ANSI C requires that a call to an unprototyped function type succeed
if the definition has a non-variadic prototype with compatible
parameters. Therefore, the default rule for such calls must be to
use a non-variadic convention. Achieve this by casting the callee to
the function type with which it is required to be compatible, unless
the target specifically opts out and insists that unprototyped calls
should use the variadic rules. The only case of that I'm aware of is
the x86-64 convention, which passes arguments the same way in both
cases but also sets a small amount of extra information; here we seek
to maintain compatibility with GCC, which does set this when calling
an unprototyped function.
Addresses PR10810 and PR10713.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140241 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGen/builtin-expect.c b/test/CodeGen/builtin-expect.c
index 664c6b6..73b3b24 100644
--- a/test/CodeGen/builtin-expect.c
+++ b/test/CodeGen/builtin-expect.c
@@ -18,7 +18,7 @@
}
// CHECK: call void @isigprocmask()
-// CHECK: [[C:%.*]] = call i64 (...)* @bar()
+// CHECK: [[C:%.*]] = call i64 bitcast (i64 (...)* @bar to i64 ()*)()
// CHECK: @test1
diff --git a/test/CodeGen/functions.c b/test/CodeGen/functions.c
index e51f93e..28e4bd0 100644
--- a/test/CodeGen/functions.c
+++ b/test/CodeGen/functions.c
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -emit-llvm -o - -verify | FileCheck %s
+// RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -o - -verify | FileCheck %s
int g();
@@ -24,7 +24,7 @@
void f1();
void f2(void) {
-// CHECK: call void @f1()
+// CHECK: call void bitcast (void ()* @f1 to void (i32, i32, i32)*)(i32 1, i32 2, i32 3)
f1(1, 2, 3);
}
// CHECK: define void @f1()
diff --git a/test/CodeGen/kr-call.c b/test/CodeGen/kr-call.c
index 97068bc..ea4e3d3 100644
--- a/test/CodeGen/kr-call.c
+++ b/test/CodeGen/kr-call.c
@@ -2,11 +2,10 @@
// Test that we don't crash. The s390x-unknown-linux target happens
// to need to set a sext argument attribute on this call, and we need
-// to make sure that rewriting it correctly drops that attribute when
-// also dropping the spurious argument.
+// to make sure that rewriting it correctly keeps that attribute.
void test0_helper();
void test0() {
- // CHECK: call void @test0_helper()
+ // CHECK: call void bitcast (void ()* @test0_helper to void (i32)*)(i32 signext 1)
test0_helper(1);
}
void test0_helper() {}
diff --git a/test/CodeGen/microsoft-call-conv.c b/test/CodeGen/microsoft-call-conv.c
index 95f5fa3..390c3be 100644
--- a/test/CodeGen/microsoft-call-conv.c
+++ b/test/CodeGen/microsoft-call-conv.c
@@ -46,5 +46,5 @@
void __stdcall f7(foo) int foo; {}
void f8(void) {
f7(0);
- // CHECK: call x86_stdcallcc void (...)* bitcast
+ // CHECK: call x86_stdcallcc void @f7(i32 0)
}
diff --git a/test/CodeGen/mrtd.c b/test/CodeGen/mrtd.c
index 2cc71bb..d7729a5 100644
--- a/test/CodeGen/mrtd.c
+++ b/test/CodeGen/mrtd.c
@@ -4,7 +4,7 @@
// CHECK: define x86_stdcallcc void @foo(i32 %arg) nounwind
void foo(int arg) {
-// CHECK: call x86_stdcallcc i32 (...)* @bar(i32
+// CHECK: call x86_stdcallcc i32 bitcast (i32 (...)* @bar to i32 (i32)*)(
bar(arg);
// CHECK: call x86_stdcallcc void @baz(i32
baz(arg);
diff --git a/test/CodeGen/stdcall-fastcall.c b/test/CodeGen/stdcall-fastcall.c
index 6f3b003..3de7b67 100644
--- a/test/CodeGen/stdcall-fastcall.c
+++ b/test/CodeGen/stdcall-fastcall.c
@@ -46,5 +46,5 @@
void __attribute((stdcall)) f7(foo) int foo; {}
void f8(void) {
f7(0);
- // CHECK: call x86_stdcallcc void (...)* bitcast
+ // CHECK: call x86_stdcallcc void @f7(i32 0)
}