On 11/04/14 18:28, Andrew Fish wrote: > >> On Nov 4, 2014, at 5:48 AM, Laszlo Ersek <ler...@redhat.com >> <mailto:ler...@redhat.com>> wrote: >> >> diff --git a/MdePkg/Library/BasePrintLib/PrintLibInternal.c >> b/MdePkg/Library/BasePrintLib/PrintLibInternal.c >> index 8dc5ec7..fbb3726 100644 >> --- a/MdePkg/Library/BasePrintLib/PrintLibInternal.c >> +++ b/MdePkg/Library/BasePrintLib/PrintLibInternal.c >> @@ -680,10 +680,20 @@ BasePrintLibSPrintMarker ( >> if (TmpGuid == NULL) { >> ArgumentString = "<null guid>"; >> } else { >> + UINTN (EFIAPI * volatile PrintFunction) ( >> + OUT CHAR8 *StartOfBuffer, >> + IN UINTN BufferSize, >> + IN UINTN Flags, >> + IN CONST CHAR8 *FormatString, >> + ... >> + ); >> + >> + PrintFunction = BasePrintLibSPrint; >> + >> GuidData1 = ReadUnaligned32 (&(TmpGuid->Data1)); >> GuidData2 = ReadUnaligned16 (&(TmpGuid->Data2)); >> GuidData3 = ReadUnaligned16 (&(TmpGuid->Data3)); >> - BasePrintLibSPrint ( >> + PrintFunction ( >> ValueBuffer, >> MAXIMUM_VALUE_CHARACTERS, >> 0, >> ---------------- >> >> With this patch, GUIDs are printed okay with -Os. >> >> (Of course it's not edk2 that needs to be fixed.) >> > > But pedantically you need change the definition of BasePrintLibSPrint() > to include EFIAPI.
I tried that (without applying above patch, before posting my message); it didn't help. Thanks, Laszlo > > If you look at BasePrintLibSPrintMarker() (and some of the other > routines) you will notice a BASE_LIST and a VA_LIST. We had an API that > exposed a VA_LIST (well code that was casting to VA_LIST) in the report > status code stack and it forced use to use our own made up BASE_LIST > concept to get it to work. I think you are going to hit similar issues > mixing calling conventions. > > 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? > > 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. > 2) The var arg chain needs to be constant. I think for i386 you get > lucky and the calling conventions are close enough it kind of works, but > for X64 they are very different. Even if you force VA_LIST to be the > Microsoft one, it is not clear to me that forces the compiler to treat > every … the Microsoft way. > > Thanks, > > Andrew Fish > > > > ------------------------------------------------------------------------------ > > > > _______________________________________________ > 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