Reviewed-by: Liming Gao <liming....@intel.com> for this series. 

> -----Original Message-----
> From: Marvin Häuser [mailto:marvin.haeu...@outlook.com]
> Sent: Sunday, June 19, 2016 9:29 AM
> To: edk2-devel@lists.01.org
> Cc: Gao, Liming <liming....@intel.com>; Kinney, Michael D
> <michael.d.kin...@intel.com>
> Subject: [PATCH v2 1/4] 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 | 110 ++++++++++++++++++++
>  1 file changed, 110 insertions(+)
> 
> diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h
> index 89b2aed07229..aa31f8c9e4ea 100644
> --- a/MdePkg/Include/Base.h
> +++ b/MdePkg/Include/Base.h
> @@ -85,6 +85,116 @@ 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
> +  #if defined (__GNUC__) || defined (__clang__)
> +    ///
> +    /// 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))
> +  #elif defined(_MSC_EXTENSIONS) && !defined(MDE_CPU_EBC)
> +    ///
> +    /// 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  __declspec(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.9.0.windows.1

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

Reply via email to