llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangir Author: None (valium007) <details> <summary>Changes</summary> Fixes #<!-- -->182175 --- Full diff: https://github.com/llvm/llvm-project/pull/182626.diff 2 Files Affected: - (modified) clang/lib/CIR/CodeGen/CIRGenExpr.cpp (+10-3) - (modified) clang/test/CIR/CodeGen/no-prototype.c (+12) ``````````diff diff --git a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp index 83d51bac01d1e..1989ead7e748a 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExpr.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExpr.cpp @@ -2039,9 +2039,16 @@ RValue CIRGenFunction::emitCall(clang::QualType calleeTy, assert(!cir::MissingFeatures::opCallChain()); assert(!cir::MissingFeatures::addressSpace()); cir::FuncType calleeTy = getTypes().getFunctionType(funcInfo); - // get non-variadic function type - calleeTy = cir::FuncType::get(calleeTy.getInputs(), - calleeTy.getReturnType(), false); + + // For unprototyped functions, funcInfo was built with RequiredArgs(0) so + // calleeTy.getInputs() is empty. So we build the non-variadic callee type from + // the actual promoted argument types instead. + SmallVector<mlir::Type, 8> promotedArgTypes; + for (const CallArg &arg : args) + promotedArgTypes.push_back(convertType(arg.ty)); + calleeTy = cir::FuncType::get(promotedArgTypes, + calleeTy.getReturnType(), /*isVarArg=*/false); + auto calleePtrTy = cir::PointerType::get(calleeTy); mlir::Operation *fn = callee.getFunctionPointer(); diff --git a/clang/test/CIR/CodeGen/no-prototype.c b/clang/test/CIR/CodeGen/no-prototype.c index d266ccb86448a..e5d4f601aec9f 100644 --- a/clang/test/CIR/CodeGen/no-prototype.c +++ b/clang/test/CIR/CodeGen/no-prototype.c @@ -82,3 +82,15 @@ int test5(int x) { } int noProto5(int x) { return x; } // CHECK: cir.func {{.*}} no_proto {{.*}} @noProto5(%arg0: !s32i {{.+}}) -> !s32i + +// No-proto declaration without definition, called with multiple args of +// different types. This is the "printf without a header" case and exercises +// the promoted-arg-type path in emitCall. +int noProto6(); +int test6(int x) { +// CHECK: cir.func {{.*}} @test6 + return noProto6("hello", x); + // CHECK: [[GGO:%.*]] = cir.get_global @noProto6 : !cir.ptr<!cir.func<(...) -> !s32i>> + // CHECK: [[CAST:%.*]] = cir.cast bitcast [[GGO]] : !cir.ptr<!cir.func<(...) -> !s32i>> -> !cir.ptr<!cir.func<(!cir.ptr<!s8i>, !s32i) -> !s32i>> + // CHECK: {{%.*}} = cir.call [[CAST]](%{{.*}}, %{{.*}}) : (!cir.ptr<!cir.func<(!cir.ptr<!s8i>, !s32i) -> !s32i>>, !cir.ptr<!s8i>, !s32i) -> !s32i +} `````````` </details> https://github.com/llvm/llvm-project/pull/182626 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
