1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
|
/*
Copyright (C) 2000,2004,2005 Silicon Graphics, Inc. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation.
This program is distributed in the hope that it would be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Further, this software is distributed without any warranty that it is
free of the rightful claim of any third person regarding infringement
or the like. Any license provided herein, whether implied or
otherwise, applies only to this software file. Patent licenses, if
any, provided herein do not apply to combinations of this program with
other software, or any other product whatsoever.
You should have received a copy of the GNU General Public License along
with this program; if not, write the Free Software Foundation, Inc., 51
Franklin Street - Fifth Floor, Boston MA 02110-1301, USA.
Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
Mountain View, CA 94043, or:
http://www.sgi.com
For further information regarding this notice, see:
http://oss.sgi.com/projects/GenInfo/NoticeExplan
$Header: /plroot/cmplrs.src/v7.4.5m/.RCS/PL/dwarfdump/RCS/tag_attr.c,v 1.8 2005/12/01 17:34:59 davea Exp $ */
#include <dwarf.h>
#include <stdio.h>
#include <stdlib.h> /* For exit() declaration etc. */
#include <errno.h> /* For errno declaration. */
/* The following is the magic token used to
distinguish real tags/attrs from group-delimiters.
Blank lines have been eliminated by an awk script.
*/
#define MAGIC_TOKEN_VALUE 0xffffffff
/* Expected input format
0xffffffff
value of a tag
value of a standard attribute that follows that tag
...
0xffffffff
value of a tag
value of a standard attribute that follows that tag
...
0xffffffff
...
No blank lines or commentary allowed, no symbols, just numbers.
*/
/* We don't need really long lines: the input file is simple. */
#define MAX_LINE_SIZE 1000
/* 1 more than the higest number in the DW_TAG defines. */
#define TABLE_SIZE 0x41
/* Enough entries to have a bit for each standard legal attr. */
#define COLUMN_COUNT 4
/* Bits per 'int' to mark legal attrs. */
#define BITS_PER_WORD 32
static unsigned int
tag_attr_combination_table[TABLE_SIZE][COLUMN_COUNT];
static char *tag_name[] = {
"0x00",
"0x01 DW_TAG_array_type",
"0x02 DW_TAG_class_type",
"0x03 DW_TAG_entry_point",
"0x04 DW_TAG_enumeration_type",
"0x05 DW_TAG_formal_parameter",
"0x06",
"0x07",
"0x08 DW_TAG_imported_declaration",
"0x09",
"0x0a DW_TAG_label",
"0x0b DW_TAG_lexical_block",
"0x0c",
"0x0d DW_TAG_member",
"0x0e",
"0x0f DW_TAG_pointer_type",
"0x10 DW_TAG_reference_type",
"0x11 DW_TAG_compile_unit",
"0x12 DW_TAG_string_type",
"0x13 DW_TAG_structure_type",
"0x14",
"0x15 DW_TAG_subroutine_type",
"0x16 DW_TAG_typedef",
"0x17 DW_TAG_union_type",
"0x18 DW_TAG_unspecified_parameters",
"0x19 DW_TAG_variant",
"0x1a DW_TAG_common_block",
"0x1b DW_TAG_common_inclusion",
"0x1c DW_TAG_inheritance",
"0x1d DW_TAG_inlined_subroutine",
"0x1e DW_TAG_module",
"0x1f DW_TAG_ptr_to_member_type",
"0x20 DW_TAG_set_type",
"0x21 DW_TAG_subrange_type",
"0x22 DW_TAG_with_stmt",
"0x23 DW_TAG_access_declaration",
"0x24 DW_TAG_base_type",
"0x25 DW_TAG_catch_block",
"0x26 DW_TAG_const_type",
"0x27 DW_TAG_constant",
"0x28 DW_TAG_enumerator",
"0x29 DW_TAG_file_type",
"0x2a DW_TAG_friend",
"0x2b DW_TAG_namelist",
"0x2c DW_TAG_namelist_item",
"0x2d DW_TAG_packed_type",
"0x2e DW_TAG_subprogram",
"0x2f DW_TAG_template_type_parameter",
"0x30 DW_TAG_template_value_parameter",
"0x31 DW_TAG_thrown_type",
"0x32 DW_TAG_try_block",
"0x33 DW_TAG_variant_part",
"0x34 DW_TAG_variable",
"0x35 DW_TAG_volatile_type",
"0x36 DW_TAG_dwarf_procedure",
"0x37 DW_TAG_restrict_type",
"0x38 DW_TAG_interface_type",
"0x39 DW_TAG_namespace",
"0x3a DW_TAG_imported_module",
"0x3b DW_TAG_unspecified_type",
"0x3c DW_TAG_partial_unit",
"0x3d DW_TAG_imported_unit",
"0x3e", /* was DW_TAG_mutable_type, removed
from DWARF3f. */
"0x3f DW_TAG_condition",
"0x40 DW_TAG_shared_type",
};
static int linecount = 0;
static char line_in[MAX_LINE_SIZE];
#define IS_EOF 1
#define NOT_EOF 0
#define MAX_LINE_SIZE 1000
static void
bad_line_input(char *msg)
{
fprintf(stderr,
"tag_attr table build failed %s, line %d: \"%s\" \n",
msg, linecount, line_in);
exit(1);
}
static void
trim_newline(char *line, int max)
{
char *end = line + max - 1;
for (; *line && (line < end); ++line) {
if (*line == '\n') {
/* Found newline, drop it */
*line = 0;
return;
}
}
return;
}
/* Reads a value from the text table.
Exits with non-zero status
if the table is erroneous in some way.
*/
static int
read_value(unsigned int *outval)
{
char *res = 0;
FILE *file = stdin;
unsigned long lval;
char *strout = 0;
++linecount;
*outval = 0;
res = fgets(line_in, sizeof(line_in), file);
if (res == 0) {
if (ferror(file)) {
fprintf(stderr,
"tag_attr: Error reading table, %d lines read\n",
linecount);
exit(1);
}
if (feof(file)) {
return IS_EOF;
}
/* impossible */
fprintf(stderr, "tag_attr: Impossible error reading table, "
"%d lines read\n", linecount);
exit(1);
}
trim_newline(line_in, sizeof(line_in));
errno = 0;
lval = strtoul(line_in, &strout, 0);
if (strout == line_in) {
bad_line_input("bad number input!");
}
if (errno != 0) {
int myerr = errno;
fprintf(stderr, "tag_attr errno %d\n", myerr);
bad_line_input("invalid number on line");
}
*outval = (int) lval;
return NOT_EOF;
}
int
main()
{
int i;
unsigned int num;
int input_eof;
input_eof = read_value(&num); /* 0xffffffff */
if (IS_EOF == input_eof) {
bad_line_input("Empty input file");
}
if (num != MAGIC_TOKEN_VALUE) {
bad_line_input("Expected 0xffffffff");
}
while (!feof(stdin)) {
unsigned int tag;
input_eof = read_value(&tag);
if (IS_EOF == input_eof) {
/* Reached normal eof */
break;
}
if (tag >= TABLE_SIZE) {
bad_line_input("tag value exceeds table size");
}
input_eof = read_value(&num);
if (IS_EOF == input_eof) {
bad_line_input("Not terminated correctly..");
}
while (num != MAGIC_TOKEN_VALUE) {
unsigned idx = num / BITS_PER_WORD;
unsigned bit = num % BITS_PER_WORD;
if (idx >= COLUMN_COUNT) {
bad_line_input
("too many attributes: table incomplete.");
}
tag_attr_combination_table[tag][idx] |= (1 << bit);
input_eof = read_value(&num);
if (IS_EOF == input_eof) {
bad_line_input("Not terminated correctly.");
}
}
}
printf("static unsigned int tag_attr_combination_table [ ][%d]"
" = {\n", COLUMN_COUNT);
for (i = 0; i < TABLE_SIZE; i++) {
printf("/* %-37s*/\n", tag_name[i]);
printf(" { %#.8x, %#.8x, %#.8x, %#.8x,},\n",
tag_attr_combination_table[i][0],
tag_attr_combination_table[i][1],
tag_attr_combination_table[i][2],
tag_attr_combination_table[i][3]
);
}
printf("};\n");
return (0);
}
|