On 11/05/14 00:02, Andrew Fish wrote:
> 
>> On Nov 4, 2014, at 2:32 PM, Jordan Justen <jljus...@gmail.com> wrote:
>>
>> On Tue, Nov 4, 2014 at 9:28 AM, Andrew Fish <af...@apple.com> wrote:
>>> So my 1st question is why do you need to mix calling conventions, and depend
>>> on EFIAPI for interoperability. Why not just change the ABI on all
>>> functions?
>>
>> GCC 4.4 doesn't support the command line option to change everything
>> over. So, EFIAPI was the only option then.
>>
>>> Problems with the mixed calling convention:
>>> 1) All assembly routines must be marked as EFIAPI, or the C code will
>>> generate the wrong calling convention. Not an issue in the MdePkg, but
>>> potentially an issue in other packages.
>>
>> I don't see this as a problem. I think this is the rules that we have
>> set up for EDK II. It just so happens that the GCC4X toolchains are
>> the only ones that use EFIAPI, and thus are the only ones that allow
>> us to keep our codebase clean with regards to EFIAPI.
>>
> 
> I agree it is good in keeping the edk2 code clean. I was more concerned about 
> code from 3rd parties. 
> So sorry this was more about a warning when you are porting code on what to 
> look out for. 
> 
> I’m really only concerned about how the VA_LIST stuff is going to
> work? Does it need to shift for native vs. EFIAPI? If so how you pass
> the VA_LIST around if the code is not all the same ABI?

We need to distinguish passing arguments through the ellipsis (...) from
passing VA_LIST (as a normal, named parameter).

For passing arguments through the ellipsis (...), the called function
*must* be EFIAPI (in the current state of the tree). Otherwise
VA_START() won't work in the callee.

(BTW I have no problem with the above "restriction".)

Regarding passing VA_LIST by name (which is identical to passing a
simple CHAR8* by name) -- it already works fine, regardless of EFIAPI
vs. no-EFIAPI.

The problem discussed in this thread is unrelated to EFIAPI. The problem
is (apparently) that gcc's -Os optimization corrupts a local variable in
a chain of recursive calls.

>> For GCC >= 4.5, I actually think we should convert *RELEASE* builds
>> over to using the ms-abi all the time to generate smaller code. I
>> think we should leave DEBUG builds as mixed to help clean up EFIAPI
>> issues.
>>
> 
> You guys should figure out if you can have a ms-abi but add the frame 
> pointers. The compiler is open source ….

In my experimentation yesterday, one of the first things I tried (on
"gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16)") was
'-fno-omit-frame-pointer'.

Because, '-Os' implies '-fomit-frame-pointer', and at that point I
thought that maybe '-fomit-frame-pointer', incurred by '-Os', was
causing the issue.

So, I added '-fno-omit-frame-pointer' *after* -Os.

It triggered a "sorry, unimplemented" bug, which was very similar to
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59927>:

    sorry, unimplemented: ms_abi attribute requires
    -maccumulate-outgoing-args or subtarget optimization implying it

However, after appending '-maccumulate-outgoing-args' as well, the build
resumed. (To clarify, this meant:

  -Os -fno-omit-frame-pointer -maccumulate-outgoing-args

.) Unfortunately, although the tree did build like this, the original
issue persisted. Which I took as proof that the bug was unrelated to
reserving or not reserving %rbp as frame pointer.

I wish I could write a small reproducer for this problem...

> 
> Thanks,
> 
> Andrew Fish
> 
>> -Jordan
> 
> 
> ------------------------------------------------------------------------------
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to