forked from OSchip/llvm-project
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. llvm-svn: 44495
This commit is contained in:
parent
3e41367dd5
commit
aefc8fd415
|
@ -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,
|
||||
|
|
|
@ -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!");
|
||||
|
||||
|
|
|
@ -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() {}
|
||||
};
|
||||
|
|
|
@ -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 };
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue