brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.2 KiB · eacbde5 Raw
297 lines · cpp
1// RUN: %clang_cc1 -triple arm64-apple-ios11 -std=c++11 -fcxx-exceptions -fexceptions -emit-llvm -o - %s | FileCheck %s2// RUN: %clang_cc1 -triple arm64-apple-ios11 -std=c++11 -fcxx-exceptions -fexceptions -fclang-abi-compat=4.0 -emit-llvm -o - %s | FileCheck %s3 4// CHECK: %[[STRUCT_SMALL:.*]] = type { ptr }5// CHECK: %[[STRUCT_LARGE:.*]] = type { ptr, [128 x i32] }6// CHECK: %[[STRUCT_TRIVIAL:.*]] = type { i32 }7// CHECK: %[[STRUCT_NONTRIVIAL:.*]] = type { i32 }8 9struct __attribute__((trivial_abi)) Small {10  int *p;11  Small();12  ~Small();13  Small(const Small &) noexcept;14  Small &operator=(const Small &);15};16 17struct __attribute__((trivial_abi)) Large {18  int *p;19  int a[128];20  Large();21  ~Large();22  Large(const Large &) noexcept;23  Large &operator=(const Large &);24};25 26struct Trivial {27  int a;28};29 30struct NonTrivial {31  NonTrivial();32  ~NonTrivial();33  int a;34};35 36struct HasTrivial {37  Small s;38  Trivial m;39};40 41struct HasNonTrivial {42  Small s;43  NonTrivial m;44};45 46struct B0 {47  virtual Small m0();48};49 50struct B1 {51  virtual Small m0();52};53 54struct D0 : B0, B1 {55  Small m0() override;56};57 58// CHECK-LABEL: define{{.*}} i64 @_ZThn8_N2D02m0Ev(59// CHECK: %[[RETVAL:.*]] = alloca %[[STRUCT_SMALL]], align 860// CHECK: %[[CALL:.*]] = tail call i64 @_ZN2D02m0Ev(61// CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[RETVAL]], i32 0, i32 062// CHECK: %[[COERCE_VAL_IP:.*]] = inttoptr i64 %[[CALL]] to ptr63// CHECK: store ptr %[[COERCE_VAL_IP]], ptr %[[COERCE_DIVE]], align 864// CHECK: %[[COERCE_DIVE2:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[RETVAL]], i32 0, i32 065// CHECK: %[[V3:.*]] = load ptr, ptr %[[COERCE_DIVE2]], align 866// CHECK: %[[COERCE_VAL_PI:.*]] = ptrtoint ptr %[[V3]] to i6467// CHECK: ret i64 %[[COERCE_VAL_PI]]68 69Small D0::m0() { return {}; }70 71// CHECK: define{{.*}} void @_Z14testParamSmall5Small(ptr %[[A_COERCE:.*]])72// CHECK: %[[A:.*]] = alloca %[[STRUCT_SMALL]], align 873// CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[A]], i32 0, i32 074// CHECK: store ptr %[[A_COERCE]], ptr %[[COERCE_DIVE]], align 875// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN5SmallD1Ev(ptr {{[^,]*}} %[[A]])76// CHECK: ret void77// CHECK: }78 79void testParamSmall(Small a) noexcept {80}81 82// CHECK: define{{.*}} i64 @_Z15testReturnSmallv()83// CHECK: %[[RETVAL:.*]] = alloca %[[STRUCT_SMALL:.*]], align 884// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN5SmallC1Ev(ptr {{[^,]*}} %[[RETVAL]])85// CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[RETVAL]], i32 0, i32 086// CHECK: %[[V0:.*]] = load ptr, ptr %[[COERCE_DIVE]], align 887// CHECK: %[[COERCE_VAL_PI:.*]] = ptrtoint ptr %[[V0]] to i6488// CHECK: ret i64 %[[COERCE_VAL_PI]]89// CHECK: }90 91Small testReturnSmall() {92  Small t;93  return t;94}95 96// CHECK: define{{.*}} void @_Z14testCallSmall0v()97// CHECK: %[[T:.*]] = alloca %[[STRUCT_SMALL:.*]], align 898// CHECK: %[[AGG_TMP:.*]] = alloca %[[STRUCT_SMALL]], align 899// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN5SmallC1Ev(ptr {{[^,]*}} %[[T]])100// CHECK: %[[CALL1:.*]] = call noundef ptr @_ZN5SmallC1ERKS_(ptr {{[^,]*}} %[[AGG_TMP]], ptr noundef nonnull align 8 dereferenceable(8) %[[T]])101// CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[AGG_TMP]], i32 0, i32 0102// CHECK: %[[V0:.*]] = load ptr, ptr %[[COERCE_DIVE]], align 8103// CHECK: call void @_Z14testParamSmall5Small(ptr %[[V0]])104// CHECK: %[[CALL2:.*]] = call noundef ptr @_ZN5SmallD1Ev(ptr {{[^,]*}} %[[T]])105// CHECK: ret void106// CHECK: }107 108void testCallSmall0() {109  Small t;110  testParamSmall(t);111}112 113// CHECK: define{{.*}} void @_Z14testCallSmall1v()114// CHECK: %[[AGG_TMP:.*]] = alloca %[[STRUCT_SMALL:.*]], align 8115// CHECK: %[[CALL:.*]] = call i64 @_Z15testReturnSmallv()116// CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[AGG_TMP]], i32 0, i32 0117// CHECK: %[[COERCE_VAL_IP:.*]] = inttoptr i64 %[[CALL]] to ptr118// CHECK: store ptr %[[COERCE_VAL_IP]], ptr %[[COERCE_DIVE]], align 8119// CHECK: %[[COERCE_DIVE1:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[AGG_TMP]], i32 0, i32 0120// CHECK: %[[V0:.*]] = load ptr, ptr %[[COERCE_DIVE1]], align 8121// CHECK: call void @_Z14testParamSmall5Small(ptr %[[V0]])122// CHECK: ret void123// CHECK: }124 125void testCallSmall1() {126  testParamSmall(testReturnSmall());127}128 129// CHECK: define{{.*}} void @_Z16testIgnoredSmallv()130// CHECK: %[[AGG_TMP_ENSURED:.*]] = alloca %[[STRUCT_SMALL:.*]], align 8131// CHECK: %[[CALL:.*]] = call i64 @_Z15testReturnSmallv()132// CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds nuw %[[STRUCT_SMALL]], ptr %[[AGG_TMP_ENSURED]], i32 0, i32 0133// CHECK: %[[COERCE_VAL_IP:.*]] = inttoptr i64 %[[CALL]] to ptr134// CHECK: store ptr %[[COERCE_VAL_IP]], ptr %[[COERCE_DIVE]], align 8135// CHECK: %[[CALL1:.*]] = call noundef ptr @_ZN5SmallD1Ev(ptr {{[^,]*}} %[[AGG_TMP_ENSURED]])136// CHECK: ret void137// CHECK: }138 139void testIgnoredSmall() {140  testReturnSmall();141}142 143// CHECK: define{{.*}} void @_Z14testParamLarge5Large(ptr dead_on_return noundef %[[A:.*]])144// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN5LargeD1Ev(ptr {{[^,]*}} %[[A]])145// CHECK: ret void146// CHECK: }147 148void testParamLarge(Large a) noexcept {149}150 151// CHECK: define{{.*}} void @_Z15testReturnLargev(ptr dead_on_unwind noalias writable sret(%[[STRUCT_LARGE]]) align 8 %[[AGG_RESULT:.*]])152// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN5LargeC1Ev(ptr {{[^,]*}} %[[AGG_RESULT]])153// CHECK: ret void154// CHECK: }155 156Large testReturnLarge() {157  Large t;158  return t;159}160 161// CHECK: define{{.*}} void @_Z14testCallLarge0v()162// CHECK: %[[T:.*]] = alloca %[[STRUCT_LARGE:.*]], align 8163// CHECK: %[[AGG_TMP:.*]] = alloca %[[STRUCT_LARGE]], align 8164// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN5LargeC1Ev(ptr {{[^,]*}} %[[T]])165// CHECK: %[[CALL1:.*]] = call noundef ptr @_ZN5LargeC1ERKS_(ptr {{[^,]*}} %[[AGG_TMP]], ptr noundef nonnull align 8 dereferenceable(520) %[[T]])166// CHECK: call void @_Z14testParamLarge5Large(ptr dead_on_return noundef %[[AGG_TMP]])167// CHECK: %[[CALL2:.*]] = call noundef ptr @_ZN5LargeD1Ev(ptr {{[^,]*}} %[[T]])168// CHECK: ret void169// CHECK: }170 171void testCallLarge0() {172  Large t;173  testParamLarge(t);174}175 176// CHECK: define{{.*}} void @_Z14testCallLarge1v()177// CHECK: %[[AGG_TMP:.*]] = alloca %[[STRUCT_LARGE:.*]], align 8178// CHECK: call void @_Z15testReturnLargev(ptr dead_on_unwind writable sret(%[[STRUCT_LARGE]]) align 8 %[[AGG_TMP]])179// CHECK: call void @_Z14testParamLarge5Large(ptr dead_on_return noundef %[[AGG_TMP]])180// CHECK: ret void181// CHECK: }182 183void testCallLarge1() {184  testParamLarge(testReturnLarge());185}186 187// CHECK: define{{.*}} void @_Z16testIgnoredLargev()188// CHECK: %[[AGG_TMP_ENSURED:.*]] = alloca %[[STRUCT_LARGE:.*]], align 8189// CHECK: call void @_Z15testReturnLargev(ptr dead_on_unwind writable sret(%[[STRUCT_LARGE]]) align 8 %[[AGG_TMP_ENSURED]])190// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN5LargeD1Ev(ptr {{[^,]*}} %[[AGG_TMP_ENSURED]])191// CHECK: ret void192// CHECK: }193 194void testIgnoredLarge() {195  testReturnLarge();196}197 198// CHECK: define{{.*}} i32 @_Z20testReturnHasTrivialv()199// CHECK: %[[RETVAL:.*]] = alloca %[[STRUCT_TRIVIAL:.*]], align 4200// CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds nuw %[[STRUCT_TRIVIAL]], ptr %[[RETVAL]], i32 0, i32 0201// CHECK: %[[V0:.*]] = load i32, ptr %[[COERCE_DIVE]], align 4202// CHECK: ret i32 %[[V0]]203// CHECK: }204 205Trivial testReturnHasTrivial() {206  Trivial t;207  return t;208}209 210// CHECK: define{{.*}} void @_Z23testReturnHasNonTrivialv(ptr dead_on_unwind noalias writable sret(%[[STRUCT_NONTRIVIAL:.*]]) align 4 %[[AGG_RESULT:.*]])211// CHECK: %[[CALL:.*]] = call noundef ptr @_ZN10NonTrivialC1Ev(ptr {{[^,]*}} %[[AGG_RESULT]])212// CHECK: ret void213// CHECK: }214 215NonTrivial testReturnHasNonTrivial() {216  NonTrivial t;217  return t;218}219 220// CHECK: define{{.*}} void @_Z18testExceptionSmallv()221// CHECK: %[[AGG_TMP:.*]] = alloca %[[STRUCT_SMALL]], align 8222// CHECK: %[[AGG_TMP1:.*]] = alloca %[[STRUCT_SMALL]], align 8223// CHECK: call noundef ptr @_ZN5SmallC1Ev(ptr {{[^,]*}} %[[AGG_TMP]])224// CHECK: invoke noundef ptr @_ZN5SmallC1Ev(ptr {{[^,]*}} %[[AGG_TMP1]])225 226// CHECK: call void @_Z20calleeExceptionSmall5SmallS_(ptr %{{.*}}, ptr %{{.*}})227// CHECK-NEXT: ret void228 229// CHECK: landingpad { ptr, i32 }230// CHECK: call noundef ptr @_ZN5SmallD1Ev(ptr {{[^,]*}} %[[AGG_TMP]])231// CHECK: br232 233// CHECK: resume { ptr, i32 }234 235void calleeExceptionSmall(Small, Small);236 237void testExceptionSmall() {238  calleeExceptionSmall(Small(), Small());239}240 241// CHECK: define{{.*}} void @_Z18testExceptionLargev()242// CHECK: %[[AGG_TMP:.*]] = alloca %[[STRUCT_LARGE]], align 8243// CHECK: %[[AGG_TMP1:.*]] = alloca %[[STRUCT_LARGE]], align 8244// CHECK: call noundef ptr @_ZN5LargeC1Ev(ptr {{[^,]*}} %[[AGG_TMP]])245// CHECK: invoke noundef ptr @_ZN5LargeC1Ev(ptr {{[^,]*}} %[[AGG_TMP1]])246 247// CHECK: call void @_Z20calleeExceptionLarge5LargeS_(ptr dead_on_return noundef %[[AGG_TMP]], ptr dead_on_return noundef %[[AGG_TMP1]])248// CHECK-NEXT: ret void249 250// CHECK: landingpad { ptr, i32 }251// CHECK: call noundef ptr @_ZN5LargeD1Ev(ptr {{[^,]*}} %[[AGG_TMP]])252// CHECK: br253 254// CHECK: resume { ptr, i32 }255 256void calleeExceptionLarge(Large, Large);257 258void testExceptionLarge() {259  calleeExceptionLarge(Large(), Large());260}261 262// CHECK: define void @_ZN7GH930401gEPNS_1SE263// CHECK: [[CALL:%.*]] = call i64 @_ZN7GH930401fEv264// CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[CALL]] to i56265// CHECK-NEXT: store i56 [[TRUNC]]266// CHECK-NEXT: ret void267void* operator new(unsigned long, void*);268namespace GH93040 {269struct [[clang::trivial_abi]] S {270  char a;271  int x;272  __attribute((aligned(2))) char y;273  S();274} __attribute((packed));275S f();276void g(S* s) { new(s) S(f()); }277struct S2 { [[no_unique_address]] S s; char c;};278static_assert(sizeof(S) == 8 && sizeof(S2) == 8, "");279}280 281 282// PR42961283 284// CHECK: define{{.*}} @"_ZN3$_08__invokeEv"()285// CHECK: %[[RETVAL:.*]] = alloca %[[STRUCT_SMALL]], align 8286// CHECK: %[[COERCE:.*]] = alloca %[[STRUCT_SMALL]], align 8287// CHECK: %[[CALL:.*]] = call{{.*}} @"_ZNK3$_0clEv"288// CHECK: %[[COERCEDIVE:.*]] = getelementptr{{.*}} %[[COERCE]]289// CHECK: %[[COERCEVALIP:.*]] = inttoptr{{.*}} %[[CALL]]290// CHECK: call {{.*}}memcpy{{.*}} %[[RETVAL]]{{.*}} %[[COERCE]]291// CHECK: %[[COERCEDIVE1:.*]] = getelementptr{{.*}} %[[RETVAL]]292// CHECK: %[[TMP:.*]] = load{{.*}} %[[COERCEDIVE1]]293// CHECK: %[[COERCEVALPI:.*]] = ptrtoint{{.*}} %[[TMP]]294// CHECK: ret{{.*}} %[[COERCEVALPI]]295 296Small (*fp)() = []() -> Small { return Small(); };297