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;
+