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