diff options
author | Andres Freund <andres@anarazel.de> | 2018-03-20 17:26:25 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2018-03-20 17:26:25 -0700 |
commit | 5b2526c83832e4e8a9f8db0389904ed2fb50ed37 (patch) | |
tree | 0e6f1e24b35e3dbc15a70e52cf0558f7bfc553b3 /config/llvm.m4 | |
parent | 6869b4f2584787d9e4cefaab8a4bae1ecbe63766 (diff) | |
download | postgresql-5b2526c83832e4e8a9f8db0389904ed2fb50ed37.tar.gz |
Add configure infrastructure (--with-llvm) to enable LLVM support.
LLVM will be used for *optional* Just-in-time compilation
support. This commit just adds the configure infrastructure that
detects LLVM.
No documentation has been added for the --with-llvm flag, that'll be
added after the actual supporting code has been added.
Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de
Diffstat (limited to 'config/llvm.m4')
-rw-r--r-- | config/llvm.m4 | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/config/llvm.m4 b/config/llvm.m4 new file mode 100644 index 0000000000..e25ffec661 --- /dev/null +++ b/config/llvm.m4 @@ -0,0 +1,108 @@ +# config/llvm.m4 + +# PGAC_LLVM_SUPPORT +# --------------- +# +# Look for the LLVM installation, check that it's new enough, set the +# corresponding LLVM_{CFLAGS,CXXFLAGS,BINPATH} and LDFLAGS +# variables. Also verifies that CLANG is available, to transform C +# into bitcode. +# +AC_DEFUN([PGAC_LLVM_SUPPORT], +[ + AC_REQUIRE([AC_PROG_AWK]) + + AC_ARG_VAR(LLVM_CONFIG, [path to llvm-config command]) + PGAC_PATH_PROGS(LLVM_CONFIG, llvm-config llvm-config-6.0 llvm-config-5.0 llvm-config-4.0 llvm-config-3.9) + + # no point continuing if llvm wasn't found + if test -z "$LLVM_CONFIG"; then + AC_MSG_ERROR([llvm-config not found, but required when compiling --with-llvm, specify with LLVM_CONFIG=]) + fi + # check if detected $LLVM_CONFIG is executable + pgac_llvm_version="$($LLVM_CONFIG --version 2> /dev/null || echo no)" + if test "x$pgac_llvm_version" = "xno"; then + AC_MSG_ERROR([$LLVM_CONFIG does not work]) + fi + # and whether the version is supported + if echo $pgac_llvm_version | $AWK -F '.' '{ if ([$]1 >= 4 || ([$]1 == 3 && [$]2 >= 9)) exit 1; else exit 0;}';then + AC_MSG_ERROR([$LLVM_CONFIG version is $pgac_llvm_version but at least 3.9 is required]) + fi + + # need clang to create some bitcode files + AC_ARG_VAR(CLANG, [path to clang compiler to generate bitcode]) + PGAC_PATH_PROGS(CLANG, clang clang-6.0 clang-5.0 clang-4.0 clang-3.9) + if test -z "$CLANG"; then + AC_MSG_ERROR([clang not found, but required when compiling --with-llvm, specify with CLANG=]) + fi + # make sure clang is executable + if test "x$($CLANG --version 2> /dev/null || echo no)" = "xno"; then + AC_MSG_ERROR([$CLANG does not work]) + fi + # Could check clang version, but it doesn't seem that + # important. Systems with a new enough LLVM version are usually + # going to have a decent clang version too. It's also not entirely + # clear what the minimum version is. + + # Collect compiler flags necessary to build the LLVM dependent + # shared library. + for pgac_option in `$LLVM_CONFIG --cppflags`; do + case $pgac_option in + -I*|-D*) LLVM_CPPFLAGS="$pgac_option $LLVM_CPPFLAGS";; + esac + done + + for pgac_option in `$LLVM_CONFIG --ldflags`; do + case $pgac_option in + -L*) LDFLAGS="$LDFLAGS $pgac_option";; + esac + done + + # ABI influencing options, standard influencing options + for pgac_option in `$LLVM_CONFIG --cxxflags`; do + case $pgac_option in + -fno-rtti*) LLVM_CXXFLAGS="$LLVM_CXXFLAGS $pgac_option";; + -std=*) LLVM_CXXFLAGS="$LLVM_CXXFLAGS $pgac_option";; + esac + done + + # Look for components we're interested in, collect necessary + # libs. As some components are optional, we can't just list all of + # them as it'd raise an error. + pgac_components=''; + for pgac_component in `$LLVM_CONFIG --components`; do + case $pgac_component in + engine) pgac_components="$pgac_components $pgac_component";; + debuginfodwarf) pgac_components="$pgac_components $pgac_component";; + orcjit) pgac_components="$pgac_components $pgac_component";; + passes) pgac_components="$pgac_components $pgac_component";; + perfjitevents) pgac_components="$pgac_components $pgac_component";; + esac + done; + + # And then get the libraries that need to be linked in for the + # selected components. They're large libraries, we only want to + # link them into the LLVM using shared library. + for pgac_option in `$LLVM_CONFIG --libs --system-libs $pgac_components`; do + case $pgac_option in + -l*) LLVM_LIBS="$LLVM_LIBS $pgac_option";; + esac + done + + LLVM_BINPATH=`$LLVM_CONFIG --bindir` + + # Check which functionality is present + SAVE_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $LLVM_CPPFLAGS" + AC_CHECK_DECLS([LLVMOrcGetSymbolAddressIn, LLVMOrcRegisterGDB, LLVMOrcRegisterPerf], [], [], [[#include <llvm-c/OrcBindings.h>]]) + AC_CHECK_DECLS([LLVMGetHostCPUName], [], [], [[#include <llvm-c/TargetMachine.h>]]) + CPPFLAGS="$SAVE_CPPFLAGS" + + # LLVM_CONFIG, CLANG are already output via AC_ARG_VAR + AC_SUBST(LLVM_LIBS) + AC_SUBST(LLVM_CPPFLAGS) + AC_SUBST(LLVM_CFLAGS) + AC_SUBST(LLVM_CXXFLAGS) + AC_SUBST(LLVM_BINPATH) + +])# PGAC_LLVM_SUPPORT |