diff --git a/src/codegen/codegen_source_base.h b/src/codegen/codegen_source_base.h index 89c5bbc05ce4cfbf14ee47f66db0370ca7e1f037..d2f80a538a337524a7897db60bfa6e6b7ea7fadc 100644 --- a/src/codegen/codegen_source_base.h +++ b/src/codegen/codegen_source_base.h @@ -23,6 +23,7 @@ namespace codegen { */ class CodeGenSourceBase { public: + virtual ~CodeGenSourceBase() = default; /*! * \brief Register constant value appeared in expresion tree * This avoid generated a ssa id for each appearance of the value diff --git a/src/codegen/llvm/codegen_amdgpu.cc b/src/codegen/llvm/codegen_amdgpu.cc index dd2cf6714251fb6f90005a1b3bf86fdacb2d72fe..9cccdf4466fd6a432b1829095a1113e1425a06a5 100644 --- a/src/codegen/llvm/codegen_amdgpu.cc +++ b/src/codegen/llvm/codegen_amdgpu.cc @@ -160,10 +160,10 @@ runtime::Module BuildAMDGPU(Array<LoweredFunc> funcs, std::string target) { config << "-mtriple=amdgcn-amd-amdhsa-hcc -mcpu=gfx" << DetectROCMComputeVersion(target) << target.substr(4, target.length() - 4); - llvm::TargetMachine* tm = GetLLVMTargetMachine(config.str()); + std::unique_ptr<llvm::TargetMachine> tm = GetLLVMTargetMachine(config.str()); std::unique_ptr<CodeGenAMDGPU> cg(new CodeGenAMDGPU()); std::unique_ptr<llvm::LLVMContext> ctx(new llvm::LLVMContext()); - cg->Init(funcs[0]->name, tm, ctx.get(), false, false); + cg->Init(funcs[0]->name, tm.get(), ctx.get(), false, false); for (LoweredFunc f : funcs) { cg->AddFunction(f); } diff --git a/src/codegen/llvm/codegen_nvptx.cc b/src/codegen/llvm/codegen_nvptx.cc index fc5ad99119ae5aaa015a9b4bc134aab008bc2f95..6bc6ccaff5829b0f5da69c8eb2235a627756a0c7 100644 --- a/src/codegen/llvm/codegen_nvptx.cc +++ b/src/codegen/llvm/codegen_nvptx.cc @@ -171,10 +171,10 @@ runtime::Module BuildNVPTX(Array<LoweredFunc> funcs, std::string target) { config << "-mtriple=nvptx64-nvidia-cuda -mcpu=sm_" << compute_ver << target.substr(5, target.length() - 5); - llvm::TargetMachine* tm = GetLLVMTargetMachine(config.str()); + std::unique_ptr<llvm::TargetMachine> tm = GetLLVMTargetMachine(config.str()); std::unique_ptr<CodeGenNVPTX> cg(new CodeGenNVPTX()); std::unique_ptr<llvm::LLVMContext> ctx(new llvm::LLVMContext()); - cg->Init(funcs[0]->name, tm, ctx.get(), false, false); + cg->Init(funcs[0]->name, tm.get(), ctx.get(), false, false); for (LoweredFunc f : funcs) { cg->AddFunction(f); } diff --git a/src/codegen/llvm/llvm_common.cc b/src/codegen/llvm/llvm_common.cc index 9d1ba6b1068fb85406eb0c9ca5f811d362e11b13..48c3e788a7f2f39b1352a3ec4e7a4b8c3412002f 100644 --- a/src/codegen/llvm/llvm_common.cc +++ b/src/codegen/llvm/llvm_common.cc @@ -114,7 +114,7 @@ void ParseLLVMTargetOptions(const std::string& target_str, } -llvm::TargetMachine* +std::unique_ptr<llvm::TargetMachine> GetLLVMTargetMachine(const std::string& target_str, bool allow_null) { std::string target_triple, mcpu, mattr; @@ -143,7 +143,7 @@ GetLLVMTargetMachine(const std::string& target_str, } llvm::TargetMachine* tm = target->createTargetMachine( target_triple, mcpu, mattr, opt, llvm::Reloc::PIC_); - return tm; + return std::unique_ptr<llvm::TargetMachine>(tm); } } // namespace codegen diff --git a/src/codegen/llvm/llvm_common.h b/src/codegen/llvm/llvm_common.h index d5d27bf83d7113a67c60efa3d643844f1dbacb47..9f162ee5c6d789024c2ef01950fe3d7caa4dd57b 100644 --- a/src/codegen/llvm/llvm_common.h +++ b/src/codegen/llvm/llvm_common.h @@ -78,7 +78,7 @@ void ParseLLVMTargetOptions(const std::string& target_str, * \param allow_null Whether allow null to be returned. * \return target machine */ -llvm::TargetMachine* +std::unique_ptr<llvm::TargetMachine> GetLLVMTargetMachine(const std::string& target_str, bool allow_null = false); } // namespace codegen diff --git a/src/codegen/llvm/llvm_module.cc b/src/codegen/llvm/llvm_module.cc index 54f986d628d392c59875e7bcbfd571459f77089a..495f9982022a9b19fafb2310953624d3318f1ae1 100644 --- a/src/codegen/llvm/llvm_module.cc +++ b/src/codegen/llvm/llvm_module.cc @@ -160,9 +160,9 @@ class LLVMModuleNode final : public runtime::ModuleNode { bool system_lib = (target.find("-system-lib") != std::string::npos); CHECK_NE(funcs.size(), 0U); ctx_ = std::make_shared<llvm::LLVMContext>(); - std::unique_ptr<CodeGenLLVM> cg = CodeGenLLVM::Create(tm_); + std::unique_ptr<CodeGenLLVM> cg = CodeGenLLVM::Create(tm_.get()); entry_func_ = funcs[0]->name; - cg->Init(funcs[0]->name, tm_, ctx_.get(), system_lib, system_lib); + cg->Init(funcs[0]->name, tm_.get(), ctx_.get(), system_lib, system_lib); for (LoweredFunc f : funcs) { cg->AddFunction(f); } @@ -218,8 +218,8 @@ class LLVMModuleNode final : public runtime::ModuleNode { builder.setMAttrs(mattrs); } builder.setTargetOptions(opt); - llvm::TargetMachine *tm = builder.selectTarget(); - llvm::TargetMachine *tm_sys = GetLLVMTargetMachine("llvm"); + auto tm = std::unique_ptr<llvm::TargetMachine>(builder.selectTarget()); + std::unique_ptr<llvm::TargetMachine> tm_sys = GetLLVMTargetMachine("llvm"); if (tm_sys->getTargetTriple().getArch() != tm->getTargetTriple().getArch()) { LOG(FATAL) << "Cannot run module, architecture mismatch " << " module=" << tm->getTargetTriple().str() @@ -231,7 +231,7 @@ class LLVMModuleNode final : public runtime::ModuleNode { << mptr_->getDataLayout().getStringRepresentation() << ")" << " and ExecutionEngine (" << layout.getStringRepresentation() << ")"; - ee_ = builder.create(tm); + ee_ = builder.create(tm.release()); CHECK(ee_ != nullptr) << "Failed to initialize git engine for " << mptr_->getTargetTriple(); ee_->runStaticConstructorsDestructors(false); @@ -275,7 +275,7 @@ class LLVMModuleNode final : public runtime::ModuleNode { // The raw pointer to the module. llvm::Module* mptr_{nullptr}; // The target machine - llvm::TargetMachine* tm_{nullptr}; + std::unique_ptr<llvm::TargetMachine> tm_{nullptr}; // The module, can be moved to ee if JIT is enabled. std::unique_ptr<llvm::Module> module_; // the context. diff --git a/src/runtime/dsl_api.h b/src/runtime/dsl_api.h index a1d6e48ceb2faeeb65651f5a3185a88de1b205a0..3e1299bd8c960b673601fe0f1f218c5dda5aab89 100644 --- a/src/runtime/dsl_api.h +++ b/src/runtime/dsl_api.h @@ -16,6 +16,7 @@ namespace runtime { */ class DSLAPI { public: + virtual ~DSLAPI() = default; virtual void NodeFree(NodeHandle handle) const = 0; virtual void NodeTypeKey2Index(const char* type_key, diff --git a/src/runtime/registry.cc b/src/runtime/registry.cc index d7bbc3ce9996f5c680f3177e7e7cd5db3f5a3a7a..3c792fdb9063ceb4e19cc784a4e4918ed3f1aa07 100644 --- a/src/runtime/registry.cc +++ b/src/runtime/registry.cc @@ -34,8 +34,11 @@ struct Registry::Manager { } static Manager* Global() { - static Manager inst; - return &inst; + // We deliberately leak the Manager instance, to avoid leak sanitizers + // complaining about the entries in Manager::fmap being leaked at program + // exit. + static Manager* inst = new Manager(); + return inst; } };