compatible issue between SPIR and LLVM/Clang 3.9+


SPIR1.2 is defined using LLVM 3.2, and SPIR2.0 is defined using LLVM3.4. And, SPIR is also one of the possible output for SYCL device compiler (and SPIR is chosen in real production computecpp from codeplay) .

But latest LLVM/clang (for example version 3.9) is not compatible with LLVM 3.2/3.4, mainly in two parts:

  1. some metadata is changed from module level to function level in llvm 3.9.
    for example, the kernel function flag. If spir is pared with llvm/clang 3.9, no kernel function could be found.

  2. mangle is changed (fixed to be correct for Itanium ABI) in llvm3.9. see
    with this change, the function name/parameters in spir could not be demangled correctly with llvm3.9.

In open source community, it is nature to follow the new version of llvm/clang, but it conflicts with spir. Do we have any plan to discuss/resolve it? thanks.


sorry, but does this relative to the compatible issue?

btw, as far as i know, clang compiles opencl kernel from source code to llvm IR, and then it is up to hardware vendor to convert llvm IR to hardware instructions.


Not sure if this is relevant, but I noticed it’s possible to use eg-Dllvm=llvm_40, when compiling llvm, in order to rename the namespace. This means it’s possible to link with both llvm versions, hopefully without issue. You can see a gist of the symbol dump of LLVMCore, after building with this define, here: