[cfe-dev] x86_64-pc-win32 ABI var arg code gen bug? Is the bitcode correct? Or is it the code gen?
NAKAMURA Takumi
geek4civic at gmail.com
Tue May 17 06:28:01 PDT 2011
Andrew,
That is not a clang issue.
I think, in practice, {rcx, rdx, r8, r9} might not need to be spilled
to "home area" in that case,
because va_arg would not touch former 4 args.
Lemme know if you had issues.
I know it must be suboptimal, "home area" would be vacant in any cases afaik.
It would be better to 4 args were spilled into the home area.
To work on this, it might be harder, I guess, thank you.
...Takumi
2011/5/17 Andrew Fish <afish at apple.com>:
> It looks like for x86_64-pc-win32 the compiler does not generate the correct
> code? It looks like the spill of the argument registers to the 32-byte
> callers shadow space is not in the bitcode?
> I have some code (attached as v.c):
> int
> ShellPrintHiiEx (
> int Col,
> int Row,
> const char *Language,
> const void *HiiFormatStringId,
> const void *HiiFormatHandle,
> ...
> )
> {
> VA_LIST Marker;
> int Value;
> VA_START (Marker, HiiFormatHandle);
> Value = ReturnMarker (Marker);
> VA_END(Marker);
>
> return Value;
> }
> clang -ccc-host-triple x86_64-pc-win32 -emit-llvm -S v.c
> declare void @llvm.va_start(i8*) nounwind
> declare void @llvm.va_end(i8*) nounwind
> define i32 @ShellPrintHiiEx(i32 %Col, i32 %Row, i8* %Language, i8*
> %HiiFormatStringId, i8* %HiiFormatHandle, ...) nounwind {
> %1 = alloca i32, align 4
> %2 = alloca i32, align 4
> %3 = alloca i8*, align 8
> %4 = alloca i8*, align 8
> %5 = alloca i8*, align 8
> %Marker = alloca i8*, align 8
> %Value = alloca i32, align 4
> store i32 %Col, i32* %1, align 4
> store i32 %Row, i32* %2, align 4
> store i8* %Language, i8** %3, align 8
> store i8* %HiiFormatStringId, i8** %4, align 8
> store i8* %HiiFormatHandle, i8** %5, align 8
> %6 = bitcast i8** %Marker to i8*
> call void @llvm.va_start(i8* %6)
> %7 = load i8** %Marker, align 8
> %8 = call i32 @ReturnMarker(i8* %7)
> store i32 %8, i32* %Value, align 4
> %9 = bitcast i8** %Marker to i8*
> call void @llvm.va_end(i8* %9)
> %10 = load i32* %Value, align 4
> ret i32 %10
> }
> So for x86_64-pc-win32 Col (%rcx), Row (%rdx), Language (%r8), and
> HiiFormatStringId (%r9) should be spilled to the 32-byte space allocated on
> the callers stack? Looks like they are being spilled locally?
> Does this mean the bitcode needs to be generated differently for
> x86_64-pc-win32, or does magic occur when code is generated and there is a
> bug in that chunk of code?
>
> clang -ccc-host-triple x86_64-pc-win32 -S v.c
> .globl ShellPrintHiiEx
> .align 16, 0x90
> ShellPrintHiiEx: # @ShellPrintHiiEx
> # BB#0:
> pushq %rbp
> .Ltmp4:
> movq %rsp, %rbp
> .Ltmp5:
> subq $80, %rsp
> .Ltmp6:
> movq 48(%rbp), %rax
> movl %ecx, -4(%rbp)
> movl %edx, -8(%rbp)
> movq %r8, -16(%rbp)
> movq %r9, -24(%rbp)
> movq %rax, -32(%rbp)
> leaq 48(%rbp), %rax
> movq %rax, -40(%rbp)
> movq %rax, %rcx
> callq ReturnMarker
> movl %eax, -44(%rbp)
> addq $80, %rsp
> popq %rbp
> ret
> Col (%rcx), Row (%rdx), Language (%r8), and HiiFormatStringId (%r9), are
> spilled to wrong location.
> Thanks,
> Andrew Fish
>
>
>
>
> cc.exe /FAcs output showing spill to callers stack:
> _TEXT SEGMENT
> Value$ = 32
> Marker$ = 40
> Col$ = 64
> Row$ = 72
> Language$ = 80
> HiiFormatStringId$ = 88
> HiiFormatHandle$ = 96
> ShellPrintHiiEx PROC NEAR
> ; 78 : {
> $LN3:
> 00030 4c 89 4c 24 20 mov QWORD PTR [rsp+32], r9
> 00035 4c 89 44 24 18 mov QWORD PTR [rsp+24], r8
> 0003a 89 54 24 10 mov DWORD PTR [rsp+16], edx
> 0003e 89 4c 24 08 mov DWORD PTR [rsp+8], ecx
> 00042 48 83 ec 38 sub rsp, 56 ; 00000038H
> ; 79 : VA_LIST Marker;
> ; 80 : int Value;
> ; 81 :
> ; 82 : VA_START (Marker, HiiFormatHandle);
> 00046 48 8d 44 24 68 lea rax, QWORD PTR HiiFormatHandle$[rsp+8]
> 0004b 48 89 44 24 28 mov QWORD PTR Marker$[rsp], rax
> ; 83 : Value = ReturnMarker (Marker);
> 00050 48 8b 4c 24 28 mov rcx, QWORD PTR Marker$[rsp]
> 00055 e8 00 00 00 00 call ReturnMarker
> 0005a 89 44 24 20 mov DWORD PTR Value$[rsp], eax
> ; 84 : VA_END(Marker);
> 0005e 48 c7 44 24 28
> 00 00 00 00 mov QWORD PTR Marker$[rsp], 0
> ; 85 :
> ; 86 : return Value;
> 00067 8b 44 24 20 mov eax, DWORD PTR Value$[rsp]
> ; 87 : }
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
More information about the cfe-dev
mailing list