Hello Chris<br><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="im">
> I have survey the efi specification and ask some question to efi engineer.<br>
> Difference between EFI C and ANSI C is as following:<br>
> 1. void*<br>
>     In EFI C, the void* is 4-byte for 32-bit processor and 8-byte for 64-bit processor.<br>
>     And it can appears in any where like ANSI C.<br>
>     So the main problem is that struct layout like<br>
>     struct S{<br>
>         void* X;<br>
>     };<br>
>     is not static.<br>
> 2. no floating support in EFI C<br>
> 3. no C++ support in EFI C<br>
> 4. no assembly support in EFI C, all assembly must convert to C<br>
<br>
</div>Ok, all of this is easy except #1.<br>
<div class="im"><br>
> I am wondering that does LLVM support model which structure layout is determined at run time??<br>
<br>
</div>No.<br>
<div class="im"><br>
> If not, do I need to modify the parser in clang to support this feature??<br>
<br>
</div>No, please don't.  This is something we specifically do not want to support.  The issue is not the parser, the issue is that struct field offsets are no longer constant in this model.<br></blockquote><div><br>I have read the EFI specification v1.10 and find the natural indexing about solving the dynamic structure layout problem:<br>
<br>19.4.4 Natural Units<br>Natural units are used when a structure has fields that can vary with the architecture of the<br>processor. Fields that precipitate the use of natural units include pointers and EFI INTN and<br>
UINTN data types. The size of one pointer or INTN/UINTN equals one natural unit. The natural<br>units field in an index encoding is a count of the number of natural fields whose sizes (in bytes)<br>must be added to determine a field offset.<br>
As an example, assume that a given EBC instruction specifies a 16-bit index of 0xA048. This<br>breaks down into:<br>• Sign bit (bit 15) = 1 (negative offset)<br>• Bits assigned to natural units (w, bits 14-12) = 2. Multiply by index size in bytes = 2 x 2 = 4 (A)<br>
• c = bits 11-4 = 4<br>• n = bits 3-0 = 8<br>On a 32-bit machine, the offset is then calculated to be:<br>• Offset = (4 + 8 * 4) * -1 = -36<br>On a 64-bit machine, the offset is calculated to be:<br>• Offset = (4 + 8 * 8) * -1 = -68<br>
<br>By this indexing model, the dynamic struture layout problem seems to be solved by the underlying EBC vm.<br>Although the data field is at different address between 32-bit and 64-bit processor.<br>Both can use the same encoding.<br>
<br>Does it means that the issue 1 can be solved??<br><br>thanks<br><br>ching<br></div></div>