> On Jun 11, 2016, at 7:58 PM, Gao, Liming <liming....@intel.com> wrote:
> 
> Hi, 
>  I don't see the usage on NORETURN attribute and UNREACHABLE() macro. Why we 
> need to add them also?
> 

When you factor in debugging I think the only thing we have that are really 
NORETURN would be phase changes. SEC calling PEI Core. DXE IPL PEIM loading DXE 
Core, DXE Core entry point. I debug across and ASSERT(), CpuBreakpoint(), or 
CpuDeadloop() all the time so turn that compiler feature on would break stuff. 
For the mode transitions we could save a few unreachable stack cleanup 
instructions? Thus I guess things like the PEI Core entry point function are 
kind of NORETURN, and I guess the UNREACHABLE would be like  
__builtin_unreachable() and end up after the call to the PEI Core entry point. 
Given things like the PEI Core entry point are defined in the PI spec, it would 
probably be better to define UNREACHABLE(). 

But I'm still not sure what problem we are trying to solve. 

Thanks,

Andrew Fish 

> Thanks
> Liming
>> -----Original Message-----
>> From: Marvin Häuser [mailto:marvin.haeu...@outlook.com]
>> Sent: Saturday, June 11, 2016 5:02 AM
>> To: edk2-devel@lists.01.org
>> Cc: Gao, Liming <liming....@intel.com>; Kinney, Michael D
>> <michael.d.kin...@intel.com>
>> Subject: [PATCH v1 1/2] MdePkg: Add NORETURN attribute and
>> UNREACHABLE() macro.
>> 
>> The NORETURN attribute informs compilers and analyzers that the flagged
>> function cannot return. This may improve the quality of the optimizations.
>> 
>> The UNREACHABLE() macro informs compilers and analyzers that its position
>> cannot be reached, for example eliminating implicit returns.
>> It is recommended to be used together with the NORETURN attribute to
>> prevent
>> warnings regarding the function flagged as 'noreturn' returning.
>> 
>> The ANALYZER-prefixed versions have the same effects, but exclude
>> compilers.
>> They may be used to surpress warnings of static analyzers, such as possible
>> dereferencing of a NULL pointer when dereferencing it after having checked
>> it
>> via ASSERT().
>> 
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Marvin Haeuser <marvin.haeu...@outlook.com>
>> ---
>> MdePkg/Include/Base.h | 103 ++++++++++++++++++++
>> 1 file changed, 103 insertions(+)
>> 
>> diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h
>> index 89b2aed07229..9dfafb282177 100644
>> --- a/MdePkg/Include/Base.h
>> +++ b/MdePkg/Include/Base.h
>> @@ -85,6 +85,109 @@ VERIFY_SIZE_OF (CHAR16, 2);
>> #endif
>> 
>> //
>> +// Should be used in combination with NORETURN to avoid 'noreturn'
>> returns
>> +// warnings.
>> +//
>> +#ifndef UNREACHABLE
>> +  #ifdef __GNUC__
>> +    ///
>> +    /// Signal compilers and analyzers that this call is not reachable.  It 
>> is
>> +    /// up to the compiler to remove any code past that point.
>> +    ///
>> +    #define UNREACHABLE()  __builtin_unreachable()
>> +  #elif defined (__has_feature)
>> +    #if __has_builtin (__builtin_unreachable)
>> +      ///
>> +      /// Signal compilers and analyzers that this call is not reachable.  
>> It is
>> +      /// up to the compiler to remove any code past that point.
>> +      ///
>> +      #define UNREACHABLE()  __builtin_unreachable()
>> +    #endif
>> +  #endif
>> +
>> +  #ifndef UNREACHABLE
>> +    ///
>> +    /// Signal compilers and analyzers that this call is not reachable.  It 
>> is
>> +    /// up to the compiler to remove any code past that point.
>> +    ///
>> +    #define UNREACHABLE()
>> +  #endif
>> +#endif
>> +
>> +//
>> +// Signaling compilers and analyzers that a certain function cannot return
>> may
>> +// remove all following code and thus lead to better optimization and less
>> +// false positives.
>> +//
>> +#ifndef NORETURN
>> +  #ifdef __GNUC__
>> +    ///
>> +    /// Signal compilers and analyzers that the function cannot return.
>> +    /// It is up to the compiler to remove any code past a call to functions
>> +    /// flagged with this attribute.
>> +    ///
>> +    #define NORETURN  __attribute__ ((noreturn))
>> +  #else
>> +    ///
>> +    /// Signal compilers and analyzers that the function cannot return.
>> +    /// It is up to the compiler to remove any code past a call to functions
>> +    /// flagged with this attribute.
>> +    ///
>> +    #define NORETURN
>> +  #endif
>> +#endif
>> +
>> +//
>> +// Should be used in combination with ANALYZER_NORETURN to avoid
>> 'noreturn'
>> +// returns warnings.
>> +//
>> +#ifndef ANALYZER_UNREACHABLE
>> +  #ifdef __clang_analyzer__
>> +    #if __has_builtin (__builtin_unreachable)
>> +      ///
>> +      /// Signal the analyzer that this call is not reachable.
>> +      /// This excludes compilers.
>> +      ///
>> +      #define ANALYZER_UNREACHABLE()  __builtin_unreachable()
>> +    #endif
>> +  #endif
>> +
>> +  #ifndef ANALYZER_UNREACHABLE
>> +    ///
>> +    /// Signal the analyzer that this call is not reachable.
>> +    /// This excludes compilers.
>> +    ///
>> +    #define ANALYZER_UNREACHABLE()
>> +  #endif
>> +#endif
>> +
>> +//
>> +// Static Analyzers may issue errors about potential NULL-dereferences
>> when
>> +// dereferencing a pointer, that has been checked before, outside of a
>> +// NULL-check.  This may lead to false positives, such as when using 
>> ASSERT()
>> +// for verification.
>> +//
>> +#ifndef ANALYZER_NORETURN
>> +  #ifdef __has_feature
>> +    #if __has_feature (attribute_analyzer_noreturn)
>> +      ///
>> +      /// Signal analyzers that the function cannot return.
>> +      /// This excludes compilers.
>> +      ///
>> +      #define ANALYZER_NORETURN  __attribute__ ((analyzer_noreturn))
>> +    #endif
>> +  #endif
>> +
>> +  #ifndef ANALYZER_NORETURN
>> +    ///
>> +    /// Signal the analyzer that the function cannot return.
>> +    /// This excludes compilers.
>> +    ///
>> +    #define ANALYZER_NORETURN
>> +  #endif
>> +#endif
>> +
>> +//
>> // For symbol name in assembly code, an extra "_" is sometimes necessary
>> //
>> 
>> --
>> 2.7.4.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to