forked from OSchip/llvm-project
[mlir] Convert function signatures before converting globals
Summary: This allows global initializers to reference functions. Differential Revision: https://reviews.llvm.org/D83266
This commit is contained in:
parent
6cff71e92e
commit
a084b94f11
|
@ -61,6 +61,8 @@ public:
|
|||
LLVM::ensureDistinctSuccessors(m);
|
||||
|
||||
T translator(m, std::move(llvmModule));
|
||||
if (failed(translator.convertFunctionSignatures()))
|
||||
return nullptr;
|
||||
if (failed(translator.convertGlobals()))
|
||||
return nullptr;
|
||||
if (failed(translator.convertFunctions()))
|
||||
|
@ -94,6 +96,7 @@ private:
|
|||
/// Check whether the module contains only supported ops directly in its body.
|
||||
static LogicalResult checkSupportedModuleOps(Operation *m);
|
||||
|
||||
LogicalResult convertFunctionSignatures();
|
||||
LogicalResult convertFunctions();
|
||||
LogicalResult convertGlobals();
|
||||
LogicalResult convertOneFunction(LLVMFuncOp func);
|
||||
|
|
|
@ -783,12 +783,13 @@ LogicalResult ModuleTranslation::checkSupportedModuleOps(Operation *m) {
|
|||
return success();
|
||||
}
|
||||
|
||||
LogicalResult ModuleTranslation::convertFunctions() {
|
||||
LogicalResult ModuleTranslation::convertFunctionSignatures() {
|
||||
// Lock access to the llvm context.
|
||||
llvm::sys::SmartScopedLock<true> scopedLock(
|
||||
llvmDialect->getLLVMContextMutex());
|
||||
|
||||
// Declare all functions first because there may be function calls that form a
|
||||
// call graph with cycles.
|
||||
// call graph with cycles, or global initializers that reference functions.
|
||||
for (auto function : getModuleBody(mlirModule).getOps<LLVMFuncOp>()) {
|
||||
llvm::FunctionCallee llvmFuncCst = llvmModule->getOrInsertFunction(
|
||||
function.getName(),
|
||||
|
@ -802,6 +803,14 @@ LogicalResult ModuleTranslation::convertFunctions() {
|
|||
return failure();
|
||||
}
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
LogicalResult ModuleTranslation::convertFunctions() {
|
||||
// Lock access to the llvm context.
|
||||
llvm::sys::SmartScopedLock<true> scopedLock(
|
||||
llvmDialect->getLLVMContextMutex());
|
||||
|
||||
// Convert functions.
|
||||
for (auto function : getModuleBody(mlirModule).getOps<LLVMFuncOp>()) {
|
||||
// Ignore external functions.
|
||||
|
|
|
@ -1230,3 +1230,13 @@ llvm.func @constant_bf16() -> !llvm<"bfloat"> {
|
|||
|
||||
// CHECK: ret bfloat 0xR4120
|
||||
|
||||
// -----
|
||||
|
||||
llvm.func @address_taken() {
|
||||
llvm.return
|
||||
}
|
||||
|
||||
llvm.mlir.global internal constant @taker_of_address() : !llvm<"void()*"> {
|
||||
%0 = llvm.mlir.addressof @address_taken : !llvm<"void()*">
|
||||
llvm.return %0 : !llvm<"void()*">
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue