[Mlir-commits] [mlir] fbee8d5 - [MLIR][LLVM] Allow importing of nameless globals (#101918)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Aug 5 19:15:57 PDT 2024
Author: Ivan R. Ivanov
Date: 2024-08-06T11:15:54+09:00
New Revision: fbee8d5a65defae402f98794d778fe724d24cc51
URL: https://github.com/llvm/llvm-project/commit/fbee8d5a65defae402f98794d778fe724d24cc51
DIFF: https://github.com/llvm/llvm-project/commit/fbee8d5a65defae402f98794d778fe724d24cc51.diff
LOG: [MLIR][LLVM] Allow importing of nameless globals (#101918)
LLVM allows nameless globals for private global variables whereas in
MLIR globals must be addressed using symbols. We attach symbols to
nameless globals in order to enable their import.
---------
Co-authored-by: Christian Ulmann <christianulmann at gmail.com>
Added:
Modified:
mlir/include/mlir/Target/LLVMIR/ModuleImport.h
mlir/lib/Target/LLVMIR/ModuleImport.cpp
mlir/test/Target/LLVMIR/Import/global-variables.ll
Removed:
################################################################################
diff --git a/mlir/include/mlir/Target/LLVMIR/ModuleImport.h b/mlir/include/mlir/Target/LLVMIR/ModuleImport.h
index df3feb0a3a280..5364e2ad47325 100644
--- a/mlir/include/mlir/Target/LLVMIR/ModuleImport.h
+++ b/mlir/include/mlir/Target/LLVMIR/ModuleImport.h
@@ -369,6 +369,10 @@ class ModuleImport {
ModuleOp mlirModule;
/// The LLVM module being imported.
std::unique_ptr<llvm::Module> llvmModule;
+ /// Nameless globals.
+ DenseMap<llvm::GlobalVariable *, FlatSymbolRefAttr> namelessGlobals;
+ /// Counter used to assign a unique ID to each nameless global.
+ unsigned namelessGlobalId = 0;
/// A dialect interface collection used for dispatching the import to specific
/// dialects.
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index af2f2cf616fdd..f283980ff1e00 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "mlir/Target/LLVMIR/ModuleImport.h"
+#include "mlir/IR/BuiltinAttributes.h"
#include "mlir/Target/LLVMIR/Import.h"
#include "AttrKindDetail.h"
@@ -73,6 +74,11 @@ static constexpr StringRef getGlobalCtorsVarName() {
return "llvm.global_ctors";
}
+/// Prefix used for symbols of nameless llvm globals.
+static constexpr StringRef getNamelessGlobalPrefix() {
+ return "mlir.llvm.nameless_global";
+}
+
/// Returns the name of the global_dtors global variables.
static constexpr StringRef getGlobalDtorsVarName() {
return "llvm.global_dtors";
@@ -884,9 +890,22 @@ LogicalResult ModuleImport::convertGlobal(llvm::GlobalVariable *globalVar) {
globalExpressionAttr =
debugImporter->translateGlobalVariableExpression(globalExpressions[0]);
+ // Workaround to support LLVM's nameless globals. MLIR, in contrast to LLVM,
+ // always requires a symbol name.
+ SmallString<128> globalName(globalVar->getName());
+ if (globalName.empty()) {
+ // Make sure the symbol name does not clash with an existing symbol.
+ globalName = SymbolTable::generateSymbolName<128>(
+ getNamelessGlobalPrefix(),
+ [this](StringRef newName) {
+ return llvmModule->getNamedValue(newName);
+ },
+ namelessGlobalId);
+ namelessGlobals[globalVar] = FlatSymbolRefAttr::get(context, globalName);
+ }
GlobalOp globalOp = builder.create<GlobalOp>(
mlirModule.getLoc(), type, globalVar->isConstant(),
- convertLinkageFromLLVM(globalVar->getLinkage()), globalVar->getName(),
+ convertLinkageFromLLVM(globalVar->getLinkage()), StringRef(globalName),
valueAttr, alignment, /*addr_space=*/globalVar->getAddressSpace(),
/*dso_local=*/globalVar->isDSOLocal(),
/*thread_local=*/globalVar->isThreadLocal(), /*comdat=*/SymbolRefAttr(),
@@ -1061,7 +1080,12 @@ FailureOr<Value> ModuleImport::convertConstant(llvm::Constant *constant) {
// Convert global variable accesses.
if (auto *globalVar = dyn_cast<llvm::GlobalVariable>(constant)) {
Type type = convertType(globalVar->getType());
- auto symbolRef = FlatSymbolRefAttr::get(context, globalVar->getName());
+ StringRef globalName = globalVar->getName();
+ FlatSymbolRefAttr symbolRef;
+ if (globalName.empty())
+ symbolRef = namelessGlobals[globalVar];
+ else
+ symbolRef = FlatSymbolRefAttr::get(context, globalName);
return builder.create<AddressOfOp>(loc, type, symbolRef).getResult();
}
diff --git a/mlir/test/Target/LLVMIR/Import/global-variables.ll b/mlir/test/Target/LLVMIR/Import/global-variables.ll
index 902f77bd7e6cb..cac7411431ae3 100644
--- a/mlir/test/Target/LLVMIR/Import/global-variables.ll
+++ b/mlir/test/Target/LLVMIR/Import/global-variables.ll
@@ -280,7 +280,24 @@ define void @bar() {
; CHECK-DAG: #[[GLOBAL_VAR:.*]] = #llvm.di_global_variable<file = #[[FILE]], line = 268, type = #[[COMPOSITE_TYPE]], isLocalToUnit = true, isDefined = true>
; CHECK-DAG: #[[GLOBAL_VAR_EXPR:.*]] = #llvm.di_global_variable_expression<var = #[[GLOBAL_VAR]], expr = <>>
-; CHECK-DAG: llvm.mlir.global external constant @".str.1"() {addr_space = 0 : i32, dbg_expr = #[[GLOBAL_VAR_EXPR]]}
+; CHECK: llvm.mlir.global private unnamed_addr constant @mlir.llvm.nameless_global_0("0\00")
+; We skip over @mlir.llvm.nameless_global.1 and 2 because they exist
+; CHECK: llvm.mlir.global private unnamed_addr constant @mlir.llvm.nameless_global_3("1\00")
+;
+; CHECK: llvm.mlir.global internal constant @zero() {addr_space = 0 : i32, dso_local} : !llvm.ptr {
+; CHECK: llvm.mlir.addressof @mlir.llvm.nameless_global_0 : !llvm.ptr
+; CHECK: llvm.mlir.global internal constant @one() {addr_space = 0 : i32, dso_local} : !llvm.ptr {
+; CHECK: llvm.mlir.addressof @mlir.llvm.nameless_global_3 : !llvm.ptr
+
+; CHECK: llvm.mlir.global external constant @".str.1"() {addr_space = 0 : i32, dbg_expr = #[[GLOBAL_VAR_EXPR]]}
+
+ at 0 = private unnamed_addr constant [2 x i8] c"0\00"
+ at 1 = private unnamed_addr constant [2 x i8] c"1\00"
+ at zero = internal constant ptr @0
+ at one = internal constant ptr @1
+
+@"mlir.llvm.nameless_global_1" = external constant [10 x i8], !dbg !0
+declare void @"mlir.llvm.nameless_global_2"()
@.str.1 = external constant [10 x i8], !dbg !0
More information about the Mlir-commits
mailing list