// REQUIRES: arm-registered-target // RUN: %clang_cc1 -triple aarch64-none-none-eabi \ // RUN: -O2 \ // RUN: -emit-llvm -o - %s | FileCheck %s extern "C" { // Base case, nothing interesting. struct S { long x, y; }; void f0(long, S); void f0m(long, long, long, long, long, S); void g0() { S s = {6, 7}; f0(1, s); f0m(1, 2, 3, 4, 5, s); } // CHECK: define{{.*}} void @g0 // CHECK: call void @f0(i64 1, [2 x i64] [i64 6, i64 7] // CHECK: call void @f0m{{.*}}[2 x i64] [i64 6, i64 7] // CHECK: declare void @f0(i64, [2 x i64]) // CHECK: declare void @f0m(i64, i64, i64, i64, i64, [2 x i64]) // Aligned struct, passed according to its natural alignment. struct __attribute__((aligned(16))) S16 { long x, y; } s16; void f1(long, S16); void f1m(long, long, long, long, long, S16); void g1() { S16 s = {6, 7}; f1(1, s); f1m(1, 2, 3, 4, 5, s); } // CHECK: define{{.*}} void @g1 // CHECK: call void @f1{{.*}}[2 x i64] [i64 6, i64 7] // CHECK: call void @f1m{{.*}}[2 x i64] [i64 6, i64 7] // CHECK: declare void @f1(i64, [2 x i64]) // CHECK: declare void @f1m(i64, i64, i64, i64, i64, [2 x i64]) // Increased natural alignment. struct SF16 { long x __attribute__((aligned(16))); long y; }; void f3(long, SF16); void f3m(long, long, long, long, long, SF16); void g3() { SF16 s = {6, 7}; f3(1, s); f3m(1, 2, 3, 4, 5, s); } // CHECK: define{{.*}} void @g3 // CHECK: call void @f3(i64 1, i128 129127208515966861318) // CHECK: call void @f3m(i64 1, i64 2, i64 3, i64 4, i64 5, i128 129127208515966861318) // CHECK: declare void @f3(i64, i128) // CHECK: declare void @f3m(i64, i64, i64, i64, i64, i128) // Packed structure. struct __attribute__((packed)) P { int x; long u; }; void f4(int, P); void f4m(int, int, int, int, int, P); void g4() { P s = {6, 7}; f4(1, s); f4m(1, 2, 3, 4, 5, s); } // CHECK: define{{.*}} void @g4() // CHECK: call void @f4(i32 1, [2 x i64] [i64 30064771078, i64 0]) // CHECK: void @f4m(i32 1, i32 2, i32 3, i32 4, i32 5, [2 x i64] [i64 30064771078, i64 0]) // CHECK: declare void @f4(i32, [2 x i64]) // CHECK: declare void @f4m(i32, i32, i32, i32, i32, [2 x i64]) // Packed structure, overaligned, same as above. struct __attribute__((packed, aligned(16))) P16 { int x; long y; }; void f5(int, P16); void f5m(int, int, int, int, int, P16); void g5() { P16 s = {6, 7}; f5(1, s); f5m(1, 2, 3, 4, 5, s); } // CHECK: define{{.*}} void @g5() // CHECK: call void @f5(i32 1, [2 x i64] [i64 30064771078, i64 0]) // CHECK: void @f5m(i32 1, i32 2, i32 3, i32 4, i32 5, [2 x i64] [i64 30064771078, i64 0]) // CHECK: declare void @f5(i32, [2 x i64]) // CHECK: declare void @f5m(i32, i32, i32, i32, i32, [2 x i64]) }