зеркало из https://github.com/microsoft/clang.git
Add a more reliable check for whether a static declaration has already
been used. In preparation for the fix to PR2360, but also a minor bug in its own right. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51583 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
80f3346981
Коммит
6f7e2eee91
|
@ -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.
|
||||
|
|
|
@ -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;
|
Загрузка…
Ссылка в новой задаче