1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4//
5// File: Debug_MetaData.h
6//
7
8//
9// This file defines special macros for debugging MetaData (even in special retail builds).
10// The level of debugging is set by these (input) macros:
11// * code:#_DEBUG_METADATA
12// * code:#_DEBUG_MDSCHEMA
13//
14//
15// #_DEBUG_METADATA
16// _DEBUG_METADATA ... Enables debugging information in MetaData implementation. It's useful for debugging
17// retail builds in MetaData (when using CHK build is too slow).
18// Note: Enabled by default if _DEBUG is defined (see code:#DefaultSetting_DEBUG_METADATA), can be
19// enabled externally/explicitly also in retail builds (without _DEBUG defined).
20//
21// Defines macros (see code:#Macros_DEBUG_METADATA):
22// * code:#INDEBUG_MD
23// * code:#COMMA_INDEBUG_MD
24// * code:#INDEBUG_MD_COMMA
25//
26// #_DEBUG_MDSCHEMA
27// _DEBUG_MDSCHEMA ... Enables additional debugging of MetaData schema.
28// Note: Allowed to be enabled only if _DEBUG is defined (see code:#Check_DEBUG_MDSCHEMA).
29//
30// Defines macros (see code:#Macros_DEBUG_MDSCHEMA):
31// * code:#_ASSERTE_MDSCHEMA
32//
33// ======================================================================================
34
35#pragma once
36
37// Include for REGUTIL class used in Debug_ReportError
38#include <utilcode.h>
39
40// --------------------------------------------------------------------------------------
41//#DefaultSetting_DEBUG_METADATA
42//
43// Enable _DEBUG_METADATA by default if _DEBUG is defined (code:#_DEBUG_METADATA).
44//
45#ifdef _DEBUG
46 #define _DEBUG_METADATA
47#endif //_DEBUG
48
49// --------------------------------------------------------------------------------------
50//#Macros_DEBUG_METADATA
51//
52// Define macros for MetaData implementation debugging (see code:#_DEBUG_METADATA).
53//
54#ifdef _DEBUG_METADATA
55 //#INDEBUG_MD
56 #define INDEBUG_MD(expr) expr
57 //#COMMA_INDEBUG_MD
58 #define COMMA_INDEBUG_MD(expr) , expr
59 //#INDEBUG_MD_COMMA
60 #define INDEBUG_MD_COMMA(expr) expr,
61
62 #define Debug_ReportError(strMessage) \
63 do { \
64 if (REGUTIL::GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_AssertOnBadImageFormat, 0)) \
65 { _ASSERTE_MSG(FALSE, (strMessage)); } \
66 } while(0)
67 #define Debug_ReportInternalError(strMessage) _ASSERTE_MSG(FALSE, (strMessage))
68#else //!_DEBUG_METADATA
69 #define INDEBUG_MD(expr)
70 #define COMMA_INDEBUG_MD(expr)
71 #define INDEBUG_MD_COMMA(expr)
72
73 #define Debug_ReportError(strMessage)
74 #define Debug_ReportInternalError(strMessage) _ASSERTE(!strMessage)
75#endif //!_DEBUG_METADATA
76
77// --------------------------------------------------------------------------------------
78//#Check_DEBUG_MDSCHEMA
79//
80// Check that _DEBUG_MDSCHEMA is defined only if _DEBUG is defined (see code:#_DEBUG_MDSCHEMA).
81//
82#ifdef _DEBUG_MDSCHEMA
83 #ifndef _DEBUG
84 #error _DEBUG_MDSCHEMA is defined while _DEBUG is not defined.
85 #endif //!_DEBUG
86#endif //_DEBUG_MDSCHEMA
87
88// --------------------------------------------------------------------------------------
89//#Macros_DEBUG_MDSCHEMA
90//
91// Define macros for MetaData schema debugging (see code:#_DEBUG_MDSCHEMA).
92//
93#ifdef _DEBUG_MDSCHEMA
94 //#_ASSERTE_MDSCHEMA
95 // This assert is useful only to catch errors in schema (tables and columns) definitions. It is useful e.g.
96 // for verifying consistency between table record classes (e.g. code:MethodDefRecord) and columns'
97 // offsets/sizes as defined in code:ColumnDefinition.
98 #define _ASSERTE_MDSCHEMA(expr) _ASSERTE(expr)
99#else //!_DEBUG_MDSCHEMA
100 #define _ASSERTE_MDSCHEMA(expr)
101#endif //!_DEBUG_MDSCHEMA
102