From c5dee2f8bc9767d78836a399739bc723dd43bc3c Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 6 May 2024 12:43:52 -0400 Subject: [PATCH] Linux updates for LLVM --- IDEHelper/CMakeLists.txt | 28 ++++++++-------- IDEHelper/COFF.cpp | 15 +++++---- IDEHelper/Compiler/BfIRCodeGen.cpp | 51 +++++++++++++++++++++++------- IDEHelper/Compiler/BfModule.cpp | 4 +-- bin/build.sh | 8 ++--- extern/llvm_build.bat | 1 + extern/llvm_build.sh | 40 +++++++++++------------ 7 files changed, 89 insertions(+), 58 deletions(-) diff --git a/IDEHelper/CMakeLists.txt b/IDEHelper/CMakeLists.txt index d4192c36..8a689484 100644 --- a/IDEHelper/CMakeLists.txt +++ b/IDEHelper/CMakeLists.txt @@ -185,29 +185,29 @@ else() X86Target.cpp ) - include_directories( - ../extern/llvm-project_13_0_1/llvm/include - ../extern/llvm-project_13_0_1/llvm/lib/Target + include_directories(h + ../extern/llvm-project_18_1_4/llvm/include + ../extern/llvm-project_18_1_4/llvm/lib/Target18_1_4 ) if(CMAKE_BUILD_TYPE STREQUAL "Debug") include_directories( - ../extern/llvm_linux_13_0_1/include - ../extern/llvm_linux_13_0_1/lib/Target/X86 - ../extern/llvm_linux_13_0_1/lib/Target/AArch64 + ../extern/llvm_linux_18_1_4/include + ../extern/llvm_linux_18_1_4/lib/Target/X86 + ../extern/llvm_linux_18_1_4/lib/Target/AArch64 ) - set(LLVM_LIB "${CMAKE_CURRENT_SOURCE_DIR}/../extern/llvm_linux_13_0_1/lib") + set(LLVM_LIB "${CMAKE_CURRENT_SOURCE_DIR}/../extern/llvm_linux_18_1_4/lib") else() include_directories( - ../extern/llvm_linux_rel_13_0_1/include - ../extern/llvm_linux_rel_13_0_1/lib/Target/X86 - ../extern/llvm_linux_rel_13_0_1/lib/Target/AArch64 + ../extern/llvm_linux_rel_18_1_4/include + ../extern/llvm_linux_rel_18_1_4/lib/Target/X86 + ../extern/llvm_linux_rel_18_1_4/lib/Target/AArch64 ) - set(LLVM_LIB "${CMAKE_CURRENT_SOURCE_DIR}/../extern/llvm_linux_rel_13_0_1/lib") + set(LLVM_LIB "${CMAKE_CURRENT_SOURCE_DIR}/../extern/llvm_linux_rel_18_1_4/lib") endif() execute_process( - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../extern/llvm_linux_13_0_1/bin/llvm-config --system-libs --link-static + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../extern/llvm_linux_18_1_4/bin/llvm-config --system-libs --link-static OUTPUT_VARIABLE LLVM_SYSTEM_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE EXEC_RESULT @@ -220,8 +220,8 @@ else() message(FATAL_ERROR "llvm-config couldn't be executed: ${EXEC_RESULT}") endif() endif() - - message(STATUS "Found LLVM 13.0.1 (local build)") + + message(STATUS "Found LLVM 18.1.4 (local build)") set(TARGET_LIBS_OS "${LLVM_SYSTEM_LIBS}") diff --git a/IDEHelper/COFF.cpp b/IDEHelper/COFF.cpp index 3da6b066..983a8873 100644 --- a/IDEHelper/COFF.cpp +++ b/IDEHelper/COFF.cpp @@ -3283,12 +3283,15 @@ void COFF::ParseCompileUnit_Symbols(DbgCompileUnit* compileUnit, uint8* sectionD break; case /*S_INLINEES*/0x1168: break; - case 0x1176: - break; - case 0x1178: - break; - case 0x1179: - break; + case 0x1176: + case 0x1178: + case 0x1179: + case 0x117A: + case 0x117B: + case 0x117C: + case 0x117D: + case 0x117E: + case 0x117F: case 0x1180: break; case 7: diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index 24ae1de0..c9a2974a 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -1181,7 +1181,7 @@ void BfIRCodeGen::Read(BfIRTypedValue& typedValue, BfIRCodeGenEntry** codeGenEnt llvm::ConstantInt::get(llvm::Type::getInt32Ty(*mLLVMContext), idx1)}; auto compositeType = GetTypeMember(target.mTypeEx, 0); - int elemIdx = BF_MIN(idx1, (int)compositeType->mMembers.mSize - 1); + int elemIdx = BF_MAX(BF_MIN(idx1, (int)compositeType->mMembers.mSize - 1), 0); auto elemType = GetTypeMember(compositeType, elemIdx); auto constant = llvm::dyn_cast(target.mValue); @@ -4709,7 +4709,15 @@ void BfIRCodeGen::HandleNextCmd() { CMD_PARAM_NOTRANS(llvm::Value*, instValue); BF_ASSERT(llvm::isa(instValue)); - ((llvm::Instruction*)instValue)->setDebugLoc(llvm::DebugLoc()); + + if (llvm::dyn_cast(instValue)) + { + printf("BfIRCmd_ClearDebugLocationInst on DbgDeclareInst in %s\n", mModuleName.c_str()); + } + else + { + ((llvm::Instruction*)instValue)->setDebugLoc(llvm::DebugLoc()); + } } break; case BfIRCmd_ClearDebugLocationInstLast: @@ -4720,7 +4728,14 @@ void BfIRCodeGen::HandleNextCmd() if (!bb->empty()) { auto& inst = bb->back(); - inst.setDebugLoc(llvm::DebugLoc()); + if (llvm::dyn_cast(&inst)) + { + printf("BfIRCmd_ClearDebugLocationInstLast on DbgDeclareInst\n"); + } + else + { + inst.setDebugLoc(llvm::DebugLoc()); + } } } } @@ -4729,7 +4744,14 @@ void BfIRCodeGen::HandleNextCmd() { CMD_PARAM_NOTRANS(llvm::Value*, instValue); BF_ASSERT(llvm::isa(instValue)); - ((llvm::Instruction*)instValue)->setDebugLoc(mIRBuilder->getCurrentDebugLocation()); + if ((llvm::dyn_cast(instValue)) && (!mIRBuilder->getCurrentDebugLocation())) + { + printf("BfIRCmd_UpdateDebugLocation NULL on DbgDeclareInst\n"); + } + else + { + ((llvm::Instruction*)instValue)->setDebugLoc(mIRBuilder->getCurrentDebugLocation()); + } } break; case BfIRCmd_SetCurrentDebugLocation: @@ -5394,15 +5416,20 @@ void BfIRCodeGen::HandleNextCmd() llvm::Instruction* insertBeforeInst = NULL; if (insertBefore != NULL) insertBeforeInst = llvm::dyn_cast(insertBefore); - if (insertBeforeInst != NULL) + + // Protect against lack of debug location + if (mIRBuilder->getCurrentDebugLocation()) { - SetResult(curId, mDIBuilder->insertDeclare(val, (llvm::DILocalVariable*)varInfo, mDIBuilder->createExpression(), - mIRBuilder->getCurrentDebugLocation(), insertBeforeInst)); - } - else - { - SetResult(curId, mDIBuilder->insertDeclare(val, (llvm::DILocalVariable*)varInfo, mDIBuilder->createExpression(), - mIRBuilder->getCurrentDebugLocation(), mIRBuilder->GetInsertBlock())); + if (insertBeforeInst != NULL) + { + SetResult(curId, mDIBuilder->insertDeclare(val, (llvm::DILocalVariable*)varInfo, mDIBuilder->createExpression(), + mIRBuilder->getCurrentDebugLocation(), insertBeforeInst)); + } + else + { + SetResult(curId, mDIBuilder->insertDeclare(val, (llvm::DILocalVariable*)varInfo, mDIBuilder->createExpression(), + mIRBuilder->getCurrentDebugLocation(), mIRBuilder->GetInsertBlock())); + } } } break; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 0c62b779..81453709 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -1258,8 +1258,8 @@ void BfModule::SetupIRBuilder(bool dbgVerifyCodeGen) // code as we walk the AST //mBfIRBuilder->mDbgVerifyCodeGen = true; if ( - (mModuleName == "BeefTest_LLVMType") - || (mModuleName == "System_ValueType") + (mModuleName == "vdata") + || (mModuleName == "") //|| (mModuleName == "Tests_FuncRefs") ) mBfIRBuilder->mDbgVerifyCodeGen = true; diff --git a/bin/build.sh b/bin/build.sh index 8da1444f..ec7f4fb6 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -43,13 +43,13 @@ else echo "Ninja isn't installed, consider installing it for faster build speeds." fi -LLVM_CONFIG=$(command -v llvm-config-13 2>/dev/null || command -v llvm-config 2>/dev/null) +LLVM_CONFIG=$(command -v llvm-config-18 2>/dev/null || command -v llvm-config 2>/dev/null) LLVM_FOUND=0 if [ -n "$LLVM_CONFIG" ]; then LLVM_VERSION=$($LLVM_CONFIG --version) LLVM_MAJOR_VERSION=$(echo "$LLVM_VERSION" | cut -d. -f1) - if [ "$LLVM_MAJOR_VERSION" = "13" ]; then + if [ "$LLVM_MAJOR_VERSION" = "18" ]; then LLVM_FOUND=1 fi fi @@ -59,8 +59,8 @@ set -e ### Dependencies ### -if [ ! -f ../extern/llvm_linux_13_0_1/_Done.txt ] && [ $LLVM_FOUND == 0 ]; then - echo "ERROR: LLVM 13 was not detected on your system. Please install the package 'llvm-13-dev' and try again." >&2 +if [ ! -f ../extern/llvm_linux_18_1_4/_Done.txt ] && [ $LLVM_FOUND == 0 ]; then + echo "ERROR: LLVM 18 was not detected on your system. Please install the package 'llvm-18-dev' and try again." >&2 echo "ERROR: As an alternative, you can compile LLVM from source using the script 'extern/llvm_build.sh'." >&2 exit fi diff --git a/extern/llvm_build.bat b/extern/llvm_build.bat index e2cd8469..cfdc8507 100644 --- a/extern/llvm_build.bat +++ b/extern/llvm_build.bat @@ -9,6 +9,7 @@ git clone --depth 1 --branch llvmorg-18.1.4 --config core.autocrlf=false https:/ @IF EXIST llvm_win64_18_1_4 GOTO HAS_CONFIG mkdir llvm_win64_18_1_4 cd llvm_win64_18_1_4 +@REM cmake ../llvm-project_18_1_4/llvm -G"Visual Studio 17 2022" -Ax64 -Thost=x64 -DLLVM_ENABLE_PROJECTS=clang -D CMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$:Debug>" -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86;WebAssembly" cmake ../llvm-project_18_1_4/llvm -G"Visual Studio 17 2022" -Ax64 -Thost=x64 -D CMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$:Debug>" -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86;WebAssembly" @IF %ERRORLEVEL% NEQ 0 GOTO HADERROR @GOTO DOBUILD diff --git a/extern/llvm_build.sh b/extern/llvm_build.sh index 317ede4c..9f16ea7c 100755 --- a/extern/llvm_build.sh +++ b/extern/llvm_build.sh @@ -14,34 +14,34 @@ do fi done -if [ ! -d llvm-project_13_0_1 ]; then - if [ -f llvm-13.0.1.src.tar.xz ]; then # if user downloaded llvm-13.0.1.src.tar.xz then use it instead - tar -xf llvm-13.0.1.src.tar.xz - mkdir llvm-project_13_0_1 - mv llvm-13.0.1.src llvm-project_13_0_1/llvm - else # shallow git clone llvm repo if llvm-13.0.1.src.tar.xz does not exists - git clone --depth 1 --branch llvmorg-13.0.1 https://github.com/llvm/llvm-project.git llvm-project_13_0_1 +if [ ! -d llvm-project_18_1_4 ]; then + if [ -f llvm-18.1.4.src.tar.xz ]; then # if user downloaded llvm-18.1.4.src.tar.xz then use it instead + tar -xf llvm-18.1.4.src.tar.xz + mkdir llvm-project_18_1_4 + mv llvm-18.1.4.src llvm-project_18_1_4/llvm + else # shallow git clone llvm repo if llvm-18.1.4.src.tar.xz does not exists + git clone --depth 1 --branch llvmorg-18.1.4 https://github.com/llvm/llvm-project.git llvm-project_18_1_4 fi -fi #end if llvm-project_13_0_1 exists +fi #end if llvm-project_18_1_4 exists -if [ ! -d llvm_linux_13_0_1 ]; then - mkdir llvm_linux_13_0_1 +if [ ! -d llvm_linux_18_1_4 ]; then + mkdir llvm_linux_18_1_4 fi -if [ ! -d llvm_linux_13_0_1/bin ] || [ $FORCE_BUILD == 1 ]; then - cd llvm_linux_13_0_1 - cmake $USE_NINJA ../llvm-project_13_0_1/llvm -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86;WebAssembly" -DCMAKE_BUILD_TYPE:String="Debug" +if [ ! -d llvm_linux_18_1_4/bin ] || [ $FORCE_BUILD == 1 ]; then + cd llvm_linux_18_1_4 + cmake $USE_NINJA ../llvm-project_18_1_4/llvm -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86;WebAssembly" -DCMAKE_BUILD_TYPE:String="Debug" cmake --build . -t $(cat ../llvm_targets.txt) cd .. fi -if [ ! -d llvm_linux_rel_13_0_1 ]; then - mkdir llvm_linux_rel_13_0_1 +if [ ! -d llvm_linux_rel_18_1_4 ]; then + mkdir llvm_linux_rel_18_1_4 fi -if [ ! -d llvm_linux_rel_13_0_1/bin ] || [ $FORCE_BUILD == 1 ]; then - cd llvm_linux_rel_13_0_1 - cmake $USE_NINJA ../llvm-project_13_0_1/llvm -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86;WebAssembly" -DCMAKE_BUILD_TYPE:String="Release" +if [ ! -d llvm_linux_rel_18_1_4/bin ] || [ $FORCE_BUILD == 1 ]; then + cd llvm_linux_rel_18_1_4 + cmake $USE_NINJA ../llvm-project_18_1_4/llvm -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86;WebAssembly" -DCMAKE_BUILD_TYPE:String="Release" cmake --build . -t $(cat ../llvm_targets.txt) cd .. fi @@ -50,6 +50,6 @@ if [ ! -d ../IDE/dist/llvm/bin ]; then mkdir ../IDE/dist/llvm mkdir ../IDE/dist/llvm/bin fi -cp llvm_linux_rel_13_0_1/bin/llvm-ar ../IDE/dist/llvm/bin +cp llvm_linux_rel_18_1_4/bin/llvm-ar ../IDE/dist/llvm/bin -echo done > llvm_linux_13_0_1/_Done.txt \ No newline at end of file +echo done > llvm_linux_18_1_4/_Done.txt \ No newline at end of file