diff options
| author | Laytan <laytanlaats@hotmail.com> | 2025-10-18 17:46:58 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-18 17:46:58 +0200 |
| commit | 253a72ffe34b4e8d128b86f720394676065c811d (patch) | |
| tree | 19df76b18579e588460bd7cdb45b9be3e6d0014f | |
| parent | c51f4daa7d715a8f2df62f69625676996c4c92d0 (diff) | |
| parent | c21453acc598ca1ec755d6e88c9c7f0e1db51da6 (diff) | |
Merge pull request #5827 from jakubtomsu/5826-fix
[LLVM Backend] Prefer the type pointer over LLVMTypeRef when looking up struct_field_remapping (Fix 5826)
| -rw-r--r-- | src/llvm_backend_utility.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 182928247..c7b4170e9 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -981,9 +981,12 @@ gb_internal lbStructFieldRemapping lb_get_struct_remapping(lbModule *m, Type *t) mutex_lock(&m->types_mutex); - auto *field_remapping = map_get(&m->struct_field_remapping, cast(void *)struct_type); + // NOTE(jakub): It's very important to check the type pointer first, + // because two disctinct but similar structs can end up with the same LLVMTypeRef after interning. + // (For example struct{u16,u8} looks identical to LLVM as struct{u16,u8,u8} once padding fields are inserted.) + auto *field_remapping = map_get(&m->struct_field_remapping, cast(void *)t); if (field_remapping == nullptr) { - field_remapping = map_get(&m->struct_field_remapping, cast(void *)t); + field_remapping = map_get(&m->struct_field_remapping, cast(void *)struct_type); } mutex_unlock(&m->types_mutex); |