Looks like we'd want something like this: Index: lib/CodeGen/TargetInfo.cpp =================================================================== --- lib/CodeGen/TargetInfo.cpp (revision 302818) +++ lib/CodeGen/TargetInfo.cpp (working copy) @@ -7043,13 +7043,13 @@ ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); }
+ if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) + return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory); + // Ignore empty records. if (isEmptyRecord(getContext(), Ty, true)) return ABIArgInfo::getIgnore(); - if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) - return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory); - uint64_t Size = getContext().getTypeSize(Ty); if (Size > 64) return getNaturalAlignIndirect(Ty, /*ByVal=*/true); On 11 May 2017 at 14:34, Richard Smith <rich...@metafoo.co.uk> wrote: > XFAIL'd for hexagon in r302825, filed PR33009 for the miscompile. > > Looks like it's only passing empty structs in C++ that is miscompiled, but > that's still pretty serious. > > On 11 May 2017 at 14:30, Richard Smith <rich...@metafoo.co.uk> wrote: > >> Wow, the Hexagon target is just horribly broken. Reduced testcase: >> >> struct A { A(); A(const A&); ~A(); }; >> void f(A a); >> void g() { f(A()); } >> >> This completely fails to pass an A object to f. Instrumented version: >> >> #include <stdio.h> >> #define DUMP(ptr) printf("%s %p\\n", __PRETTY_FUNCTION__, ptr) >> >> struct A { >> A() { DUMP(this); } >> A(const A&) { DUMP(this); } >> ~A() { DUMP(this); } >> }; >> void f(A a) { DUMP(&a); } >> int main() { f(A()); } >> >> ... prints: >> >> A::A() 0x7ffd54d95658 >> void f(A) 0x7ffd54d95638 >> A::~A() 0x7ffd54d95658 >> >> Also, the hexagon bot appears to be failing to send mail. >> >> On 11 May 2017 at 13:17, Krzysztof Parzyszek via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> >>> Hexagon is still broken. :( >>> >>> http://lab.llvm.org:8011/builders/clang-hexagon-elf/builds/7942 >>> >>> -Krzysztof >>> >>> >>> On 5/11/2017 1:58 PM, Richard Smith via cfe-commits wrote: >>> >>>> Author: rsmith >>>> Date: Thu May 11 13:58:24 2017 >>>> New Revision: 302817 >>>> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=302817&view=rev >>>> Log: >>>> PR22877: When constructing an array via a constructor with a default >>>> argument >>>> in list-initialization, run cleanups for the default argument after each >>>> iteration of the initialization loop. >>>> >>>> We previously only ran the destructor for any temporary once, at the >>>> end of the >>>> complete loop, rather than once per iteration! >>>> >>>> Re-commit of r302750, reverted in r302776. >>>> >>>> Added: >>>> cfe/trunk/test/CodeGenCXX/array-default-argument.cpp >>>> - copied, changed from r302775, cfe/trunk/test/CodeGenCXX/arra >>>> y-default-argument.cpp >>>> Modified: >>>> cfe/trunk/lib/CodeGen/CGExprAgg.cpp >>>> >>>> Modified: cfe/trunk/lib/CodeGen/CGExprAgg.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CG >>>> ExprAgg.cpp?rev=302817&r1=302816&r2=302817&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/lib/CodeGen/CGExprAgg.cpp (original) >>>> +++ cfe/trunk/lib/CodeGen/CGExprAgg.cpp Thu May 11 13:58:24 2017 >>>> @@ -512,12 +512,20 @@ void AggExprEmitter::EmitArrayInit(Addre >>>> currentElement->addIncoming(element, entryBB); >>>> // Emit the actual filler expression. >>>> - LValue elementLV = >>>> - CGF.MakeAddrLValue(Address(currentElement, elementAlign), >>>> elementType); >>>> - if (filler) >>>> - EmitInitializationToLValue(filler, elementLV); >>>> - else >>>> - EmitNullInitializationToLValue(elementLV); >>>> + { >>>> + // C++1z [class.temporary]p5: >>>> + // when a default constructor is called to initialize an >>>> element of >>>> + // an array with no corresponding initializer [...] the >>>> destruction of >>>> + // every temporary created in a default argument is sequenced >>>> before >>>> + // the construction of the next array element, if any >>>> + CodeGenFunction::RunCleanupsScope CleanupsScope(CGF); >>>> + LValue elementLV = >>>> + CGF.MakeAddrLValue(Address(currentElement, elementAlign), >>>> elementType); >>>> + if (filler) >>>> + EmitInitializationToLValue(filler, elementLV); >>>> + else >>>> + EmitNullInitializationToLValue(elementLV); >>>> + } >>>> // Move on to the next element. >>>> llvm::Value *nextElement = >>>> >>>> Copied: cfe/trunk/test/CodeGenCXX/array-default-argument.cpp (from >>>> r302775, cfe/trunk/test/CodeGenCXX/array-default-argument.cpp) >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCX >>>> X/array-default-argument.cpp?p2=cfe/trunk/test/CodeGenCXX/ar >>>> ray-default-argument.cpp&p1=cfe/trunk/test/CodeGenCXX/array- >>>> default-argument.cpp&r1=302775&r2=302817&rev=302817&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/test/CodeGenCXX/array-default-argument.cpp (original) >>>> +++ cfe/trunk/test/CodeGenCXX/array-default-argument.cpp Thu May 11 >>>> 13:58:24 2017 >>>> @@ -17,11 +17,11 @@ void g() { >>>> // CHECK: br label %[[LOOP:.*]] >>>> // [[LOOP]]: >>>> - // CHECK: {{call|invoke}}[[THISCALL:( x86_thiscallcc)?]] void >>>> @_ZN1AC1Ev([[TEMPORARY:.*]]) >>>> + // CHECK: {{call|invoke}} {{.*}} @_ZN1AC1Ev([[TEMPORARY:.*]]) >>>> // CHECK-EH: unwind label %[[PARTIAL_ARRAY_LPAD:.*]] >>>> - // CHECK: {{call|invoke}}[[THISCALL]] void @_ZN1BC1E1A({{.*}}, >>>> [[TEMPORARY]]) >>>> + // CHECK: {{call|invoke}} {{.*}} @_ZN1BC1E1A({{.*}}, [[TEMPORARY]]) >>>> // CHECK-EH: unwind label %[[A_AND_PARTIAL_ARRAY_LPAD:.*]] >>>> - // CHECK: {{call|invoke}}[[THISCALL]] void @_ZN1AD1Ev([[TEMPORARY]]) >>>> + // CHECK: {{call|invoke}} {{.*}} @_ZN1AD1Ev([[TEMPORARY]]) >>>> // CHECK-EH: unwind label %[[PARTIAL_ARRAY_LPAD]] >>>> // CHECK: getelementptr {{.*}}, i{{[0-9]*}} 1 >>>> // CHECK: icmp eq >>>> @@ -32,5 +32,5 @@ void g() { >>>> f(); >>>> // CHECK-NOT: @_ZN1AD1Ev( >>>> - // CHECK: {{call|invoke}}[[THISCALL]] void @_ZN1BD1Ev( >>>> + // CHECK: {{call|invoke}} {{.*}} @_ZN1BD1Ev( >>>> } >>>> >>>> >>>> _______________________________________________ >>>> cfe-commits mailing list >>>> cfe-commits@lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>> >>>> >>> -- >>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, >>> hosted by The Linux Foundation >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits