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(
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();