Skip to content

Commit

Permalink
emit padding as undef values, take 2
Browse files Browse the repository at this point in the history
merge also a few tests I had here for this feature, and FileCheck'ize one file

llvm-svn: 101535
  • Loading branch information
nunoplopes committed Apr 16, 2010
1 parent 4d273f4 commit 5863c99
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 20 deletions.
6 changes: 3 additions & 3 deletions clang/lib/CodeGen/CGExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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!");

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -537,7 +537,7 @@ class ConstExprEmitter :
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);
}

Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGen/decl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand Down
34 changes: 23 additions & 11 deletions clang/test/CodeGen/designated-initializers.c
Original file line number Diff line number Diff line change
@@ -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 = { };

int main(int argc, char **argv)
{
union { int i; float f; } u2 = { };
static struct foo foo = {
.b = 1024,
};
}
// 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
[1] = 22
};

int main(int argc, char **argv)
{
// CHECK: internal global %struct.foo { i8* null, i32 1024 }
static struct foo foo = {
.b = 1024,
};

// 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
}
17 changes: 13 additions & 4 deletions clang/test/CodeGen/global-init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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")));
8 changes: 7 additions & 1 deletion clang/test/CodeGen/union-init2.c
Original file line number Diff line number Diff line change
@@ -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 = {};

0 comments on commit 5863c99

Please sign in to comment.