]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/DebugLib.h
MdePkg: fix comment typo in DebugLib.h
[mirror_edk2.git] / MdePkg / Include / Library / DebugLib.h
index 9cb9027b7094eae96acde8e0b1f946bd5306bc44..86bb71f8c8c76f74021c30c87f65af204ac3d9aa 100644 (file)
@@ -3,12 +3,16 @@
   \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
-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
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
+\r
+  Note that a reserved macro named MDEPKG_NDEBUG is introduced for the intention\r
+  of size reduction when compiler optimization is disabled. If MDEPKG_NDEBUG is\r
+  defined, then debug and assert related macros wrapped by it are the NULL implementations.\r
+\r
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials are licensed and made available under \r
+the terms and conditions of the BSD License that accompanies this distribution.  \r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
 \r
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
@@ -37,15 +41,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define DEBUG_FS        0x00000008  // EFI File system\r
 #define DEBUG_POOL      0x00000010  // Alloc & Free's\r
 #define DEBUG_PAGE      0x00000020  // Alloc & Free's\r
-#define DEBUG_INFO      0x00000040  // Verbose\r
-#define DEBUG_DISPATCH  0x00000080  // PEI/DXE Dispatchers\r
+#define DEBUG_INFO      0x00000040  // Informational debug messages\r
+#define DEBUG_DISPATCH  0x00000080  // PEI/DXE/SMM Dispatchers\r
 #define DEBUG_VARIABLE  0x00000100  // Variable\r
 #define DEBUG_BM        0x00000400  // Boot Manager\r
 #define DEBUG_BLKIO     0x00001000  // BlkIo Driver\r
 #define DEBUG_NET       0x00004000  // SNI Driver\r
 #define DEBUG_UNDI      0x00010000  // UNDI Driver\r
-#define DEBUG_LOADFILE  0x00020000  // UNDI Driver\r
+#define DEBUG_LOADFILE  0x00020000  // LoadFile\r
 #define DEBUG_EVENT     0x00080000  // Event messages\r
+#define DEBUG_GCD       0x00100000  // Global Coherency Database changes\r
+#define DEBUG_CACHE     0x00200000  // Memory range cachability changes\r
+#define DEBUG_VERBOSE   0x00400000  // Detailed debug messages that may significantly impact boot performance\r
 #define DEBUG_ERROR     0x80000000  // Error\r
 \r
 //\r
@@ -66,20 +73,21 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define EFI_D_UNDI      DEBUG_UNDI\r
 #define EFI_D_LOADFILE  DEBUG_LOADFILE\r
 #define EFI_D_EVENT     DEBUG_EVENT\r
+#define EFI_D_VERBOSE   DEBUG_VERBOSE\r
 #define EFI_D_ERROR     DEBUG_ERROR\r
 \r
 /**\r
   Prints a debug message to the debug output device if the specified error level is enabled.\r
 \r
-  If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print \r
-  the message specified by Format and the associated variable argument list to \r
-  the debug output device.\r
+  If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function \r
+  GetDebugPrintErrorLevel (), then print the message specified by Format and the \r
+  associated variable argument list to the debug output device.\r
 \r
   If Format is NULL, then ASSERT().\r
 \r
   @param  ErrorLevel  The error level of the debug message.\r
-  @param  Format      Format string for the debug message to print.\r
-  @param  ...         Variable argument list whose contents are accessed \r
+  @param  Format      The format string for the debug message to print.\r
+  @param  ...         The variable argument list whose contents are accessed \r
                       based on the format string specified by Format.\r
 \r
 **/\r
@@ -108,9 +116,9 @@ DebugPrint (
   If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.\r
   If Description is NULL, then a <Description> string of "(NULL) Description" is printed.\r
 \r
-  @param  FileName     Pointer to the name of the source file that generated the assert condition.\r
+  @param  FileName     The pointer to the name of the source file that generated the assert condition.\r
   @param  LineNumber   The line number in the source file that generated the assert condition\r
-  @param  Description  Pointer to the description of the assert condition.\r
+  @param  Description  The pointer to the description of the assert condition.\r
 \r
 **/\r
 VOID\r
@@ -131,10 +139,10 @@ DebugAssert (
   If Buffer is NULL, then ASSERT().\r
   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). \r
 \r
-  @param   Buffer  Pointer to the target buffer to be filled with PcdDebugClearMemoryValue.\r
-  @param   Length  Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. \r
+  @param   Buffer  The pointer to the target buffer to be filled with PcdDebugClearMemoryValue.\r
+  @param   Length  The number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. \r
 \r
-  @return  Buffer  Pointer to the target buffer filled with PcdDebugClearMemoryValue.\r
+  @return  Buffer  The pointer to the target buffer filled with PcdDebugClearMemoryValue.\r
 \r
 **/\r
 VOID *\r
@@ -149,7 +157,7 @@ DebugClearMemory (
   Returns TRUE if ASSERT() macros are enabled.\r
 \r
   This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of \r
-  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+  PcdDebugProperyMask is set.  Otherwise, FALSE is returned.\r
 \r
   @retval  TRUE    The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set.\r
   @retval  FALSE   The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear.\r
@@ -166,7 +174,7 @@ DebugAssertEnabled (
   Returns TRUE if DEBUG() macros are enabled.\r
 \r
   This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of \r
-  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+  PcdDebugProperyMask is set.  Otherwise, FALSE is returned.\r
 \r
   @retval  TRUE    The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set.\r
   @retval  FALSE   The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear.\r
@@ -183,7 +191,7 @@ DebugPrintEnabled (
   Returns TRUE if DEBUG_CODE() macros are enabled.\r
 \r
   This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of \r
-  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+  PcdDebugProperyMask is set.  Otherwise, FALSE is returned.\r
 \r
   @retval  TRUE    The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set.\r
   @retval  FALSE   The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear.\r
@@ -200,7 +208,7 @@ DebugCodeEnabled (
   Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled.\r
 \r
   This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of \r
-  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+  PcdDebugProperyMask is set.  Otherwise, FALSE is returned.\r
 \r
   @retval  TRUE    The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set.\r
   @retval  FALSE   The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear.\r
@@ -212,6 +220,20 @@ DebugClearMemoryEnabled (
   VOID\r
   );\r
 \r
+/**\r
+  Returns TRUE if any one of the bit is set both in ErrorLevel and PcdFixedDebugPrintErrorLevel.\r
+\r
+  This function compares the bit mask of ErrorLevel and PcdFixedDebugPrintErrorLevel.\r
+\r
+  @retval  TRUE    Current ErrorLevel is supported.\r
+  @retval  FALSE   Current ErrorLevel is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+DebugPrintLevelEnabled (\r
+  IN  CONST UINTN        ErrorLevel\r
+  );\r
 \r
 /**  \r
   Internal worker macro that calls DebugAssert().\r
@@ -230,82 +252,106 @@ DebugClearMemoryEnabled (
 \r
   This macro calls DebugPrint() passing in the debug error level, a format \r
   string, and a variable argument list.\r
+  __VA_ARGS__ is not supported by EBC compiler, Microsoft Visual Studio .NET 2003\r
+  and Microsoft Windows Server 2003 Driver Development Kit (Microsoft WINDDK) version 3790.1830.\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
-#define _DEBUG(Expression)   DebugPrint Expression\r
 \r
+#if !defined(MDE_CPU_EBC) && (!defined (_MSC_VER) || _MSC_VER > 1400)\r
+  #define _DEBUG_PRINT(PrintLevel, ...)              \\r
+    do {                                             \\r
+      if (DebugPrintLevelEnabled (PrintLevel)) {     \\r
+        DebugPrint (PrintLevel, ##__VA_ARGS__);      \\r
+      }                                              \\r
+    } while (FALSE)\r
+  #define _DEBUG(Expression)   _DEBUG_PRINT Expression\r
+#else\r
+#define _DEBUG(Expression)   DebugPrint Expression\r
+#endif\r
 \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
+  @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
@@ -319,26 +365,29 @@ DebugClearMemoryEnabled (
                   parameter that may be NULL.  If it is NULL, then the entire \r
                   handle database is searched.\r
 \r
-  @param  Guid    Pointer to a protocol GUID.\r
+  @param  Guid    The 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
@@ -353,7 +402,7 @@ DebugClearMemoryEnabled (
 \r
 \r
 /**  \r
-  Macro that marks the end of debug source code.\r
+  The macro that marks the end of debug source code.\r
 \r
   If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, \r
   then this macro marks the end of source code that is included in a module.  \r
@@ -365,7 +414,7 @@ DebugClearMemoryEnabled (
 \r
 \r
 /**  \r
-  Macro that declares a section of debug source code.\r
+  The macro that declares a section of debug source code.\r
 \r
   If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, \r
   then the source code specified by Expression is included in a module.  \r
@@ -379,12 +428,12 @@ DebugClearMemoryEnabled (
 \r
 \r
 /**  \r
-  Macro that calls DebugClearMemory() to clear a buffer to a default value.\r
+  The macro that calls DebugClearMemory() to clear a buffer to a default value.\r
 \r
   If the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set, \r
   then this macro calls DebugClearMemory() passing in Address and Length.\r
 \r
-  @param  Address  Pointer to a buffer.\r
+  @param  Address  The pointer to a buffer.\r
   @param  Length   The number of bytes in the buffer to set.\r
 \r
 **/\r
@@ -400,25 +449,25 @@ DebugClearMemoryEnabled (
   Macro that calls DebugAssert() if the containing record does not have a \r
   matching signature.  If the signatures matches, then a pointer to the data \r
   structure that contains a specified field of that data structure is returned.  \r
-  This is a light weight method hide information by placing a public data \r
+  This is a lightweight method hide information by placing a public data \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 the 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
@@ -426,7 +475,7 @@ DebugClearMemoryEnabled (
   If TYPE does not contain a field called Signature, then the module will not \r
   compile.\r
 \r
-  @param  Record         Pointer to the field specified by Field within a data \r
+  @param  Record         The pointer to the field specified by Field within a data \r
                          structure of type TYPE.\r
 \r
   @param  TYPE           The name of the data structure type to return  This \r
@@ -438,9 +487,14 @@ DebugClearMemoryEnabled (
   @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