diff options
| author | gingerBill <bill@gingerbill.org> | 2022-08-24 12:52:57 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-08-24 12:52:57 +0100 |
| commit | f1ffd902944df5a7a8f89ca9a3d18e3c94307348 (patch) | |
| tree | 1c2eba35db42467718e1c49057bff65eccfb872e /src/types.cpp | |
| parent | 777aa8b1182933c00fc77eb9e80bc235b94fbb61 (diff) | |
Fix #1966
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/types.cpp b/src/types.cpp index 0ca239bde..570d7c556 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3571,10 +3571,22 @@ i64 type_align_of_internal(Type *t, TypePath *path) { return build_context.word_size; } - // return gb_clamp(next_pow2(type_size_of(t)), 1, build_context.max_align); + i64 max_alignment = build_context.word_size; + if (is_arch_wasm()) { + // NOTE(bill): wasm32 with LLVM defines its default datalayout as: + // + // e-m:e-p:32:32-i64:64-n32:64-S128 + // + // This means that the alignment of a 64-bit type is 64-bits and not 32-bits like + // on other 32-bit architectures + // + // See: https://github.com/WebAssembly/tool-conventions/blob/main/BasicCABI.md + max_alignment = 8; + } + // NOTE(bill): Things that are bigger than build_context.word_size, are actually comprised of smaller types // TODO(bill): Is this correct for 128-bit types (integers)? - return gb_clamp(next_pow2(type_size_of_internal(t, path)), 1, build_context.word_size); + return gb_clamp(next_pow2(type_size_of_internal(t, path)), 1, max_alignment); } i64 *type_set_offsets_of(Slice<Entity *> const &fields, bool is_packed, bool is_raw_union) { |