From: Chris Lattner Date: Sun, 9 Dec 2007 00:36:01 +0000 (+0000) Subject: implement support for functions that initialize globals. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ea81a84e21c23914a4189e8b4002149fb7cdf43;p=clang implement support for functions that initialize globals. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44730 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp index c5e6a26859..ecabb814ae 100644 --- a/CodeGen/CodeGenModule.cpp +++ b/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) { diff --git a/test/CodeGen/globalinit.c b/test/CodeGen/globalinit.c index f08760f53a..bfa909bd75 100644 --- a/test/CodeGen/globalinit.c +++ b/test/CodeGen/globalinit.c @@ -12,3 +12,6 @@ void bar() { x[0] = 1; } extern int y[]; void *g = y; +int latin_ptr2len (char *p); +int (*mb_ptr2len) (char *p) = latin_ptr2len; +