clover: Fix build with LLVM 3.3 v2
authorTom Stellard <thomas.stellard@amd.com>
Fri, 22 Feb 2013 18:19:14 +0000 (19:19 +0100)
committerTom Stellard <thomas.stellard@amd.com>
Thu, 28 Feb 2013 21:01:23 +0000 (16:01 -0500)
v2:
  - Fix order that the clang libraries are passed to the linker to avoid
    missing symbol errors.

Acked-by: Francisco Jerez <currojerez@riseup.net>
src/gallium/state_trackers/clover/llvm/invocation.cpp
src/gallium/targets/opencl/Makefile.am

index 0bd8e22f8eb0a2f46dd42fc72452ab9a76a1213a..2785d10310a42e313cb918573d516a3f60327fad 100644 (file)
 #include <clang/CodeGen/CodeGenAction.h>
 #include <llvm/Bitcode/BitstreamWriter.h>
 #include <llvm/Bitcode/ReaderWriter.h>
-#include <llvm/DerivedTypes.h>
 #include <llvm/Linker.h>
+#if HAVE_LLVM < 0x0303
+#include <llvm/DerivedTypes.h>
 #include <llvm/LLVMContext.h>
 #include <llvm/Module.h>
+#else
+#include <llvm/IR/DerivedTypes.h>
+#include <llvm/IR/LLVMContext.h>
+#include <llvm/IR/Module.h>
+#include <llvm/Support/IRReader.h>
+#endif
 #include <llvm/PassManager.h>
 #include <llvm/Support/TargetSelect.h>
 #include <llvm/Support/MemoryBuffer.h>
 
 #if HAVE_LLVM < 0x0302
 #include <llvm/Target/TargetData.h>
-#else
+#elif HAVE_LLVM < 0x0303
 #include <llvm/DataLayout.h>
+#else
+#include <llvm/IR/DataLayout.h>
 #endif
 
 #include "pipe/p_state.h"
@@ -151,7 +160,11 @@ namespace {
       // Add libclc generic search path
       c.getHeaderSearchOpts().AddPath(LIBCLC_INCLUDEDIR,
                                       clang::frontend::Angled,
-                                      false, false, false);
+                                      false, false
+#if HAVE_LLVM < 0x0303
+                                      , false
+#endif
+                                      );
 
       // Add libclc include
       c.getPreprocessorOpts().Includes.push_back("clc/clc.h");
@@ -167,8 +180,12 @@ namespace {
       c.getInvocation().setLangDefaults(c.getLangOpts(), clang::IK_OpenCL,
                                         clang::LangStandard::lang_opencl11);
 #endif
-      c.createDiagnostics(0, NULL, new clang::TextDiagnosticPrinter(
-                          s_log,
+      c.createDiagnostics(
+#if HAVE_LLVM < 0x0303
+                          0, NULL,
+#endif
+                          new clang::TextDiagnosticPrinter(
+                                 s_log,
 #if HAVE_LLVM <= 0x0301
                                  c.getDiagnosticOpts()));
 #else
@@ -201,12 +218,26 @@ namespace {
 
       llvm::PassManager PM;
       llvm::PassManagerBuilder Builder;
-      bool isNative;
-      llvm::Linker linker("clover", mod);
+      llvm::sys::Path libclc_path =
+                            llvm::sys::Path(LIBCLC_LIBEXECDIR + triple + ".bc");
 
       // Link the kernel with libclc
-      linker.LinkInFile(llvm::sys::Path(LIBCLC_LIBEXECDIR + triple + ".bc"), isNative);
+#if HAVE_LLVM < 0x0303
+      bool isNative;
+      llvm::Linker linker("clover", mod);
+      linker.LinkInFile(libclc_path, isNative);
       mod = linker.releaseModule();
+#else
+      std::string err_str;
+      llvm::SMDiagnostic err;
+      llvm::Module *libclc_mod = llvm::ParseIRFile(libclc_path.str(), err,
+                                                   mod->getContext());
+      if (llvm::Linker::LinkModules(mod, libclc_mod,
+                                    llvm::Linker::DestroySource,
+                                    &err_str)) {
+         throw build_error(err_str);
+      }
+#endif
 
       // Add a function internalizer pass.
       //
index c5c30030cad1969d2844bfcbae6153ed7f8d5c50..389eecc9d932c2c2fe121e9cba6aee4baa7fe6e1 100644 (file)
@@ -21,9 +21,9 @@ libOpenCL_la_LIBADD = \
        -lclangSema \
        -lclangAnalysis \
        -lclangAST \
+       -lclangEdit \
        -lclangLex \
        -lclangBasic \
-       -lclangEdit \
        $(LLVM_LIBS)