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. llvm-svn: 140241
13 lines
453 B
C
13 lines
453 B
C
// RUN: %clang_cc1 -triple s390x-unknown-linux -emit-llvm -o - %s | FileCheck %s
|
|
|
|
// 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 keeps that attribute.
|
|
void test0_helper();
|
|
void test0() {
|
|
// CHECK: call void bitcast (void ()* @test0_helper to void (i32)*)(i32 signext 1)
|
|
test0_helper(1);
|
|
}
|
|
void test0_helper() {}
|
|
|