\r
The Debug library supports debug print and asserts based on a combination of macros and code.\r
The debug library can be turned on and off so that the debug code does not increase the size of an image.\r
- \r
+\r
+ Note that a MDEPKG_NDEBUG macro is introduced to switch on/off debug and assert related macros.\r
+ 1. If MDEPKG_NDEBUG is defined, then debug and assert related macros are NULL.\r
+ 2. If MDEPKG_NDEBUG is not defined, then PcdDebugProperyMask is used to turn on/off these helper macros.\r
+\r
Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
/** \r
Macro that calls DebugAssert() if an expression evaluates to FALSE.\r
\r
- If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, \r
- then this macro evaluates the Boolean expression specified by Expression. If \r
- Expression evaluates to FALSE, then DebugAssert() is called passing in the \r
- source filename, source line number, and Expression.\r
+ If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED \r
+ bit of PcdDebugProperyMask is set, then this macro evaluates the Boolean \r
+ expression specified by Expression. If Expression evaluates to FALSE, then \r
+ DebugAssert() is called passing in the source filename, source line number, \r
+ and Expression.\r
\r
@param Expression Boolean expression\r
\r
**/\r
-#define ASSERT(Expression) \\r
- do { \\r
- if (DebugAssertEnabled ()) { \\r
- if (!(Expression)) { \\r
- _ASSERT (Expression); \\r
- } \\r
- } \\r
- } while (FALSE)\r
-\r
+#if !defined(MDEPKG_NDEBUG) \r
+ #define ASSERT(Expression) \\r
+ do { \\r
+ if (DebugAssertEnabled ()) { \\r
+ if (!(Expression)) { \\r
+ _ASSERT (Expression); \\r
+ } \\r
+ } \\r
+ } while (FALSE)\r
+#else\r
+ #define ASSERT(Expression)\r
+#endif\r
\r
/** \r
Macro that calls DebugPrint().\r
\r
- If the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set, \r
- then this macro passes Expression to DebugPrint().\r
+ If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED \r
+ bit of PcdDebugProperyMask is set, then this macro passes Expression to \r
+ DebugPrint().\r
\r
@param Expression Expression containing an error level, a format string, \r
and a variable argument list based on the format string.\r
\r
\r
**/\r
-#define DEBUG(Expression) \\r
- do { \\r
- if (DebugPrintEnabled ()) { \\r
- _DEBUG (Expression); \\r
- } \\r
- } while (FALSE)\r
-\r
+#if !defined(MDEPKG_NDEBUG) \r
+ #define DEBUG(Expression) \\r
+ do { \\r
+ if (DebugPrintEnabled ()) { \\r
+ _DEBUG (Expression); \\r
+ } \\r
+ } while (FALSE)\r
+#else\r
+ #define DEBUG(Expression)\r
+#endif\r
\r
/** \r
Macro that calls DebugAssert() if an EFI_STATUS evaluates to an error code.\r
\r
- If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, \r
- then this macro evaluates the EFI_STATUS value specified by StatusParameter. \r
- If StatusParameter is an error code, then DebugAssert() is called passing in \r
- the source filename, source line number, and StatusParameter.\r
+ If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED \r
+ bit of PcdDebugProperyMask is set, then this macro evaluates the EFI_STATUS \r
+ value specified by StatusParameter. If StatusParameter is an error code, \r
+ then DebugAssert() is called passing in the source filename, source line \r
+ number, and StatusParameter.\r
\r
@param StatusParameter EFI_STATUS value to evaluate.\r
\r
**/\r
-#define ASSERT_EFI_ERROR(StatusParameter) \\r
- do { \\r
- if (DebugAssertEnabled ()) { \\r
- if (EFI_ERROR (StatusParameter)) { \\r
- DEBUG ((EFI_D_ERROR, "\nASSERT_EFI_ERROR (Status = %r)\n", StatusParameter)); \\r
- _ASSERT (!EFI_ERROR (StatusParameter)); \\r
- } \\r
- } \\r
- } while (FALSE)\r
-\r
+#if !defined(MDEPKG_NDEBUG)\r
+ #define ASSERT_EFI_ERROR(StatusParameter) \\r
+ do { \\r
+ if (DebugAssertEnabled ()) { \\r
+ if (EFI_ERROR (StatusParameter)) { \\r
+ DEBUG ((EFI_D_ERROR, "\nASSERT_EFI_ERROR (Status = %r)\n", StatusParameter)); \\r
+ _ASSERT (!EFI_ERROR (StatusParameter)); \\r
+ } \\r
+ } \\r
+ } while (FALSE)\r
+#else\r
+ #define ASSERT_EFI_ERROR(StatusParameter)\r
+#endif\r
\r
/** \r
Macro that calls DebugAssert() if a protocol is already installed in the \r
handle database.\r
\r
- If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear, \r
- then return.\r
+ If MDEPKG_NDEBUG is defined or the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit \r
+ of PcdDebugProperyMask is clear, then return.\r
\r
If Handle is NULL, then a check is made to see if the protocol specified by Guid \r
is present on any handle in the handle database. If Handle is not NULL, then \r
@param Guid Pointer to a protocol GUID.\r
\r
**/\r
-#define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid) \\r
- do { \\r
- if (DebugAssertEnabled ()) { \\r
- VOID *Instance; \\r
- ASSERT (Guid != NULL); \\r
- if (Handle == NULL) { \\r
- if (!EFI_ERROR (gBS->LocateProtocol ((EFI_GUID *)Guid, NULL, &Instance))) { \\r
- _ASSERT (Guid already installed in database); \\r
- } \\r
- } else { \\r
- if (!EFI_ERROR (gBS->HandleProtocol (Handle, (EFI_GUID *)Guid, &Instance))) { \\r
- _ASSERT (Guid already installed on Handle); \\r
- } \\r
- } \\r
- } \\r
- } while (FALSE)\r
-\r
+#if !defined(MDEPKG_NDEBUG)\r
+ #define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid) \\r
+ do { \\r
+ if (DebugAssertEnabled ()) { \\r
+ VOID *Instance; \\r
+ ASSERT (Guid != NULL); \\r
+ if (Handle == NULL) { \\r
+ if (!EFI_ERROR (gBS->LocateProtocol ((EFI_GUID *)Guid, NULL, &Instance))) { \\r
+ _ASSERT (Guid already installed in database); \\r
+ } \\r
+ } else { \\r
+ if (!EFI_ERROR (gBS->HandleProtocol (Handle, (EFI_GUID *)Guid, &Instance))) { \\r
+ _ASSERT (Guid already installed on Handle); \\r
+ } \\r
+ } \\r
+ } \\r
+ } while (FALSE)\r
+#else\r
+ #define ASSERT_PROTOCOL_ALREADY_INSTALLED(Handle, Guid)\r
+#endif\r
\r
/**\r
Macro that marks the beginning of debug source code.\r
structure inside a larger private data structure and using a pointer to the \r
public data structure to retrieve a pointer to the private data structure.\r
\r
- If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear, \r
- then this macro computes the offset, in bytes, of field specified by Field \r
- from the beginning of the data structure specified by TYPE. This offset is \r
- subtracted from Record, and is used to return a pointer to a data structure \r
- of the type specified by TYPE.\r
-\r
- If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, \r
- then this macro computes the offset, in bytes, of field specified by Field from \r
- the beginning of the data structure specified by TYPE. This offset is \r
- subtracted from Record, and is used to compute a pointer to a data structure of \r
- the type specified by TYPE. The Signature field of the data structure specified \r
- by TYPE is compared to TestSignature. If the signatures match, then a pointer \r
- to the pointer to a data structure of the type specified by TYPE is returned. \r
- If the signatures do not match, then DebugAssert() is called with a description \r
- of "CR has a bad signature" and Record is returned. \r
+ If MDEPKG_NDEBUG is defined or the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit \r
+ of PcdDebugProperyMask is clear, then this macro computes the offset, in bytes,\r
+ of field specified by Field from the beginning of the data structure specified \r
+ by TYPE. This offset is subtracted from Record, and is used to return a pointer \r
+ to a data structure of the type specified by TYPE.\r
+\r
+ If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit\r
+ of PcdDebugProperyMask is set, then this macro computes the offset, in bytes, \r
+ of field specified by Field from the beginning of the data structure specified \r
+ by TYPE. This offset is subtracted from Record, and is used to compute a pointer\r
+ to a data structure of the type specified by TYPE. The Signature field of the \r
+ data structure specified by TYPE is compared to TestSignature. If the signatures \r
+ match, then a pointer to the pointer to a data structure of the type specified by \r
+ TYPE is returned. If the signatures do not match, then DebugAssert() is called \r
+ with a description of "CR has a bad signature" and Record is returned. \r
\r
If the data type specified by TYPE does not contain the field specified by Field, \r
then the module will not compile.\r
@param TestSignature The 32-bit signature value to match.\r
\r
**/\r
-#define CR(Record, TYPE, Field, TestSignature) \\r
- (DebugAssertEnabled () && (BASE_CR (Record, TYPE, Field)->Signature != TestSignature)) ? \\r
- (TYPE *) (_ASSERT (CR has Bad Signature), Record) : \\r
- BASE_CR (Record, TYPE, Field)\r
+#if !defined(MDEPKG_NDEBUG)\r
+ #define CR(Record, TYPE, Field, TestSignature) \\r
+ (DebugAssertEnabled () && (BASE_CR (Record, TYPE, Field)->Signature != TestSignature)) ? \\r
+ (TYPE *) (_ASSERT (CR has Bad Signature), Record) : \\r
+ BASE_CR (Record, TYPE, Field)\r
+#else\r
+ #define CR(Record, TYPE, Field, TestSignature) \\r
+ BASE_CR (Record, TYPE, Field)\r
+#endif\r
\r
#endif\r