On 18 July 2016 at 07:56, Gao, Liming <[email protected]> wrote: > Ard: > > The below condition can't be trigged. It is in the else path of #elif > defined(__GNUC__). So, #if defined(__GNUC__) is always FALSE in below case. > Are they added for comment only? >
This is only the case after the next patch removes the '&& !defined(NO_BUILTIN_VA_FUNCS)' from the __GNUC__ test. But you are right that at that point, the condition can no longer be met. I think it does make sense to keep it, since the combination is known to generate broken binaries, but I am happy to drop the patch if other people feel this is not necessary. -- Ard. >> -----Original Message----- >> From: edk2-devel [mailto:[email protected]] On Behalf Of >> Ard Biesheuvel >> Sent: Sunday, July 17, 2016 6:35 PM >> To: [email protected]; [email protected]; [email protected]; Gao, >> Liming <[email protected]>; Shi, Steven <[email protected]>; Zhu, >> Yonghong <[email protected]>; Kinney, Michael D >> <[email protected]>; Justen, Jordan L <[email protected]> >> Cc: [email protected]; [email protected]; Ard Biesheuvel >> <[email protected]>; Ye, Ting <[email protected]>; Long, Qin >> <[email protected]> >> Subject: [edk2] [PATCH v3 6/9] MdePkg: disallow open coded varargs >> implementation on optimizing GCC >> >> The open coded varargs implementation that performs pointer arithmetic on >> the last named parameter of a function to calculate the addresses of >> variadic parameters and subsequently derefences them is fragile, and break >> spectacularly when used under GCC with optimization enabled. So explicitly >> disallow this combination. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Ard Biesheuvel <[email protected]> >> --- >> MdePkg/Include/Base.h | 5 +++++ >> 1 file changed, 5 insertions(+) >> >> diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h >> index e03fa8239284..95400f993e6b 100644 >> --- a/MdePkg/Include/Base.h >> +++ b/MdePkg/Include/Base.h >> @@ -635,6 +635,11 @@ typedef __builtin_va_list VA_LIST; >> #endif >> >> #else >> + >> +#if defined(__GNUC__) && defined(__OPTIMIZE__) >> +#error This VA_LIST implementation is incompatible with GCC optimization >> +#endif >> + >> /// >> /// Variable used to traverse the list of arguments. This type can vary by >> /// implementation and could be an array or structure. >> -- >> 1.9.1 >> >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

