aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CodeGenModule.cpp29
-rw-r--r--test/CodeGen/static-forward-decl.c5
2 files changed, 17 insertions, 17 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 329599c116..f14a0858d3 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -341,19 +341,6 @@ void CodeGenModule::EmitFunction(const FunctionDecl *FD) {
CodeGenFunction(*this).GenerateCode(FD);
return;
}
-
- // We need to check the Module here to see if GetAddrOfFunctionDecl() has
- // already added this function to the Module because the address of the
- // function's prototype was taken. If this is the case, call
- // GetAddrOfFunctionDecl to insert the static FunctionDecl into the used
- // GlobalDeclsMap, so that EmitStatics will generate code for it later.
- //
- // Example:
- // static int foo();
- // int bar() { return foo(); }
- // static int foo() { return 5; }
- if (getModule().getFunction(FD->getName()))
- GetAddrOfFunctionDecl(FD, true);
StaticDecls.push_back(FD);
}
@@ -366,11 +353,19 @@ void CodeGenModule::EmitStatics() {
do {
Changed = false;
for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) {
- // Check the map of used decls for our static. If not found, continue.
const Decl *D = StaticDecls[i];
- if (!GlobalDeclMap.count(D))
- continue;
-
+
+ // Check if we have used a decl with the same name
+ // FIXME: The AST should have some sort of aggregate decls or
+ // global symbol map.
+ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+ if (!getModule().getFunction(FD->getName()))
+ continue;
+ } else {
+ if (!getModule().getNamedGlobal(cast<VarDecl>(D)->getName()))
+ continue;
+ }
+
// If this is a function decl, generate code for the static function if it
// has a body. Otherwise, we must have a var decl for a static global
// variable.
diff --git a/test/CodeGen/static-forward-decl.c b/test/CodeGen/static-forward-decl.c
new file mode 100644
index 0000000000..8e0825cb6c
--- /dev/null
+++ b/test/CodeGen/static-forward-decl.c
@@ -0,0 +1,5 @@
+// RUN: clang %s -emit-llvm -o - -triple=i686-apple-darwin9 | grep "global i32 10"
+
+static int i;
+int*j=&i;
+static int i = 10;