[cfe-commits] r50001 - in /cfe/trunk: lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h test/CodeGen/unusedstatic.c
Nate Begeman
natebegeman at mac.com
Sun Apr 20 13:38:08 PDT 2008
Author: sampo
Date: Sun Apr 20 15:38:08 2008
New Revision: 50001
URL: http://llvm.org/viewvc/llvm-project?rev=50001&view=rev
Log:
Fix PR2236
Add test
Implement feedback from Chris re: PR1998
Added:
cfe/trunk/test/CodeGen/unusedstatic.c
Modified:
cfe/trunk/lib/CodeGen/CodeGenModule.cpp
cfe/trunk/lib/CodeGen/CodeGenModule.h
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=50001&r1=50000&r2=50001&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sun Apr 20 15:38:08 2008
@@ -303,6 +303,19 @@
// If the function is a static, defer code generation until later so we can
// easily omit unused statics.
if (FD->getStorageClass() == FunctionDecl::Static) {
+ // 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);
return;
}
@@ -320,7 +333,7 @@
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[D] == 0)
+ if (!GlobalDeclMap.count(D))
continue;
// If this is a function decl, generate code for the static function if it
@@ -330,8 +343,7 @@
if (FD->getBody())
CodeGenFunction(*this).GenerateCode(FD);
} else {
- const VarDecl *VD = cast<VarDecl>(D);
- EmitGlobalVarInit(VD);
+ EmitGlobalVarInit(cast<VarDecl>(D));
}
// Erase the used decl from the list.
StaticDecls[i] = StaticDecls.back();
@@ -346,8 +358,8 @@
// Warn about all statics that are still unused at end of code generation.
for (unsigned i = 0, e = StaticDecls.size(); i != e; ++i) {
- const Decl *D = StaticDecls[i];
- std::string Msg = cast<NamedDecl>(D)->getName();
+ const NamedDecl *D = StaticDecls[i];
+ std::string Msg = D->getName();
getDiags().Report(Context.getFullLoc(D->getLocation()),
diag::warn_unused_static, &Msg, 1);
}
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=50001&r1=50000&r2=50001&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.h Sun Apr 20 15:38:08 2008
@@ -34,9 +34,8 @@
class Decl;
class Expr;
class Stmt;
- class ValueDecl;
+ class NamedDecl;
class VarDecl;
- class TypeDecl;
struct LangOptions;
class Diagnostic;
class AnnotateAttr;
@@ -59,7 +58,7 @@
llvm::Function *MemCpyFn;
llvm::Function *MemSetFn;
llvm::DenseMap<const Decl*, llvm::Constant*> GlobalDeclMap;
- std::vector<const Decl*> StaticDecls;
+ std::vector<const NamedDecl*> StaticDecls;
std::vector<llvm::Constant*> GlobalCtors;
std::vector<llvm::Constant*> Annotations;
Added: cfe/trunk/test/CodeGen/unusedstatic.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/unusedstatic.c?rev=50001&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/unusedstatic.c (added)
+++ cfe/trunk/test/CodeGen/unusedstatic.c Sun Apr 20 15:38:08 2008
@@ -0,0 +1,7 @@
+// RUN: clang %s -emit-llvm -verify
+// PR1998
+// PR2236
+static void a (void);
+void b (void) { a (); }
+static void a(void) {}
+static void c(void) {} // expected-warning {{static 'c' defined but not used}}
More information about the cfe-commits
mailing list