Mercurial > hg > CbC > CbC_llvm
comparison clang/test/CodeGenCXX/microsoft-abi-sret-and-byval.cpp @ 173:0572611fdcc8 llvm10 llvm12
reorgnization done
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:55:54 +0900 |
parents | 1d019706d866 |
children | 2e18cbf3894f |
comparison
equal
deleted
inserted
replaced
172:9fbae9c8bf63 | 173:0572611fdcc8 |
---|---|
82 take_bools_and_chars('A', 'B', SmallWithDtor(), 'D', true, 13, false); | 82 take_bools_and_chars('A', 'B', SmallWithDtor(), 'D', true, 13, false); |
83 } | 83 } |
84 | 84 |
85 // Returning structs that fit into a register. | 85 // Returning structs that fit into a register. |
86 Small small_return() { return Small(); } | 86 Small small_return() { return Small(); } |
87 // LINUX-LABEL: define void @_Z12small_returnv(%struct.Small* noalias sret %agg.result) | 87 // LINUX-LABEL: define void @_Z12small_returnv(%struct.Small* noalias sret align 4 %agg.result) |
88 // WIN32: define dso_local i32 @"?small_return@@YA?AUSmall@@XZ"() | 88 // WIN32: define dso_local i32 @"?small_return@@YA?AUSmall@@XZ"() |
89 // WIN64: define dso_local i32 @"?small_return@@YA?AUSmall@@XZ"() | 89 // WIN64: define dso_local i32 @"?small_return@@YA?AUSmall@@XZ"() |
90 | 90 |
91 Medium medium_return() { return Medium(); } | 91 Medium medium_return() { return Medium(); } |
92 // LINUX-LABEL: define void @_Z13medium_returnv(%struct.Medium* noalias sret %agg.result) | 92 // LINUX-LABEL: define void @_Z13medium_returnv(%struct.Medium* noalias sret align 4 %agg.result) |
93 // WIN32: define dso_local i64 @"?medium_return@@YA?AUMedium@@XZ"() | 93 // WIN32: define dso_local i64 @"?medium_return@@YA?AUMedium@@XZ"() |
94 // WIN64: define dso_local i64 @"?medium_return@@YA?AUMedium@@XZ"() | 94 // WIN64: define dso_local i64 @"?medium_return@@YA?AUMedium@@XZ"() |
95 | 95 |
96 // Returning structs that fit into a register but are not POD. | 96 // Returning structs that fit into a register but are not POD. |
97 SmallCpp11NotCpp03Pod small_non_pod_return() { return SmallCpp11NotCpp03Pod(); } | 97 SmallCpp11NotCpp03Pod small_non_pod_return() { return SmallCpp11NotCpp03Pod(); } |
98 // LINUX-LABEL: define void @_Z20small_non_pod_returnv(%struct.SmallCpp11NotCpp03Pod* noalias sret %agg.result) | 98 // LINUX-LABEL: define void @_Z20small_non_pod_returnv(%struct.SmallCpp11NotCpp03Pod* noalias sret align 4 %agg.result) |
99 // WIN32: define dso_local void @"?small_non_pod_return@@YA?AUSmallCpp11NotCpp03Pod@@XZ"(%struct.SmallCpp11NotCpp03Pod* noalias sret %agg.result) | 99 // WIN32: define dso_local void @"?small_non_pod_return@@YA?AUSmallCpp11NotCpp03Pod@@XZ"(%struct.SmallCpp11NotCpp03Pod* noalias sret align 4 %agg.result) |
100 // WIN64: define dso_local void @"?small_non_pod_return@@YA?AUSmallCpp11NotCpp03Pod@@XZ"(%struct.SmallCpp11NotCpp03Pod* noalias sret %agg.result) | 100 // WIN64: define dso_local void @"?small_non_pod_return@@YA?AUSmallCpp11NotCpp03Pod@@XZ"(%struct.SmallCpp11NotCpp03Pod* noalias sret align 4 %agg.result) |
101 | 101 |
102 SmallWithCtor small_with_ctor_return() { return SmallWithCtor(); } | 102 SmallWithCtor small_with_ctor_return() { return SmallWithCtor(); } |
103 // LINUX-LABEL: define void @_Z22small_with_ctor_returnv(%struct.SmallWithCtor* noalias sret %agg.result) | 103 // LINUX-LABEL: define void @_Z22small_with_ctor_returnv(%struct.SmallWithCtor* noalias sret align 4 %agg.result) |
104 // WIN32: define dso_local void @"?small_with_ctor_return@@YA?AUSmallWithCtor@@XZ"(%struct.SmallWithCtor* noalias sret %agg.result) | 104 // WIN32: define dso_local void @"?small_with_ctor_return@@YA?AUSmallWithCtor@@XZ"(%struct.SmallWithCtor* noalias sret align 4 %agg.result) |
105 // WIN64: define dso_local void @"?small_with_ctor_return@@YA?AUSmallWithCtor@@XZ"(%struct.SmallWithCtor* noalias sret %agg.result) | 105 // WIN64: define dso_local void @"?small_with_ctor_return@@YA?AUSmallWithCtor@@XZ"(%struct.SmallWithCtor* noalias sret align 4 %agg.result) |
106 // FIXME: The 'sret' mark here doesn't seem to be enough to convince LLVM to | 106 // FIXME: The 'sret' mark here doesn't seem to be enough to convince LLVM to |
107 // preserve the hidden sret pointer in R0 across the function. | 107 // preserve the hidden sret pointer in R0 across the function. |
108 // WOA: define dso_local arm_aapcs_vfpcc void @"?small_with_ctor_return@@YA?AUSmallWithCtor@@XZ"(%struct.SmallWithCtor* noalias sret %agg.result) | 108 // WOA: define dso_local arm_aapcs_vfpcc void @"?small_with_ctor_return@@YA?AUSmallWithCtor@@XZ"(%struct.SmallWithCtor* noalias sret align 4 %agg.result) |
109 | 109 |
110 SmallWithVftable small_with_vftable_return() { return SmallWithVftable(); } | 110 SmallWithVftable small_with_vftable_return() { return SmallWithVftable(); } |
111 // LINUX-LABEL: define void @_Z25small_with_vftable_returnv(%struct.SmallWithVftable* noalias sret %agg.result) | 111 // LINUX-LABEL: define void @_Z25small_with_vftable_returnv(%struct.SmallWithVftable* noalias sret align 4 %agg.result) |
112 // WIN32: define dso_local void @"?small_with_vftable_return@@YA?AUSmallWithVftable@@XZ"(%struct.SmallWithVftable* noalias sret %agg.result) | 112 // WIN32: define dso_local void @"?small_with_vftable_return@@YA?AUSmallWithVftable@@XZ"(%struct.SmallWithVftable* noalias sret align 4 %agg.result) |
113 // WIN64: define dso_local void @"?small_with_vftable_return@@YA?AUSmallWithVftable@@XZ"(%struct.SmallWithVftable* noalias sret %agg.result) | 113 // WIN64: define dso_local void @"?small_with_vftable_return@@YA?AUSmallWithVftable@@XZ"(%struct.SmallWithVftable* noalias sret align 8 %agg.result) |
114 | 114 |
115 MediumWithCopyCtor medium_with_copy_ctor_return() { return MediumWithCopyCtor(); } | 115 MediumWithCopyCtor medium_with_copy_ctor_return() { return MediumWithCopyCtor(); } |
116 // LINUX-LABEL: define void @_Z28medium_with_copy_ctor_returnv(%struct.MediumWithCopyCtor* noalias sret %agg.result) | 116 // LINUX-LABEL: define void @_Z28medium_with_copy_ctor_returnv(%struct.MediumWithCopyCtor* noalias sret align 4 %agg.result) |
117 // WIN32: define dso_local void @"?medium_with_copy_ctor_return@@YA?AUMediumWithCopyCtor@@XZ"(%struct.MediumWithCopyCtor* noalias sret %agg.result) | 117 // WIN32: define dso_local void @"?medium_with_copy_ctor_return@@YA?AUMediumWithCopyCtor@@XZ"(%struct.MediumWithCopyCtor* noalias sret align 4 %agg.result) |
118 // WIN64: define dso_local void @"?medium_with_copy_ctor_return@@YA?AUMediumWithCopyCtor@@XZ"(%struct.MediumWithCopyCtor* noalias sret %agg.result) | 118 // WIN64: define dso_local void @"?medium_with_copy_ctor_return@@YA?AUMediumWithCopyCtor@@XZ"(%struct.MediumWithCopyCtor* noalias sret align 4 %agg.result) |
119 // WOA: define dso_local arm_aapcs_vfpcc void @"?medium_with_copy_ctor_return@@YA?AUMediumWithCopyCtor@@XZ"(%struct.MediumWithCopyCtor* noalias sret %agg.result) | 119 // WOA: define dso_local arm_aapcs_vfpcc void @"?medium_with_copy_ctor_return@@YA?AUMediumWithCopyCtor@@XZ"(%struct.MediumWithCopyCtor* noalias sret align 4 %agg.result) |
120 | 120 |
121 // Returning a large struct that doesn't fit into a register. | 121 // Returning a large struct that doesn't fit into a register. |
122 Big big_return() { return Big(); } | 122 Big big_return() { return Big(); } |
123 // LINUX-LABEL: define void @_Z10big_returnv(%struct.Big* noalias sret %agg.result) | 123 // LINUX-LABEL: define void @_Z10big_returnv(%struct.Big* noalias sret align 4 %agg.result) |
124 // WIN32: define dso_local void @"?big_return@@YA?AUBig@@XZ"(%struct.Big* noalias sret %agg.result) | 124 // WIN32: define dso_local void @"?big_return@@YA?AUBig@@XZ"(%struct.Big* noalias sret align 4 %agg.result) |
125 // WIN64: define dso_local void @"?big_return@@YA?AUBig@@XZ"(%struct.Big* noalias sret %agg.result) | 125 // WIN64: define dso_local void @"?big_return@@YA?AUBig@@XZ"(%struct.Big* noalias sret align 4 %agg.result) |
126 | 126 |
127 | 127 |
128 void small_arg(Small s) {} | 128 void small_arg(Small s) {} |
129 // LINUX-LABEL: define void @_Z9small_arg5Small(i32 %s.0) | 129 // LINUX-LABEL: define void @_Z9small_arg5Small(i32 %s.0) |
130 // WIN32: define dso_local void @"?small_arg@@YAXUSmall@@@Z"(i32 %s.0) | 130 // WIN32: define dso_local void @"?small_arg@@YAXUSmall@@@Z"(i32 %s.0) |
179 // WOA: } | 179 // WOA: } |
180 | 180 |
181 | 181 |
182 // Test that the eligible non-aggregate is passed directly, but returned | 182 // Test that the eligible non-aggregate is passed directly, but returned |
183 // indirectly on ARM64 Windows. | 183 // indirectly on ARM64 Windows. |
184 // WOA64: define dso_local void @"?small_arg_with_private_member@@YA?AUSmallWithPrivate@@U1@@Z"(%struct.SmallWithPrivate* inreg noalias sret %agg.result, i64 %s.coerce) {{.*}} { | 184 // WOA64: define dso_local void @"?small_arg_with_private_member@@YA?AUSmallWithPrivate@@U1@@Z"(%struct.SmallWithPrivate* inreg noalias sret align 4 %agg.result, i64 %s.coerce) {{.*}} { |
185 SmallWithPrivate small_arg_with_private_member(SmallWithPrivate s) { return s; } | 185 SmallWithPrivate small_arg_with_private_member(SmallWithPrivate s) { return s; } |
186 | 186 |
187 void call_small_arg_with_dtor() { | 187 void call_small_arg_with_dtor() { |
188 small_arg_with_dtor(SmallWithDtor()); | 188 small_arg_with_dtor(SmallWithDtor()); |
189 } | 189 } |
192 // WIN64: call void @"?small_arg_with_dtor@@YAXUSmallWithDtor@@@Z"(i32 %{{.*}}) | 192 // WIN64: call void @"?small_arg_with_dtor@@YAXUSmallWithDtor@@@Z"(i32 %{{.*}}) |
193 // WIN64: ret void | 193 // WIN64: ret void |
194 | 194 |
195 // Test that references aren't destroyed in the callee. | 195 // Test that references aren't destroyed in the callee. |
196 void ref_small_arg_with_dtor(const SmallWithDtor &s) { } | 196 void ref_small_arg_with_dtor(const SmallWithDtor &s) { } |
197 // WIN32: define dso_local void @"?ref_small_arg_with_dtor@@YAXABUSmallWithDtor@@@Z"(%struct.SmallWithDtor* dereferenceable({{[0-9]+}}) %s) {{.*}} { | 197 // WIN32: define dso_local void @"?ref_small_arg_with_dtor@@YAXABUSmallWithDtor@@@Z"(%struct.SmallWithDtor* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %s) {{.*}} { |
198 // WIN32-NOT: call x86_thiscallcc void @"??1SmallWithDtor@@QAE@XZ" | 198 // WIN32-NOT: call x86_thiscallcc void @"??1SmallWithDtor@@QAE@XZ" |
199 // WIN32: } | 199 // WIN32: } |
200 // WIN64-LABEL: define dso_local void @"?ref_small_arg_with_dtor@@YAXAEBUSmallWithDtor@@@Z"(%struct.SmallWithDtor* dereferenceable({{[0-9]+}}) %s) | 200 // WIN64-LABEL: define dso_local void @"?ref_small_arg_with_dtor@@YAXAEBUSmallWithDtor@@@Z"(%struct.SmallWithDtor* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %s) |
201 | 201 |
202 void big_arg_with_dtor(BigWithDtor s) {} | 202 void big_arg_with_dtor(BigWithDtor s) {} |
203 // WIN64-LABEL: define dso_local void @"?big_arg_with_dtor@@YAXUBigWithDtor@@@Z"(%struct.BigWithDtor* %s) | 203 // WIN64-LABEL: define dso_local void @"?big_arg_with_dtor@@YAXUBigWithDtor@@@Z"(%struct.BigWithDtor* %s) |
204 // WIN64: call void @"??1BigWithDtor@@QEAA@XZ" | 204 // WIN64: call void @"??1BigWithDtor@@QEAA@XZ" |
205 // WIN64: } | 205 // WIN64: } |
279 // WIN64: call void @"?takes_ref_field@@YAXURefField@@@Z"(i64 %{{.*}}) | 279 // WIN64: call void @"?takes_ref_field@@YAXURefField@@@Z"(i64 %{{.*}}) |
280 | 280 |
281 class Class { | 281 class Class { |
282 public: | 282 public: |
283 Small thiscall_method_small() { return Small(); } | 283 Small thiscall_method_small() { return Small(); } |
284 // LINUX: define {{.*}} void @_ZN5Class21thiscall_method_smallEv(%struct.Small* noalias sret %agg.result, %class.Class* %this) | 284 // LINUX: define {{.*}} void @_ZN5Class21thiscall_method_smallEv(%struct.Small* noalias sret align 4 %agg.result, %class.Class* %this) |
285 // WIN32: define {{.*}} x86_thiscallcc void @"?thiscall_method_small@Class@@QAE?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret %agg.result) | 285 // WIN32: define {{.*}} x86_thiscallcc void @"?thiscall_method_small@Class@@QAE?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret align 4 %agg.result) |
286 // WIN64: define linkonce_odr dso_local void @"?thiscall_method_small@Class@@QEAA?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret %agg.result) | 286 // WIN64: define linkonce_odr dso_local void @"?thiscall_method_small@Class@@QEAA?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret align 4 %agg.result) |
287 | 287 |
288 SmallWithCtor thiscall_method_small_with_ctor() { return SmallWithCtor(); } | 288 SmallWithCtor thiscall_method_small_with_ctor() { return SmallWithCtor(); } |
289 // LINUX: define {{.*}} void @_ZN5Class31thiscall_method_small_with_ctorEv(%struct.SmallWithCtor* noalias sret %agg.result, %class.Class* %this) | 289 // LINUX: define {{.*}} void @_ZN5Class31thiscall_method_small_with_ctorEv(%struct.SmallWithCtor* noalias sret align 4 %agg.result, %class.Class* %this) |
290 // WIN32: define {{.*}} x86_thiscallcc void @"?thiscall_method_small_with_ctor@Class@@QAE?AUSmallWithCtor@@XZ"(%class.Class* %this, %struct.SmallWithCtor* noalias sret %agg.result) | 290 // WIN32: define {{.*}} x86_thiscallcc void @"?thiscall_method_small_with_ctor@Class@@QAE?AUSmallWithCtor@@XZ"(%class.Class* %this, %struct.SmallWithCtor* noalias sret align 4 %agg.result) |
291 // WIN64: define linkonce_odr dso_local void @"?thiscall_method_small_with_ctor@Class@@QEAA?AUSmallWithCtor@@XZ"(%class.Class* %this, %struct.SmallWithCtor* noalias sret %agg.result) | 291 // WIN64: define linkonce_odr dso_local void @"?thiscall_method_small_with_ctor@Class@@QEAA?AUSmallWithCtor@@XZ"(%class.Class* %this, %struct.SmallWithCtor* noalias sret align 4 %agg.result) |
292 | 292 |
293 Small __cdecl cdecl_method_small() { return Small(); } | 293 Small __cdecl cdecl_method_small() { return Small(); } |
294 // LINUX: define {{.*}} void @_ZN5Class18cdecl_method_smallEv(%struct.Small* noalias sret %agg.result, %class.Class* %this) | 294 // LINUX: define {{.*}} void @_ZN5Class18cdecl_method_smallEv(%struct.Small* noalias sret align 4 %agg.result, %class.Class* %this) |
295 // WIN32: define {{.*}} void @"?cdecl_method_small@Class@@QAA?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret %agg.result) | 295 // WIN32: define {{.*}} void @"?cdecl_method_small@Class@@QAA?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret align 4 %agg.result) |
296 // WIN64: define linkonce_odr dso_local void @"?cdecl_method_small@Class@@QEAA?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret %agg.result) | 296 // WIN64: define linkonce_odr dso_local void @"?cdecl_method_small@Class@@QEAA?AUSmall@@XZ"(%class.Class* %this, %struct.Small* noalias sret align 4 %agg.result) |
297 | 297 |
298 Big __cdecl cdecl_method_big() { return Big(); } | 298 Big __cdecl cdecl_method_big() { return Big(); } |
299 // LINUX: define {{.*}} void @_ZN5Class16cdecl_method_bigEv(%struct.Big* noalias sret %agg.result, %class.Class* %this) | 299 // LINUX: define {{.*}} void @_ZN5Class16cdecl_method_bigEv(%struct.Big* noalias sret align 4 %agg.result, %class.Class* %this) |
300 // WIN32: define {{.*}} void @"?cdecl_method_big@Class@@QAA?AUBig@@XZ"(%class.Class* %this, %struct.Big* noalias sret %agg.result) | 300 // WIN32: define {{.*}} void @"?cdecl_method_big@Class@@QAA?AUBig@@XZ"(%class.Class* %this, %struct.Big* noalias sret align 4 %agg.result) |
301 // WIN64: define linkonce_odr dso_local void @"?cdecl_method_big@Class@@QEAA?AUBig@@XZ"(%class.Class* %this, %struct.Big* noalias sret %agg.result) | 301 // WIN64: define linkonce_odr dso_local void @"?cdecl_method_big@Class@@QEAA?AUBig@@XZ"(%class.Class* %this, %struct.Big* noalias sret align 4 %agg.result) |
302 | 302 |
303 void thiscall_method_arg(Empty s) {} | 303 void thiscall_method_arg(Empty s) {} |
304 // LINUX: define {{.*}} void @_ZN5Class19thiscall_method_argE5Empty(%class.Class* %this) | 304 // LINUX: define {{.*}} void @_ZN5Class19thiscall_method_argE5Empty(%class.Class* %this) |
305 // WIN32: define {{.*}} void @"?thiscall_method_arg@Class@@QAEXUEmpty@@@Z"(%class.Class* %this, %struct.Empty* byval(%struct.Empty) align 4 %s) | 305 // WIN32: define {{.*}} void @"?thiscall_method_arg@Class@@QAEXUEmpty@@@Z"(%class.Class* %this, %struct.Empty* byval(%struct.Empty) align 4 %s) |
306 // WIN64: define linkonce_odr dso_local void @"?thiscall_method_arg@Class@@QEAAXUEmpty@@@Z"(%class.Class* %this, i8 %s.coerce) | 306 // WIN64: define linkonce_odr dso_local void @"?thiscall_method_arg@Class@@QEAAXUEmpty@@@Z"(%class.Class* %this, i8 %s.coerce) |