> On Mar 18, 2016, at 5:13 PM, Laszlo Ersek <[email protected]> wrote:
> 
> On 03/19/16 00:27, Andrew Fish wrote:
>> 
>>> On Mar 18, 2016, at 3:46 PM, Michael Brown <[email protected]> wrote:
>>> 
>>> On 18/03/16 22:30, Laszlo Ersek wrote:
>>>> Unfortunately, I've run into a big issue: the DEBUG(()) macro. (To a
>>>> smaller extent, the ASSERT_EFI_ERROR() macro as well.) These macros
>>>> expand to the null replacement string when MDEPKG_NDEBUG is defined
>>>> (which is occasionally the case for RELEASE builds). If those macro
>>>> invocations constitute the only read accesses to some local variables,
>>>> then the MDEPKG_NDEBUG build triggers "-Wunused-but-set-variable".
>>>> 
>>>> For ASSERT_EFI_ERROR(), I could work it around like this:
>>>> 
>>>>  ((VOID)(TRUE ? 0 : (StatusParameter)))
>>>> 
>>>> but I have no clue how to do the same with DEBUG(), which can receive
>>>> any number of arguments (of any type too).
>>> 
>>> With the caveat that I haven't looked at how DEBUG() is implemented in EDK2:
>>> 
>>> Could this rely upon dead code elimination?  At least gcc will happily 
>>> accept something which expands to
>>> 
>>> if ( 0 ) {
>>>    do_something_with ( a_variable );
>>> }
>>> 
>>> and treat that as being a "use" of a_variable (for the purposes of 
>>> -Wunused-but-set-variable).
>>> 
>> 
>> All the DEBUG macros work this way all ready.  MDEPKG_NDEBUG was a 
>> hack-a-round for compilers that don't do link time optimization.
> 
> Like, all versions of gcc that are currently supported? :)
> 
>> So you don't need to redefine anything, just don't use MDEPKG_NDEBUG.
> 
> That sounds like good advice, but reality would have to catch up:
> 

Well you got advice to reinvent the wheel..... If you followed that path you 
would end up reinventing the non MDEPKG_NDEBUG path. 

> $ git grep MDEPKG_NDEBUG -- '*.dsc'
> 

I did not realize that some packages had used MDEPKG_NDEBUG, but it makes sense 
I guess so the coding errors would be the same for all the supported compilers. 

> ArmPkg/ArmPkg.dsc:  RELEASE_*_*_CC_FLAGS  = -DMDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc:  GCC:*_UNIXGCC_*_CC_FLAGS      
>  = -DMDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc:  GCC:RELEASE_*_*_CC_FLAGS      
>  = -DMDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc:  INTEL:RELEASE_*_*_CC_FLAGS    
>  = /D MDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc:  MSFT:RELEASE_*_*_CC_FLAGS     
>  = /D MDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc:  GCC:*_UNIXGCC_*_CC_FLAGS   
>     = -DMDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc:  GCC:RELEASE_*_*_CC_FLAGS   
>     = -DMDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc:  INTEL:RELEASE_*_*_CC_FLAGS 
>     = /D MDEPKG_NDEBUG
> CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc:  MSFT:RELEASE_*_*_CC_FLAGS  
>     = /D MDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32.dsc:  GCC:*_UNIXGCC_*_CC_FLAGS             = 
> -DMDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32.dsc:  GCC:RELEASE_*_*_CC_FLAGS             = 
> -DMDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32.dsc:  INTEL:RELEASE_*_*_CC_FLAGS           = /D 
> MDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32.dsc:  MSFT:RELEASE_*_*_CC_FLAGS            = /D 
> MDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32X64.dsc:  GCC:*_UNIXGCC_*_CC_FLAGS             = 
> -DMDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32X64.dsc:  GCC:RELEASE_*_*_CC_FLAGS             = 
> -DMDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32X64.dsc:  INTEL:RELEASE_*_*_CC_FLAGS           = /D 
> MDEPKG_NDEBUG
> OvmfPkg/OvmfPkgIa32X64.dsc:  MSFT:RELEASE_*_*_CC_FLAGS            = /D 
> MDEPKG_NDEBUG
> OvmfPkg/OvmfPkgX64.dsc:  GCC:*_UNIXGCC_*_CC_FLAGS             = 
> -DMDEPKG_NDEBUG
> OvmfPkg/OvmfPkgX64.dsc:  GCC:RELEASE_*_*_CC_FLAGS             = 
> -DMDEPKG_NDEBUG
> OvmfPkg/OvmfPkgX64.dsc:  INTEL:RELEASE_*_*_CC_FLAGS           = /D 
> MDEPKG_NDEBUG
> OvmfPkg/OvmfPkgX64.dsc:  MSFT:RELEASE_*_*_CC_FLAGS            = /D 
> MDEPKG_NDEBUG
> Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc:        ICC:*_*_*_CC_FLAGS = -D 
> MDEPKG_NDEBUG
> Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc:        GCC:*_*_*_CC_FLAGS = -D 
> MDEPKG_NDEBUG
> Vlv2TbltDevicePkg/PlatformPkgIA32.dsc:        ICC:*_*_*_CC_FLAGS = /D 
> MDEPKG_NDEBUG
> Vlv2TbltDevicePkg/PlatformPkgIA32.dsc:        GCC:*_*_*_CC_FLAGS = -D 
> MDEPKG_NDEBUG
> Vlv2TbltDevicePkg/PlatformPkgX64.dsc:        ICC:*_*_*_CC_FLAGS = /D 
> MDEPKG_NDEBUG
> Vlv2TbltDevicePkg/PlatformPkgX64.dsc:        GCC:*_*_*_CC_FLAGS = -D 
> MDEPKG_NDEBUG
> 
>> That will give you the same path as VC++ and clang (assuming LTO is 
>> enabled). 
> 
> Well, LTO is unusable in edk2 with the supported GCC toolchains, to my 
> knowledge.
> 
>> https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Library/DebugLib.h
>> 
>> #if !defined(MDEPKG_NDEBUG)      
>>  #define DEBUG(Expression)        \
>>    do {                           \
>>      if (DebugPrintEnabled ()) {  \
>>        _DEBUG (Expression);       \
>>      }                            \
>>    } while (FALSE)
>> #else
>>  #define DEBUG(Expression)
>> #endif
>> 
>> 
>> If you have code that only exists in DEBUG builds you can use these macros 
>> to isolate it. 
>> 
>> /**
>>  Macro that marks the beginning of debug source code.
>>  If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, 
>>  then this macro marks the beginning of source code that is included in a 
>> module.
>>  Otherwise, the source lines between DEBUG_CODE_BEGIN() and DEBUG_CODE_END() 
>>  are not included in a module.
>> **/
>> #define DEBUG_CODE_BEGIN()  do { if (DebugCodeEnabled ()) { UINT8  
>> __DebugCodeLocal
>> 
>> 
>> /**  
>>  The macro that marks the end of debug source code.
>>  If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, 
>>  then this macro marks the end of source code that is included in a module.  
>>  Otherwise, the source lines between DEBUG_CODE_BEGIN() and DEBUG_CODE_END() 
>>  are not included in a module.
>> **/
>> #define DEBUG_CODE_END()    __DebugCodeLocal = 0; __DebugCodeLocal++; } } 
>> while (FALSE)
> 
> Right, but the code that triggers the problem is more like:
> 
>  CHAR8 *Message;
> 
>  Message = "";
>  if (whatever) {
>    // do some real logic
> 
>    Message = "blah\n";
> 
>    // do some more real logic
>  }
> 
>  DEBUG ((EFI_D_INFO, "%a\n", Message));
> 
> I.e., it's hard to find a common, tight scope for all uses of the variable in 
> question.
> 

I feel bad saying this, but make that variable volatile and the compiler would 
probably think you know what you are doing and stop warning. 

Thanks,

Andrew Fish

> Thanks
> Laszlo
> _______________________________________________
> 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

Reply via email to