Andrew:
  Thanks for your explanation. So, they are the different topics. I suggest to 
separate this patch. 
1. NORETURN attribute and UNREACHABLE() macro will be used for the really 
NORETURN case, like phase change. 
2. ANALYZER_UNREACHABLE and ANALYZER_NORETURN are for static code analyzer, 
like clang compiler analyzer. 

Thanks
Liming
> -----Original Message-----
> From: [email protected] [mailto:[email protected]]
> Sent: Sunday, June 12, 2016 11:11 AM
> To: Gao, Liming <[email protected]>
> Cc: Marvin Häuser <[email protected]>; edk2-
> [email protected]; Kinney, Michael D <[email protected]>
> Subject: Re: [edk2] [PATCH v1 1/2] MdePkg: Add NORETURN attribute and
> UNREACHABLE() macro.
> 
> 
> > On Jun 11, 2016, at 7:58 PM, Gao, Liming <[email protected]> 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:[email protected]]
> >> Sent: Saturday, June 11, 2016 5:02 AM
> >> To: [email protected]
> >> Cc: Gao, Liming <[email protected]>; Kinney, Michael D
> >> <[email protected]>
> >> 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 <[email protected]>
> >> ---
> >> 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
> > [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