summaryrefslogtreecommitdiffstats
path: root/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/Target/LLVMIR/ModuleTranslation.cpp')
-rw-r--r--mlir/lib/Target/LLVMIR/ModuleTranslation.cpp39
1 files changed, 36 insertions, 3 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 7f3ce5a738f..f985fed3991 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -279,6 +279,35 @@ LogicalResult ModuleTranslation::convertBlock(Block &bb, bool ignoreArguments) {
return success();
}
+// Convert the LLVM dialect linkage type to LLVM IR linkage type.
+llvm::GlobalVariable::LinkageTypes convertLinkageType(LLVM::Linkage linkage) {
+ switch (linkage) {
+ case LLVM::Linkage::Private:
+ return llvm::GlobalValue::PrivateLinkage;
+ case LLVM::Linkage::Internal:
+ return llvm::GlobalValue::InternalLinkage;
+ case LLVM::Linkage::AvailableExternally:
+ return llvm::GlobalValue::AvailableExternallyLinkage;
+ case LLVM::Linkage::Linkonce:
+ return llvm::GlobalValue::LinkOnceAnyLinkage;
+ case LLVM::Linkage::Weak:
+ return llvm::GlobalValue::WeakAnyLinkage;
+ case LLVM::Linkage::Common:
+ return llvm::GlobalValue::CommonLinkage;
+ case LLVM::Linkage::Appending:
+ return llvm::GlobalValue::AppendingLinkage;
+ case LLVM::Linkage::ExternWeak:
+ return llvm::GlobalValue::ExternalWeakLinkage;
+ case LLVM::Linkage::LinkonceODR:
+ return llvm::GlobalValue::LinkOnceODRLinkage;
+ case LLVM::Linkage::WeakODR:
+ return llvm::GlobalValue::WeakODRLinkage;
+ case LLVM::Linkage::External:
+ return llvm::GlobalValue::ExternalLinkage;
+ }
+ llvm_unreachable("unknown linkage type");
+}
+
// Create named global variables that correspond to llvm.mlir.global
// definitions.
void ModuleTranslation::convertGlobals() {
@@ -308,11 +337,15 @@ void ModuleTranslation::convertGlobals() {
cst = cast<llvm::Constant>(valueMapping.lookup(ret.getOperand(0)));
}
+ auto linkage = convertLinkageType(op.linkage());
+ bool anyExternalLinkage =
+ (linkage == llvm::GlobalVariable::ExternalLinkage ||
+ linkage == llvm::GlobalVariable::ExternalWeakLinkage);
auto addrSpace = op.addr_space().getLimitedValue();
auto *var = new llvm::GlobalVariable(
- *llvmModule, type, op.constant(), llvm::GlobalValue::InternalLinkage,
- cst, op.sym_name(), /*InsertBefore=*/nullptr,
- llvm::GlobalValue::NotThreadLocal, addrSpace);
+ *llvmModule, type, op.constant(), linkage,
+ anyExternalLinkage ? nullptr : cst, op.sym_name(),
+ /*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal, addrSpace);
globalsMapping.try_emplace(op, var);
}
OpenPOWER on IntegriCloud