diff options
Diffstat (limited to 'mlir/lib/Target/LLVMIR/ModuleTranslation.cpp')
| -rw-r--r-- | mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 7b86b250c294..6e8b2dec75b7 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -64,6 +64,8 @@ using namespace mlir; using namespace mlir::LLVM; using namespace mlir::LLVM::detail; +extern llvm::cl::opt<bool> UseNewDbgInfoFormat; + #include "mlir/Dialect/LLVMIR/LLVMConversionEnumsToLLVM.inc" namespace { @@ -1390,10 +1392,10 @@ LogicalResult ModuleTranslation::convertDialectAttributes( return success(); } -/// Converts the function attributes from LLVMFuncOp and attaches them to the -/// llvm::Function. -static void convertFunctionAttributes(LLVMFuncOp func, - llvm::Function *llvmFunc) { +/// Converts memory effect attributes from `func` and attaches them to +/// `llvmFunc`. +static void convertFunctionMemoryAttributes(LLVMFuncOp func, + llvm::Function *llvmFunc) { if (!func.getMemory()) return; @@ -1412,6 +1414,18 @@ static void convertFunctionAttributes(LLVMFuncOp func, llvmFunc->setMemoryEffects(newMemEffects); } +/// Converts function attributes from `func` and attaches them to `llvmFunc`. +static void convertFunctionAttributes(LLVMFuncOp func, + llvm::Function *llvmFunc) { + if (func.getNoInlineAttr()) + llvmFunc->addFnAttr(llvm::Attribute::NoInline); + if (func.getAlwaysInlineAttr()) + llvmFunc->addFnAttr(llvm::Attribute::AlwaysInline); + if (func.getOptimizeNoneAttr()) + llvmFunc->addFnAttr(llvm::Attribute::OptimizeNone); + convertFunctionMemoryAttributes(func, llvmFunc); +} + FailureOr<llvm::AttrBuilder> ModuleTranslation::convertParameterAttrs(LLVMFuncOp func, int argIdx, DictionaryAttr paramAttrs) { @@ -1789,6 +1803,9 @@ prepareLLVMModule(Operation *m, llvm::LLVMContext &llvmContext, StringRef name) { m->getContext()->getOrLoadDialect<LLVM::LLVMDialect>(); auto llvmModule = std::make_unique<llvm::Module>(name, llvmContext); + // ModuleTranslation can currently only construct modules in the old debug + // info format, so set the flag accordingly. + llvmModule->setNewDbgInfoFormatFlag(false); if (auto dataLayoutAttr = m->getDiscardableAttr(LLVM::LLVMDialect::getDataLayoutAttrName())) { llvmModule->setDataLayout(cast<StringAttr>(dataLayoutAttr).getValue()); @@ -1867,6 +1884,11 @@ mlir::translateModuleToLLVMIR(Operation *module, llvm::LLVMContext &llvmContext, if (failed(translator.convertFunctions())) return nullptr; + // Once we've finished constructing elements in the module, we should convert + // it to use the debug info format desired by LLVM. + // See https://llvm.org/docs/RemoveDIsDebugInfo.html + translator.llvmModule->setIsNewDbgInfoFormat(UseNewDbgInfoFormat); + if (!disableVerification && llvm::verifyModule(*translator.llvmModule, &llvm::errs())) return nullptr; |
