+dnl
+dnl LLVM
+dnl
+AC_ARG_ENABLE([llvm-shared-libs],
+ [AS_HELP_STRING([--enable-llvm-shared-libs],
+ [link with LLVM shared libraries @<:@default=enabled@:>@])],
+ [enable_llvm_shared_libs="$enableval"],
+ [enable_llvm_shared_libs=yes])
+
+AC_ARG_WITH([llvm-prefix],
+ [AS_HELP_STRING([--with-llvm-prefix],
+ [Prefix for LLVM installations in non-standard locations])],
+ [llvm_prefix="$withval"],
+ [llvm_prefix=''])
+
+PKG_CHECK_MODULES([LIBELF], [libelf], [have_libelf=yes], [have_libelf=no])
+if test "x$have_libelf" = xno; then
+ LIBELF_LIBS=''
+ LIBELF_CFLAGS=''
+ AC_CHECK_LIB([elf], [elf_memory], [have_libelf=yes;LIBELF_LIBS=-lelf], [have_libelf=no])
+ AC_SUBST([LIBELF_LIBS])
+ AC_SUBST([LIBELF_CFLAGS])
+fi
+
+if test -z "$LLVM_CONFIG"; then
+ if test -n "$llvm_prefix"; then
+ AC_PATH_TOOL([LLVM_CONFIG], [llvm-config], [no], ["$llvm_prefix/bin"])
+ else
+ AC_PATH_TOOL([LLVM_CONFIG], [llvm-config], [no])
+ fi
+fi
+
+llvm_add_component() {
+ new_llvm_component=$1
+ driver_name=$2
+
+ if $LLVM_CONFIG --components | grep -iqw $new_llvm_component ; then
+ LLVM_COMPONENTS="${LLVM_COMPONENTS} ${new_llvm_component}"
+ else
+ AC_MSG_ERROR([LLVM component '$new_llvm_component' not enabled in your LLVM build. Required by $driver_name.])
+ fi
+}
+
+llvm_add_default_components() {
+ driver_name=$1
+
+ # Required default components
+ llvm_add_component "bitwriter" $driver_name
+ llvm_add_component "engine" $driver_name
+ llvm_add_component "mcdisassembler" $driver_name
+ llvm_add_component "mcjit" $driver_name
+
+ # Optional default components
+ if $LLVM_CONFIG --components | grep -iqw inteljitevents ; then
+ LLVM_COMPONENTS="$LLVM_COMPONENTS inteljitevents"
+ fi
+}
+
+llvm_add_target() {
+ new_llvm_target=$1
+ driver_name=$2
+
+ if $LLVM_CONFIG --targets-built | grep -iqw $new_llvm_target ; then
+ llvm_add_component $new_llvm_target $driver_name
+ else
+ AC_MSG_ERROR([LLVM target '$new_llvm_target' not enabled in your LLVM build. Required by $driver_name.])
+ fi
+}
+
+# Call this inside ` ` to get the return value.
+# $1 is the llvm-config command with arguments.
+strip_unwanted_llvm_flags() {
+ # Use \> (marks the end of the word)
+ echo `$1` | sed \
+ -e 's/-march=\S*//g' \
+ -e 's/-mtune=\S*//g' \
+ -e 's/-mcpu=\S*//g' \
+ -e 's/-DNDEBUG\>//g' \
+ -e 's/-D_GNU_SOURCE\>//g' \
+ -e 's/-pedantic\>//g' \
+ -e 's/-Wcovered-switch-default\>//g' \
+ -e 's/-O.\>//g' \
+ -e 's/-g\>//g' \
+ -e 's/-Wall\>//g' \
+ -e 's/-Wcast-qual\>//g' \
+ -e 's/-Woverloaded-virtual\>//g' \
+ -e 's/-fcolor-diagnostics\>//g' \
+ -e 's/-fdata-sections\>//g' \
+ -e 's/-ffunction-sections\>//g' \
+ -e 's/-fno-exceptions\>//g' \
+ -e 's/-fomit-frame-pointer\>//g' \
+ -e 's/-fvisibility-inlines-hidden\>//g' \
+ -e 's/-fPIC\>//g' \
+ -e 's/-fstack-protector-strong\>//g'
+}
+
+llvm_set_environment_variables() {
+ if test "x$LLVM_CONFIG" != xno; then
+ LLVM_VERSION=`$LLVM_CONFIG --version | egrep -o '^[[0-9.]]+'`
+ LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
+ LLVM_BINDIR=`$LLVM_CONFIG --bindir`
+ LLVM_CPPFLAGS=`strip_unwanted_llvm_flags "$LLVM_CONFIG --cppflags"`
+ LLVM_CFLAGS=$LLVM_CPPFLAGS # CPPFLAGS seem to be sufficient
+ LLVM_CXXFLAGS=`strip_unwanted_llvm_flags "$LLVM_CONFIG --cxxflags"`
+ LLVM_INCLUDEDIR=`$LLVM_CONFIG --includedir`
+ LLVM_LIBDIR=`$LLVM_CONFIG --libdir`
+
+ AC_COMPUTE_INT([LLVM_VERSION_MAJOR], [LLVM_VERSION_MAJOR],
+ [#include "${LLVM_INCLUDEDIR}/llvm/Config/llvm-config.h"])
+ AC_COMPUTE_INT([LLVM_VERSION_MINOR], [LLVM_VERSION_MINOR],
+ [#include "${LLVM_INCLUDEDIR}/llvm/Config/llvm-config.h"])
+ AC_COMPUTE_INT([LLVM_VERSION_PATCH], [LLVM_VERSION_PATCH],
+ [#include "${LLVM_INCLUDEDIR}/llvm/Config/llvm-config.h"])
+
+ # Only needed for LLVM < 3.6.0
+ if test -z "$LLVM_VERSION_PATCH"; then
+ LLVM_VERSION_PATCH=0
+ fi
+
+ if test "$LLVM_VERSION_MINOR" -lt 10; then
+ LLVM_VERSION_INT="${LLVM_VERSION_MAJOR}0${LLVM_VERSION_MINOR}"
+ else
+ LLVM_VERSION_INT="${LLVM_VERSION_MAJOR}${LLVM_VERSION_MINOR}"
+ fi
+
+ DEFINES="${DEFINES} -DHAVE_LLVM=0x0$LLVM_VERSION_INT -DMESA_LLVM_VERSION_PATCH=$LLVM_VERSION_PATCH"
+ MESA_LLVM=1
+ else
+ MESA_LLVM=0
+ LLVM_VERSION_INT=0
+ fi
+}
+
+llvm_check_version_for() {
+ if test "x$MESA_LLVM" = x0; then
+ AC_MSG_ERROR([LLVM $1 or newer is required for $2])
+ return
+ fi
+
+ llvm_target_version_major=`echo $1 | cut -d. -f1 | egrep -o '^[[0-9]]+'`
+ llvm_target_version_minor=`echo $1 | cut -d. -f2 | egrep -o '^[[0-9]]+'`
+ llvm_target_version_patch=`echo $1 | cut -d. -f3 | egrep -o '^[[0-9]]+'`
+
+ if test "$LLVM_VERSION_MAJOR" -gt "$llvm_target_version_major"; then
+ # major > required major
+ # --> OK
+ return
+ fi
+
+ if test "$LLVM_VERSION_MAJOR" -eq "$llvm_target_version_major"; then
+ if test "$LLVM_VERSION_MINOR" -gt "$llvm_target_version_minor"; then
+ # major = required major and
+ # minor > required minor
+ # --> OK
+ return
+ else
+ if test "$LLVM_VERSION_MINOR" -eq "$llvm_target_version_minor"; then
+ if test "$LLVM_VERSION_PATCH" -ge "$llvm_target_version_patch"; then
+ # major = required major and
+ # minor = required minor and
+ # patch >= required patch
+ # --> OK
+ return
+ fi
+ fi
+ fi
+ fi
+
+ AC_MSG_ERROR([LLVM $1 or newer is required for $2])
+}
+
+radeon_llvm_check() {
+ if test ${LLVM_VERSION_INT} -lt 307; then
+ amdgpu_llvm_target_name='r600'
+ else
+ amdgpu_llvm_target_name='amdgpu'
+ fi
+
+ llvm_check_version_for $*
+
+ llvm_add_target $amdgpu_llvm_target_name $2
+
+ llvm_add_default_components $2
+ llvm_add_component "bitreader" $2
+ llvm_add_component "ipo" $2
+
+ NEED_RADEON_LLVM=yes
+ if test "x$have_libelf" != xyes; then
+ AC_MSG_ERROR([$1 requires libelf when using llvm])
+ fi
+}
+
+llvm_set_environment_variables
+
+AC_SUBST([MESA_LLVM])
+AC_SUBST([LLVM_BINDIR])
+AC_SUBST([LLVM_CFLAGS])
+AC_SUBST([LLVM_CPPFLAGS])
+AC_SUBST([LLVM_CXXFLAGS])
+AC_SUBST([LLVM_LIBDIR])
+AC_SUBST([LLVM_LIBS])
+AC_SUBST([LLVM_LDFLAGS])
+AC_SUBST([LLVM_INCLUDEDIR])
+AC_SUBST([LLVM_VERSION])
+