Allow align(1) for global variables.

This reverts a39997d326, and fixes the invalid tests in std.conv.
This commit is contained in:
Johan Engelen 2016-10-11 21:37:45 +02:00
parent a90fdfe624
commit 7e572e6f03
3 changed files with 13 additions and 7 deletions

View file

@ -846,10 +846,10 @@ void DtoResolveVariable(VarDeclaration *vd) {
linkage, nullptr, llName, vd->isThreadlocal()); linkage, nullptr, llName, vd->isThreadlocal());
getIrGlobal(vd)->value = gvar; getIrGlobal(vd)->value = gvar;
// Set the alignment and use the target pointer size as lower bound. // Set the alignment (it is important not to use type->alignsize because
unsigned alignment = // VarDeclarations can have an align() attribute independent of the type
std::max(DtoAlignment(vd), gDataLayout->getPointerSize()); // as well).
gvar->setAlignment(alignment); gvar->setAlignment(DtoAlignment(vd));
applyVarDeclUDAs(vd, gvar); applyVarDeclUDAs(vd, gvar);

@ -1 +1 @@
Subproject commit fe82475369dd9bd426e40fbb968d19a11f60f71d Subproject commit def73b22bcc46416f59fc2b7bc070a4143ad9d77

View file

@ -6,10 +6,14 @@
align(32) struct Outer { int a; } align(32) struct Outer { int a; }
struct Inner { align(32) int a; } struct Inner { align(32) int a; }
align(1) ubyte globalByte1;
// CHECK-DAG: align11globalByte1h = {{.*}} align 1
static Outer globalOuter; static Outer globalOuter;
// CHECK: constant %align.Outer_init zeroinitializer{{(, comdat)?}}, align 32 // CHECK-DAG: constant %align.Outer_init zeroinitializer{{(, comdat)?}}, align 32
// CHECK-DAG: align11globalOuterS5align5Outer = {{.*}} align 32
static Inner globalInner; static Inner globalInner;
// CHECK: constant %align.Inner_init zeroinitializer{{(, comdat)?}}, align 32 // CHECK-DAG: constant %align.Inner_init zeroinitializer{{(, comdat)?}}, align 32
// CHECK-DAG: align11globalInnerS5align5Inner = {{.*}} align 32
Outer passAndReturnOuterByVal(Outer arg) { return arg; } Outer passAndReturnOuterByVal(Outer arg) { return arg; }
// CHECK: define{{.*}} void @{{.*}}_D5align23passAndReturnOuterByValFS5align5OuterZS5align5Outer // CHECK: define{{.*}} void @{{.*}}_D5align23passAndReturnOuterByValFS5align5OuterZS5align5Outer
@ -29,6 +33,8 @@ void main() {
Inner inner; Inner inner;
// CHECK: %inner = alloca %align.Inner, align 32 // CHECK: %inner = alloca %align.Inner, align 32
align(1) byte byte1;
// CHECK: %byte1 = alloca i8, align 1
align(16) byte byte16; align(16) byte byte16;
// CHECK: %byte16 = alloca i8, align 16 // CHECK: %byte16 = alloca i8, align 16
align(64) Outer outer64; align(64) Outer outer64;