Int128 alignment fixed on x64 Linux.

This commit is contained in:
Christoffer Lerno
2024-08-11 22:48:21 +02:00
parent f7c39ae4a9
commit 3cae557b88
4 changed files with 25 additions and 5 deletions

View File

@@ -63,6 +63,7 @@
- Fix Vec2.angle
- Update to libc::setjmp on Win32, to do no stack unwinding.
- Recursively follow interfaces when looking up method.
- Int128 alignment fixed on x64 Linux.
### Stdlib changes

View File

@@ -1546,20 +1546,21 @@ static AlignData os_target_alignment_of_int(OsType os, ArchType arch, uint32_t b
case ARCH_TYPE_PPC64:
case ARCH_TYPE_PPC:
case ARCH_TYPE_PPC64LE:
case ARCH_TYPE_X86_64:
case ARCH_TYPE_WASM64:
case ARCH_TYPE_RISCV32:
case ARCH_TYPE_WASM32:
case ARCH_TYPE_XTENSA:
return (AlignData) { MIN(64u, bits), MIN(64u, bits) };
case ARCH_TYPE_X86_64:
case ARCH_TYPE_RISCV64:
return (AlignData) { bits, bits };
case ARCH_TYPE_AARCH64:
case ARCH_TYPE_AARCH64_BE:
if (bits < 32 && !os_is_apple(os) && os != OS_TYPE_WIN32) return (AlignData){ bits, 32 };
if (bits < 32) return (AlignData){ bits, 32 };
return (AlignData) { bits, bits };
case ARCH_TYPE_X86:
if (bits < 32) return (AlignData) { bits, bits };
if (bits <= 32) return (AlignData) { bits, bits };
if (bits == 128) return (AlignData) { 128, 128 };
if (os == OS_TYPE_ELFIAMCU) return (AlignData) { 32, 32 };
if (os == OS_TYPE_WIN32 || os == OS_TYPE_NACL) return (AlignData) { 64, 64 };
return (AlignData) { 32, 64 };

View File

@@ -0,0 +1,18 @@
module abc;
interface AstNode {
fn void free();
fn double get_span();
fn void dump(int depth);
}
interface AstBodyStatement : AstNode {
}
interface AstExpression : /* AstNode,*/ AstBodyStatement {
}
fn void main()
{
AstExpression a = null;
a.dump(100);
}

View File

@@ -26,5 +26,5 @@ const int128 I128 = 0b0100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_000
@test.I = local_unnamed_addr constant i32 1073741824, align 4
@test.UL = local_unnamed_addr constant i64 -9223372036854775808, align 8
@test.L = local_unnamed_addr constant i64 4611686018427387904, align 8
@test.UI128 = local_unnamed_addr constant i128 -170141183460469231731687303715884105728, align 8
@test.I128 = local_unnamed_addr constant i128 85070591730234615865843651857942052864, align 8
@test.UI128 = local_unnamed_addr constant i128 -170141183460469231731687303715884105728, align 16
@test.I128 = local_unnamed_addr constant i128 85070591730234615865843651857942052864, align 16