File 18204_backported.patch of Package tvm
From 5cf6a84dcbb665b09a3e00947465a5381a3a7cda Mon Sep 17 00:00:00 2001
From: Balint Cristian <cristian.balint@gmail.com>
Date: Mon, 11 Aug 2025 17:56:41 +0300
Subject: [PATCH] [LLVM] Fixes up to the latest LLVM21
---
src/target/llvm/codegen_amdgpu.cc | 4 ++++
src/target/llvm/codegen_blob.cc | 4 ++++
src/target/llvm/codegen_llvm.cc | 8 +++++++
src/target/llvm/codegen_nvptx.cc | 8 +++++++
src/target/llvm/llvm_instance.cc | 4 ++++
src/target/llvm/llvm_module.cc | 27 ++++++++++++++++++++++-
tests/cpp/target/parsers/aprofile_test.cc | 4 ++--
7 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/src/target/llvm/codegen_amdgpu.cc b/src/target/llvm/codegen_amdgpu.cc
index ae859170d664..0cf218054320 100644
--- a/src/target/llvm/codegen_amdgpu.cc
+++ b/src/target/llvm/codegen_amdgpu.cc
@@ -284,7 +284,11 @@ runtime::Module BuildAMDGPU(IRModule mod, Target target) {
for (auto& bitcode_path : bitcode_files) {
std::unique_ptr<llvm::Module> mlib = llvm_instance.LoadIR(bitcode_path);
+#if TVM_LLVM_VERSION >= 210
+ mlib->setTargetTriple(llvm::Triple(llvm_target->GetTargetTriple()));
+#else
mlib->setTargetTriple(llvm_target->GetTargetTriple());
+#endif
mlib->setDataLayout(tm->createDataLayout());
for (llvm::Function& f : mlib->functions()) {
diff --git a/src/target/llvm/codegen_blob.cc b/src/target/llvm/codegen_blob.cc
index 8ea964b6d2d9..3d48f57513d0 100644
--- a/src/target/llvm/codegen_blob.cc
+++ b/src/target/llvm/codegen_blob.cc
@@ -69,7 +69,11 @@ std::unique_ptr<llvm::Module> CodeGenBlob(const std::string& data, bool system_l
llvm::LLVMContext* ctx = llvm_target->GetContext();
std::string module_name = c_symbol_prefix + "devc";
auto module = std::make_unique<llvm::Module>(module_name, *ctx);
+#if TVM_LLVM_VERSION >= 210
+ module->setTargetTriple(triple);
+#else
module->setTargetTriple(triple.str());
+#endif
llvm_target->SetTargetMetadata(module.get());
module->setDataLayout(tm->createDataLayout());
auto* blob_value = llvm::ConstantDataArray::getString(*ctx, data, false);
diff --git a/src/target/llvm/codegen_llvm.cc b/src/target/llvm/codegen_llvm.cc
index 21dd62efa9b7..4fe120e945b9 100644
--- a/src/target/llvm/codegen_llvm.cc
+++ b/src/target/llvm/codegen_llvm.cc
@@ -168,7 +168,11 @@ void CodeGenLLVM::SetFastMathFlags(llvm::FastMathFlags fmf) { builder_->setFastM
void CodeGenLLVM::InitTarget() {
llvm::TargetMachine* tm = llvm_target_->GetOrCreateTargetMachine();
+#if TVM_LLVM_VERSION >= 210
+ module_->setTargetTriple(tm->getTargetTriple());
+#else
module_->setTargetTriple(tm->getTargetTriple().str());
+#endif
module_->setDataLayout(tm->createDataLayout());
#if TVM_LLVM_VERSION >= 200
data_layout_.reset(new llvm::DataLayout(module_.get()->getDataLayout()));
@@ -374,7 +378,11 @@ void CodeGenLLVM::HandleImport(const std::string& code) {
mlib = llvm_target_->GetInstance().ParseIR(code);
}
+#if TVM_LLVM_VERSION >= 210
+ mlib->setTargetTriple(llvm::Triple(llvm_target_->GetTargetTriple()));
+#else
mlib->setTargetTriple(llvm_target_->GetTargetTriple());
+#endif
mlib->setDataLayout(llvm_target_->GetOrCreateTargetMachine()->createDataLayout());
// mark all the functions as force inline
for (llvm::Function& f : mlib->functions()) {
diff --git a/src/target/llvm/codegen_nvptx.cc b/src/target/llvm/codegen_nvptx.cc
index bcea45cfa70e..a6b70ad39a32 100644
--- a/src/target/llvm/codegen_nvptx.cc
+++ b/src/target/llvm/codegen_nvptx.cc
@@ -189,7 +189,11 @@ class CodeGenNVPTX : public CodeGenLLVM {
} else if (sync == "shared" || sync == "shared.dyn") {
#if TVM_LLVM_VERSION >= 200
llvm::Function* f = llvm::cast<llvm::Function>(llvm::Intrinsic::getOrInsertDeclaration(
+#if TVM_LLVM_VERSION >= 210
+ module_.get(), llvm::Intrinsic::nvvm_barrier_cta_sync_aligned_all, {}));
+#else
module_.get(), llvm::Intrinsic::nvvm_barrier0, {}));
+#endif
#else
llvm::Function* f =
llvm::Intrinsic::getDeclaration(module_.get(), llvm::Intrinsic::nvvm_barrier0);
@@ -335,7 +339,11 @@ runtime::Module BuildNVPTX(IRModule mod, Target target) {
std::string path = (*flibdevice_path)(compute_ver).cast<std::string>();
if (path.length() != 0) {
std::unique_ptr<llvm::Module> mlib = llvm_instance.LoadIR(path);
+#if TVM_LLVM_VERSION >= 210
+ mlib->setTargetTriple(llvm::Triple(llvm_target->GetTargetTriple()));
+#else
mlib->setTargetTriple(llvm_target->GetTargetTriple());
+#endif
mlib->setDataLayout(tm->createDataLayout());
cg->AddLinkModule(std::move(mlib));
}
diff --git a/src/target/llvm/llvm_instance.cc b/src/target/llvm/llvm_instance.cc
index ebf9a754b101..e494a2bbf9e9 100644
--- a/src/target/llvm/llvm_instance.cc
+++ b/src/target/llvm/llvm_instance.cc
@@ -981,7 +981,11 @@ std::string LLVMTarget::GetTargetMetadata(const llvm::Module& module) {
return meta.str();
}
}
+#if TVM_LLVM_VERSION >= 210
+ return "llvm -mtriple " + module.getTargetTriple().str();
+#else
return "llvm -mtriple " + module.getTargetTriple();
+#endif
}
void LLVMTarget::SetTargetMetadata(llvm::Module* module) const {
diff --git a/src/target/llvm/llvm_module.cc b/src/target/llvm/llvm_module.cc
index 924f520082fd..a9e09652eec0 100644
--- a/src/target/llvm/llvm_module.cc
+++ b/src/target/llvm/llvm_module.cc
@@ -429,7 +429,11 @@ void LLVMModuleNode::InitMCJIT() {
// create MCJIT
mcjit_ee_ = builder.create(tm.release());
ICHECK(mcjit_ee_ != nullptr) << "Failed to initialize LLVM MCJIT engine for "
+#if TVM_LLVM_VERSION >= 210
+ << module_->getTargetTriple().str();
+#else
<< module_->getTargetTriple();
+#endif
VLOG(2) << "LLVM MCJIT execute " << module_->getModuleIdentifier() << " for triple `"
<< llvm_target->GetTargetTriple() << "`"
@@ -503,8 +507,13 @@ void LLVMModuleNode::InitORCJIT() {
#if TVM_LLVM_VERSION >= 130
// linker
const auto linkerBuilder =
+#if TVM_LLVM_VERSION >= 210
+ [&](llvm::orc::ExecutionSession& session)
+ -> llvm::Expected<std::unique_ptr<llvm::orc::ObjectLayer>> {
+#else
[&](llvm::orc::ExecutionSession& session,
const llvm::Triple& triple) -> std::unique_ptr<llvm::orc::ObjectLayer> {
+#endif
#if _WIN32
auto GetMemMgr = []() { return std::make_unique<llvm::SectionMemoryManager>(); };
auto ObjLinkingLayer =
@@ -512,12 +521,20 @@ void LLVMModuleNode::InitORCJIT() {
#else
auto ObjLinkingLayer = std::make_unique<llvm::orc::ObjectLinkingLayer>(session);
#endif
+#if TVM_LLVM_VERSION >= 210
+ if (tm_builder.getTargetTriple().isOSBinFormatCOFF()) {
+#else
if (triple.isOSBinFormatCOFF()) {
+#endif
ObjLinkingLayer->setOverrideObjectFlagsWithResponsibilityFlags(true);
ObjLinkingLayer->setAutoClaimResponsibilityForObjectSymbols(true);
}
+#if TVM_LLVM_VERSION >= 210
+ return llvm::Expected<std::unique_ptr<llvm::orc::ObjectLayer>>(std::move(ObjLinkingLayer));
+#else
return ObjLinkingLayer;
- };
+#endif
+ }; // NOLINT(readability/braces)
#endif
// create LLJIT
@@ -532,7 +549,11 @@ void LLVMModuleNode::InitORCJIT() {
.create());
ICHECK(orcjit_ee_ != nullptr) << "Failed to initialize LLVM ORCJIT engine for "
+#if TVM_LLVM_VERSION >= 210
+ << module_->getTargetTriple().str();
+#else
<< module_->getTargetTriple();
+#endif
// store ctors
auto ctors = llvm::orc::getConstructors(*module_);
@@ -635,7 +656,11 @@ TVM_FFI_REGISTER_GLOBAL("codegen.LLVMMod
// Generate a LLVM module from an input target string
auto module = std::make_unique<llvm::Module>(module_name, *llvm_target->GetContext());
llvm_target->SetTargetMetadata(module.get());
+#if TVM_LLVM_VERSION >= 210
+ module->setTargetTriple(llvm::Triple(llvm_target->GetTargetTriple()));
+#else
module->setTargetTriple(llvm_target->GetTargetTriple());
+#endif
module->setDataLayout(llvm_target->GetOrCreateTargetMachine()->createDataLayout());
n->Init(std::move(module), std::move(llvm_instance));
n->SetJITEngine(llvm_target->GetJITEngine());