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 c5e6a26..ecabb81 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -202,8 +202,8 @@
/// 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 @@
}
switch (Expression->getStmtClass()) {
+ default: break; // default emits a warning and returns bogus value.
+ case Stmt::DeclRefExprClass: {
+ const ValueDecl *Decl = cast<DeclRefExpr>(Expression)->getDecl();
+ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl))
+ return CGM.GetAddrOfFunctionDecl(FD, false);
+ break;
+ }
+
// Generate constant for floating point literal values.
case Stmt::FloatingLiteralClass: {
const FloatingLiteral *FLiteral = cast<FloatingLiteral>(Expression);
@@ -416,11 +424,10 @@
// an array or struct.
case Stmt::InitListExprClass:
return GenerateAggregateInit(cast<InitListExpr>(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 f08760f..bfa909b 100644
--- a/test/CodeGen/globalinit.c
+++ b/test/CodeGen/globalinit.c
@@ -12,3 +12,6 @@
extern int y[];
void *g = y;
+int latin_ptr2len (char *p);
+int (*mb_ptr2len) (char *p) = latin_ptr2len;
+