From 283d094b75a544120d5e30cc17258218e7646af5 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 9 Dec 2007 00:36:01 +0000 Subject: implement support for functions that initialize globals. llvm-svn: 44730 --- clang/CodeGen/CodeGenModule.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'clang/CodeGen/CodeGenModule.cpp') diff --git a/clang/CodeGen/CodeGenModule.cpp b/clang/CodeGen/CodeGenModule.cpp index c5e6a26859e..ecabb814ae7 100644 --- a/clang/CodeGen/CodeGenModule.cpp +++ b/clang/CodeGen/CodeGenModule.cpp @@ -202,8 +202,8 @@ static llvm::Constant *GenerateConversionToBool(llvm::Constant *Expression, /// GenerateConstantCast - Generates a constant cast to convert the Expression /// into the Target type. static llvm::Constant *GenerateConstantCast(const Expr *Expression, - QualType Target, - CodeGenModule &CGM) { + QualType Target, + CodeGenModule &CGM) { CodeGenTypes& Types = CGM.getTypes(); QualType Source = Expression->getType().getCanonicalType(); Target = Target.getCanonicalType(); @@ -346,6 +346,14 @@ static llvm::Constant *GenerateConstantExpr(const Expr *Expression, } switch (Expression->getStmtClass()) { + default: break; // default emits a warning and returns bogus value. + case Stmt::DeclRefExprClass: { + const ValueDecl *Decl = cast(Expression)->getDecl(); + if (const FunctionDecl *FD = dyn_cast(Decl)) + return CGM.GetAddrOfFunctionDecl(FD, false); + break; + } + // Generate constant for floating point literal values. case Stmt::FloatingLiteralClass: { const FloatingLiteral *FLiteral = cast(Expression); @@ -416,11 +424,10 @@ static llvm::Constant *GenerateConstantExpr(const Expr *Expression, // an array or struct. case Stmt::InitListExprClass: return GenerateAggregateInit(cast(Expression), CGM); - - default: - CGM.WarnUnsupported(Expression, "initializer"); - return llvm::UndefValue::get(Types.ConvertType(type)); } + + CGM.WarnUnsupported(Expression, "initializer"); + return llvm::UndefValue::get(Types.ConvertType(type)); } llvm::Constant *CodeGenModule::EmitGlobalInit(const Expr *Expression) { -- cgit v1.2.3