summaryrefslogtreecommitdiffstats
path: root/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
diff options
context:
space:
mode:
authorAlex Zinenko <zinenko@google.com>2019-12-02 03:27:38 -0800
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-12-02 03:28:10 -0800
commitd5e627f84b440cb4dd30802930629ea970dd4342 (patch)
tree13d3a929445b6e260759eb3ecdc92a247225c08f /mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
parent2235333d5878393ca4d43891184c3f58f71edeb5 (diff)
downloadbcm5719-llvm-d5e627f84b440cb4dd30802930629ea970dd4342.tar.gz
bcm5719-llvm-d5e627f84b440cb4dd30802930629ea970dd4342.zip
Introduce Linkage attribute to the LLVM dialect
LLVM IR supports linkage on global objects such as global variables and functions. Introduce the Linkage attribute into the LLVM dialect, backed by an integer storage. Use this attribute on LLVM::GlobalOp and make it mandatory. Implement parsing/printing of the attribute and conversion to LLVM IR. See tensorflow/mlir#277. PiperOrigin-RevId: 283309328
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