<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>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?</div><div><br></div><div>I have some code (attached as v.c):</div><div><br></div><div><div>int</div><div>ShellPrintHiiEx (</div><div>  int                  Col,</div><div>  int                  Row,</div><div>  const char           *Language,</div><div>  const void           *HiiFormatStringId,</div><div>  const void           *HiiFormatHandle,</div><div>  ...</div><div>  )</div><div>{</div><div>  VA_LIST           Marker;</div><div>  int               Value;</div><div><br></div><div>  VA_START (Marker, HiiFormatHandle);</div><div>  Value = ReturnMarker (Marker);</div><div>  VA_END(Marker);</div><div>  </div><div>  return Value;</div><div>}</div><div><br></div></div><div>clang -ccc-host-triple x86_64-pc-win32 -emit-llvm -S  v.c</div><div><div>declare void @llvm.va_start(i8*) nounwind</div><div><br></div><div>declare void @llvm.va_end(i8*) nounwind</div><div><br></div><div>define i32 @ShellPrintHiiEx(i32 %Col, i32 %Row, i8* %Language, i8* %HiiFormatStringId, i8* %HiiFormatHandle, ...) nounwind {</div><div>  %1 = alloca i32, align 4</div><div>  %2 = alloca i32, align 4</div><div>  %3 = alloca i8*, align 8</div><div>  %4 = alloca i8*, align 8</div><div>  %5 = alloca i8*, align 8</div><div>  %Marker = alloca i8*, align 8</div><div>  %Value = alloca i32, align 4</div><div>  store i32 %Col, i32* %1, align 4</div><div>  store i32 %Row, i32* %2, align 4</div><div>  store i8* %Language, i8** %3, align 8</div><div>  store i8* %HiiFormatStringId, i8** %4, align 8</div><div>  store i8* %HiiFormatHandle, i8** %5, align 8</div><div>  %6 = bitcast i8** %Marker to i8*</div><div>  call void @llvm.va_start(i8* %6)</div><div>  %7 = load i8** %Marker, align 8</div><div>  %8 = call i32 @ReturnMarker(i8* %7)</div><div>  store i32 %8, i32* %Value, align 4</div><div>  %9 = bitcast i8** %Marker to i8*</div><div>  call void @llvm.va_end(i8* %9)</div><div>  %10 = load i32* %Value, align 4</div><div>  ret i32 %10</div><div>}</div></div><div><br></div><div>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?</div><div><br></div><div>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?</div><div><br></div><div><br></div><div>clang -ccc-host-triple x86_64-pc-win32  -S  v.c</div><div><br></div><div><div><span class="Apple-tab-span" style="white-space:pre">     </span>.globl<span class="Apple-tab-span" style="white-space:pre">      </span>ShellPrintHiiEx</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>.align<span class="Apple-tab-span" style="white-space:pre">      </span>16, 0x90</div><div>ShellPrintHiiEx:                        # @ShellPrintHiiEx</div><div># BB#0:</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>pushq<span class="Apple-tab-span" style="white-space:pre">       </span>%rbp</div><div>.Ltmp4:</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>%rsp, %rbp</div><div>.Ltmp5:</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>subq<span class="Apple-tab-span" style="white-space:pre">        </span>$80, %rsp</div><div>.Ltmp6:</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>48(%rbp), %rax</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>movl<span class="Apple-tab-span" style="white-space:pre">        </span>%ecx, -4(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>movl<span class="Apple-tab-span" style="white-space:pre">        </span>%edx, -8(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>%r8, -16(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>%r9, -24(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>%rax, -32(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>leaq<span class="Apple-tab-span" style="white-space:pre">        </span>48(%rbp), %rax</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>%rax, -40(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>movq<span class="Apple-tab-span" style="white-space:pre">        </span>%rax, %rcx</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>callq<span class="Apple-tab-span" style="white-space:pre">       </span>ReturnMarker</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>movl<span class="Apple-tab-span" style="white-space:pre">        </span>%eax, -44(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>addq<span class="Apple-tab-span" style="white-space:pre">        </span>$80, %rsp</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>popq<span class="Apple-tab-span" style="white-space:pre">        </span>%rbp</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>ret</div></div><div><br></div><div>Col (%rcx), Row (%rdx), Language (%r8), and HiiFormatStringId (%r9), are spilled to wrong location.</div><div><br></div>Thanks,<div><br><div>
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; font-size: 12px; "><div>Andrew Fish</div><div><br></div><div><br></div></div></div></div></body></html>