Scott, comdat folding is related to optimization. My other email on this thread describes a debug issue seen when optimization and comdat folding is disabled along with an example that can be used to evaluate the issue on different debuggers.
I want to clarify that there is no "ban" on the use of static. That is legal C syntax and developers are welcome to use static in their packages. It is only a recommendation for EDK II packages that are shared by all platforms to improve debug. I have had my own debug experiences where I have wasted many hours root causing difficult firmware issues only to find the debugger was showing me the incorrect function names. At the time, discouraging the use of static seemed like a reasonable recommendation. MdePkg/Include/Base.h defines STATIC with the intended use for variables/datum elements. /// /// Datum is scoped to the current file or function. /// #define STATIC static I agree that if we want to change this from a recommendation to a requirement that it would need to be clearly documented in the EDK II coding document along with clear justification for the requirement. Even as a recommendation, it would be good to mention in the EDK II coding document and the EDK II module writer's guide along with clear justification for the recommendation. Given that all of the EDKI II packages shared by all platforms are consistently following this recommendation, do you see any harm in applying this recommendation to the new MdePkg BaseOrderedCollectionRedBlackTreeLib? We could also work on evaluating all the latest debuggers to see if this debug issue seen in the past is still present or not. If the no debuggers have the issue, then the recommendation could be dropped. Thanks, Mike -----Original Message----- From: Scott Duplichan [mailto:[email protected]] Sent: Tuesday, August 19, 2014 10:28 PM To: [email protected] Subject: Re: [edk2] [PATCH] MdePkg: refine code for BaseOrderedCollectionRedBlackTreeLib Brian J. Johnson [mailto:[email protected]] wrote: [...] ]> In this case, even the Microsoft Visual Studio debugger gives ]> the appearance of stepping through the 'wrong' function. But ]> the linker /verbose output confirms the debugger is correct: ]> ]> Selected symbol: ]> _f1 from 1.obj ]> Replaced symbol(s): ]> _f2 from 1.obj ]> _f3 from 1.obj ] ]FWIW I have seen this behavior most commonly with functions which, after ]optimization, simply return a constant (eg. TRUE, or EFI_SUCCESS.) It's ]a bit surprising when looking at symbol names, but it always seems to ]produce correct results. ]-- ] ] Brian That is my experience too. I see now that this optimization is called 'comdat folding' and is explained here: http://msdn.microsoft.com/en-us/library/bxwfs976.aspx Here are a few cases of comdat folding from a current EDK2 OVMF build using VS2010 tools: Selected symbol: PeiDefaultIoWrite16 from PeiCore.lib(CpuIo.obj) Replaced symbol(s): PeiDefaultIoWrite32 from PeiCore.lib(CpuIo.obj) PeiDefaultIoWrite64 from PeiCore.lib(CpuIo.obj) PeiDefaultIoWrite8 from PeiCore.lib(CpuIo.obj) PeiDefaultMemWrite16 from PeiCore.lib(CpuIo.obj) PeiDefaultMemWrite32 from PeiCore.lib(CpuIo.obj) PeiDefaultMemWrite64 from PeiCore.lib(CpuIo.obj) PeiDefaultMemWrite8 from PeiCore.lib(CpuIo.obj) Selected symbol: CoreEmptyCallbackFunction from DxeCore.lib(Dispatcher.obj) Replaced symbol(s): SzFree from LzmaDecompressLib.lib(LzmaDecompress.obj) Selected symbol: DxePcdSet8 from PcdDxe.lib(Pcd.obj) Replaced symbol(s): DxePcdSetBool from PcdDxe.lib(Pcd.obj) Here is a case where more complex functions are folded. The source code of the merged functions is quite different, but evidently the intermediate code is the same: Selected symbol: HexCharToUintn from UefiShellDebug1CommandsLib.lib(UefiShellDebug1CommandsLib.obj) Replaced symbol(s): InternalHexCharToUintn from BaseLib.lib(String.obj) Building OVMF using VS2010 results in 35 cases of comdat folding. I confirmed the optimization can be prevented replacing linker options " /OPT:REF /OPT:ICF=10" with "/NOICF". Avoiding the use of static functions is _not_ preventing the comdat folding optimization. So either the original problem was due to another cause, or more likely the removal of static functions did avoid comdat folding when a different compiler version and/or options was used. I think the decision to ban the use of static functions should be revisited. If the original debugger problem can be reproduced and confirmed to be due to comdat folding, then engineers can learn to recognize and appreciate comdat folding and understand that debugger behavior is correct. Alternatively, comdat folding could be disabled for the NOOPT build. If the original debugger problem is not due to comdat folding, then it should be documented along with steps to reproduce in case someone wants to investigate. Right now, the static function ban is not even mentioned in an EDK2 coding document. Banning a C language feature as mainstream as static functions should be avoided if possible, and carefully documented if not. Thanks, Scott ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
