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;
   }
 };