Jordan Justen [mailto:jordan.l.jus...@intel.com] wrote:

]Sent: Friday, July 10, 2015 02:24 AM
]To: edk2-devel@lists.sourceforge.net; Scott Duplichan
]Subject: Re: [edk2] [PATCH] BaseTools/GCC: allow unused but set variables
]
]On 2015-07-08 19:31:09, Scott Duplichan wrote:
]> Bruce Cran [mailto:br...@cran.org.uk] wrote:
]> 
]> ]Sent: Wednesday, July 08, 2015 05:12 PM
]> ]To: edk2-devel@lists.sourceforge.net
]> ]Subject: Re: [edk2] [PATCH] BaseTools/GCC: allow unused but set variables
]> ]
]> ]On Wed, Jul 08, 2015 at 10:43:38PM +0200, Laszlo Ersek wrote:
]> ]
]> ]> I think it would make a difference if -flto *actually* worked, but from
]> ]> a quick google search, I think it either doesn't work with gcc-4.8 at
]> ]> all, *or* the edk2 build system would have to use FLTO-aware binutils
]> ]> and linker wrappers (or parameters). I have no clue how to set that up.
]> ]> So for now we'll have to stick with MDEPKG_NDEBUG I guess.
]> ]
]> ]I've been trying to get -flto working this week, but without success (yet!).
]> ]I'm currently running into a problem of ld (built from source) apparently 
not
]> ]knowing about the lto plugin (and passing the liblto.so file via -plugin 
causes
]> ]an assert failure), but I'll keep trying.
]> 
]> Last year I spent some time to get gcc -flto working properly with EDK2.
]> At that time, the people here were busy with other things and there didn't
]> seem to be a lot of interest in gcc link time optimization. So I never
]> submitted a patch. Maybe it is time to revive this effort. Here is what I
]> found:
]> 
]>     http://notabs.org/uefi/gcc-lto.htm
]> 
]> So 6 conditions need to be met for ghcc link time optimization to work
]> properly with EDK2:
]> 
]>     1) Add -flto to the compile flags
]>     2) Use gcc to launch ld instead of invoking ld directly
]>     3) Include the compile flags on the link command line
]>     4) Use gcc-ar in place of ar when building static libraries
]>     5) Library code that resolves helper function calls generated by the 
compiler must be compiled ]without the -flto flag
]>     6) These libraries must be prefixed with -Wl,-plugin-opt=-pass-through= 
on the link command line.
]> 
]> A patch from late 2014 is here:
]> 
http://sourceforge.net/projects/edk2developertoolsforwindows/files/Patches/Link%20Time%20Optimization/
]
]BaseTools/Contributions.txt (Contributed-under...)
]
]If you don't submit it edk2-devel, and continue to follow up on it,
]then work can easily slip through the cracks.
]
]That said, I've spent a little time looking at your work, so it's not
]true that there was no interest. But, if you have something that is
]*actually working* for DuetPkg, EmulatorPkg and OvmfPkg, can you put
]together a patch series?

The patch isn't ready for review. One reason is that it exposes
a problem that has no simple solution that I can find. A BaseTools
change may be needed. Link time code generation allows gcc to warn
about things that it otherwise can't. With -flto, gcc warns about:

extern const VOID* _gPcd_FixedAtBuild_PcdShellSupplier[];
AutoGen.c:207:15: note: previously declared here
    GLOBAL_REMOVE_IF_UNREFERENCED const UINT16
    _gPcd_FixedAtBuild_PcdShellSupplier[7] = {69, 68, 75, 32, 73, 73, 0 };

Both definitions are generated so they can't easily be changed.
This slight inconsistency in the array definition stops the build
because of warnings as errors. For this -flto proof of concept
experiment, I disable warning as errors. But the problem needs
to be resolved before a patch can be submitted. It was discussed
in a thread titled "Status of gcc link time optimization for EDK2 use".
Sergey made a python patch, but as I remember it didn't quite fix
every occurrence.

]I don't see how we can manage 5 & 6 with our current BaseTools. How
]did you manage it? Searching for 'pass-through' in your patch doesn't
]yield any results.

I punted and omitted -flto for that case. It is only a serious problem
for ARM:

    "While making the EDK2 build meet requirement 5 is easy, the same
    is not true for requirement 6 in some cases. For example, the ARM
    build resolves compiler generated helper function calls with
    CompilerIntrinsicsLib.lib and BaseStackCheckLib.lib. The path to
    these libraries varies with the package name and build options.
    Without a significant modification to the EDK2 build tools, there
    is no way to generate the requires prefixed path for use on the
    linker command line. This limitation affects ARM builds the most
    because gcc ARM code uses more compiler generated helper function
    calls than other target architectures. For this reason, link time
    optimization is not enabled for ARM in the gcc LTO EDK2 patch. The
    use of compiler generated helper function calls is kept to a minimum
    in x86 code. For the IA32 builds the compiler generates a floating
    point helper call when building stdlib. The patch disables link time
    optimization for IA32 stdlib to avoid the
    -Wl,-plugin-opt=-pass-through= requirement."

I will update the patch to work with the current EDK2 code. Here are
another couple of things to decide.

1) Which gcc version(s) get -flto? Probably 4.9 and later make sense.
2) Use of gcc -flto probably needs to be optional. We could make
   two tool chain definitions, such as GCC49 and GCC49LTO. But that
   creates a lot of duplication in an already big template file. 
   For the proof of concept experiment, -flto can be disabled by
   setting an environment variable.

]Thanks,
]
]-Jordan


------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to