Fix PR9614 for functions with the always_inline attribute. Try to keep

the common case (-O0, no always_inline) fast.

llvm-svn: 143222
This commit is contained in:
Rafael Espindola
2011-10-28 20:43:56 +00:00
parent 409b694c6c
commit fffc1ce1d7
2 changed files with 20 additions and 15 deletions

View File

@@ -901,18 +901,15 @@ bool
CodeGenModule::shouldEmitFunction(const FunctionDecl *F) {
if (getFunctionLinkage(F) != llvm::Function::AvailableExternallyLinkage)
return true;
if (F->hasAttr<AlwaysInlineAttr>())
return true;
if (CodeGenOpts.OptimizationLevel == 0)
if (CodeGenOpts.OptimizationLevel == 0 &&
!F->hasAttr<AlwaysInlineAttr>())
return false;
// PR9614. Avoid cases where the source code is lying to us. An available
// externally function should have an equivalent function somewhere else,
// but a function that calls itself is clearly not equivalent to the real
// implementation.
// This happens in glibc's btowc and in some configure checks.
if (isTriviallyRecursiveViaAsm(F))
return false;
return true;
return !isTriviallyRecursiveViaAsm(F);
}
void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) {