================ @@ -919,13 +919,46 @@ rewriteCallOrInvoke(mlir::Operation *op, mlir::ValueRange callOperands, memoryEffects, noUnwind, willReturn); mlir::LLVM::LLVMFunctionType llvmFnTy; + + // Temporary to handle the case where we need to prepend an operand if the + // callee is an alias. + SmallVector<mlir::Value> adjustedCallOperands; + if (calleeAttr) { // direct call - mlir::FunctionOpInterface fn = - mlir::SymbolTable::lookupNearestSymbolFrom<mlir::FunctionOpInterface>( - op, calleeAttr); - assert(fn && "Did not find function for call"); - llvmFnTy = cast<mlir::LLVM::LLVMFunctionType>( - converter->convertType(fn.getFunctionType())); + mlir::Operation *callee = + mlir::SymbolTable::lookupNearestSymbolFrom(op, calleeAttr); + if (auto fn = dyn_cast<mlir::FunctionOpInterface>(callee)) { + llvmFnTy = cast<mlir::LLVM::LLVMFunctionType>( + converter->convertType(fn.getFunctionType())); + } else if (auto alias = cast<mlir::LLVM::AliasOp>(callee)) { + // If the callee wasan alias. In that case, + // we need to prepend the address of the alias to the operands. The + // way aliases work in the LLVM dialect is a little counter-intuitive. + // The AliasOp itself is a pseudo-function that returns the address of + // the global value being aliased, but when we generate the call we + // need to insert an operation that gets the address of the AliasOp. + // This all gets sorted out when the LLVM dialect is lowered to LLVM IR. + auto symAttr = cast<mlir::FlatSymbolRefAttr>(calleeAttr); + auto addrOfAlias = + rewriter + .create<mlir::LLVM::AddressOfOp>( + op->getLoc(), + mlir::LLVM::LLVMPointerType::get(rewriter.getContext()), + symAttr) + .getResult(); + adjustedCallOperands.push_back(addrOfAlias); + + // Now add the regular operands and assign this to the range value. + llvm::append_range(adjustedCallOperands, callOperands); + callOperands = adjustedCallOperands; + + // Clear the callee attribute because we're calling an alias. + calleeAttr = {}; + llvmFnTy = cast<mlir::LLVM::LLVMFunctionType>(alias.getType()); ---------------- xlauko wrote:
```suggestion llvmFnTy = mlir::cast<mlir::LLVM::LLVMFunctionType>(alias.getType()); ``` https://github.com/llvm/llvm-project/pull/150520 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits