emit padding as undef values, take 2

merge also a few tests I had here for this feature, and FileCheck'ize one file

llvm-svn: 101535
This commit is contained in:
Nuno Lopes 2010-04-16 20:56:35 +00:00
parent 4d273f4519
commit 5863c999e7
5 changed files with 47 additions and 20 deletions

View File

@ -259,7 +259,7 @@ void ConstStructBuilder::AppendPadding(uint64_t NumBytes) {
if (NumBytes > 1)
Ty = llvm::ArrayType::get(Ty, NumBytes);
llvm::Constant *C = llvm::Constant::getNullValue(Ty);
llvm::Constant *C = llvm::UndefValue::get(Ty);
Elements.push_back(C);
assert(getAlignment(C) == 1 && "Padding must have 1 byte alignment!");
@ -297,7 +297,7 @@ void ConstStructBuilder::ConvertStructToPacked() {
if (NumBytes > 1)
Ty = llvm::ArrayType::get(Ty, NumBytes);
llvm::Constant *Padding = llvm::Constant::getNullValue(Ty);
llvm::Constant *Padding = llvm::UndefValue::get(Ty);
PackedElements.push_back(Padding);
ElementOffsetInBytes += getSizeInBytes(Padding);
}
@ -537,7 +537,7 @@ public:
if (NumPadBytes > 1)
Ty = llvm::ArrayType::get(Ty, NumPadBytes);
Elts.push_back(llvm::Constant::getNullValue(Ty));
Elts.push_back(llvm::UndefValue::get(Ty));
Types.push_back(Ty);
}

View File

@ -2,7 +2,7 @@
// CHECK: @test1.x = internal constant [12 x i32] [i32 1
// CHECK: @test2.x = internal constant [13 x i32] [i32 1,
// CHECK: @test5w = global %0 { i32 2, [4 x i8] zeroinitializer }
// CHECK: @test5w = global %0 { i32 2, [4 x i8] undef }
// CHECK: @test5y = global %union.test5u { double 7.300000e+0{{[0]*}}1 }
// CHECK: @test6.x = internal constant %struct.SelectDest { i8 1, i8 2, i32 3, i32 0 }

View File

@ -1,22 +1,34 @@
// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o %t
// RUN: grep "{ i8\* null, i32 1024 }" %t
// RUN: grep "i32 0, i32 22" %t
// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
struct foo {
void *a;
int b;
};
// CHECK: @u = global %union.anon zeroinitializer
union { int i; float f; } u = { };
// CHECK: @u2 = global %0 { i32 0, [4 x i8] undef }
union { int i; double f; } u2 = { };
// CHECK: @b = global [2 x i32] [i32 0, i32 22]
int b[2] = {
[1] = 22
};
int main(int argc, char **argv)
{
union { int i; float f; } u2 = { };
static struct foo foo = {
.b = 1024,
};
}
// CHECK: internal global %struct.foo { i8* null, i32 1024 }
static struct foo foo = {
.b = 1024,
};
int b[2] = {
[1] 22
};
// CHECK: bitcast %union.anon* %u2
// CHECK: call void @llvm.memset
union { int i; float f; } u2 = { };
// CHECK-NOT: call void @llvm.memset
union { int i; float f; } u3;
// CHECK: ret i32
}

View File

@ -12,19 +12,28 @@ int c __attribute__((weak))= 0;
// CHECK: @c = weak global i32 0
// Since this is marked const, it should get weak_odr linkage, since all
// definitions have to be the same.
// CHECK: @d = weak_odr constant i32 0
const int d __attribute__((weak))= 0;
// PR6168 "too many undefs"
struct ManyFields {
int a;
int b;
int c;
char d;
int e;
int f;
};
// CHECK: global %0 { i32 1, i32 2, i32 0, i8 0, i32 0, i32 0 }
struct ManyFields FewInits = {1, 2};
// NOTE: tentative definitions are processed at the end of the translation unit.
// This shouldn't be emitted as common because it has an explicit section.
// rdar://7119244
int b __attribute__((section("foo")));
// CHECK: @b = global i32 0, section "foo"
int b __attribute__((section("foo")));

View File

@ -1,7 +1,13 @@
// RUN: %clang_cc1 -emit-llvm %s -o - -triple i686-pc-linux-gnu | FileCheck %s
// Make sure we generate something sane instead of a ptrtoint
// CHECK: bitcast (%0* @r to %union.x*), [4 x i8] undef
union x {long long b;union x* a;} r = {.a = &r};
// CHECK: bitcast (%0* @r to %union.x*), [4 x i8] zero
// CHECK: global %1 { [3 x i8] zeroinitializer, [5 x i8] undef }
union z {
char a[3];
long long b;
};
union z y = {};