LLVMJIT: Check for 'noinline' attribute in recursively inlined functions.

Previously the attribute was only checked for external functions
inlined, not "static" functions that had to be inlined as
dependencies.

This isn't really a bug, but makes debugging a bit harder. The new
behaviour also makes more sense. Therefore backpatch.

Author: Andres Freund
Backpatch: 11-, where JIT compilation was added
This commit is contained in:
Andres Freund 2018-07-25 16:23:59 -07:00
parent 167075be3a
commit bcafa263ec
1 changed files with 7 additions and 8 deletions

View File

@ -287,14 +287,6 @@ llvm_build_inline_plan(llvm::Module *mod)
Assert(!funcDef->isDeclaration());
Assert(funcDef->hasExternalLinkage());
/* don't inline functions marked as noinline */
if (funcDef->getAttributes().hasFnAttribute(llvm::Attribute::NoInline))
{
ilog(DEBUG1, "ineligibile to import %s due to noinline",
symbolName.data());
continue;
}
llvm::StringSet<> importVars;
llvm::SmallPtrSet<const llvm::Function *, 8> visitedFunctions;
int running_instcount = 0;
@ -600,6 +592,13 @@ function_inlinable(llvm::Function &F,
if (F.materialize())
elog(FATAL, "failed to materialize metadata");
if (F.getAttributes().hasFnAttribute(llvm::Attribute::NoInline))
{
ilog(DEBUG1, "ineligibile to import %s due to noinline",
F.getName().data());
return false;
}
function_references(F, running_instcount, referencedVars, referencedFunctions);
for (llvm::GlobalVariable* rv: referencedVars)