aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <vvvv@yandex-team.com>2025-01-09 13:19:56 +0300
committervvvv <vvvv@yandex-team.com>2025-01-09 13:34:30 +0300
commit427d34bceee5c2b12a181a0eac3fd562b68e8754 (patch)
tree4731e34812732aa6e5c8182a6bab8438006b648f
parent22152213a5c128f39919ace8973c35dcd27006c9 (diff)
downloadydb-427d34bceee5c2b12a181a0eac3fd562b68e8754.tar.gz
LLVM16 codegen lib
commit_hash:ff712c48c83af95a314d804dd8dcef2edaf44b9f
-rw-r--r--yql/essentials/minikql/codegen/codegen.cpp84
-rw-r--r--yql/essentials/minikql/codegen/codegen_llvm_deps.h.txt3
-rw-r--r--yql/essentials/minikql/codegen/llvm16/ut/ya.make28
-rw-r--r--yql/essentials/minikql/codegen/llvm16/ya.make27
-rw-r--r--yql/essentials/minikql/codegen/ya.make2
-rw-r--r--yql/essentials/minikql/codegen/ya.make.inc3
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