<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>I think I'm seeing some Windows ABI code gen issues. My guess is it is related to having the va_start key off an argument that is not in a register. Most of my EFI firmware code runs fine, but the new EFI shell crashes all over the place and prints out lots of garbage. Here is the gist of the print function: </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><div><br></div><div>The Windows compiler spills the arguments passed in registers back to the the callers stack frame per the ABI. The clang version spills locally?  </div><div><br></div><div><div>_ShellPrintHiiEx:                       ## @ShellPrintHiiEx</div><div>Leh_func_begin1:</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>Ltmp1:</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>Ltmp2:</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>Ltmp3:</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>-24(%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>movq<span class="Apple-tab-span" style="white-space:pre">        </span>$0, -40(%rbp)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>movl<span class="Apple-tab-span" style="white-space:pre">        </span>-44(%rbp), %eax</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><br></div><div><br></div><div>Also I can't figure out what this code is doing in main() </div><div><br></div><div><div><span class="Apple-tab-span" style="white-space:pre"> </span>movl<span class="Apple-tab-span" style="white-space:pre">        </span>$0, -4(%rbp)</div></div><div><br></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>clang -ccc-host-triple x86_64-pc-win32-macho -S v.c</div><div><br></div><div></div></div></div></body></html>