diff options
author | vvvv <vvvv@yandex-team.com> | 2025-01-09 13:19:56 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.com> | 2025-01-09 13:34:30 +0300 |
commit | 427d34bceee5c2b12a181a0eac3fd562b68e8754 (patch) | |
tree | 4731e34812732aa6e5c8182a6bab8438006b648f | |
parent | 22152213a5c128f39919ace8973c35dcd27006c9 (diff) | |
download | ydb-427d34bceee5c2b12a181a0eac3fd562b68e8754.tar.gz |
LLVM16 codegen lib
commit_hash:ff712c48c83af95a314d804dd8dcef2edaf44b9f
-rw-r--r-- | yql/essentials/minikql/codegen/codegen.cpp | 84 | ||||
-rw-r--r-- | yql/essentials/minikql/codegen/codegen_llvm_deps.h.txt | 3 | ||||
-rw-r--r-- | yql/essentials/minikql/codegen/llvm16/ut/ya.make | 28 | ||||
-rw-r--r-- | yql/essentials/minikql/codegen/llvm16/ya.make | 27 | ||||
-rw-r--r-- | yql/essentials/minikql/codegen/ya.make | 2 | ||||
-rw-r--r-- | yql/essentials/minikql/codegen/ya.make.inc | 3 |
6 files changed, 127 insertions, 20 deletions
diff --git a/yql/essentials/minikql/codegen/codegen.cpp b/yql/essentials/minikql/codegen/codegen.cpp index 767bef25c9..f02b058357 100644 --- a/yql/essentials/minikql/codegen/codegen.cpp +++ b/yql/essentials/minikql/codegen/codegen.cpp @@ -189,18 +189,13 @@ namespace NCodegen { namespace { - void FatalErrorHandler(void* user_data, -#if LLVM_VERSION_MAJOR == 12 - const std::string& reason -#else - const char* reason -#endif - , bool gen_crash_diag) { + void FatalErrorHandler(void* user_data, const char* reason, bool gen_crash_diag) { Y_UNUSED(user_data); Y_UNUSED(gen_crash_diag); ythrow yexception() << "LLVM fatal error: " << reason; } +#if LLVM_VERSION_MAJOR < 16 void AddAddressSanitizerPasses(const llvm::PassManagerBuilder& builder, llvm::legacy::PassManagerBase& pm) { Y_UNUSED(builder); pm.add(llvm::createAddressSanitizerFunctionPass()); @@ -216,6 +211,7 @@ namespace { Y_UNUSED(builder); pm.add(llvm::createThreadSanitizerLegacyPassPass()); } +#endif struct TCodegenInit { TCodegenInit() { @@ -293,11 +289,6 @@ public: llvm::TargetOptions targetOptions; targetOptions.EnableFastISel = true; - // init manually, this field was lost in llvm::TargetOptions ctor :/ - // make coverity happy -#if LLVM_VERSION_MAJOR == 12 - targetOptions.StackProtectorGuardOffset = 0; -#endif std::string what; auto&& engineBuilder = llvm::EngineBuilder(std::move(module)); @@ -398,7 +389,6 @@ public: ReverseGlobalMapping_[(const void*)&__emutls_get_address] = "__emutls_get_address"; #endif #if defined(_win_) - AddGlobalMapping("__security_check_cookie", (const void*)&__security_check_cookie); AddGlobalMapping("__security_cookie", (const void*)&__security_cookie); #endif @@ -424,10 +414,10 @@ public: llvm::TimePassesIsEnabled = true; } - std::unique_ptr<llvm::legacy::PassManager> modulePassManager; - std::unique_ptr<llvm::legacy::FunctionPassManager> functionPassManager; - if (ExportedSymbols) { + std::unique_ptr<llvm::legacy::PassManager> modulePassManager; + std::unique_ptr<llvm::legacy::FunctionPassManager> functionPassManager; + modulePassManager = std::make_unique<llvm::legacy::PassManager>(); modulePassManager->add(llvm::createInternalizePass([&](const llvm::GlobalValue& gv) -> bool { auto name = TString(gv.getName().str()); @@ -438,6 +428,7 @@ public: modulePassManager->run(*Module_); } +#if LLVM_VERSION_MAJOR < 16 llvm::PassManagerBuilder passManagerBuilder; passManagerBuilder.OptLevel = disableOpt ? 0 : 2; passManagerBuilder.SizeLevel = 0; @@ -464,8 +455,8 @@ public: AddThreadSanitizerPass); } - functionPassManager = std::make_unique<llvm::legacy::FunctionPassManager>(Module_); - modulePassManager = std::make_unique<llvm::legacy::PassManager>(); + auto functionPassManager = std::make_unique<llvm::legacy::FunctionPassManager>(Module_); + auto modulePassManager = std::make_unique<llvm::legacy::PassManager>(); passManagerBuilder.populateModulePassManager(*modulePassManager); passManagerBuilder.populateFunctionPassManager(*functionPassManager); @@ -485,9 +476,64 @@ public: auto modulePassStart = Now(); modulePassManager->run(*Module_); + + if (compileStats) { + compileStats->ModulePassTime = (Now() - modulePassStart).MilliSeconds(); + } +#else + llvm::PassBuilder passBuilder; + + llvm::LoopAnalysisManager lam; + llvm::FunctionAnalysisManager fam; + llvm::CGSCCAnalysisManager cgam; + llvm::ModuleAnalysisManager mam; + + // Register the target library analysis directly and give it a customized + // preset TLI. + std::unique_ptr<llvm::TargetLibraryInfoImpl> tlii(new llvm::TargetLibraryInfoImpl(llvm::Triple(Triple_))); + fam.registerPass([&] { return llvm::TargetLibraryAnalysis(*tlii); }); + + // Register all the basic analyses with the managers. + passBuilder.registerModuleAnalyses(mam); + passBuilder.registerCGSCCAnalyses(cgam); + passBuilder.registerFunctionAnalyses(fam); + passBuilder.registerLoopAnalyses(lam); + passBuilder.crossRegisterProxies(lam, fam, cgam, mam); + + auto sanitizersCallback = [&](llvm::ModulePassManager& mpm, llvm::OptimizationLevel level) { + Y_UNUSED(level); + if (EffectiveSanitize_ == ESanitize::Asan) { + llvm::AddressSanitizerOptions options; + mpm.addPass(llvm::AddressSanitizerPass(options)); + } + + if (EffectiveSanitize_ == ESanitize::Msan) { + llvm::MemorySanitizerOptions options; + mpm.addPass(llvm::MemorySanitizerPass(options)); + } + + if (EffectiveSanitize_ == ESanitize::Tsan) { + mpm.addPass(llvm::ModuleThreadSanitizerPass()); + mpm.addPass(llvm::createModuleToFunctionPassAdaptor(llvm::ThreadSanitizerPass())); + } + }; + + passBuilder.registerOptimizerLastEPCallback(sanitizersCallback); + + llvm::ModulePassManager modulePassManager; + if (disableOpt) { + modulePassManager = passBuilder.buildO0DefaultPipeline(llvm::OptimizationLevel::O0, false); + } else { + modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::OptimizationLevel::O2); + } + + auto modulePassStart = Now(); + modulePassManager.run(*Module_, mam); + if (compileStats) { compileStats->ModulePassTime = (Now() - modulePassStart).MilliSeconds(); } +#endif AllocateTls(); @@ -685,7 +731,7 @@ private: if (!align) { // When LLVM IL declares a variable without alignment, use // the ABI default alignment for the type. - align = dataLayout.getABITypeAlignment(type); + align = dataLayout.getABITypeAlign(type).value(); } TStringBuf name(nameRef.data(), nameRef.size()); diff --git a/yql/essentials/minikql/codegen/codegen_llvm_deps.h.txt b/yql/essentials/minikql/codegen/codegen_llvm_deps.h.txt index 5b0dc3caea..d2501d7663 100644 --- a/yql/essentials/minikql/codegen/codegen_llvm_deps.h.txt +++ b/yql/essentials/minikql/codegen/codegen_llvm_deps.h.txt @@ -1,5 +1,6 @@ #pragma once +#include <llvm/BinaryFormat/Dwarf.h> #include <llvm/ExecutionEngine/ExecutionEngine.h> #include <llvm/ExecutionEngine/JITEventListener.h> #include <llvm/ExecutionEngine/MCJIT.h> @@ -9,8 +10,10 @@ #include <llvm/IR/LLVMContext.h> #include <llvm/IR/Module.h> #include <llvm/IR/Verifier.h> +#include <llvm/IR/PassManager.h> #include <llvm/IRReader/IRReader.h> #include <llvm/Linker/Linker.h> +#include <llvm/Passes/PassBuilder.h> #include <llvm-c/Disassembler.h> #include <llvm/Support/Host.h> #include <llvm/Support/ManagedStatic.h> diff --git a/yql/essentials/minikql/codegen/llvm16/ut/ya.make b/yql/essentials/minikql/codegen/llvm16/ut/ya.make new file mode 100644 index 0000000000..da312f14db --- /dev/null +++ b/yql/essentials/minikql/codegen/llvm16/ut/ya.make @@ -0,0 +1,28 @@ +UNITTEST() + +PEERDIR( + contrib/libs/llvm16/lib/IR + contrib/libs/llvm16/lib/ExecutionEngine/MCJIT + contrib/libs/llvm16/lib/Linker + contrib/libs/llvm16/lib/Passes + contrib/libs/llvm16/lib/Target/X86 + contrib/libs/llvm16/lib/Target/X86/AsmParser + contrib/libs/llvm16/lib/Target/X86/Disassembler + contrib/libs/llvm16/lib/Transforms/IPO + contrib/libs/llvm16/lib/Transforms/ObjCARC +) + +IF (OS_LINUX) + PEERDIR( + contrib/libs/llvm16/lib/ExecutionEngine/PerfJITEvents + ) +ENDIF() + +USE_LLVM_BC16() +SET(LLVM_VER 16) + +INCLUDE(../../ut/ya.make.inc) + +PEERDIR(yql/essentials/minikql/codegen/llvm16) + +END() diff --git a/yql/essentials/minikql/codegen/llvm16/ya.make b/yql/essentials/minikql/codegen/llvm16/ya.make new file mode 100644 index 0000000000..1b214397d8 --- /dev/null +++ b/yql/essentials/minikql/codegen/llvm16/ya.make @@ -0,0 +1,27 @@ +LIBRARY() + +PEERDIR( + contrib/libs/llvm16/lib/IR + contrib/libs/llvm16/lib/ExecutionEngine/MCJIT + contrib/libs/llvm16/lib/Linker + contrib/libs/llvm16/lib/Passes + contrib/libs/llvm16/lib/Target/X86 + contrib/libs/llvm16/lib/Target/X86/AsmParser + contrib/libs/llvm16/lib/Target/X86/Disassembler + contrib/libs/llvm16/lib/Transforms/IPO + contrib/libs/llvm16/lib/Transforms/ObjCARC +) + +IF (OS_LINUX) + PEERDIR( + contrib/libs/llvm16/lib/ExecutionEngine/PerfJITEvents + ) +ENDIF() + +INCLUDE(../ya.make.inc) + +END() + +RECURSE_FOR_TESTS( + ut +) diff --git a/yql/essentials/minikql/codegen/ya.make b/yql/essentials/minikql/codegen/ya.make index 2140a91b9f..3ced79188d 100644 --- a/yql/essentials/minikql/codegen/ya.make +++ b/yql/essentials/minikql/codegen/ya.make @@ -1 +1 @@ -RECURSE(no_llvm llvm14) +RECURSE(no_llvm llvm14 llvm16) diff --git a/yql/essentials/minikql/codegen/ya.make.inc b/yql/essentials/minikql/codegen/ya.make.inc index d7cca3c965..1244b280ad 100644 --- a/yql/essentials/minikql/codegen/ya.make.inc +++ b/yql/essentials/minikql/codegen/ya.make.inc @@ -7,17 +7,20 @@ COPY_FILE( AUTO ../codegen_llvm_deps.h.txt ${ARCADIA_BUILD_ROOT}/${MODDIR}/codegen_llvm_deps.h OUTPUT_INCLUDES + llvm/BinaryFormat/Dwarf.h llvm/ExecutionEngine/ExecutionEngine.h llvm/ExecutionEngine/JITEventListener.h llvm/ExecutionEngine/MCJIT.h llvm/IR/DiagnosticInfo.h llvm/IR/DiagnosticPrinter.h + llvm/IR/PassManager.h llvm/IR/LegacyPassManager.h llvm/IR/LLVMContext.h llvm/IR/Module.h llvm/IR/Verifier.h llvm/IRReader/IRReader.h llvm/Linker/Linker.h + llvm/Passes/PassBuilder.h llvm-c/Disassembler.h llvm/Support/Host.h llvm/Support/ManagedStatic.h |