diff options
author | Oliver Hunt <oliver@apple.com> | 2007-12-02 00:11:25 +0000 |
---|---|---|
committer | Oliver Hunt <oliver@apple.com> | 2007-12-02 00:11:25 +0000 |
commit | 2824723d6d181d2dfa56e62caabd68b0b18f0b9d (patch) | |
tree | 8b7969bd6e749a3ae1ee582881a1af74710cc9e0 | |
parent | ab38e4b50268633f037a10841fdfb612513f8d33 (diff) |
Support initalisers for more than just int-typed static variables.
We now use the CodeGenModule logic for generating the constant
initialiser expression, so happily further initialiser fixes should
automatically work for statics as well.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44495 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | CodeGen/CGDecl.cpp | 9 | ||||
-rw-r--r-- | CodeGen/CodeGenModule.cpp | 7 | ||||
-rw-r--r-- | CodeGen/CodeGenModule.h | 4 | ||||
-rw-r--r-- | test/CodeGen/staticinit.c | 10 |
4 files changed, 18 insertions, 12 deletions
diff --git a/CodeGen/CGDecl.cpp b/CodeGen/CGDecl.cpp index 09a47b9e5e..b9f072b65f 100644 --- a/CodeGen/CGDecl.cpp +++ b/CodeGen/CGDecl.cpp @@ -75,14 +75,11 @@ void CodeGenFunction::EmitStaticBlockVarDecl(const BlockVarDecl &D) { llvm::Constant *Init = 0; if (D.getInit() == 0) { Init = llvm::Constant::getNullValue(LTy); - } else if (D.getType()->isIntegerType()) { - llvm::APSInt Value(static_cast<uint32_t>( - getContext().getTypeSize(D.getInit()->getType(), SourceLocation()))); - if (D.getInit()->isIntegerConstantExpr(Value, getContext())) - Init = llvm::ConstantInt::get(Value); + } else { + Init = CGM.EmitGlobalInit(D.getInit()); } - assert(Init && "FIXME: Support initializers"); + assert(Init && "Unable to create initialiser for static decl"); DMEntry = new llvm::GlobalVariable(LTy, false, diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp index e4d0f47b0c..171a70c5a0 100644 --- a/CodeGen/CodeGenModule.cpp +++ b/CodeGen/CodeGenModule.cpp @@ -275,9 +275,8 @@ static llvm::Constant *GenerateConstantExpr(const Expr* Expression, return 0; } -llvm::Constant *CodeGenModule::EmitGlobalInit(const FileVarDecl *D, - llvm::GlobalVariable *GV) { - return GenerateConstantExpr(D->getInit(), *this); +llvm::Constant *CodeGenModule::EmitGlobalInit(const Expr *Expression) { + return GenerateConstantExpr(Expression, *this); } void CodeGenModule::EmitGlobalVar(const FileVarDecl *D) { @@ -300,7 +299,7 @@ void CodeGenModule::EmitGlobalVar(const FileVarDecl *D) { } if (!Init) - Init = EmitGlobalInit(D, GV); + Init = EmitGlobalInit(D->getInit()); assert(Init && "FIXME: Global variable initializers unimp!"); diff --git a/CodeGen/CodeGenModule.h b/CodeGen/CodeGenModule.h index 1d7c30e487..9278e68641 100644 --- a/CodeGen/CodeGenModule.h +++ b/CodeGen/CodeGenModule.h @@ -30,6 +30,7 @@ namespace clang { class ASTContext; class FunctionDecl; class Decl; + class Expr; class ValueDecl; class FileVarDecl; struct LangOptions; @@ -76,8 +77,7 @@ public: void EmitFunction(const FunctionDecl *FD); void EmitGlobalVar(const FileVarDecl *D); void EmitGlobalVarDeclarator(const FileVarDecl *D); - llvm::Constant *EmitGlobalInit(const FileVarDecl *D, - llvm::GlobalVariable *GV); + llvm::Constant *EmitGlobalInit(const Expr *Expression); void PrintStats() {} }; diff --git a/test/CodeGen/staticinit.c b/test/CodeGen/staticinit.c index 7411be3220..e226179768 100644 --- a/test/CodeGen/staticinit.c +++ b/test/CodeGen/staticinit.c @@ -1,5 +1,15 @@ // RUN: clang -emit-llvm %s +struct AStruct { + int i; + char *s; + double d; +}; + void f() { static int i = 42; + static int is[] = { 1, 2, 3, 4 }; + static char* str = "forty-two"; + static char* strs[] = { "one", "two", "three", "four" }; + static struct AStruct myStruct = { 1, "two", 3.0 }; } |