On 07/16/16 14:29, Laszlo Ersek wrote:
> On 07/16/16 00:16, Ard Biesheuvel wrote:
>> Now that we switched to the __builtin_ms_va_list VA_LIST type for
>> GCC/X64, we can trust the compiler to do the right thing even under
>> optimization, and so we can enable -Os optimization all the way back
>> to GCC44, and drop the -D define that prevents the use of the __builtin
>> VA_LIST types. Note that this requires the -maccumulate-outgoing-args
>> switch as well.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Ard Biesheuvel <[email protected]>
>> ---
>>  BaseTools/Conf/tools_def.template | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/BaseTools/Conf/tools_def.template 
>> b/BaseTools/Conf/tools_def.template
>> index 2065fa34998f..a7da6741611d 100644
>> --- a/BaseTools/Conf/tools_def.template
>> +++ b/BaseTools/Conf/tools_def.template
>> @@ -4353,7 +4353,7 @@ DEFINE GCC_AARCH64_RC_FLAGS        = -I binary -O 
>> elf64-littleaarch64 -B aarch64
>>  
>>  DEFINE GCC44_ALL_CC_FLAGS            = -g -fshort-wchar 
>> -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -ffunction-sections 
>> -fdata-sections -c -include AutoGen.h -fno-common 
>> -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings
>>  DEFINE GCC44_IA32_CC_FLAGS           = DEF(GCC44_ALL_CC_FLAGS) -m32 
>> -march=i586 -malign-double -fno-stack-protector -D EFI32 
>> -fno-asynchronous-unwind-tables
>> -DEFINE GCC44_X64_CC_FLAGS            = DEF(GCC44_ALL_CC_FLAGS) -m64 
>> -fno-stack-protector "-DEFIAPI=__attribute__((ms_abi))" 
>> -DNO_BUILTIN_VA_FUNCS -mno-red-zone -Wno-address -mcmodel=large 
>> -fno-asynchronous-unwind-tables
>> +DEFINE GCC44_X64_CC_FLAGS            = DEF(GCC44_ALL_CC_FLAGS) -m64 
>> -fno-stack-protector "-DEFIAPI=__attribute__((ms_abi))" -Os 
>> -maccumulate-outgoing-args -mno-red-zone -Wno-address -mcmodel=large 
>> -fno-asynchronous-unwind-tables
>>  DEFINE GCC44_IA32_X64_DLINK_COMMON   = -nostdlib -n -q --gc-sections -z 
>> common-page-size=0x20
>>  DEFINE GCC44_IA32_X64_ASLDLINK_FLAGS = DEF(GCC44_IA32_X64_DLINK_COMMON) 
>> --entry ReferenceAcpiTable -u ReferenceAcpiTable
>>  DEFINE GCC44_IA32_X64_DLINK_FLAGS    = DEF(GCC44_IA32_X64_DLINK_COMMON) 
>> --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map 
>> $(DEST_DIR_DEBUG)/$(BASE_NAME).map
>>
> 
> Before I embark on build-testing this series too with my "build farm",
> I'd like to point out this thread:
> 
> http://thread.gmane.org/gmane.comp.bios.tianocore.devel/10741/focus=10961
> 
> Now, the assumption that -Os itself was causing the corruption has been
> laid to rest; we now know that the corruption was the product of the
> VA_LIST implementation, which is exactly what this series is replacing.
> So that's not why I'm pointing at the thread.
> 
> However, I recall from the thread that -Os enables -fomit-frame-pointer,
> which might make source level debugging impossible (according to the GCC
> manual).
> 
> Now, we're not big on source level debugging in GCC builds, at least
> right now, plus I also cannot claim that that -fomit-frame-pointer is
> never enabled *otherwise*. Much as I know -fomit-frame-pointer could be
> enabled with -O1, -O2, even with -O0?...
> 
> I'd just like to avoid a setting that *guarantees* that source level
> debugging would be impossible or garbled. Ard, can you comment on that?
> 
> ... Actually, just now I'm remembering something Scott explained to me:
> the difference between DEBUG, RELEASE, and NOOPT. Both DEBUG and RELEASE
> are supposed to be optimized (they differ in the compilation of DEBUG,
> DEBUG_CODE, ASSERT etc; not in optimization). NOOPT on the other hand is
> supposed to keep DEBUGs, but also disable optimization (for source level
> debugging).
> 
> At the moment, we have no NOOPT settings for GCC. We only have RELEASE
> (in the "supposed" meaning of RELEASE), and DEBUG (which has,
> traditionally, stood for the NOOPT behavior actually).
> 
> Version 1 of this patch set uses -O2 instead of -Os, but another
> difference is that v1 only added optimization to RELEASE. This version
> adds optimization (-Os) to DEBUG too (*) -- I guess in no small part
> because I expressed a wish for that? --, but it doesn't introduce a
> NOOPT target. I'm concerned that this might cause us to lose any usable
> source level debugging, even though our current "source level debugging"
> facility means a super contrived, out-of-tree gdb setup.
> 
> (*) This is not my "discovery" of course, it's announced in the v2 blurb.
> 
> I don't really know what to ask for / wish for :) I think introducing
> NOOPT might be a sizeable task, and it would even require changes to
> platforms (OvmfPkg and ArmVirtPkg minimally). So I don't feel good about
> asking Ard to add NOOPT as well.
> 
> Instead, I admit that my suggestion (implied request?) in the
> v1 thread -- i.e., to add optimization to DEBUG -- broke the GCC
> toolchain tradition of DEBUG standing for NOOPT actually.
> 
> I'm very sorry about that. :(
> 
> In order to uphold the GCC toolchain tradition for DEBUG, should we add
> -Os (and whatever else -Os requires) to RELEASE only?

The blurb does say,

> This aligns X64 with IA32, which is already built using -Os
> for both DEBUG and RELEASE.

and indeed I can see -Os in *_GCC44_IA32_CC_FLAGS.

So maybe we've never had source level debugging for Ia32 binaries. The
few times I used gdb, I certainly looked at X64 binaries only.

I guess I'm no longer in a position to suggest anything, but I'd like to
hear comments. If the consensus is to stick with this v2 series as-is,
and *maybe* add NOOPT sometime later, I won't contest it. I'll go ahead
and build-test this series in that case. Comments? :)

Thanks
Laszlo
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to