OpenSolaris_b135/cmd/sgs/liblddbg/common/_debug.h

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_DEBUG_DOT_H
#define	_DEBUG_DOT_H

#include <debug.h>
#include <conv.h>

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Debugging is enabled by various tokens (see debug.c) that result in an
 * internal bit mask (d_class) being initialized.  Each debugging function is
 * appropriate for one or more of the classes specified by the bit mask.  Each
 * debugging function validates whether it is appropriate for the present
 * classes before printing anything.
 */
#define	DBG_NOTCLASS(c)	!(dbg_desc->d_class & (c))

#define	DBG_C_ARGS	0x00000001
#define	DBG_C_AUDITING	0x00000002
#define	DBG_C_BASIC	0x00000004
#define	DBG_C_BINDINGS	0x00000008
#define	DBG_C_CAP	0x00000010
#define	DBG_C_DEMANGLE	0x00000020
#define	DBG_C_ENTRY	0x00000040
#define	DBG_C_FILES	0x00000080
#define	DBG_C_GOT	0x00000100
#define	DBG_C_INIT	0x00000200
#define	DBG_C_LIBS	0x00000400
#define	DBG_C_MAP	0x00000800
#define	DBG_C_MOVE	0x00001000
#define	DBG_C_RELOC	0x00002000
#define	DBG_C_SECTIONS	0x00004000
#define	DBG_C_SEGMENTS	0x00008000
#define	DBG_C_STATS	0x00010000
#define	DBG_C_STRTAB	0x00020000
#define	DBG_C_SUPPORT	0x00040000
#define	DBG_C_SYMBOLS	0x00080000
#define	DBG_C_TLS	0x00100000
#define	DBG_C_UNUSED	0x00200000
#define	DBG_C_VERSIONS	0x00400000
#define	DBG_C_CALLBACK	0x00800000


#define	DBG_C_ALL	0xffffffff

typedef struct {
	const char	*o_name;	/* command line argument name */
	uint_t		o_class;	/* associated class for this name */
	uint_t		o_extra;	/* associated extra for this name */
} DBG_options;

#define	AL_CNT_DEBUG	4

/*
 * Some Dbg_*() format strings differ depending on whether they are used for
 * 32-bit or 64-bit values.
 */
#if	defined(_ELF64)

#define	MSG_EDATA_TITLE		MSG_EDATA_TITLE_64
#define	MSG_EDATA_ENTRY		MSG_EDATA_ENTRY_64

#else

#define	MSG_EDATA_TITLE		MSG_EDATA_TITLE_32
#define	MSG_EDATA_ENTRY		MSG_EDATA_ENTRY_32

#endif

/*
 * Some Elf_*() format strings differ depending on whether they are used for
 * 32-bit or 64-bit values.
 */
#if	defined(_ELF64)

#define	MSG_CB_IPHDR_ADDR	MSG_CB_IPHDR_ADDR_64
#define	MSG_CB_IPHDR_PHDR	MSG_CB_IPHDR_PHDR_64

#define	MSG_GOT_TITLE		MSG_GOT_TITLE_64
#define	MSG_GOT_ENTRY_RE	MSG_GOT_ENTRY_RE_64
#define	MSG_GOT_ENTRY_NR	MSG_GOT_ENTRY_NR_64
#define	MSG_GOT_COLUMNS1	MSG_GOT_COLUMNS1_64
#define	MSG_GOT_COLUMNS2	MSG_GOT_COLUMNS2_64
#define	MSG_GOT_FORMAT1		MSG_GOT_FORMAT1_64
#define	MSG_GOT_FORMAT2		MSG_GOT_FORMAT2_64

#define	MSG_PHD_VADDR		MSG_PHD_VADDR_64
#define	MSG_PHD_PADDR		MSG_PHD_PADDR_64
#define	MSG_PHD_FILESZ		MSG_PHD_FILESZ_64
#define	MSG_PHD_OFFSET		MSG_PHD_OFFSET_64

#define	MSG_REL_EFSA_TITLE	MSG_REL_EFSA_TITLE_64
#define	MSG_REL_EFLA_TITLE	MSG_REL_EFLA_TITLE_64
#define	MSG_REL_EFSN_TITLE	MSG_REL_EFSN_TITLE_64
#define	MSG_REL_EFLN_TITLE	MSG_REL_EFLN_TITLE_64
#define	MSG_REL_EFSA_ENTRY	MSG_REL_EFSA_ENTRY_64
#define	MSG_REL_EFLA_ENTRY	MSG_REL_EFLA_ENTRY_64
#define	MSG_REL_EFSN_ENTRY	MSG_REL_EFSN_ENTRY_64
#define	MSG_REL_EFLN_ENTRY	MSG_REL_EFLN_ENTRY_64
#define	MSG_REL_RT_APLREG	MSG_REL_RT_APLREG_64
#define	MSG_REL_RT_APLVAL	MSG_REL_RT_APLVAL_64
#define	MSG_REL_RTA_TITLE	MSG_REL_RTA_TITLE_64
#define	MSG_REL_RTN_TITLE	MSG_REL_RTN_TITLE_64
#define	MSG_REL_RTV_TITLE	MSG_REL_RTV_TITLE_64
#define	MSG_REL_RTA_ENTRY	MSG_REL_RTA_ENTRY_64
#define	MSG_REL_RTN_ENTRY	MSG_REL_RTN_ENTRY_64
#define	MSG_REL_LDSA_TITLE	MSG_REL_LDSA_TITLE_64
#define	MSG_REL_LDSN_TITLE	MSG_REL_LDSN_TITLE_64
#define	MSG_REL_LDSA_ENTRY	MSG_REL_LDSA_ENTRY_64
#define	MSG_REL_LDSN_ENTRY	MSG_REL_LDSN_ENTRY_64
#define	MSG_REL_LDSV_TITLE	MSG_REL_LDSV_TITLE_64
#define	MSG_REL_LDSV_ENTRY	MSG_REL_LDSV_ENTRY_64
#define	MSG_REL_LDLA_TITLE	MSG_REL_LDLA_TITLE_64
#define	MSG_REL_LDLN_TITLE	MSG_REL_LDLN_TITLE_64
#define	MSG_REL_LDLA_ENTRY	MSG_REL_LDLA_ENTRY_64
#define	MSG_REL_LDLN_ENTRY	MSG_REL_LDLN_ENTRY_64
#define	MSG_REL_LDLV_TITLE	MSG_REL_LDLV_TITLE_64
#define	MSG_REL_LDLV_ENTRY	MSG_REL_LDLV_ENTRY_64

#define	MSG_SHD_ADDR		MSG_SHD_ADDR_64
#define	MSG_SHD_SIZE		MSG_SHD_SIZE_64
#define	MSG_SHD_OFFSET		MSG_SHD_OFFSET_64
#define	MSG_SHD_OFFSET_ENT	MSG_SHD_OFFSET_ENT_64
#define	MSG_SHD_ALIGN		MSG_SHD_ALIGN_64
#define	MSG_SHD_LINK		MSG_SHD_LINK_64

#define	MSG_SYM_EFS_ENTRY	MSG_SYM_EFS_ENTRY_64
#define	MSG_SYM_EFL_ENTRY	MSG_SYM_EFL_ENTRY_64
#define	MSG_SYM_EFS_TITLE	MSG_SYM_EFS_TITLE_64
#define	MSG_SYM_EFL_TITLE	MSG_SYM_EFL_TITLE_64
#define	MSG_SYM_LDS_TITLE	MSG_SYM_LDS_TITLE_64
#define	MSG_SYM_LDL_TITLE	MSG_SYM_LDL_TITLE_64

#else

#define	MSG_CB_IPHDR_ADDR	MSG_CB_IPHDR_ADDR_32
#define	MSG_CB_IPHDR_PHDR	MSG_CB_IPHDR_PHDR_32

#define	MSG_GOT_TITLE		MSG_GOT_TITLE_32
#define	MSG_GOT_ENTRY_RE	MSG_GOT_ENTRY_RE_32
#define	MSG_GOT_ENTRY_NR	MSG_GOT_ENTRY_NR_32
#define	MSG_GOT_COLUMNS1	MSG_GOT_COLUMNS1_32
#define	MSG_GOT_COLUMNS2	MSG_GOT_COLUMNS2_32
#define	MSG_GOT_FORMAT1		MSG_GOT_FORMAT1_32
#define	MSG_GOT_FORMAT2		MSG_GOT_FORMAT2_32

#define	MSG_PHD_VADDR		MSG_PHD_VADDR_32
#define	MSG_PHD_PADDR		MSG_PHD_PADDR_32
#define	MSG_PHD_FILESZ		MSG_PHD_FILESZ_32
#define	MSG_PHD_OFFSET		MSG_PHD_OFFSET_32

#define	MSG_REL_EFSA_TITLE	MSG_REL_EFSA_TITLE_32
#define	MSG_REL_EFLA_TITLE	MSG_REL_EFLA_TITLE_32
#define	MSG_REL_EFSN_TITLE	MSG_REL_EFSN_TITLE_32
#define	MSG_REL_EFLN_TITLE	MSG_REL_EFLN_TITLE_32
#define	MSG_REL_EFSA_ENTRY	MSG_REL_EFSA_ENTRY_32
#define	MSG_REL_EFLA_ENTRY	MSG_REL_EFLA_ENTRY_32
#define	MSG_REL_EFSN_ENTRY	MSG_REL_EFSN_ENTRY_32
#define	MSG_REL_EFLN_ENTRY	MSG_REL_EFLN_ENTRY_32
#define	MSG_REL_RT_APLREG	MSG_REL_RT_APLREG_32
#define	MSG_REL_RT_APLVAL	MSG_REL_RT_APLVAL_32
#define	MSG_REL_RTA_TITLE	MSG_REL_RTA_TITLE_32
#define	MSG_REL_RTN_TITLE	MSG_REL_RTN_TITLE_32
#define	MSG_REL_RTV_TITLE	MSG_REL_RTV_TITLE_32
#define	MSG_REL_RTA_ENTRY	MSG_REL_RTA_ENTRY_32
#define	MSG_REL_RTN_ENTRY	MSG_REL_RTN_ENTRY_32
#define	MSG_REL_LDSA_TITLE	MSG_REL_LDSA_TITLE_32
#define	MSG_REL_LDSN_TITLE	MSG_REL_LDSN_TITLE_32
#define	MSG_REL_LDSA_ENTRY	MSG_REL_LDSA_ENTRY_32
#define	MSG_REL_LDSN_ENTRY	MSG_REL_LDSN_ENTRY_32
#define	MSG_REL_LDSV_TITLE	MSG_REL_LDSV_TITLE_32
#define	MSG_REL_LDSV_ENTRY	MSG_REL_LDSV_ENTRY_32
#define	MSG_REL_LDLA_TITLE	MSG_REL_LDLA_TITLE_32
#define	MSG_REL_LDLN_TITLE	MSG_REL_LDLN_TITLE_32
#define	MSG_REL_LDLA_ENTRY	MSG_REL_LDLA_ENTRY_32
#define	MSG_REL_LDLN_ENTRY	MSG_REL_LDLN_ENTRY_32
#define	MSG_REL_LDLV_TITLE	MSG_REL_LDLV_TITLE_32
#define	MSG_REL_LDLV_ENTRY	MSG_REL_LDLV_ENTRY_32

#define	MSG_SHD_ADDR		MSG_SHD_ADDR_32
#define	MSG_SHD_SIZE		MSG_SHD_SIZE_32
#define	MSG_SHD_OFFSET		MSG_SHD_OFFSET_32
#define	MSG_SHD_OFFSET_ENT	MSG_SHD_OFFSET_ENT_32
#define	MSG_SHD_ALIGN		MSG_SHD_ALIGN_32
#define	MSG_SHD_LINK		MSG_SHD_LINK_32

#define	MSG_SYM_EFS_ENTRY	MSG_SYM_EFS_ENTRY_32
#define	MSG_SYM_EFL_ENTRY	MSG_SYM_EFL_ENTRY_32
#define	MSG_SYM_EFS_TITLE	MSG_SYM_EFS_TITLE_32
#define	MSG_SYM_EFL_TITLE	MSG_SYM_EFL_TITLE_32
#define	MSG_SYM_LDS_TITLE	MSG_SYM_LDS_TITLE_32
#define	MSG_SYM_LDL_TITLE	MSG_SYM_LDL_TITLE_32

#endif

#define	INDEX_STR_SIZE		10

/*
 * Buffer used by dbg_isec_name() to format input section
 * names. The size was selected to satisfy two opposing
 * constraints:
 * -	To be large enough to handle the largest C++ mangled name.
 *	Although we can malloc buffers, we don't want that to happen.
 * -	To be small enough on the thread stack to not cause problems.
 */
typedef char dbg_isec_name_buf_t[INDEX_STR_SIZE + 2048];

#if	defined(_ELF64)
#define	dbg_fmt_isec_name	dbg64_fmt_isec_name
#define	dbg_fmt_isec_name2	dbg64_fmt_isec_name2
#else
#define	dbg_fmt_isec_name	dbg32_fmt_isec_name
#define	dbg_fmt_isec_name2	dbg32_fmt_isec_name2
#endif
extern	const char	*dbg_fmt_isec_name(Is_desc *, dbg_isec_name_buf_t,
			    char **);
extern	const char	*dbg_fmt_isec_name2(const char *, Word,
			    dbg_isec_name_buf_t, char **);

#ifdef	__cplusplus
}
#endif

#endif	/* _DEBUG_DOT_H */