Commit 2eaef84
stage2 llvm: Use unpacked struct for unions and arrays
Our lowerings for various LLVM types assume that we can anticipate the
alignment/layout that LLVM will generate. Among other things, this
requires that we keep the alignment of our lowered LLVM types
synchronized with their expected alignment in Zig.
- Arrays were using packed struct types, which is seems to be
incorrect since array elements are supposed to be self-aligned.
- Unions were using packed struct types for their payload, which causes
layout divergence between what stage2 expects and what LLVM generates
Consider this lowered union type:
```llvm
%Value = type { <{ i64, [8 x i8] }>, i1, [7 x i8] } ; 24 bytes, align(1)
%ErrorUnion = type { %Value, i16 } ; 26 bytes, align(2)
```
Zig expects Value to be align(8) and, by extension, for ErrorUnion to be
size 32.1 parent 7090f04 commit 2eaef84
1 file changed
Lines changed: 5 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2689 | 2689 | | |
2690 | 2690 | | |
2691 | 2691 | | |
2692 | | - | |
| 2692 | + | |
2693 | 2693 | | |
2694 | 2694 | | |
2695 | 2695 | | |
| |||
3002 | 3002 | | |
3003 | 3003 | | |
3004 | 3004 | | |
3005 | | - | |
| 3005 | + | |
3006 | 3006 | | |
3007 | 3007 | | |
3008 | 3008 | | |
| |||
3039 | 3039 | | |
3040 | 3040 | | |
3041 | 3041 | | |
3042 | | - | |
| 3042 | + | |
3043 | 3043 | | |
3044 | 3044 | | |
3045 | 3045 | | |
| |||
3056 | 3056 | | |
3057 | 3057 | | |
3058 | 3058 | | |
3059 | | - | |
| 3059 | + | |
3060 | 3060 | | |
3061 | 3061 | | |
3062 | 3062 | | |
| |||
3343 | 3343 | | |
3344 | 3344 | | |
3345 | 3345 | | |
3346 | | - | |
| 3346 | + | |
3347 | 3347 | | |
3348 | 3348 | | |
3349 | 3349 | | |
| |||
0 commit comments