diff options
Diffstat (limited to 'mlir/lib/Target/LLVMIR/ModuleImport.cpp')
-rw-r--r-- | mlir/lib/Target/LLVMIR/ModuleImport.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp index ab187cd..663cad7 100644 --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -517,6 +517,33 @@ void ModuleImport::addDebugIntrinsic(llvm::CallInst *intrinsic) { debugIntrinsics.insert(intrinsic); } +LogicalResult ModuleImport::convertModuleFlagsMetadata() { + SmallVector<llvm::Module::ModuleFlagEntry> llvmModuleFlags; + llvmModule->getModuleFlagsMetadata(llvmModuleFlags); + + SmallVector<Attribute> moduleFlags; + for (const auto [behavior, key, val] : llvmModuleFlags) { + // Currently only supports most common: int constant values. + auto *constInt = llvm::mdconst::dyn_extract<llvm::ConstantInt>(val); + if (!constInt) { + emitWarning(mlirModule.getLoc()) + << "unsupported module flag value: " << diagMD(val, llvmModule.get()) + << ", only constant integer currently supported"; + continue; + } + + moduleFlags.push_back(builder.getAttr<ModuleFlagAttr>( + convertModFlagBehaviorFromLLVM(behavior), + builder.getStringAttr(key->getString()), constInt->getZExtValue())); + } + + if (!moduleFlags.empty()) + builder.create<LLVM::ModuleFlagsOp>(mlirModule.getLoc(), + builder.getArrayAttr(moduleFlags)); + + return success(); +} + LogicalResult ModuleImport::convertLinkerOptionsMetadata() { for (const llvm::NamedMDNode &named : llvmModule->named_metadata()) { if (named.getName() != "llvm.linker.options") @@ -596,6 +623,8 @@ LogicalResult ModuleImport::convertMetadata() { } if (failed(convertLinkerOptionsMetadata())) return failure(); + if (failed(convertModuleFlagsMetadata())) + return failure(); if (failed(convertIdentMetadata())) return failure(); if (failed(convertCommandlineMetadata())) |