r216491 - Win64 ABI shouldn't extend integer type arguments.
Julien Lerouge
jlerouge at apple.com
Tue Aug 26 15:17:35 PDT 2014
Ah, thanks, I’ll revert and take a look.
On Aug 26, 2014, at 3:14 PM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:
> Looks like this broke CodeGenCXX/microsoft-abi-member-pointers.cpp
>
> On 26 August 2014 17:52, Julien Lerouge <jlerouge at apple.com> wrote:
>> Author: jlerouge
>> Date: Tue Aug 26 16:52:27 2014
>> New Revision: 216491
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=216491&view=rev
>> Log:
>> Win64 ABI shouldn't extend integer type arguments.
>>
>> Summary:
>> MSVC doesn't extend integer types smaller than 64bit, so to preserve
>> binary compatibility, clang shouldn't either.
>>
>> For example, the following C code built with MSVC:
>>
>> unsigned test(unsigned v);
>> unsigned foobar(unsigned short);
>> int main() { return test(0xffffffff) + foobar(28); }
>>
>> Produces the following:
>>
>> 0000000000000004: B9 FF FF FF FF mov ecx,0FFFFFFFFh
>> 0000000000000009: E8 00 00 00 00 call test
>> 000000000000000E: 89 44 24 20 mov dword ptr [rsp+20h],eax
>> 0000000000000012: 66 B9 1C 00 mov cx,1Ch
>> 0000000000000016: E8 00 00 00 00 call foobar
>>
>> And as you can see, when setting up the call to foobar, only cx is overwritten.
>>
>> If foobar is compiled with clang, then the zero extension added by clang means
>> the rest of the register, which contains garbage, could be used.
>>
>> For example if foobar is:
>>
>> unsigned foobar(unsigned short v) {
>> return v;
>> }
>>
>> Compiled with clang -fomit-frame-pointer -O3 gives the following assembly:
>>
>> foobar:
>> 0000000000000000: 89 C8 mov eax,ecx
>> 0000000000000002: C3 ret
>>
>> And that function would return garbage because the 16 most significant bits of
>> ecx still contain garbage from the first call.
>>
>> With this change, the code for that function is now:
>>
>> foobar:
>> 0000000000000000: 0F B7 C1 movzx eax,cx
>> 0000000000000003: C3 ret
>>
>> Reviewers: chapuni, rnk
>>
>> Reviewed By: rnk
>>
>> Subscribers: majnemer, cfe-commits
>>
>> Differential Revision: http://reviews.llvm.org/D4380
>>
>> Added:
>> cfe/trunk/test/CodeGen/x86_64-arguments-win32.c
>> Modified:
>> cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> cfe/trunk/test/CodeGen/2007-06-18-SextAttrAggregate.c
>>
>> Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=216491&r1=216490&r2=216491&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Tue Aug 26 16:52:27 2014
>> @@ -2773,9 +2773,6 @@ ABIArgInfo WinX86_64ABIInfo::classify(Qu
>> return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), Size));
>> }
>>
>> - if (Ty->isPromotableIntegerType())
>> - return ABIArgInfo::getExtend();
>> -
>> return ABIArgInfo::getDirect();
>> }
>>
>>
>> Modified: cfe/trunk/test/CodeGen/2007-06-18-SextAttrAggregate.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/2007-06-18-SextAttrAggregate.c?rev=216491&r1=216490&r2=216491&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/2007-06-18-SextAttrAggregate.c (original)
>> +++ cfe/trunk/test/CodeGen/2007-06-18-SextAttrAggregate.c Tue Aug 26 16:52:27 2014
>> @@ -1,11 +1,13 @@
>> // RUN: %clang_cc1 %s -o - -emit-llvm | FileCheck %s
>> -// XFAIL: aarch64, arm64
>> +// XFAIL: aarch64, arm64, x86_64-pc-win32
>>
>> // PR1513
>>
>> // AArch64 ABI actually requires the reverse of what this is testing: the callee
>> // does any extensions and remaining bits are unspecified.
>>
>> +// Win64 ABI does expect extensions for type smaller than 64bits.
>> +
>> // Technically this test wasn't written to test that feature, but it's a
>> // valuable check nevertheless.
>>
>>
>> Added: cfe/trunk/test/CodeGen/x86_64-arguments-win32.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_64-arguments-win32.c?rev=216491&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/x86_64-arguments-win32.c (added)
>> +++ cfe/trunk/test/CodeGen/x86_64-arguments-win32.c Tue Aug 26 16:52:27 2014
>> @@ -0,0 +1,16 @@
>> +// RUN: %clang_cc1 -w -triple x86_64-pc-win32 -emit-llvm -o - %s | FileCheck %s
>> +
>> +// To be ABI compatible with code generated by MSVC, there shouldn't be any
>> +// sign/zero extensions on types smaller than 64bit.
>> +
>> +// CHECK-LABEL: define void @f1(i8 %a)
>> +void f1(char a) {}
>> +
>> +// CHECK-LABEL: define void @f2(i8 %a)
>> +void f2(unsigned char a) {}
>> +
>> +// CHECK-LABEL: define void @f3(i16 %a)
>> +void f3(short a) {}
>> +
>> +// CHECK-LABEL: define void @f4(i16 %a)
>> +void f4(unsigned short a) {}
>>
>>
>> _______________________________________________
>> 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