Annotation of coherent/f/usr/include/common/_xdebug.h, revision 1.1

1.1     ! root        1: #ifndef        __COMMON__XDEBUG_H__
        !             2: #define        __COMMON__XDEBUG_H__
        !             3: 
        !             4: 
        !             5: /*
        !             6:  *-IMPORTS:
        !             7:  *     <common/ccompat.h>
        !             8:  *             __STRING ()
        !             9:  */
        !            10: 
        !            11: #include <common/ccompat.h>
        !            12: 
        !            13: 
        !            14: /*
        !            15:  * This file contains some simple macros for use in debugging and statistics
        !            16:  * gathering code. Centralizing these definitions has no real purpose other
        !            17:  * than increasing consistency for the person attempting to test code.
        !            18:  *
        !            19:  * Note that it would be nice if we could hook this into a source-code
        !            20:  * control system's notion of version, so that in addition to file name,
        !            21:  * build date, and build time we could include version number, author and
        !            22:  * last change date by having macros in every .c file's beginning.
        !            23:  *
        !            24:  * Note that under C++, higher levels of debugging information can use the
        !            25:  * constructor/destructor facilities of C++ code to create automatic
        !            26:  * dependency information for files and all kinds of other useful facilities
        !            27:  * if the source-code control system above can be extended for most file
        !            28:  * types.
        !            29:  *
        !            30:  * Since this file controls compile-time debugging detail, it is intended
        !            31:  * that this system be used especially in cases where source distribution
        !            32:  * is not desirable. The ability to include multiple library versions
        !            33:  * is an invaluable aid to debugging, not merely because of the extra
        !            34:  * information that may be provided in case of a simply detected error, but
        !            35:  * because the addition of debugging information subtly alters the
        !            36:  * characteristics of the system under test. Merely including a range of
        !            37:  * different libraries can test a system for a variety of the more subtle
        !            38:  * bugs that usually manifest themselves only during the porting process.
        !            39:  */
        !            40: 
        !            41: /*
        !            42:  * We define standard names for system debugging-level macros that are
        !            43:  * controlled by a single user symbol defined on the command line for the
        !            44:  * compilation, _DEBUG_LEVEL. If not defined, this symbol defaults to the
        !            45:  * value zero. The value of this symbol determines the level of detail
        !            46:  * included in the compile-time debugging information, and/or the level of
        !            47:  * run-time checking that is desired.
        !            48:  *
        !            49:  * This facility defines a simple linear scale of debugging detail, and is
        !            50:  * intended to supplement system-dependent optional debugging facilities in
        !            51:  * cases where the systems affected by a problem cannot be easily determined
        !            52:  * without experimentation.
        !            53:  */
        !            54: 
        !            55: #ifndef        _DEBUG_LEVEL
        !            56: #define        _DEBUG_LEVEL   3
        !            57: #endif
        !            58: 
        !            59: 
        !            60: /*
        !            61:  * Define a bitmap of debugging feature levels that we can combine. Note
        !            62:  * that some feature sections are ordered so that the relative magnitudes
        !            63:  * and order of the bits are important.
        !            64:  */
        !            65: 
        !            66: #define        __FI_NAME_M__   0x0001          /* include file name */
        !            67: #define        __FI_LINE_M__   0x0002          /* include file line no */
        !            68: #define        __FI_DATE_M__   0x0004          /* include build date */
        !            69: #define        __FI_TIME_M__   0x0008          /* include build time */
        !            70: #define        __FI_USER_M__   0x0010          /* include user info */
        !            71: 
        !            72: 
        !            73: /*
        !            74:  * Turn the _DEBUG_LEVEL into a __DEBUG_PROFILE__, unless that has already
        !            75:  * been overridden.
        !            76:  */
        !            77: 
        !            78: #if    _DEBUG_LEVEL < 1
        !            79: 
        !            80: # define  __DEBUG_PROFILE__    0
        !            81: 
        !            82: #elif  _DEBUG_LEVEL < 2
        !            83: 
        !            84: # define  __DEBUG_PROFILE__    __FI_NAME_M__
        !            85: 
        !            86: #elif  _DEBUG_LEVEL < 3
        !            87: 
        !            88: # define  __DEBUG_PROFILE__    (__FI_NAME_M__ | __FI_LINE_M__)
        !            89: 
        !            90: #elif  _DEBUG_LEVEL < 4
        !            91: 
        !            92: # define  __DEBUG_PROFILE__    (__FI_NAME_M__ | __FI_LINE_M__ | \
        !            93:                                 __FI_DATE_M__)
        !            94: 
        !            95: #elif  _DEBUG_LEVEL < 5
        !            96: 
        !            97: # define  __DEBUG_PROFILE__    (__FI_NAME_M__ | __FI_LINE_M__ | \
        !            98:                                 __FI_DATE_M__)
        !            99: 
        !           100: #elif  _DEBUG_LEVEL < 6
        !           101: 
        !           102: # define  __DEBUG_PROFILE__    (__FI_NAME_M__ | __FI_LINE_M__ | \
        !           103:                                 __FI_DATE_M__ | __FI_USER_M__)
        !           104: 
        !           105: #elif  _DEBUG_LEVEL < 7
        !           106: 
        !           107: # define  __DEBUG_PROFILE__    (__FI_NAME_M__ | __FI_LINE_M__ | \
        !           108:                                 __FI_DATE_M__ | __FI_USER_M__)
        !           109: 
        !           110: #elif  _DEBUG_LEVEL < 8
        !           111: 
        !           112: # define  __DEBUG_PROFILE__    (__FI_NAME_M__ | __FI_LINE_M__ | \
        !           113:                                 __FI_DATE_M__ | __FI_TIME_M__ | \
        !           114:                                 __FI_USER_M__)
        !           115: 
        !           116: #else  /* anything else */
        !           117: 
        !           118: # define  __DEBUG_PROFILE__    (__FI_NAME_M__ | __FI_LINE_M__ | \
        !           119:                                 __FI_DATE_M__ | __FI_TIME_M__ | \
        !           120:                                 __FI_USER_M__)
        !           121: 
        !           122: #endif /* switch (_DEBUG_LEVEL) */
        !           123: 
        !           124: 
        !           125: /*
        !           126:  * Before we get into the _DEBUG_LEVEL feature tests, we note that there is
        !           127:  * some other information that the user might like to use to annotate the
        !           128:  * __FILE_INFO__ macro, rather than just to redefine it. We allow the user
        !           129:  * to define the _USER_NAME macro for the purpose of including the name of
        !           130:  * the person performing the build (or other information such as the name
        !           131:  * of the translator or cross-development platform being used).
        !           132:  */
        !           133: 
        !           134: #ifndef        _USER_NAME
        !           135: 
        !           136: # define       _USER_NAME      no-one
        !           137: 
        !           138: #endif /* ! defined (_USER_NAME) */
        !           139: 
        !           140: # define       __USER_NAME__   __STRING (_USER_NAME)
        !           141: 
        !           142: 
        !           143: 
        !           144: /*
        !           145:  * The "standard" debugging macro __FILE_INFO__ can be used in place of the
        !           146:  * more common __FILE__ definition in many cases. At different levels of
        !           147:  * debugging information, the value of this symbol (which is an ANSI string)
        !           148:  * includes more information. At debugging level 0, this macro expands to
        !           149:  * an empty string, allowing it to be used without complex #if statements
        !           150:  * in the client.
        !           151:  *
        !           152:  * A side issue is the way spaces are included in the output string; note
        !           153:  * that individual feature tests are done in bit order of the feature
        !           154:  * string, so we can do some funky tests of the magnitude of part of the
        !           155:  * feature mask to see if anything we are interested in is following the
        !           156:  * current bit. Sleazy, but it gives nice output.
        !           157:  *
        !           158:  * Since including line numbers as strings generates a lot of big strings
        !           159:  * that cannot be marged, we provide __FILE_INFO__ which consists of a string
        !           160:  * and an optional line number (zero if line numbers are not to be included)
        !           161:  * and __FILE_INFO_STRING__ which is a single string.
        !           162:  *
        !           163:  * We also export the symbol __NO_FILE_INFO__ if we know that the value of
        !           164:  * __FILE_INFO__ is an empty string, in order to allow users to replace a
        !           165:  * null string expansion with a NULL value.
        !           166:  */
        !           167: 
        !           168: #if    ! defined (__FILE_INFO__) && ! defined (__NO_FILE_INFO__)
        !           169: 
        !           170: # define  __FI_M__     (__FI_NAME_M__ | __FI_DATE_M__ | __FI_TIME_M__ | \
        !           171:                         __FI_USER_M__)
        !           172: 
        !           173: # if   (__DEBUG_PROFILE__ & __FI_NAME_M__) != 0
        !           174: #  define      __FI_NAME__     __FILE__
        !           175: # else
        !           176: #  define      __FI_NAME__
        !           177: # endif        /* no file name */
        !           178: 
        !           179: 
        !           180: # if   (__DEBUG_PROFILE__ & __FI_LINE_M__) != 0
        !           181: #  define      __FI_LINE_STR__ " Line # " __STRING (__LINE__)
        !           182: #  define      __FI_LINE__     , __LINE__
        !           183: #else
        !           184: #  define      __FI_LINE_STR__
        !           185: #  define      __FI_LINE__     , 0
        !           186: #endif
        !           187: 
        !           188: 
        !           189: # if   (__DEBUG_PROFILE__ & __FI_M__) > __FI_NAME_M__
        !           190: #  define      __FI_NAME_S__   " "
        !           191: # else
        !           192: #  define      __FI_NAME_S__
        !           193: # endif        /* don't need a space */
        !           194: 
        !           195: 
        !           196: # if   (__DEBUG_PROFILE__ & __FI_LINE_M__) != 0
        !           197: #  define      __FI_LINE_S__   " "
        !           198: # else
        !           199: #  define      __FI_LINE_S__
        !           200: #endif
        !           201: 
        !           202: 
        !           203: # if   (__DEBUG_PROFILE__ & __FI_DATE_M__) != 0
        !           204: #  define      __FI_DATE__     " built on " __DATE__
        !           205: # else
        !           206: #  define      __FI_DATE__
        !           207: # endif        /* no file build date */
        !           208: 
        !           209: 
        !           210: # if   (__DEBUG_PROFILE__ & __FI_M__) > __FI_DATE_M__
        !           211: #  define      __FI_DATE_S__   " "
        !           212: # else
        !           213: #  define      __FI_DATE_S__
        !           214: # endif        /* don't need a space */
        !           215: 
        !           216: 
        !           217: # if   (__DEBUG_PROFILE__ & __FI_TIME_M__) != 0
        !           218: #  define      __FI_TIME__     " at " __TIME__
        !           219: # else
        !           220: #  define      __FI_TIME__
        !           221: # endif        /* no file build time */
        !           222: 
        !           223: 
        !           224: # if   (__DEBUG_PROFILE__ & __FI_M__) > __FI_TIME_M__
        !           225: #  define      __FI_TIME_S__   " "
        !           226: # else
        !           227: #  define      __FI_TIME_S__
        !           228: # endif        /* don't need a space */
        !           229: 
        !           230: 
        !           231: # if   (__DEBUG_PROFILE__ & __FI_USER_M__) != 0
        !           232: #  define      __FI_USER__     __USER_NAME__
        !           233: # else
        !           234: #  define      __FI_USER__
        !           235: # endif        /* no file name */
        !           236: 
        !           237: 
        !           238: /*
        !           239:  * Define __NO_FILE_INFO__ iff the user has not requested anything to be
        !           240:  * included in the __FILE_INFO__ macro.
        !           241:  */
        !           242: 
        !           243: # if   (__DEBUG_PROFILE__ & __FI_M__) == 0
        !           244: #  define      __NO_FILE_INFO__        1
        !           245: # endif
        !           246: 
        !           247: 
        !           248: /*
        !           249:  * Note that we terminate these strings with a "" so that they ALWAYS expand
        !           250:  * to a valid ISO C string of some form. If we are using a C compiler than
        !           251:  * cannot merge constant strings, create a static string constant.
        !           252:  */
        !           253: 
        !           254: # define       __FILE_INFO_FMT__       __FI_NAME__ __FI_NAME_S__ \
        !           255:                                        __FI_DATE__ __FI_DATE_S__ \
        !           256:                                        __FI_TIME__ __FI_TIME_S__ \
        !           257:                                        __FI_USER__ ""
        !           258: 
        !           259: # if   ! _SHARED_STRINGS
        !           260: #  if  (__DEBUG_PROFILE__ & __FI_NAME_M__) != 0 && defined (__BASE_FILE__)
        !           261: /*
        !           262:  * Since we are evaluating __FILE__ here in the header, switch over to use
        !           263:  * __BASE_FILE__ if the preprocessor knows about that.
        !           264:  */
        !           265: #   undef      __FI_NAME__
        !           266: #   define     __FI_NAME__     __BASE_FILE__
        !           267: 
        !           268: static __CONST__ char * __CONST__ __file_info_fmt__ = __FILE_INFO_FMT__;
        !           269: #   undef      __FILE_INFO_FMT__
        !           270: #   define     __FILE_INFO_FMT__       __file_info_fmt__
        !           271: 
        !           272: #  endif /* defined (__BASE_FILE__) */
        !           273: # endif        /* ! _SHARED_STRINGS */
        !           274: 
        !           275: 
        !           276: # define       __FILE_INFO__           __FILE_INFO_FMT__ __FI_LINE__
        !           277: 
        !           278: # define       __FILE_INFO_STRING__    __FI_NAME__ __FI_NAME_S__ \
        !           279:                                        __FI_LINE_STR__ __FI_LINE_S__ \
        !           280:                                        __FI_DATE__ __FI_DATE_S__ \
        !           281:                                        __FI_TIME__ __FI_TIME_S__ \
        !           282:                                        __FI_USER__ ""
        !           283: 
        !           284: /*
        !           285:  * Remove unneeded private preprocessor symbols. Note that the __FI_xxx__
        !           286:  * symbols cannot be removed because they are needed in the expansion of
        !           287:  * __FILE_INFO__. Since they being with double-underscores, this should not
        !           288:  * be a problem.
        !           289:  */
        !           290: 
        !           291: # undef        __FI_M__
        !           292: 
        !           293: #endif /* ! defined (__FILE_INFO__) && ! defined (__NO_FILE_INFO__) */
        !           294: 
        !           295: /*
        !           296:  * Other handy stuff: many debugging systems do not maintain a separate
        !           297:  * debugger global namespace, and so definitions that have local or file
        !           298:  * static scope are not necessarily visible.
        !           299:  *
        !           300:  * In order to get more control over the global namespace, structures that
        !           301:  * should not normally appear visible but whose addresses we may wish to
        !           302:  * reveal should be declared with the following storage class prefix.
        !           303:  */
        !           304: 
        !           305: #ifndef        __LOCAL__
        !           306: # ifdef        _SHOW
        !           307: 
        !           308: #  define      __LOCAL__
        !           309: 
        !           310: # else
        !           311: 
        !           312: #  define      __LOCAL__       static
        !           313: 
        !           314: # endif
        !           315: #endif
        !           316: 
        !           317: 
        !           318: #endif /* ! defined (__COMMON__XDEBUG_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.