[Beignet] [Patch V2 2/2] Add llvm3.6 build support.

Song, Ruiling ruiling.song at intel.com
Wed Feb 11 18:08:38 PST 2015



> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Wednesday, February 11, 2015 4:26 PM
> To: Yang, Rong R
> Cc: beignet at lists.freedesktop.org
> Subject: Re: [Beignet] [Patch V2 2/2] Add llvm3.6 build support.
> 
> Some minor comments as below:
> 
> On Wed, Feb 11, 2015 at 03:44:58PM +0800, Yang Rong wrote:
> > There are some changes from llvm3.5:
> > 1. Some functions return std::unique_ptr instead of pointer.
> > 2. MetaNode to Value and Value to MetaNode.
> >
> > V2: Fix llvm3.5 build error.
> > Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> > ---
> >  backend/src/backend/gen_program.cpp    | 10 ++++++++++
> >  backend/src/backend/program.cpp        |  4 ++++
> >  backend/src/llvm/llvm_bitcode_link.cpp | 35
> > ++++++++++++++++++++++++++++++----
> >  backend/src/llvm/llvm_gen_backend.cpp  | 23
> ++++++++++++++++++++--
> >  backend/src/llvm/llvm_passes.cpp       |  5 ++++-
> >  backend/src/llvm/llvm_to_gen.cpp       | 16 +++++++++++++---
> >  backend/src/llvm/llvm_unroll.cpp       | 14 ++++++++++++++
> >  7 files changed, 97 insertions(+), 10 deletions(-)
> >
> > diff --git a/backend/src/backend/gen_program.cpp
> > b/backend/src/backend/gen_program.cpp
> > index 4cfb703..5d36975 100644
> > --- a/backend/src/backend/gen_program.cpp
> > +++ b/backend/src/backend/gen_program.cpp
> > @@ -257,9 +257,15 @@ namespace gbe {
> >      llvm::StringRef llvm_bin_str(binary_content);
> >      llvm::LLVMContext& c = llvm::getGlobalContext();
> >      llvm::SMDiagnostic Err;
> > +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
> > +    std::unique_ptr<llvm::MemoryBuffer> memory_buffer =
> llvm::MemoryBuffer::getMemBuffer(llvm_bin_str, "llvm_bin_str");
> > +    acquireLLVMContextLock();
> > +    llvm::Module* module =
> > +llvm::parseIR(memory_buffer->getMemBufferRef(), Err, c).release();
> > +#else
> >      llvm::MemoryBuffer* memory_buffer =
> llvm::MemoryBuffer::getMemBuffer(llvm_bin_str, "llvm_bin_str");
> >      acquireLLVMContextLock();
> >      llvm::Module* module = llvm::ParseIR(memory_buffer, Err, c);
> > +#endif
> >      releaseLLVMContextLock();
> >      if(module == NULL){
> >        GBE_ASSERT(0);
> > @@ -386,10 +392,14 @@ namespace gbe {
> >      }else{
> >        llvm::Module* src =
> (llvm::Module*)((GenProgram*)src_program)->module;
> >        llvm::Module* dst =
> > (llvm::Module*)((GenProgram*)dst_program)->module;
> > +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6
> > +      llvm::Linker::LinkModules(dst, src);
> Then how to get back the errMsg with LLVM 3.6?

I have a look at the tools/clang/lib/CodeGen/CodeGenAction.cpp
It define an function BackendConsumer::linkerDiagnosticHandler() as the DiagnosticHandler, and pass it to LinkModules().
We can use same kind of logic here.

 
> > +#else
> 
> 
> >        llvm::Linker::LinkModules( dst,
> >                                   src,
> >                                   llvm::Linker::PreserveSource,
> >                                   &errMsg);
> > +#endif
> >        if (errMsg.c_str() != NULL) {
> >          if (err != NULL && errSize != NULL && stringSize > 0u) {
> >            if(errMsg.length() < stringSize ) diff --git
> > a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
> > index 38ce9c8..06810bd 100644
> > --- a/backend/src/backend/program.cpp
> > +++ b/backend/src/backend/program.cpp
> > @@ -621,7 +621,11 @@ namespace gbe {
> >      if (!retVal)
> >        return false;
> >
> > +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5
> >      llvm::Module *module = Act->takeModule();
> > +#else
> > +    llvm::Module *module = Act->takeModule().release(); #endif
> >
> >      *out_module = module;
> >      return true;
> > diff --git a/backend/src/llvm/llvm_bitcode_link.cpp
> > b/backend/src/llvm/llvm_bitcode_link.cpp
> > index d3058d6..f67ebe0 100644
> > --- a/backend/src/llvm/llvm_bitcode_link.cpp
> > +++ b/backend/src/llvm/llvm_bitcode_link.cpp
> > @@ -67,7 +67,11 @@ namespace gbe
> >      }
> >      assert(findBC);
> >
> > +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5
> >      oclLib = getLazyIRFileModule(FilePath, Err, ctx);
> > +#else
> > +    oclLib = getLazyIRFileModule(FilePath, Err, ctx).release();
> > +#endif
> >      if (!oclLib) {
> >        printf("Fatal Error: ocl lib can not be opened\n");
> >        return NULL;
> > @@ -110,20 +114,26 @@ namespace gbe
> >          if (!newMF) {
> >            newMF = src.getFunction(fnName);
> >            if (!newMF) {
> > -	    printf("Can not find the lib: %s\n", fnName.c_str());
> > -	    return false;
> > +            printf("Can not find the lib: %s\n", fnName.c_str());
> > +            return false;
> >            }
> > -	  fromSrc = true;
> > +            fromSrc = true;
> >          }
> >
> >          std::string ErrInfo;// = "Not Materializable";
> >          if (!fromSrc && newMF->isMaterializable()) {
> > +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5
> >            if (newMF->Materialize(&ErrInfo)) {
> >              printf("Can not materialize the function: %s,
> because %s\n", fnName.c_str(), ErrInfo.c_str());
> >              return false;
> >            }
> > +#else
> > +          if (newMF->materialize()) {
> The same concern as the above one, then we will not know the reason why
> it fail? Or is there any other mechanism to get it? Also the same concerns for
> the following similar calls.

I find llvm 3.6 use std::error_code as the return value of materialize.
We can write like:
if(std::error_code EC = newMF->materialize()) {
	printf("Can not materialize the function: %s,  because %s\n", fnName.c_str(), EC.message());
}
> 
> > +            printf("Can not materialize the function: %s\n",
> fnName.c_str());
> > +            return false;
> > +          }
> > +#endif
> >          }
> > -
> >          if (!materializedFuncCall(src, lib, *newMF, MFS))
> >            return false;
> >
> > @@ -209,12 +219,21 @@ namespace gbe
> >        }
> >        std::string ErrInfo;// = "Not Materializable";
> >        if (newMF->isMaterializable()) {
> > +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5
> >          if (newMF->Materialize(&ErrInfo)) {
> >            printf("Can not materialize the function: %s, because %s\n",
> fnName.c_str(), ErrInfo.c_str());
> >            delete clonedLib;
> >            return NULL;
> >          }
> >        }
> > +#else
> > +        if (newMF->materialize()) {
> > +          printf("Can not materialize the function: %s\n",
> fnName.c_str());
> > +          delete clonedLib;
> > +          return NULL;
> > +        }
> > +      }
> > +#endif
> >
> >        if (!materializedFuncCall(*mod, *clonedLib, *newMF,
> materializedFuncs)) {
> >          delete clonedLib;
> > @@ -227,11 +246,19 @@ namespace gbe
> >      /* We use beignet's bitcode as dst because it will have a lot of
> >         lazy functions which will not be loaded. */
> >      std::string errorMsg;
> > +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 5
> >      if(Linker::LinkModules(clonedLib, mod, Linker::DestroySource,
> &errorMsg)) {
> >        delete clonedLib;
> >        printf("Fatal Error: link the bitcode error:\n%s\n",
> errorMsg.c_str());
> >        return NULL;
> >      }
> > +#else
> > +    if(Linker::LinkModules(clonedLib, mod)) {
> > +      delete clonedLib;

> > diff --git a/backend/src/llvm/llvm_passes.cpp
> > b/backend/src/llvm/llvm_passes.cpp
> > index 5c0a2e0..1b40389 100644
> > --- a/backend/src/llvm/llvm_passes.cpp
> > +++ b/backend/src/llvm/llvm_passes.cpp
> > @@ -59,7 +59,6 @@
> >  #include "llvm/ADT/SmallString.h"
> >  #include "llvm/ADT/STLExtras.h"
> >  #include "llvm/Analysis/ConstantsScanner.h"
> > -#include "llvm/Analysis/FindUsedTypes.h"
> If this header file is not needed for both 3.3/3.4 and 3.5, it's better to use a
> separate patch to remove it.
> 
> The other part LGTM.
> 
> Thanks,
> Zhigang Gong.
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list