Ah, thanks, I’ll revert and take a look. On Aug 26, 2014, at 3:14 PM, Rafael Espíndola <[email protected]> wrote:
> Looks like this broke CodeGenCXX/microsoft-abi-member-pointers.cpp > > On 26 August 2014 17:52, Julien Lerouge <[email protected]> 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 >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
