From: Andres Freund Date: Wed, 25 Jul 2018 23:23:59 +0000 (-0700) Subject: LLVMJIT: Check for 'noinline' attribute in recursively inlined functions. X-Git-Tag: REL_12_BETA1~1820 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bcafa263ec408ae8e383e389832b2a623900a55c;p=postgresql 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 --- diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp index 130e2ab415..b33a32141d 100644 --- a/src/backend/jit/llvm/llvmjit_inline.cpp +++ b/src/backend/jit/llvm/llvmjit_inline.cpp @@ -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 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)