1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* Copyright (c) 1988 AT&T */ 22 /* All Rights Reserved */ 23 24 /* 25 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 */ 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 32 /* 33 * symintHdr.h -- symbol information interface, Header file. 34 * 35 * these headers are the definitions used by the set of 36 * routines which provide an interface to access symbol 37 * information stored in the object file. 38 * 39 */ 40 /* protect against multiple inclusion */ 41 #ifndef _SYMINTHDR_H 42 #define _SYMINTHDR_H 43 44 45 46 #include <libelf.h> 47 #include <sys/elf.h> 48 #include "dwarf.h" 49 50 51 /* 52 * PROF_DEBUG - compilation-time debug flag 53 * 54 * if this is defined, we include debugging code. 55 * 56 * there are three levels: none, 1, and 2. 57 * 58 * none -- (PROF_DEBUG is undefined.) 59 * no debugging code is generated. 60 * 61 * 1 -- (PROF_DEBUG == 1.) 62 * assertion code is generated, only. 63 * 64 * 2 -- (PROF_DEBUG == anything else.) 65 * both assertion code and debug() code 66 * are generated. 67 */ 68 69 #ifndef PROF_DEBUG 70 #define NDEBUG 71 #elif PROF_DEBUG == 1 72 #undef NDEBUG 73 #else /* == 2, anything else */ 74 #undef NDEBUG 75 #endif 76 77 #include "assert.h" 78 79 /* 80 * Types 81 * 82 * - caCOVWORD is used for all entries in the coverage structure. This 83 * includes the number of basic blocks, each line number in the line 84 * number array, and each execution count in the count array. The size 85 * (number of bytes) of the coverage structure may be found in the symbol 86 * table. 87 */ 88 typedef unsigned char BYTES_1; 89 typedef unsigned short BYTES_2; 90 typedef unsigned int BYTES_4; 91 typedef unsigned long BYTES_LONG; /* ``long'' is 4 bytes, too */ 92 typedef BYTES_LONG caCOVWORD; 93 typedef unsigned char BOOLEAN; 94 95 /* 96 * Type of base address - used in dump.c and soqueue.c. 97 */ 98 typedef unsigned long TYPE_BASEAD; 99 100 /* 101 * Macros 102 */ 103 #define SYMBOL_IS_FUNC(sym_p) \ 104 (((sym_p)->ps_dbg.pd_symtag == TAG_subroutine) || \ 105 ((sym_p)->ps_dbg.pd_symtag == TAG_global_subroutine)) 106 #define SYMBOL_NAME(sym_p) (sym_p)->ps_dbg.pd_name 107 #define SYMBOL_LINES_P(sym_p) (sym_p)->ps_dbg.pd_line_p 108 #define SYMBOL_LASTLN_P(sym_p) (sym_p)->ps_dbg.pd_lali_p 109 110 #define ISYMBOL_IS_FUNC(sym_p, index) SYMBOL_IS_FUNC(&((sym_p)[(index)])) 111 #define ISYMBOL_NAME(sym_p, index) SYMBOL_NAME(&((sym_p)[(index)])) 112 #define ISYMBOL_LINES(sym_p, index) SYMBOL_LINES(&((sym_p)[(index)])) 113 #define ISYMBOL_LASTLN(sym_p, index) SYMBOL_LASTLN(&((sym_p)[(index)])) 114 115 typedef struct { 116 unsigned char pe_ident[EI_NIDENT]; 117 Elf32_Half pe_type; 118 } PROF_MAGIC; 119 120 #define PROF_MAGIC_FAKE_STRING "fake prof magic" 121 122 123 #define COV_PREFIX "__coverage." 124 125 126 /* 127 * ``primitive'' definitions used in 128 * subsequent structures. 129 */ 130 131 typedef unsigned char LEN1; 132 133 typedef unsigned short LEN2; 134 135 typedef unsigned long int LEN4; 136 137 typedef unsigned long int ADDR; 138 139 typedef LEN2 DBG_TAG; 140 141 /* 142 * object ``replacing'' a symbol table entry - PROF_SYMBOL. 143 * 144 * a PROF_SYMBOL will contain or direct us to all the information 145 * needed by the profilers, for a given symbol. 146 */ 147 typedef struct symint_prof_symbol 148 PROF_SYMBOL; 149 150 struct symint_prof_symbol { 151 Elf32_Sym ps_sym; /* normal symbol entry */ 152 }; 153 154 155 /* 156 * structure to replace LDFILE - PROF_FILE. 157 */ 158 typedef struct symint_prof_file 159 PROF_FILE; 160 161 162 /* 163 * symint_prof_file contains a primary and an (optional) auxiliary 164 * symbol table, which we wish to treat as a single logical symbol table. 165 * In this logical table, the data from the auxiliary table preceeds that 166 * from the primary. Symbol indices start at [0], which is the first item 167 * in the auxiliary table if there is one. The sole purpose for this is so 168 * that we can treat the combination of .SUNW_ldynsym and .dynsym sections 169 * as a logically single entity. 170 * 171 * Both tables must share the same string table section. 172 */ 173 struct symint_prof_file { 174 int pf_fildes; /* file descriptor */ 175 Elf *pf_elf_p; /* elf descriptor */ 176 Elf32_Ehdr *pf_elfhd_p; /* elf header */ 177 Elf_Data *pf_snmdat_p; /* section names data */ 178 Elf_Data *pf_symdat_pri_p; /* primary symbol table data */ 179 Elf_Data *pf_symdat_aux_p; /* auxiliary symbol table data */ 180 Elf32_Word pf_symstr_ndx; /* Section index of string table */ 181 int pf_nstsyms; /* total # symbols in both tables */ 182 int pf_nstsyms_aux; /* # symbols in auxiliary table */ 183 184 Elf32_Shdr *pf_shdarr_p; /* complete array of section hdrs */ 185 186 PROF_SYMBOL *pf_symarr_p; /* P_S array w/symbols of interest */ 187 int pf_nsyms; /* number of symbols of interest */ 188 }; 189 190 #endif /* _SYMINTHDR_H */ 191