radeon: Support LLVM 3.2
authorTom Stellard <thomas.stellard@amd.com>
Thu, 10 May 2012 14:21:54 +0000 (10:21 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Mon, 1 Oct 2012 15:37:17 +0000 (15:37 +0000)
LLVM 3.2 and newer requires that the R600/SI backend be part of the
LLVM tree.

configure.ac
src/gallium/drivers/radeon/Makefile
src/gallium/drivers/radeon/Makefile.sources
src/gallium/drivers/radeon/radeon_llvm_emit.cpp

index 896f98a53bb5d78acdec43f878e2eafc04f9a57f..32f412b48e9261e96ee1dc58df0c2f992262c5af 100644 (file)
@@ -1661,6 +1661,7 @@ if test "x$enable_gallium_llvm" = xyes; then
             if $LLVM_CONFIG --components | grep -q '\<mcjit\>'; then
                 LLVM_COMPONENTS="${LLVM_COMPONENTS} mcjit"
             fi
+            LLVM_COMPONENTS="${LLVM_COMPONENTS} all-targets"
             if test "x$enable_opencl" = xyes; then
                 LLVM_COMPONENTS="${LLVM_COMPONENTS} ipo linker instrumentation"
             fi
@@ -1782,6 +1783,23 @@ gallium_require_drm_loader() {
     fi
 }
 
+radeon_llvm_check() {
+    LLVM_VERSION_MAJOR=`echo $LLVM_VERSION | cut -d. -f1`
+    if test "$LLVM_VERSION_MAJOR" -lt "3" -o "x$LLVM_VERSION" = "x3.0"; then
+        AC_MSG_ERROR([LLVM 3.1 or newer is required for the r600/radeonsi llvm compiler.])
+    fi
+    if test "$LLVM_VERSION_MAJOR" -ge "3" -a "x$LLVM_VERSION" != "x3.1" && $LLVM_CONFIG --targets-built | grep -qv '\<AMDGPU\>' ; then
+        AC_MSG_ERROR([To use the r600/radeonsi LLVM backend with LLVM 3.2 and newer, you need to fetch the LLVM source from:
+                      git://people.freedesktop.org/~tstellar/llvm master
+                      and build with --enable-experimental-targets==AMDGPU])
+    fi
+    if test "$LLVM_VERSION" = "3.2"; then
+        dnl LLVM 3.2 does not add experimental libraries to llvm-config's
+        dnl library list.
+        LLVM_LIBS="$LLVM_LIBS -lLLVMAMDGPUCodeGen -lLLVMAMDGPUDesc -lLLVMAMDGPUAsmPrinter -lLLVMAMDGPUInfo `$LLVM_CONFIG --libs mc`"
+    fi
+}
+
 dnl Gallium drivers
 dnl Duplicates in GALLIUM_DRIVERS_DIRS are removed by sorting it after this block
 if test "x$with_gallium_drivers" != x; then
@@ -1812,9 +1830,7 @@ if test "x$with_gallium_drivers" != x; then
             gallium_require_drm_loader
             GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r600"
             if test "x$enable_r600_llvm" = xyes -o "x$enable_opencl" = xyes; then
-                if test "x$LLVM_VERSION" != "x3.1"; then
-                    AC_MSG_ERROR([LLVM 3.1 is required for the r600 llvm compiler.])
-                fi
+                radeon_llvm_check
                 NEED_RADEON_GALLIUM=yes;
             fi
             if test "x$enable_r600_llvm" = xyes; then
@@ -1829,9 +1845,7 @@ if test "x$with_gallium_drivers" != x; then
             PKG_CHECK_MODULES([RADEON], [libdrm_radeon >= $LIBDRM_RADEON_REQUIRED])
             gallium_require_drm_loader
             GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS radeonsi"
-            if test "x$LLVM_VERSION" != "x3.1"; then
-                AC_MSG_ERROR([LLVM 3.1 is required to build the radeonsi driver.])
-            fi
+            radeon_llvm_check
            NEED_RADEON_GALLIUM=yes;
             gallium_check_st "radeon/drm" "dri-radeonsi" "xorg-radeonsi" "" "" "vdpau-radeonsi" ""
             ;;
index 7f1c61352e3db9f77a30872384f38bbe6e35f721..bcc2646dd5f16842c8e218a54477b5ef9d32d8e7 100644 (file)
@@ -12,6 +12,12 @@ TBLGEN = $(LLVM_BINDIR)/llvm-tblgen
 
 CXXFLAGS+= $(LLVM_CXXFLAGS)
 
+ifeq ($(LLVM_VERSION),3.1)
+       CPP_SOURCES += $(LLVM_CPP_SOURCES)
+else
+       CXXFLAGS+= -DEXTERNAL_LLVM
+endif
+
 include ../../Makefile.template
 
 CXXFLAGS := $(filter-out -DDEBUG, $(CXXFLAGS))
index c5d1207451adbd7bde55e0a57c01c89bf3093a5b..5e793422d66ece00124bab550b1ce6222e72862c 100644 (file)
@@ -23,8 +23,7 @@ TD_FILES := \
        SIRegisterInfo.td       \
        SISchedule.td
 
-
-GENERATED_SOURCES := \
+LLVM_GENERATED_SOURCES := \
        R600Intrinsics.td               \
        R600RegisterInfo.td             \
        SIRegisterInfo.td               \
@@ -41,7 +40,7 @@ GENERATED_SOURCES := \
        AMDGPUGenMCCodeEmitter.inc      \
        AMDGPUGenDFAPacketizer.inc
 
-CPP_SOURCES := \
+LLVM_CPP_SOURCES := \
        AMDIL7XXDevice.cpp              \
        AMDILCFGStructurizer.cpp        \
        AMDILDevice.cpp                 \
@@ -81,6 +80,8 @@ CPP_SOURCES := \
        MCTargetDesc/SIMCCodeEmitter.cpp \
        MCTargetDesc/R600MCCodeEmitter.cpp \
        TargetInfo/AMDGPUTargetInfo.cpp \
+
+CPP_SOURCES := \
        radeon_llvm_emit.cpp
 
 C_SOURCES := \
index 1b67bfea68594f768377628309ff7fdd1ca0dcc2..625b0b491d65ad8fe88c7c74360dd4e5c3eaabd5 100644 (file)
@@ -90,6 +90,7 @@ radeon_llvm_compile(LLVMModuleRef M, unsigned char ** bytes,
    /* XXX: Can we just initialize the AMDGPU target here? */
    InitializeAllTargets();
    InitializeAllTargetMCs();
+   InitializeAllAsmPrinters();
 #else
    LLVMInitializeAMDGPUTargetInfo();
    LLVMInitializeAMDGPUTarget();