From: | Peter Eisentraut <peter(dot)eisentraut(at)2ndquadrant(dot)com> |
---|---|
To: | Andres Freund <andres(at)anarazel(dot)de>, pgsql-hackers(at)postgresql(dot)org |
Cc: | Pierre Ducroquet <p(dot)psql(at)pinaraf(dot)info> |
Subject: | Re: JIT compiling with LLVM v11 |
Date: | 2018-03-03 00:13:01 |
Message-ID: | e81721fc-25a8-4ea0-b525-43abf7c5282b@2ndquadrant.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 3/1/18 03:02, Andres Freund wrote:
> I've pushed a revised version of my JIT patchset.
> 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=shortlog;h=refs/heads/jit
(testing 2e15e8b8100a61ec092a1e5b2db4a93f07a64cbd)
I'm having an interesting time getting this to build on macOS.
First, you need to use a CXX that is reasonably similar to the CC.
Otherwise, the CXX will complain about things like attributes not
being supported etc. That's not surprising, but it's a support issue
that we'll have to prepare ourselves for.
Using my standard set of CC=gcc-7 and CXX=g++-7, the build fails with
g++-7: error: unrecognized command line option '-stdlib=libc++'
That comes from llvm-config --cxxflags, which was apparently made for
/usr/bin/cc (which is clang).
I see here the same problems as we had in the olden days with Perl,
where it gave us a bunch of compiler flags that applied to the system
compiler but not the compiler currently in use. We should just take the
flags that we really need, like -I and -L. Maybe we don't need it at all.
Trying it again then with CC=/usr/bin/cc and CXX=/usr/bin/c++, it
fails with
In file included from llvmjit_inline.cpp:25:
In file included from ../../../../src/include/jit/llvmjit.h:16:
In file included from
/usr/local/Cellar/llvm/5.0.1/include/llvm-c/Types.h:17:
In file included from
/usr/local/Cellar/llvm/5.0.1/include/llvm/Support/DataTypes.h:33:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath:555:1:
error: templates must have C++ linkage
Using this patch gets it past that:
diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp
b/src/backend/jit/llvm/llvmjit_inline.cpp
index d4204d2cd2..ad87cfd2d9 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -22,7 +22,6 @@
extern "C"
{
#include "postgres.h"
-#include "jit/llvmjit.h"
#include <fcntl.h>
#include <sys/mman.h>
@@ -35,6 +34,8 @@ extern "C"
#include "storage/fd.h"
}
+#include "jit/llvmjit.h"
+
#include <llvm-c/Core.h>
#include <llvm-c/BitReader.h>
It seems that it was intended that way anyway, since llvmjit.h contains
its own provisions for extern C.
Then, I'm getting this error:
/usr/bin/cc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-Wno-unused-command-line-argument -g -O2 -Wno-deprecated-declarations
-Werror -bundle -multiply_defined suppress -o llvmjit.so llvmjit.o
llvmjit_error.o llvmjit_inline.o llvmjit_wrap.o llvmjit_expr.o
llvmjit_deform.o -L../../../../src/port -L../../../../src/common
-L/usr/local/lib -L/usr/local/opt/openssl/lib
-L/usr/local/opt/readline/lib -L/usr/local/Cellar/libxml2/2.9.7/lib
-L/usr/local/Cellar/llvm/5.0.1/lib -L/usr/local/lib
-L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib
-Wl,-dead_strip_dylibs -Werror -lLLVMPasses -lLLVMipo
-lLLVMInstrumentation -lLLVMVectorize -lLLVMLinker -lLLVMIRReader
-lLLVMAsmParser -lLLVMOrcJIT -lLLVMX86Disassembler -lLLVMX86AsmParser
-lLLVMX86CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter
-lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMCodeGen
-lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMBitWriter
-lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter
-lLLVMX86Utils -lLLVMMCJIT -lLLVMExecutionEngine -lLLVMTarget
-lLLVMAnalysis -lLLVMProfileData -lLLVMRuntimeDyld -lLLVMDebugInfoDWARF
-lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMBitReader -lLLVMCore
-lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle -lcurses -lz -lm
-bundle_loader ../../../../src/backend/postgres
Undefined symbols for architecture x86_64:
"std::__1::error_code::message() const", referenced from:
_LLVMPrintModuleToFile in libLLVMCore.a(Core.cpp.o)
_LLVMCreateMemoryBufferWithContentsOfFile in libLLVMCore.a(Core.cpp.o)
_LLVMCreateMemoryBufferWithSTDIN in libLLVMCore.a(Core.cpp.o)
_LLVMTargetMachineEmitToFile in libLLVMTarget.a(TargetMachineC.cpp.o)
llvm::errorToErrorCode(llvm::Error) in libLLVMSupport.a(Error.cpp.o)
llvm::ECError::log(llvm::raw_ostream&) const in
libLLVMSupport.a(Error.cpp.o)
llvm::SectionMemoryManager::finalizeMemory(std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char> >*) in
libLLVMExecutionEngine.a(SectionMemoryManager.cpp.o)
[snipped about 900 lines]
It seems the problem here is linking C++ with the C compiler. If I
hack in to use c++ in the above command, it continues, and the build
completes.
configure didn't find any of the LLVMOrc* symbols it was looking for.
Is that a problem? They seem to be for some debugging support.
So, how do I turn this on then? I see a bunch of new GUC settings
that are all off by default. Which ones turn the feature(s) on?
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | David Gould | 2018-03-03 00:18:40 | Re: [patch] BUG #15005: ANALYZE can make pg_class.reltuples inaccurate. |
Previous Message | Tomas Vondra | 2018-03-02 23:26:01 | Re: Online enabling of checksums |