mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-09 09:26:06 +00:00

LLVM IR recently added a Type parameter to the byval Attribute, so that when pointers become opaque and no longer have an element type the information will still be present in IR. For now the Type parameter is optional (which is why Clang didn't need this change at the time), but it will become mandatory soon. llvm-svn: 362652
39 lines
792 B
C++
39 lines
792 B
C++
// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
|
|
|
|
|
|
// CHECK: _Z3fooRi(i32* inreg
|
|
void __attribute__ ((regparm (1))) foo(int &a) {
|
|
}
|
|
|
|
struct S1 {
|
|
int x;
|
|
S1(const S1 &y);
|
|
};
|
|
|
|
void __attribute__((regparm(3))) foo2(S1 a, int b);
|
|
// CHECK: declare void @_Z4foo22S1i(%struct.S1* inreg, i32 inreg)
|
|
void bar2(S1 a, int b) {
|
|
foo2(a, b);
|
|
}
|
|
|
|
struct S2 {
|
|
int x;
|
|
};
|
|
|
|
void __attribute__((regparm(3))) foo3(struct S2 a, int b);
|
|
// CHECK: declare void @_Z4foo32S2i(i32 inreg, i32 inreg)
|
|
void bar3(struct S2 a, int b) {
|
|
foo3(a, b);
|
|
}
|
|
|
|
struct S3 {
|
|
struct {
|
|
struct {} b[0];
|
|
} a;
|
|
};
|
|
__attribute((regparm(2))) void foo4(S3 a, int b);
|
|
// CHECK: declare void @_Z4foo42S3i(%struct.S3* byval(%struct.S3) align 4, i32 inreg)
|
|
void bar3(S3 a, int b) {
|
|
foo4(a, b);
|
|
}
|