[cfe-commits] r66132 - in /cfe/trunk: lib/CodeGen/CodeGenModule.cpp test/CodeGen/incomplete-function-type.c

Eli Friedman eli.friedman at gmail.com
Wed Mar 4 20:18:11 PST 2009


Author: efriedma
Date: Wed Mar  4 22:18:07 2009
New Revision: 66132

URL: http://llvm.org/viewvc/llvm-project?rev=66132&view=rev
Log:
Make IRGen compatible with declaring a function with incomplete 
return/argument types.  (The generated IR isn't ideal, but we can't 
really do better in general.)


Modified:
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/test/CodeGen/incomplete-function-type.c

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=66132&r1=66131&r2=66132&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Mar  4 22:18:07 2009
@@ -779,13 +779,24 @@
 llvm::GlobalValue *
 CodeGenModule::EmitForwardFunctionDefinition(const FunctionDecl *D,
                                              const llvm::Type *Ty) {
-  if (!Ty)
+  bool DoSetAttributes = true;
+  if (!Ty) {
     Ty = getTypes().ConvertType(D->getType());
+    if (!isa<llvm::FunctionType>(Ty)) {
+      // This function doesn't have a complete type (for example, the return
+      // type is an incomplete struct). Use a fake type instead, and make
+      // sure not to try to set attributes.
+      Ty = llvm::FunctionType::get(llvm::Type::VoidTy,
+                                   std::vector<const llvm::Type*>(), false);
+      DoSetAttributes = false;
+    }
+  }
   llvm::Function *F = llvm::Function::Create(cast<llvm::FunctionType>(Ty), 
                                              llvm::Function::ExternalLinkage,
                                              getMangledName(D),
                                              &getModule());
-  SetFunctionAttributes(D, F);
+  if (DoSetAttributes)
+    SetFunctionAttributes(D, F);
   return F;
 }
 

Modified: cfe/trunk/test/CodeGen/incomplete-function-type.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/incomplete-function-type.c?rev=66132&r1=66131&r2=66132&view=diff

==============================================================================
--- cfe/trunk/test/CodeGen/incomplete-function-type.c (original)
+++ cfe/trunk/test/CodeGen/incomplete-function-type.c Wed Mar  4 22:18:07 2009
@@ -1,9 +1,9 @@
 // RUN: clang -emit-llvm %s -o - | not grep opaque
 
-enum teste1 (*test1)(void);
-struct tests2 (*test2)();
+enum teste1 test1f(void), (*test1)(void) = test1f;
+struct tests2 test2f(), (*test2)() = test2f;
 struct tests3;
-void (*test3)(struct tests3);
+void test3f(struct tests3), (*test3)(struct tests3) = test3f;
 enum teste1 { TEST1 };
 struct tests2 { int x,y,z,a,b,c,d,e,f,g; };
 struct tests3 { float x; };





More information about the cfe-commits mailing list