diff options
-rw-r--r-- | .SRCINFO | 46 | ||||
-rw-r--r-- | GBE-let-GenRegister-reg-never-return-uninitialized-m.patch | 37 | ||||
-rw-r--r-- | PKGBUILD | 116 | ||||
-rw-r--r-- | llvm10.patch | 358 | ||||
-rw-r--r-- | llvm8.patch | 71 | ||||
-rw-r--r-- | llvm9.patch | 113 | ||||
-rw-r--r-- | utests_add_limits.patch | 11 |
7 files changed, 703 insertions, 49 deletions
@@ -1,33 +1,35 @@ pkgbase = beignet-git - pkgdesc = A GPGPU System for Intel Ivybridge GPUs - pkgver = Release_v1.0.0.r676.gad86ed3 + pkgdesc = An open source OpenCL implementation for Intel IvyBridge & Haswell iGPUs + pkgver = 1.0.0.r1396.gf72309a5 pkgrel = 2 - url = http://cgit.freedesktop.org/beignet/ + url = https://01.org/beignet arch = x86_64 - license = LGPL2.1 - makedepends = clang + license = LGPL + makedepends = git + makedepends = llvm70 makedepends = cmake - makedepends = python2 + makedepends = ninja + makedepends = python + makedepends = ocl-icd depends = glu - depends = libsm - depends = libxext + depends = clang70 depends = mesa - depends = ncurses - depends = ocl-icd - depends = llvm + depends = opencl-headers + provides = beignet provides = opencl-intel - provides = opencl-headers - provides = opencl-headers12 + provides = opencl-driver conflicts = beignet - conflicts = opencl-intel - conflicts = opencl-headers - conflicts = opencl-headers12 - replaces = beignet - replaces = opencl-intel - replaces = opencl-headers - replaces = opencl-headers12 - source = git://anongit.freedesktop.org/beignet + source = git+https://github.com/intel/beignet.git + source = GBE-let-GenRegister-reg-never-return-uninitialized-m.patch + source = utests_add_limits.patch + source = llvm8.patch + source = llvm9.patch + source = llvm10.patch sha256sums = SKIP + sha256sums = c1f5880bb192103c371d51f57f646837ca01a8bbe012b9022d4e345c2f1187de + sha256sums = 584dd293856ddfc76ca9e50488aa2076239ab568a945e957ca3221e2d30b1c52 + sha256sums = d24e4d8a1a791dc02c91117f900143789dd6f01eaa89292ad67c4fb4eaf84328 + sha256sums = 5913a93fe6ef77b91480bb6d27c7875673294c0a8a924b2ac66756d0d3577908 + sha256sums = 2eb9b0801e24f4e537033b41a6bc462e4082f6216d62933240ca3010020ea779 pkgname = beignet-git - diff --git a/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch b/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch new file mode 100644 index 000000000000..7f6efa7d14b1 --- /dev/null +++ b/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch @@ -0,0 +1,37 @@ +From e837f9f4c6133d8ef56923ffbdbca224b1d7aa23 Mon Sep 17 00:00:00 2001 +From: Michael Lass <bevan@bi-co.net> +Date: Sun, 1 Dec 2019 13:05:45 +0100 +Subject: [PATCH] GBE: let GenRegister::reg() never return uninitialized memory + +GenRegister::reg() is called throughout the code, not only on virtual +but also on physical registers. For the latter, value.reg is not +initialized and therefore reg() returns uninitialized memory, leading to +undefined behavior. Make sure to always return initialized memory by +returning a valid ir::Register, even for physical registers. + +Fixes https://gitlab.freedesktop.org/beignet/beignet/issues/12 +--- + backend/src/backend/gen_register.hpp | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/backend/src/backend/gen_register.hpp b/backend/src/backend/gen_register.hpp +index 6c73f5e6..78846c91 100644 +--- a/backend/src/backend/gen_register.hpp ++++ b/backend/src/backend/gen_register.hpp +@@ -243,7 +243,12 @@ namespace gbe + } + + /*! Return the IR virtual register */ +- INLINE ir::Register reg(void) const { return ir::Register(value.reg); } ++ INLINE ir::Register reg(void) const { ++ if (this->physical) ++ return ir::Register(); ++ else ++ return ir::Register(value.reg); ++ } + + /*! For immediates or virtual register */ + union { +-- +2.24.0 + @@ -1,37 +1,99 @@ -# Current Maintainer: Sean Lynch <seanl@literati.org> +# Maintainer: Michael Lass <bevan@bi-co.net> +# Contributor: Sean Lynch <seanl@literati.org> +# Contributor: Bruno Pagani <archange@archlinux.org> +# Contributor: Antoine Lubineau <antoine@lubignon.info> +# Contributor: Leopold Bloom <blinxwang@gmail.com> +# Contributor: Michal Krenek (a.k.a. Mikos) <m.krenek@gmail.com> + +# This PKGBUILD is maintained on github: +# https://github.com/michaellass/AUR + +# For me, utests fail when built with Clang 10. I therefore by default stick to +# Clang 7 for which no unofficial patches are required. Patches to build against +# Clang 8, 9 or 10 are however included and can be simply commented in. +# - Michael + pkgname=beignet-git -pkgver=1.0.0.r799.gcf95b44 -pkgrel=1 -pkgdesc='A GPGPU System for Intel Ivybridge GPUs' -arch=('x86_64') -url='http://cgit.freedesktop.org/beignet/' -license=('LGPL2.1') -depends=('glu' 'libsm' 'libxext' 'mesa' 'ncurses' 'ocl-icd' 'llvm') -makedepends=('clang' 'cmake' 'python2') -provides=('opencl-intel' 'opencl-headers' 'opencl-headers12') -conflicts=('beignet' 'opencl-intel' 'opencl-headers' 'opencl-headers12') -replaces=('beignet' 'opencl-intel' 'opencl-headers' 'opencl-headers12') -source=("git://anongit.freedesktop.org/beignet") -sha256sums=('SKIP') +pkgver=1.0.0.r1396.gf72309a5 +pkgrel=2 +pkgdesc="An open source OpenCL implementation for Intel IvyBridge & Haswell iGPUs" +arch=(x86_64) +url="https://01.org/beignet" +license=(LGPL) +depends=(glu clang70 mesa opencl-headers) +makedepends=(git llvm70 cmake ninja python ocl-icd) +provides=(beignet opencl-intel opencl-driver) +conflicts=(beignet) +source=("git+https://github.com/intel/beignet.git" + GBE-let-GenRegister-reg-never-return-uninitialized-m.patch + utests_add_limits.patch + llvm8.patch + llvm9.patch + llvm10.patch) +sha256sums=('SKIP' + 'c1f5880bb192103c371d51f57f646837ca01a8bbe012b9022d4e345c2f1187de' + '584dd293856ddfc76ca9e50488aa2076239ab568a945e957ca3221e2d30b1c52' + 'd24e4d8a1a791dc02c91117f900143789dd6f01eaa89292ad67c4fb4eaf84328' + '5913a93fe6ef77b91480bb6d27c7875673294c0a8a924b2ac66756d0d3577908' + '2eb9b0801e24f4e537033b41a6bc462e4082f6216d62933240ca3010020ea779') function pkgver() { - cd "$srcdir/beignet" - git describe --long --tags | sed 's/^Release_v//;s/-/.r/;s/-/./' + cd "$srcdir/beignet" + git describe --long --tags | sed 's/^Release_v//;s/-/.r/;s/-/./' +} + +prepare() { + cd beignet + + # Remove implementation of cl_intel_device_side_avc_motion_estimation + # (conflicts with the implemention in Clang 8) + # git revert -n 9b7ca443cf7b d61933205874 a4257c7475e7 5a288032ab23 9cb7ff4c285d + + # Static linking leads to build failure due to the gbe compiler still using shared libs + git revert -n 1bd0d252d733 + + # Fix undefined behavior + # See: + # * https://github.com/intel/beignet/pull/16 + # * https://gitlab.freedesktop.org/beignet/beignet/issues/12 + # A similar fix is included in llvm8.patch + patch -Np1 -i ../GBE-let-GenRegister-reg-never-return-uninitialized-m.patch + + # Patches from FreeBSD + Debian to build with newer LLVM + # patch -Np1 -i ../llvm8.patch + # patch -Np1 -i ../llvm9.patch + + # https://lists.freedesktop.org/archives/beignet/2020-January/009251.html + # https://github.com/intel/opencl-clang/commit/77ae1114c7bf79d724f5129461 + # patch -Np1 -i ../llvm10.patch + + # Add missing <limits> include to utest header (required by some utests) + patch -p1 -i ../utests_add_limits.patch } build() { - cd "$srcdir/beignet" - mkdir -p "$srcdir/beignet/build" - cd "$srcdir/beignet/build" - cmake .. \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=/usr/lib \ - -DCMAKE_BUILD_TYPE=RELEASE \ - -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python2 - make + cmake -B build -S beignet -G Ninja \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=/usr/lib \ + -DCMAKE_BUILD_TYPE=RELEASE \ + -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE \ + -DLLVM_INSTALL_DIR=/opt/llvm70/bin + ninja -C build } +# runtime_climage_from_boname fails on wayland because there is no DRI2 in xwayland +#check() { +# ninja -C build utest_run +# ( +# source build/utests/setenv.sh +# build/utests/utest_run +# ) +#} + package() { - cd "$srcdir/beignet/build" - make DESTDIR="$pkgdir/" install + DESTDIR="${pkgdir}" ninja -C build install + # Remove headers already provided by 'opencl-headers' + cd "${pkgdir}"/usr/include/CL + rm cl.h cl_d3d10.h cl_d3d11.h cl_dx9_media_sharing.h cl_egl.h cl_ext.h \ + cl_gl.h cl_gl_ext.h cl_platform.h opencl.h } diff --git a/llvm10.patch b/llvm10.patch new file mode 100644 index 000000000000..93683bbd2159 --- /dev/null +++ b/llvm10.patch @@ -0,0 +1,358 @@ +diff -upr beignet.orig/backend/src/backend/program.cpp beignet/backend/src/backend/program.cpp +--- beignet.orig/backend/src/backend/program.cpp 2020-04-16 03:44:21.153955099 +0300 ++++ beignet/backend/src/backend/program.cpp 2020-04-16 03:47:50.369205839 +0300 +@@ -694,9 +694,14 @@ namespace gbe { + #endif + ); + ++ llvm::cl::ResetAllOptionOccurrences(); + clang::CompilerInvocation::CreateFromArgs(*CI, ++#if LLVM_VERSION_MAJOR < 10 + &args[0], + &args[0] + args.size(), ++#else ++ clang::ArrayRef<const char*>(args), ++#endif + Diags); + // Create the compiler instance + clang::CompilerInstance Clang; +@@ -1242,8 +1247,12 @@ EXTEND_QUOTE: + // Create the compiler invocation + std::unique_ptr<clang::CompilerInvocation> CI(new clang::CompilerInvocation); + return clang::CompilerInvocation::CreateFromArgs(*CI, ++#if LLVM_VERSION_MAJOR < 10 + &args[0], + &args[0] + args.size(), ++#else ++ clang::ArrayRef<const char*>(args), ++#endif + Diags); + } + #endif +Only in beignet/backend/src/backend: program.cpp.orig +Only in beignet.orig/backend/src: CMakeLists.txt.orig +diff -upr beignet.orig/backend/src/llvm/llvm_gen_backend.cpp beignet/backend/src/llvm/llvm_gen_backend.cpp +--- beignet.orig/backend/src/llvm/llvm_gen_backend.cpp 2020-04-16 03:44:21.783970632 +0300 ++++ beignet/backend/src/llvm/llvm_gen_backend.cpp 2020-04-16 03:45:04.141685867 +0300 +@@ -575,11 +575,13 @@ namespace gbe + has_errors(false), + legacyMode(true) + { ++#if LLVM_VERSION_MAJOR < 10 + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 37 + initializeLoopInfoWrapperPassPass(*PassRegistry::getPassRegistry()); + #else + initializeLoopInfoPass(*PassRegistry::getPassRegistry()); + #endif ++#endif + pass = PASS_EMIT_REGISTERS; + } + +diff -upr beignet.orig/backend/src/llvm/llvm_gen_backend.hpp beignet/backend/src/llvm/llvm_gen_backend.hpp +--- beignet.orig/backend/src/llvm/llvm_gen_backend.hpp 2020-04-16 03:44:21.177289008 +0300 ++++ beignet/backend/src/llvm/llvm_gen_backend.hpp 2020-04-16 03:45:04.135019035 +0300 +@@ -130,10 +130,10 @@ namespace gbe + llvm::FunctionPass *createGenPass(ir::Unit &unit); + + /*! Remove the GEP instructions */ +- llvm::BasicBlockPass *createRemoveGEPPass(const ir::Unit &unit); ++ llvm::FunctionPass *createRemoveGEPPass(const ir::Unit &unit); + + /*! Merge load/store if possible */ +- llvm::BasicBlockPass *createLoadStoreOptimizationPass(); ++ llvm::FunctionPass *createLoadStoreOptimizationPass(); + + /*! Scalarize all vector op instructions */ + llvm::FunctionPass* createScalarizePass(); +@@ -141,7 +141,7 @@ namespace gbe + llvm::ModulePass* createBarrierNodupPass(bool); + + /*! Convert the Intrinsic call to gen function */ +- llvm::BasicBlockPass *createIntrinsicLoweringPass(); ++ llvm::FunctionPass *createIntrinsicLoweringPass(); + + /*! Passer the printf function call. */ + llvm::FunctionPass* createPrintfParserPass(ir::Unit &unit); +diff -upr beignet.orig/backend/src/llvm/llvm_intrinsic_lowering.cpp beignet/backend/src/llvm/llvm_intrinsic_lowering.cpp +--- beignet.orig/backend/src/llvm/llvm_intrinsic_lowering.cpp 2020-04-16 03:44:21.783970632 +0300 ++++ beignet/backend/src/llvm/llvm_intrinsic_lowering.cpp 2020-04-16 03:45:04.135019035 +0300 +@@ -29,12 +29,12 @@ + using namespace llvm; + + namespace gbe { +- class InstrinsicLowering : public BasicBlockPass ++ class InstrinsicLowering : public FunctionPass + { + public: + static char ID; + InstrinsicLowering() : +- BasicBlockPass(ID) {} ++ FunctionPass(ID) {} + + void getAnalysisUsage(AnalysisUsage &AU) const { + +@@ -93,9 +93,9 @@ namespace gbe { + CI->eraseFromParent(); + return NewCI; + } +- virtual bool runOnBasicBlock(BasicBlock &BB) ++ virtual bool runOnFunction(Function &F) + { +- bool changedBlock = false; ++ for (BasicBlock &BB : F) { + Module *M = BB.getParent()->getParent(); + + DataLayout TD(M); +@@ -159,13 +159,14 @@ namespace gbe { + } + } + } +- return changedBlock; ++ } ++ return true; + } + }; + + char InstrinsicLowering::ID = 0; + +- BasicBlockPass *createIntrinsicLoweringPass() { ++ FunctionPass *createIntrinsicLoweringPass() { + return new InstrinsicLowering(); + } + } // end namespace +diff -upr beignet.orig/backend/src/llvm/llvm_loadstore_optimization.cpp beignet/backend/src/llvm/llvm_loadstore_optimization.cpp +--- beignet.orig/backend/src/llvm/llvm_loadstore_optimization.cpp 2020-04-16 03:44:21.177289008 +0300 ++++ beignet/backend/src/llvm/llvm_loadstore_optimization.cpp 2020-04-16 03:45:38.645879307 +0300 +@@ -26,13 +26,13 @@ + + using namespace llvm; + namespace gbe { +- class GenLoadStoreOptimization : public BasicBlockPass { ++ class GenLoadStoreOptimization : public FunctionPass { + + public: + static char ID; + ScalarEvolution *SE; + const DataLayout *TD; +- GenLoadStoreOptimization() : BasicBlockPass(ID) {} ++ GenLoadStoreOptimization() : FunctionPass(ID) {} + + void getAnalysisUsage(AnalysisUsage &AU) const { + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 38 +@@ -45,7 +45,9 @@ namespace gbe { + AU.setPreservesCFG(); + } + +- virtual bool runOnBasicBlock(BasicBlock &BB) { ++ virtual bool runOnFunction(Function &F) { ++ bool changedAnyBlock = false; ++ for (BasicBlock &BB : F) { + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 38 + SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); + #else +@@ -59,7 +61,9 @@ namespace gbe { + #else + TD = getAnalysisIfAvailable<DataLayout>(); + #endif +- return optimizeLoadStore(BB); ++ changedAnyBlock = optimizeLoadStore(BB) | changedAnyBlock; ++ } ++ return changedAnyBlock; + } + Type *getValueType(Value *insn); + Value *getPointerOperand(Value *I); +@@ -159,7 +163,11 @@ namespace gbe { + values.push_back(merged[i]); + } + LoadInst *ld = cast<LoadInst>(first); ++#if LLVM_VERSION_MAJOR < 10 + unsigned align = ld->getAlignment(); ++#else ++ MaybeAlign align = ld->getAlign(); ++#endif + unsigned addrSpace = ld->getPointerAddressSpace(); + // insert before first load + Builder.SetInsertPoint(ld); +@@ -352,7 +360,11 @@ namespace gbe { + + unsigned addrSpace = st->getPointerAddressSpace(); + ++#if LLVM_VERSION_MAJOR < 10 + unsigned align = st->getAlignment(); ++#else ++ MaybeAlign align = st->getAlign(); ++#endif + // insert before the last store + Builder.SetInsertPoint(last); + +@@ -466,7 +478,7 @@ namespace gbe { + return changed; + } + +- BasicBlockPass *createLoadStoreOptimizationPass() { ++ FunctionPass *createLoadStoreOptimizationPass() { + return new GenLoadStoreOptimization(); + } + }; +Only in beignet/backend/src/llvm: llvm_loadstore_optimization.cpp.orig +Only in beignet/backend/src/llvm: llvm_loadstore_optimization.cpp.rej +diff -upr beignet.orig/backend/src/llvm/llvm_passes.cpp beignet/backend/src/llvm/llvm_passes.cpp +--- beignet.orig/backend/src/llvm/llvm_passes.cpp 2020-04-16 03:44:21.177289008 +0300 ++++ beignet/backend/src/llvm/llvm_passes.cpp 2020-04-16 03:45:04.135019035 +0300 +@@ -37,7 +37,7 @@ + #include "sys/map.hpp" + + using namespace llvm; +- ++template class cfg::Update<BasicBlock *>; + namespace gbe + { + bool isKernelFunction(const llvm::Function &F) { +@@ -219,13 +219,13 @@ namespace gbe + return offset; + } + +- class GenRemoveGEPPasss : public BasicBlockPass ++ class GenRemoveGEPPasss : public FunctionPass + { + + public: + static char ID; + GenRemoveGEPPasss(const ir::Unit &unit) : +- BasicBlockPass(ID), ++ FunctionPass(ID), + unit(unit) {} + const ir::Unit &unit; + void getAnalysisUsage(AnalysisUsage &AU) const { +@@ -242,16 +242,18 @@ namespace gbe + + bool simplifyGEPInstructions(GetElementPtrInst* GEPInst); + +- virtual bool runOnBasicBlock(BasicBlock &BB) ++ virtual bool runOnFunction(Function &F) + { +- bool changedBlock = false; ++ bool changedAnyBlock = false; ++ for (BasicBlock &BB : F) { + iplist<Instruction>::iterator I = BB.getInstList().begin(); + for (auto nextI = I, E = --BB.getInstList().end(); I != E; I = nextI) { + iplist<Instruction>::iterator I = nextI++; + if(GetElementPtrInst* gep = dyn_cast<GetElementPtrInst>(&*I)) +- changedBlock = (simplifyGEPInstructions(gep) || changedBlock); ++ changedAnyBlock = (simplifyGEPInstructions(gep) | changedAnyBlock); + } +- return changedBlock; ++ } ++ return changedAnyBlock; + } + }; + +@@ -367,7 +369,7 @@ namespace gbe + return true; + } + +- BasicBlockPass *createRemoveGEPPass(const ir::Unit &unit) { ++ FunctionPass *createRemoveGEPPass(const ir::Unit &unit) { + return new GenRemoveGEPPasss(unit); + } + } /* namespace gbe */ +diff -upr beignet.orig/backend/src/llvm/llvm_sampler_fix.cpp beignet/backend/src/llvm/llvm_sampler_fix.cpp +--- beignet.orig/backend/src/llvm/llvm_sampler_fix.cpp 2020-04-16 03:44:21.783970632 +0300 ++++ beignet/backend/src/llvm/llvm_sampler_fix.cpp 2020-04-16 03:45:04.138352451 +0300 +@@ -33,11 +33,13 @@ namespace gbe { + class SamplerFix : public FunctionPass { + public: + SamplerFix() : FunctionPass(ID) { ++#if LLVM_VERSION_MAJOR < 10 + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 35 + initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry()); + #else + initializeDominatorTreePass(*PassRegistry::getPassRegistry()); + #endif ++#endif + } + + bool visitCallInst(CallInst *I) { +diff -upr beignet.orig/backend/src/llvm/llvm_scalarize.cpp beignet/backend/src/llvm/llvm_scalarize.cpp +--- beignet.orig/backend/src/llvm/llvm_scalarize.cpp 2020-04-16 03:44:21.670634504 +0300 ++++ beignet/backend/src/llvm/llvm_scalarize.cpp 2020-04-16 03:45:04.141685867 +0300 +@@ -96,11 +96,13 @@ namespace gbe { + + Scalarize() : FunctionPass(ID) + { ++#if LLVM_VERSION_MAJOR < 10 + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 35 + initializeDominatorTreeWrapperPassPass(*PassRegistry::getPassRegistry()); + #else + initializeDominatorTreePass(*PassRegistry::getPassRegistry()); + #endif ++#endif + } + + virtual bool runOnFunction(Function&); +diff -upr beignet.orig/CMake/FindLLVM.cmake beignet/CMake/FindLLVM.cmake +--- beignet.orig/CMake/FindLLVM.cmake 2020-04-16 03:44:21.137288022 +0300 ++++ beignet/CMake/FindLLVM.cmake 2020-04-16 03:46:38.104039602 +0300 +@@ -104,30 +104,16 @@ string(REGEX REPLACE " *\n" "" LLVM_SYST + endif (LLVM_SYSTEM_LIBS_ORIG) + endif (LLVM_VERSION_NODOT VERSION_GREATER 34) + ++#something harmless because whitespace at start is an error ++set(CLANG_LIBRARIES "-ldl") + macro(add_one_lib name) + FIND_LIBRARY(CLANG_LIB + NAMES ${name} + PATHS ${LLVM_LIBRARY_DIR} NO_DEFAULT_PATH) +- set(CLANG_LIBRARIES ${CLANG_LIBRARIES} ${CLANG_LIB}) ++ set(CLANG_LIBRARIES "${CLANG_LIBRARIES} ${CLANG_LIB}") ++ message(STATUS "clanglibs name ${name} this ${CLANG_LIB} all ${CLANG_LIBRARIES} ") + unset(CLANG_LIB CACHE) + endmacro() + + #Assume clang lib path same as llvm lib path +-add_one_lib("clangCodeGen") +-add_one_lib("clangFrontend") +-add_one_lib("clangSerialization") +-add_one_lib("clangDriver") +-add_one_lib("clangSema") +-add_one_lib("clangStaticAnalyzerFrontend") +-add_one_lib("clangStaticAnalyzerCheckers") +-add_one_lib("clangStaticAnalyzerCore") +-add_one_lib("clangAnalysis") +-add_one_lib("clangEdit") +-if (LLVM_VERSION_NODOT VERSION_GREATER 80) +-add_one_lib("clangASTMatchers") +-endif (LLVM_VERSION_NODOT VERSION_GREATER 80) +-add_one_lib("clangAST") +-add_one_lib("clangParse") +-add_one_lib("clangSema") +-add_one_lib("clangLex") +-add_one_lib("clangBasic") ++add_one_lib("clang-cpp") +Only in beignet/CMake: FindLLVM.cmake.orig +diff -upr beignet.orig/CMakeLists.txt beignet/CMakeLists.txt +--- beignet.orig/CMakeLists.txt 2020-04-16 03:44:21.137288022 +0300 ++++ beignet/CMakeLists.txt 2020-04-16 03:45:04.131685618 +0300 +@@ -80,7 +80,7 @@ elseif (COMPILER STREQUAL "CLANG") + elseif (COMPILER STREQUAL "ICC") + set (CMAKE_C_CXX_FLAGS "${CMAKE_C_CXX_FLAGS} -wd2928 -Wall -fPIC -fstrict-aliasing -fp-model fast -msse4.1 -Wl,-E") + endif () +-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -std=c++0x -Wno-invalid-offsetof") ++set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -Wno-invalid-offsetof") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_CXX_FLAGS}") + set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DGBE_DEBUG=1") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DGBE_DEBUG=1") +diff -upr beignet.orig/utests/CMakeLists.txt beignet/utests/CMakeLists.txt +--- beignet.orig/utests/CMakeLists.txt 2020-04-16 03:44:21.220623410 +0300 ++++ beignet/utests/CMakeLists.txt 2020-04-16 03:45:04.131685618 +0300 +@@ -26,8 +26,8 @@ if (NOT NOT_BUILD_STAND_ALONE_UTEST) + # Threads + Find_Package(Threads) + +- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -std=c++0x -Wno-invalid-offsetof") +- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_CXX_FLAGS}") ++ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_CXX_FLAGS} -Wno-invalid-offsetof -ffloat-store -fno-strict-aliasing") ++ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_CXX_FLAGS} -ffloat-store -fno-strict-aliasing") #compiler_{degrees,radians,function_argument2} use equality comparison of floats, compiler_long_bitcast uses aliasing + set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DGBE_DEBUG=1") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DGBE_DEBUG=1") + set (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG -DGBE_DEBUG=0") diff --git a/llvm8.patch b/llvm8.patch new file mode 100644 index 000000000000..b17a18035d83 --- /dev/null +++ b/llvm8.patch @@ -0,0 +1,71 @@ +Description: Fix build with LLVM/Clang 8 + +Origin: (partly) FreeBSD https://svnweb.freebsd.org/ports/head/lang/beignet/files/patch-llvm8?view=markup +Author: Jan Beich, Rebecca N. Palmer + +--- a/backend/src/CMakeLists.txt ++++ b/backend/src/CMakeLists.txt +@@ -168,6 +168,7 @@ add_dependencies(gbe beignet_bitcode) + endif (NOT (USE_STANDALONE_GBE_COMPILER STREQUAL "true")) + + add_library(gbeinterp SHARED gbe_bin_interpreter.cpp) ++target_link_libraries(gbeinterp ${LLVM_MODULE_LIBS} ${LLVM_SYSTEM_LIBS}) + + if (LLVM_VERSION_NODOT VERSION_EQUAL 34) + find_library(TERMINFO NAMES tinfo ncurses) +--- a/backend/src/llvm/llvm_gen_backend.cpp ++++ b/backend/src/llvm/llvm_gen_backend.cpp +@@ -3073,14 +3073,22 @@ namespace gbe + + + static unsigned getChildNo(BasicBlock *bb) { ++#if LLVM_VERSION_MAJOR < 8 + TerminatorInst *term = bb->getTerminator(); ++#else ++ Instruction *term = bb->getTerminator(); ++#endif + return term->getNumSuccessors(); + } + + // return NULL if index out-range of children number + static BasicBlock *getChildPossible(BasicBlock *bb, unsigned index) { + ++#if LLVM_VERSION_MAJOR < 8 + TerminatorInst *term = bb->getTerminator(); ++#else ++ Instruction *term = bb->getTerminator(); ++#endif + unsigned childNo = term->getNumSuccessors(); + BasicBlock *child = NULL; + if(index < childNo) { +--- a/backend/src/backend/gen_register.hpp ++++ b/backend/src/backend/gen_register.hpp +@@ -225,6 +225,7 @@ namespace gbe + uint32_t width, + uint32_t hstride) + { ++ this->value.reg = 0;//avoid subgroup crash + this->type = type; + this->file = file; + this->nr = nr; +--- a/backend/src/libocl/tmpl/ocl_integer.tmpl.cl ++++ b/backend/src/libocl/tmpl/ocl_integer.tmpl.cl +@@ -216,13 +216,14 @@ OVERLOADABLE ulong mad_sat(ulong a, ulon + return __gen_ocl_mad_sat(a, b, c); + } + +-OVERLOADABLE uchar __rotate_left(uchar x, uchar y) { return (x << y) | (x >> (8 - y)); } ++// the 'volatile' is to make the LLVM optimizer leave these alone, as it would convert them to intrinsics (fshl/fshr) that we don't implement ++OVERLOADABLE uchar __rotate_left(uchar x, uchar y) { volatile uchar z; z = (x << y); return z | (x >> (8 - y)); } + OVERLOADABLE char __rotate_left(char x, char y) { return __rotate_left((uchar)x, (uchar)y); } +-OVERLOADABLE ushort __rotate_left(ushort x, ushort y) { return (x << y) | (x >> (16 - y)); } ++OVERLOADABLE ushort __rotate_left(ushort x, ushort y) { volatile ushort z; z = (x << y); return z | (x >> (16 - y)); } + OVERLOADABLE short __rotate_left(short x, short y) { return __rotate_left((ushort)x, (ushort)y); } +-OVERLOADABLE uint __rotate_left(uint x, uint y) { return (x << y) | (x >> (32 - y)); } ++OVERLOADABLE uint __rotate_left(uint x, uint y) { volatile uint z; z = (x << y); return z | (x >> (32 - y)); } + OVERLOADABLE int __rotate_left(int x, int y) { return __rotate_left((uint)x, (uint)y); } +-OVERLOADABLE ulong __rotate_left(ulong x, ulong y) { return (x << y) | (x >> (64 - y)); } ++OVERLOADABLE ulong __rotate_left(ulong x, ulong y) { volatile ulong z; z = (x << y); return z | (x >> (64 - y)); } + OVERLOADABLE long __rotate_left(long x, long y) { return __rotate_left((ulong)x, (ulong)y); } + #define DEF(type, m) OVERLOADABLE type rotate(type x, type y) { return __rotate_left(x, (type)(y & m)); } + DEF(char, 7) diff --git a/llvm9.patch b/llvm9.patch new file mode 100644 index 000000000000..5bcb516d5a41 --- /dev/null +++ b/llvm9.patch @@ -0,0 +1,113 @@ +Description: Fix build with LLVM/Clang 9 + +Origin: (mostly) FreeBSD https://svnweb.freebsd.org/ports/head/lang/beignet/files/patch-llvm9?view=markup +Author: Jan Beich, Rebecca N. Palmer + +--- a/CMake/FindLLVM.cmake ++++ b/CMake/FindLLVM.cmake +@@ -126,6 +126,9 @@ macro(add_one_lib name) + add_one_lib("clangStaticAnalyzerCore") + add_one_lib("clangAnalysis") + add_one_lib("clangEdit") ++if (LLVM_VERSION_NODOT VERSION_GREATER 80) ++add_one_lib("clangASTMatchers") ++endif (LLVM_VERSION_NODOT VERSION_GREATER 80) + add_one_lib("clangAST") + add_one_lib("clangParse") + add_one_lib("clangSema") +--- a/backend/src/llvm/llvm_intrinsic_lowering.cpp ++++ b/backend/src/llvm/llvm_intrinsic_lowering.cpp +@@ -77,7 +77,11 @@ namespace gbe { + std::vector<Type *> ParamTys; + for (Value** I = ArgBegin; I != ArgEnd; ++I) + ParamTys.push_back((*I)->getType()); ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ FunctionCallee FCache = M->getOrInsertFunction(NewFn, ++#else + Constant* FCache = M->getOrInsertFunction(NewFn, ++#endif + FunctionType::get(RetTy, ParamTys, false)); + + IRBuilder<> Builder(CI->getParent(), BasicBlock::iterator(CI)); +--- a/backend/src/llvm/llvm_sampler_fix.cpp ++++ b/backend/src/llvm/llvm_sampler_fix.cpp +@@ -82,7 +82,11 @@ namespace gbe { + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 40 + Module *M = I->getParent()->getParent()->getParent(); + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50 ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ FunctionCallee samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType()); ++#else + Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType()); ++#endif + #else + Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType(), nullptr); + #endif +@@ -124,7 +128,11 @@ namespace gbe { + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 40 + Module *M = I->getParent()->getParent()->getParent(); + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50 ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ FunctionCallee samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType()); ++#else + Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType()); ++#endif + #else + Value* samplerCvt = M->getOrInsertFunction("__gen_ocl_sampler_to_int", i32Ty, I->getOperand(0)->getType(), nullptr); + #endif +--- a/backend/src/llvm/llvm_profiling.cpp ++++ b/backend/src/llvm/llvm_profiling.cpp +@@ -163,10 +163,18 @@ namespace gbe + // __gen_ocl_store_timestamp(int nth, int type); + Value *Args[2] = {ConstantInt::get(intTy, pointNum++), ConstantInt::get(intTy, profilingType)}; + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50 ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ builder->CreateCall(module->getOrInsertFunction( ++#else + builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction( ++#endif + "__gen_ocl_calc_timestamp", Type::getVoidTy(module->getContext()), + IntegerType::getInt32Ty(module->getContext()), ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ IntegerType::getInt32Ty(module->getContext())), ++#else + IntegerType::getInt32Ty(module->getContext()))), ++#endif + ArrayRef<Value*>(Args)); + #else + builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction( +@@ -185,10 +193,18 @@ namespace gbe + Value *Args2[2] = {profilingBuf, ConstantInt::get(intTy, profilingType)}; + + #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 50 ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ builder->CreateCall(module->getOrInsertFunction( ++#else + builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction( ++#endif + "__gen_ocl_store_profiling", Type::getVoidTy(module->getContext()), + ptrTy, ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ IntegerType::getInt32Ty(module->getContext())), ++#else + IntegerType::getInt32Ty(module->getContext()))), ++#endif + ArrayRef<Value*>(Args2)); + #else + builder->CreateCall(cast<llvm::Function>(module->getOrInsertFunction( +--- a/backend/src/llvm/llvm_device_enqueue.cpp ++++ b/backend/src/llvm/llvm_device_enqueue.cpp +@@ -398,8 +398,13 @@ namespace gbe { + std::vector<Type *> ParamTys; + for (Value** iter = args.begin(); iter != args.end(); ++iter) + ParamTys.push_back((*iter)->getType()); ++#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 90 ++ CallInst* newCI = builder.CreateCall(mod->getOrInsertFunction( ++ "__gen_enqueue_kernel_slm", FunctionType::get(intTy, ParamTys, false)), args); ++#else + CallInst* newCI = builder.CreateCall(cast<llvm::Function>(mod->getOrInsertFunction( + "__gen_enqueue_kernel_slm", FunctionType::get(intTy, ParamTys, false))), args); ++#endif + CI->replaceAllUsesWith(newCI); + deadInsnSet.insert(CI); + } diff --git a/utests_add_limits.patch b/utests_add_limits.patch new file mode 100644 index 000000000000..14d3d64b4f12 --- /dev/null +++ b/utests_add_limits.patch @@ -0,0 +1,11 @@ +diff -ru beignet.old/utests/utest_helper.hpp beignet.new/utests/utest_helper.hpp +--- beignet.old/utests/utest_helper.hpp 2023-03-10 16:35:05.068061790 +0100 ++++ beignet.new/utests/utest_helper.hpp 2023-03-10 16:35:46.962204258 +0100 +@@ -34,6 +34,7 @@ + #include <cassert> + #include <cstdio> + #include <cstdlib> ++#include <limits> + + #if defined(__ANDROID__) + #define __thread |