Pass mfloat-abi to LLVMModule::Init (#6150)
authorTrevor Morris <trevmorr@amazon.com>
Wed, 5 Aug 2020 17:04:08 +0000 (10:04 -0700)
committerGitHub <noreply@github.com>
Wed, 5 Aug 2020 17:04:08 +0000 (10:04 -0700)
Fix lint

src/target/llvm/codegen_blob.cc
src/target/llvm/llvm_module.cc

index af2562e..6df4817 100644 (file)
@@ -33,12 +33,17 @@ namespace codegen {
 std::pair<std::unique_ptr<llvm::Module>, std::shared_ptr<llvm::LLVMContext>> CodeGenBlob(
     const std::string& data, bool system_lib, const std::string& target_triple) {
   InitializeLLVM();
-  auto tm = GetLLVMTargetMachine(std::string("-mtriple ") + target_triple);
+  std::string full_target_triple = std::string("-mtriple ") + target_triple;
+  auto tm = GetLLVMTargetMachine(full_target_triple);
   auto triple = tm->getTargetTriple();
   auto ctx = std::make_shared<llvm::LLVMContext>();
   std::string module_name = "devc";
   std::unique_ptr<llvm::Module> module(new llvm::Module(module_name, *ctx));
   module->setTargetTriple(triple.str());
+  // Store full target string in metadata, because flags such as -mfloat-abi must be preserved for
+  // ModulePackImportsToLLVM.
+  module->addModuleFlag(llvm::Module::ModFlagBehavior::Override, "tvm_target",
+                        llvm::MDString::get(*ctx, full_target_triple));
   module->setDataLayout(tm->createDataLayout());
   auto* blob_value = llvm::ConstantDataArray::getString(*ctx, data, false);
   auto* tvm_dev_mblob = new llvm::GlobalVariable(
index a3e2123..9e585d7 100644 (file)
@@ -61,6 +61,11 @@ class LLVMModuleNode final : public runtime::ModuleNode {
       return PackedFunc([flag](TVMArgs args, TVMRetValue* rv) { *rv = flag; });
     } else if (name == "_get_target_triple") {
       std::string target_triple = tm_->getTargetTriple().str();
+      // getTargetTriple() doesn't include other flags besides the triple. Add back flags which are
+      // important for ModulePackImportsToLLVM.
+      if (tm_->Options.FloatABIType == llvm::FloatABI::ABIType::Soft) {
+        target_triple += " -mfloat-abi=soft";
+      }
       return PackedFunc([target_triple](TVMArgs args, TVMRetValue* rv) { *rv = target_triple; });
     }
     if (ee_ == nullptr) LazyInitJIT();