From a77c3201878cbfcd305b47005e3b3c195ece7cfc Mon Sep 17 00:00:00 2001 From: Christoph Gerum Date: Mon, 3 May 2021 16:57:58 +0200 Subject: [PATCH] [Codegen] Fix assertion errors in llvm backend when using llvm debug build (#7959) --- src/target/llvm/codegen_cpu.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/target/llvm/codegen_cpu.cc b/src/target/llvm/codegen_cpu.cc index b49f850b2d90..ab96d6e69d14 100644 --- a/src/target/llvm/codegen_cpu.cc +++ b/src/target/llvm/codegen_cpu.cc @@ -794,17 +794,20 @@ void CodeGenCPU::DefineFunctionRegistry(Array func_names) { std::vector funcs; for (auto sym : func_names) { symbols.push_back(sym); - llvm::GlobalVariable* sym_func = new llvm::GlobalVariable( - *module_, ftype_tvm_backend_packed_c_func_, true, llvm::GlobalValue::ExternalLinkage, - nullptr, sym.operator std::string()); + auto* sym_func = + llvm::Function::Create(ftype_tvm_backend_packed_c_func_, llvm::GlobalValue::ExternalLinkage, + sym.operator std::string(), module_.get()); + funcs.emplace_back(sym_func); } - llvm::DataLayout layout(module_.get()); llvm::ArrayType* t_tvm_crt_func_ptrs = llvm::ArrayType::get(ftype_tvm_backend_packed_c_func_->getPointerTo(), funcs.size()); + llvm::DataLayout layout(module_.get()); + llvm::GlobalVariable* func_registry_ptrs = new llvm::GlobalVariable( *module_, t_tvm_crt_func_ptrs, true, llvm::GlobalValue::InternalLinkage, llvm::ConstantArray::get(t_tvm_crt_func_ptrs, funcs), "_tvm_func_registry_ptrs"); + uint64_t align = layout.getTypeAllocSize(ftype_tvm_backend_packed_c_func_->getPointerTo()); #if TVM_LLVM_VERSION >= 100 func_registry_ptrs->setAlignment(llvm::Align(align)); @@ -815,7 +818,9 @@ void CodeGenCPU::DefineFunctionRegistry(Array func_names) { *module_, t_tvm_crt_func_registry_, true, llvm::GlobalVariable::InternalLinkage, llvm::ConstantStruct::get( t_tvm_crt_func_registry_, - {GetConstString(::tvm::target::GenerateFuncRegistryNames(symbols)), func_registry_ptrs}), + {GetConstString(::tvm::target::GenerateFuncRegistryNames(symbols)), + llvm::ConstantExpr::getBitCast(func_registry_ptrs, + ftype_tvm_backend_packed_c_func_->getPointerTo())}), "_tvm_crt_func_registry"); llvm::GlobalVariable* module = new llvm::GlobalVariable( *module_, t_tvm_crt_module_, true, llvm::GlobalValue::InternalLinkage,