]> granicus.if.org Git - postgresql/commitdiff
LLVMJIT: Check for 'noinline' attribute in recursively inlined functions.
authorAndres Freund <andres@anarazel.de>
Wed, 25 Jul 2018 23:23:59 +0000 (16:23 -0700)
committerAndres Freund <andres@anarazel.de>
Wed, 25 Jul 2018 23:23:59 +0000 (16:23 -0700)
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

src/backend/jit/llvm/llvmjit_inline.cpp

index 130e2ab415e54eff871964970e3897f4477ec6ea..b33a32141d1cd46174a5cea24f78bcf9e5ac1647 100644 (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)