On Friday, February 2, 2018 10:48:16 AM CET Pierre Ducroquet wrote: > On Monday, January 29, 2018 10:53:50 AM CET Andres Freund wrote: > > Hi, > > > > On 2018-01-23 23:20:38 -0800, Andres Freund wrote: > > > == Code == > > > > > > As the patchset is large (500kb) and I'm still quickly evolving it, I do > > > not yet want to attach it. The git tree is at > > > > > > https://git.postgresql.org/git/users/andresfreund/postgres.git > > > > > > in the jit branch > > > > > > https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a > > > =s > > > hortlog;h=refs/heads/jit > > > > I've just pushed an updated and rebased version of the tree: > > - Split the large "jit infrastructure" commits into a number of smaller > > > > commits > > > > - Split the C++ file > > - Dropped some of the performance stuff done to heaptuple.c - that was > > > > mostly to make performance comparisons a bit more interesting, but > > doesn't seem important enough to deal with. > > > > - Added a commit renaming datetime.h symbols so they don't conflict with > > > > LLVM variables anymore, removing ugly #undef PM/#define PM dance > > around includes. Will post separately. > > > > - Reduced the number of pointer constants in the generated LLVM IR, by > > > > doing more getelementptr accesses (stem from before the time types > > were automatically synced) > > > > - Increased number of comments a bit > > > > There's a jit-before-rebase-2018-01-29 tag, for the state of the tree > > before the rebase. > > > > Regards, > > > > Andres > > Hi > > I have successfully built the JIT branch against LLVM 4.0.1 on Debian > testing. This is not enough for Debian stable (LLVM 3.9 is the latest > available there), but it's a first step. > I've split the patch in four files. The first three fix the build issues, > the last one fixes a runtime issue. > I think they are small enough to not be a burden for you in your > developments. But if you don't want to carry these ifdefs right now, I > maintain them in a branch on a personal git and rebase as frequently as I > can. > > LLVM 3.9 support isn't going to be hard, but I prefer splitting. I also hope > this will help more people test this wonderful toy… :) > > Regards > > Pierre
For LLVM 3.9, only small changes were needed. I've attached the patches to this email. I only did very basic, primitive testing, but it seems to work. I'll do more testing in the next days. Pierre
>From 5ca9594a7f52b7daab8562293010fe8c807107ee Mon Sep 17 00:00:00 2001 From: Pierre <pierre.ducroq...@people-doc.com> Date: Fri, 2 Feb 2018 11:29:45 +0100 Subject: [PATCH 1/2] Fix building with LLVM 3.9 --- src/backend/lib/llvmjit_inline.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/backend/lib/llvmjit_inline.cpp b/src/backend/lib/llvmjit_inline.cpp index 8a747cbfc0..a785261bea 100644 --- a/src/backend/lib/llvmjit_inline.cpp +++ b/src/backend/lib/llvmjit_inline.cpp @@ -37,7 +37,12 @@ extern "C" #include <llvm/ADT/StringSet.h> #include <llvm/ADT/StringMap.h> #include <llvm/Analysis/ModuleSummaryAnalysis.h> +#if LLVM_MAJOR_VERSION > 3 #include <llvm/Bitcode/BitcodeReader.h> +#else +#include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/Support/Error.h" +#endif #include <llvm/IR/CallSite.h> #include <llvm/IR/DebugInfo.h> #include <llvm/IR/IntrinsicInst.h> @@ -100,7 +105,12 @@ llvm_inline(LLVMModuleRef M) llvm_execute_inline_plan(mod, globalsToInline.get()); } -#if LLVM_VERSION_MAJOR < 5 +#if LLVM_VERSION_MAJOR < 4 +bool operator!(const llvm::ValueInfo &vi) { + return !( (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id) + || (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.V)); +} +#elif LLVM_VERSION_MAJOR < 5 bool operator!(const llvm::ValueInfo &vi) { return !( (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id) || (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV)); @@ -188,12 +198,15 @@ llvm_build_inline_plan(llvm::Module *mod) funcName.data(), modPath.data()); +// XXX Missing in LLVM < 4.0 ? +#if LLVM_VERSION_MAJOR > 3 if (gvs->notEligibleToImport()) { elog(DEBUG1, "uneligible to import %s due to summary", funcName.data()); continue; } +#endif if ((int) fs->instCount() > threshold) { @@ -339,8 +352,10 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline) #if LLVM_VERSION_MAJOR > 4 #define IRMOVE_PARAMS , /*IsPerformingImport=*/false -#else +#elif LLVM_VERSION_MAJOR > 3 #define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false +#else +#define IRMOVE_PARAMS #endif if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(), [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {} @@ -648,7 +663,11 @@ llvm_load_index(void) if (e) elog(ERROR, "could not load summary at %s", subpath); #else +#if LLVM_VERSION_MAJOR > 3 std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get()); +#else + std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref, [](const llvm::DiagnosticInfo &) {}).get()); +#endif if (!subindex) elog(ERROR, "could not load summary at %s", subpath); else -- 2.15.1
>From be1f76a141ab346b6ba8d9e8b38c81a40a427dc7 Mon Sep 17 00:00:00 2001 From: Pierre <pierre.ducroq...@people-doc.com> Date: Fri, 2 Feb 2018 11:29:57 +0100 Subject: [PATCH 2/2] Fix segfault with LLVM 3.9 --- src/backend/lib/llvmjit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c index d0c5537610..ad9582182f 100644 --- a/src/backend/lib/llvmjit.c +++ b/src/backend/lib/llvmjit.c @@ -462,12 +462,12 @@ llvm_session_initialize(void) cpu = LLVMGetHostCPUName(); llvm_opt0_targetmachine = - LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL, + LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "", LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelJITDefault); llvm_opt3_targetmachine = - LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL, + LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "", LLVMCodeGenLevelAggressive, LLVMRelocDefault, LLVMCodeModelJITDefault); -- 2.15.1