[cfe-commits] r166052 - in /cfe/trunk: lib/CodeGen/TargetInfo.cpp test/CodeGen/arm-abi-vector.c
Evgeniy Stepanov
eugeni.stepanov at gmail.com
Wed Oct 17 07:30:22 PDT 2012
The offending commit is
r165609 | logan | 2012-10-10 10:56:20 +0400 (Wed, 10 Oct 2012) | 12 lines
Fix PR 11709: Change the definition of va_list to meet AAPCS requirement
AAPCS ABI Section 7.1.4 [1] specifies that va_list
should be defined as struct __va_list { void *__ap;};
And in C++, it is defined in namespace std.
[1] http://infocenter.arm.com/help/topic
/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
Patch by Weiming Zhao.
On Wed, Oct 17, 2012 at 5:55 PM, Evgeniy Stepanov
<eugeni.stepanov at gmail.com> wrote:
> Hey,
>
> looks like one of your varargs on ARM changes broke the following:
>
> void fn1 (__builtin_va_list args)
> {
> __builtin_va_arg (args, int);
> }
>
> # clang++ -target arm-linux-gnueabi -S 1.cc
> [...]
> tools/clang/lib/AST/ExprClassification.cpp:599:
> clang::Expr::Classification::ModifiableType
> IsModifiable(clang::ASTContext&, const clang::Expr*,
> clang::Expr::Classification::Kinds, clang::SourceLocation&): Assertion
> `(E->getObjectKind() == OK_ObjCProperty ||
> !Ctx.getLangOpts().CPlusPlus) && "C++ struct assignment should be
> resolved by the " "copy assignment operator."' failed.
>
> I'm bisecting now and will file a bug when done.
>
> On Tue, Oct 16, 2012 at 11:51 PM, Manman Ren <mren at apple.com> wrote:
>> Author: mren
>> Date: Tue Oct 16 14:51:48 2012
>> New Revision: 166052
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=166052&view=rev
>> Log:
>> ARM ABI: fix ABI alignment issues in varargs.
>>
>> We generalize r166040 to handle ABI alignment issues for all types.
>>
>> rdar://12439123
>>
>> Modified:
>> cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> cfe/trunk/test/CodeGen/arm-abi-vector.c
>>
>> Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=166052&r1=166051&r2=166052&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Tue Oct 16 14:51:48 2012
>> @@ -3213,13 +3213,11 @@
>>
>> // The ABI alignment for 64-bit or 128-bit vectors is 8 for AAPCS and 4 for
>> // APCS. For AAPCS, the ABI alignment is at least 4-byte and at most 8-byte.
>> - if (Ty->getAs<VectorType>()) {
>> - if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
>> - getABIKind() == ARMABIInfo::AAPCS)
>> - TyAlign = std::min(std::max(TyAlign, (uint64_t)4), (uint64_t)8);
>> - else
>> - TyAlign = 4;
>> - }
>> + if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
>> + getABIKind() == ARMABIInfo::AAPCS)
>> + TyAlign = std::min(std::max(TyAlign, (uint64_t)4), (uint64_t)8);
>> + else
>> + TyAlign = 4;
>> // Use indirect if size of the illegal vector is bigger than 16 bytes.
>> if (isIllegalVectorType(Ty) && Size > 16) {
>> IsIndirect = true;
>> @@ -3246,8 +3244,7 @@
>>
>> if (IsIndirect)
>> Addr = Builder.CreateLoad(Builder.CreateBitCast(Addr, BPP));
>> - else if (Ty->getAs<VectorType>() &&
>> - (TyAlign < CGF.getContext().getTypeAlign(Ty) / 8)) {
>> + else if (TyAlign < CGF.getContext().getTypeAlign(Ty) / 8) {
>> // We can't directly cast ap.cur to pointer to a vector type, since ap.cur
>> // may not be correctly aligned for the vector type. We create an aligned
>> // temporary space and copy the content over from ap.cur to the temporary
>>
>> Modified: cfe/trunk/test/CodeGen/arm-abi-vector.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-abi-vector.c?rev=166052&r1=166051&r2=166052&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/arm-abi-vector.c (original)
>> +++ cfe/trunk/test/CodeGen/arm-abi-vector.c Tue Oct 16 14:51:48 2012
>> @@ -226,3 +226,38 @@
>> // APCS-GNU: call double (i32, ...)* @varargs_vec_5s(i32 5, <4 x i32> %3)
>> return varargs_vec_5s(5, *in);
>> }
>> +
>> +// Pass struct as varargs.
>> +typedef struct
>> +{
>> + __int2 i2;
>> + float f;
>> +} StructWithVec;
>> +
>> +double varargs_struct(int fixed, ...) {
>> +// CHECK: varargs_struct
>> +// CHECK: %3 = and i32 %2, -8
>> +// CHECK: %ap.align = inttoptr i32 %3 to i8*
>> +// CHECK: %ap.next = getelementptr i8* %ap.align, i32 16
>> +// CHECK: bitcast i8* %ap.align to %struct.StructWithVec*
>> +// APCS-GNU: varargs_struct
>> +// APCS-GNU: %var.align = alloca %struct.StructWithVec
>> +// APCS-GNU: %ap.next = getelementptr i8* %ap.cur, i32 16
>> +// APCS-GNU: %1 = bitcast %struct.StructWithVec* %var.align to i8*
>> +// APCS-GNU: call void @llvm.memcpy
>> + va_list ap;
>> + double sum = fixed;
>> + va_start(ap, fixed);
>> + StructWithVec c3 = va_arg(ap, StructWithVec);
>> + sum = sum + c3.i2.x + c3.i2.y + c3.f;
>> + va_end(ap);
>> + return sum;
>> +}
>> +
>> +double test_struct(StructWithVec* d) {
>> +// CHECK: test_struct
>> +// CHECK: call arm_aapcscc double (i32, ...)* @varargs_struct(i32 3, [2 x i64] %3)
>> +// APCS-GNU: test_struct
>> +// APCS-GNU: call double (i32, ...)* @varargs_struct(i32 3, [2 x i64] %3)
>> + return varargs_struct(3, *d);
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list