Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: third_party/yasm/patched-yasm/modules/dbgfmts/dwarf2/dwarf2-line.c

Issue 11364046: Update Yasm to 1.2.0 (Yasm Part 1/3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * DWARF2 debugging format - line information 2 * DWARF2 debugging format - line information
3 * 3 *
4 * Copyright (C) 2006-2007 Peter Johnson 4 * Copyright (C) 2006-2007 Peter Johnson
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 10 matching lines...) Expand all
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE. 28 * POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 #include <util.h> 30 #include <util.h>
31 /*@unused@*/ RCSID("$Id: dwarf2-line.c 2130 2008-10-07 05:38:11Z peter $");
32 31
33 #include <libyasm.h> 32 #include <libyasm.h>
34 33
35 #include "dwarf2-dbgfmt.h" 34 #include "dwarf2-dbgfmt.h"
36 35
37 /* DWARF line number opcodes */ 36 /* DWARF line number opcodes */
38 typedef enum { 37 typedef enum {
39 DW_LNS_extended_op = 0, 38 DW_LNS_extended_op = 0,
40 DW_LNS_copy, 39 DW_LNS_copy,
41 DW_LNS_advance_pc, 40 DW_LNS_advance_pc,
(...skipping 28 matching lines...) Expand all
70 0, /* DW_LNS_set_prologue_end */ 69 0, /* DW_LNS_set_prologue_end */
71 0, /* DW_LNS_set_epilogue_begin */ 70 0, /* DW_LNS_set_epilogue_begin */
72 1 /* DW_LNS_set_isa */ 71 1 /* DW_LNS_set_isa */
73 #endif 72 #endif
74 }; 73 };
75 74
76 /* Line number extended opcodes */ 75 /* Line number extended opcodes */
77 typedef enum { 76 typedef enum {
78 DW_LNE_end_sequence = 1, 77 DW_LNE_end_sequence = 1,
79 DW_LNE_set_address, 78 DW_LNE_set_address,
80 DW_LNE_define_file 79 DW_LNE_define_file,
80 DW_LNE_set_discriminator
81 } dwarf_line_number_ext_op; 81 } dwarf_line_number_ext_op;
82 82
83 /* Base and range for line offsets in special opcodes */ 83 /* Base and range for line offsets in special opcodes */
84 #define DWARF2_LINE_BASE -5 84 #define DWARF2_LINE_BASE -5
85 #define DWARF2_LINE_RANGE 14 85 #define DWARF2_LINE_RANGE 14
86 86
87 #define DWARF2_MAX_SPECIAL_ADDR_DELTA \ 87 #define DWARF2_MAX_SPECIAL_ADDR_DELTA \
88 (((255-DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)*\ 88 (((255-DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)*\
89 dbgfmt_dwarf2->min_insn_len) 89 dbgfmt_dwarf2->min_insn_len)
90 90
(...skipping 22 matching lines...) Expand all
113 yasm_bytecode *line_end_prevbc; 113 yasm_bytecode *line_end_prevbc;
114 } dwarf2_spp; 114 } dwarf2_spp;
115 115
116 typedef struct dwarf2_line_op { 116 typedef struct dwarf2_line_op {
117 dwarf_line_number_op opcode; 117 dwarf_line_number_op opcode;
118 /*@owned@*/ /*@null@*/ yasm_intnum *operand; 118 /*@owned@*/ /*@null@*/ yasm_intnum *operand;
119 119
120 /* extended opcode */ 120 /* extended opcode */
121 dwarf_line_number_ext_op ext_opcode; 121 dwarf_line_number_ext_op ext_opcode;
122 /*@null@*/ /*@dependent@*/ yasm_symrec *ext_operand; /* unsigned */ 122 /*@null@*/ /*@dependent@*/ yasm_symrec *ext_operand; /* unsigned */
123 /*@null@*/ /*@dependent@*/ yasm_intnum *ext_operand_int; /* unsigned */
123 unsigned long ext_operandsize; 124 unsigned long ext_operandsize;
124 } dwarf2_line_op; 125 } dwarf2_line_op;
125 126
126 /* Bytecode callback function prototypes */ 127 /* Bytecode callback function prototypes */
127 static void dwarf2_spp_bc_destroy(void *contents); 128 static void dwarf2_spp_bc_destroy(void *contents);
128 static void dwarf2_spp_bc_print(const void *contents, FILE *f, 129 static void dwarf2_spp_bc_print(const void *contents, FILE *f,
129 int indent_level); 130 int indent_level);
130 static int dwarf2_spp_bc_calc_len 131 static int dwarf2_spp_bc_calc_len
131 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); 132 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data);
132 static int dwarf2_spp_bc_tobytes 133 static int dwarf2_spp_bc_tobytes
133 (yasm_bytecode *bc, unsigned char **bufp, void *d, 134 (yasm_bytecode *bc, unsigned char **bufp, unsigned char *bufstart, void *d,
134 yasm_output_value_func output_value, 135 yasm_output_value_func output_value,
135 /*@null@*/ yasm_output_reloc_func output_reloc); 136 /*@null@*/ yasm_output_reloc_func output_reloc);
136 137
137 static void dwarf2_line_op_bc_destroy(void *contents); 138 static void dwarf2_line_op_bc_destroy(void *contents);
138 static void dwarf2_line_op_bc_print(const void *contents, FILE *f, 139 static void dwarf2_line_op_bc_print(const void *contents, FILE *f,
139 int indent_level); 140 int indent_level);
140 static int dwarf2_line_op_bc_calc_len 141 static int dwarf2_line_op_bc_calc_len
141 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data); 142 (yasm_bytecode *bc, yasm_bc_add_span_func add_span, void *add_span_data);
142 static int dwarf2_line_op_bc_tobytes 143 static int dwarf2_line_op_bc_tobytes
143 (yasm_bytecode *bc, unsigned char **bufp, void *d, 144 (yasm_bytecode *bc, unsigned char **bufp, unsigned char *bufstart, void *d,
144 yasm_output_value_func output_value, 145 yasm_output_value_func output_value,
145 /*@null@*/ yasm_output_reloc_func output_reloc); 146 /*@null@*/ yasm_output_reloc_func output_reloc);
146 147
147 /* Bytecode callback structures */ 148 /* Bytecode callback structures */
148 static const yasm_bytecode_callback dwarf2_spp_bc_callback = { 149 static const yasm_bytecode_callback dwarf2_spp_bc_callback = {
149 dwarf2_spp_bc_destroy, 150 dwarf2_spp_bc_destroy,
150 dwarf2_spp_bc_print, 151 dwarf2_spp_bc_print,
151 yasm_bc_finalize_common, 152 yasm_bc_finalize_common,
152 NULL, 153 NULL,
153 dwarf2_spp_bc_calc_len, 154 dwarf2_spp_bc_calc_len,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 dwarf2_dbgfmt_append_line_op(yasm_section *sect, dwarf_line_number_op opcode, 248 dwarf2_dbgfmt_append_line_op(yasm_section *sect, dwarf_line_number_op opcode,
248 /*@only@*/ /*@null@*/ yasm_intnum *operand) 249 /*@only@*/ /*@null@*/ yasm_intnum *operand)
249 { 250 {
250 dwarf2_line_op *line_op = yasm_xmalloc(sizeof(dwarf2_line_op)); 251 dwarf2_line_op *line_op = yasm_xmalloc(sizeof(dwarf2_line_op));
251 yasm_bytecode *bc; 252 yasm_bytecode *bc;
252 253
253 line_op->opcode = opcode; 254 line_op->opcode = opcode;
254 line_op->operand = operand; 255 line_op->operand = operand;
255 line_op->ext_opcode = 0; 256 line_op->ext_opcode = 0;
256 line_op->ext_operand = NULL; 257 line_op->ext_operand = NULL;
258 line_op->ext_operand_int = NULL;
257 line_op->ext_operandsize = 0; 259 line_op->ext_operandsize = 0;
258 260
259 bc = yasm_bc_create_common(&dwarf2_line_op_bc_callback, line_op, 0); 261 bc = yasm_bc_create_common(&dwarf2_line_op_bc_callback, line_op, 0);
260 bc->len = 1; 262 bc->len = 1;
261 if (operand) 263 if (operand)
262 bc->len += yasm_intnum_size_leb128(operand, 264 bc->len += yasm_intnum_size_leb128(operand,
263 opcode == DW_LNS_advance_line); 265 opcode == DW_LNS_advance_line);
264 266
265 yasm_dwarf2__append_bc(sect, bc); 267 yasm_dwarf2__append_bc(sect, bc);
266 return bc; 268 return bc;
267 } 269 }
268 270
269 /* Create and add a new extended line opcode to a section, updating offset on 271 /* Create and add a new extended line opcode to a section, updating offset on
270 * insertion; no optimization necessary. 272 * insertion; no optimization necessary.
271 */ 273 */
272 static yasm_bytecode * 274 static yasm_bytecode *
273 dwarf2_dbgfmt_append_line_ext_op(yasm_section *sect, 275 dwarf2_dbgfmt_append_line_ext_op(yasm_section *sect,
274 dwarf_line_number_ext_op ext_opcode, 276 dwarf_line_number_ext_op ext_opcode,
275 unsigned long ext_operandsize, 277 unsigned long ext_operandsize,
276 /*@null@*/ yasm_symrec *ext_operand) 278 /*@null@*/ yasm_symrec *ext_operand)
277 { 279 {
278 dwarf2_line_op *line_op = yasm_xmalloc(sizeof(dwarf2_line_op)); 280 dwarf2_line_op *line_op = yasm_xmalloc(sizeof(dwarf2_line_op));
279 yasm_bytecode *bc; 281 yasm_bytecode *bc;
280 282
281 line_op->opcode = DW_LNS_extended_op; 283 line_op->opcode = DW_LNS_extended_op;
282 line_op->operand = yasm_intnum_create_uint(ext_operandsize+1); 284 line_op->operand = yasm_intnum_create_uint(ext_operandsize+1);
283 line_op->ext_opcode = ext_opcode; 285 line_op->ext_opcode = ext_opcode;
284 line_op->ext_operand = ext_operand; 286 line_op->ext_operand = ext_operand;
287 line_op->ext_operand_int = NULL;
285 line_op->ext_operandsize = ext_operandsize; 288 line_op->ext_operandsize = ext_operandsize;
286 289
287 bc = yasm_bc_create_common(&dwarf2_line_op_bc_callback, line_op, 0); 290 bc = yasm_bc_create_common(&dwarf2_line_op_bc_callback, line_op, 0);
288 bc->len = 2 + yasm_intnum_size_leb128(line_op->operand, 0) + 291 bc->len = 2 + yasm_intnum_size_leb128(line_op->operand, 0) +
289 ext_operandsize; 292 ext_operandsize;
290 293
291 yasm_dwarf2__append_bc(sect, bc); 294 yasm_dwarf2__append_bc(sect, bc);
292 return bc; 295 return bc;
293 } 296 }
294 297
298 static yasm_bytecode *
299 dwarf2_dbgfmt_append_line_ext_op_int(yasm_section *sect,
300 dwarf_line_number_ext_op ext_opcode,
301 /*@only@*/ yasm_intnum *ext_operand)
302 {
303 dwarf2_line_op *line_op = yasm_xmalloc(sizeof(dwarf2_line_op));
304 unsigned long ext_operandsize = yasm_intnum_size_leb128(ext_operand, 0);
305 yasm_bytecode *bc;
306
307 line_op->opcode = DW_LNS_extended_op;
308 line_op->operand = yasm_intnum_create_uint(ext_operandsize+1);
309 line_op->ext_opcode = ext_opcode;
310 line_op->ext_operand = NULL;
311 line_op->ext_operand_int = ext_operand;
312 line_op->ext_operandsize = ext_operandsize;
313
314 bc = yasm_bc_create_common(&dwarf2_line_op_bc_callback, line_op, 0);
315 bc->len = 2 + yasm_intnum_size_leb128(line_op->operand, 0) +
316 ext_operandsize;
317
318 yasm_dwarf2__append_bc(sect, bc);
319 return bc;
320 }
321
295 static void 322 static void
296 dwarf2_dbgfmt_finalize_locs(yasm_section *sect, dwarf2_section_data *dsd) 323 dwarf2_dbgfmt_finalize_locs(yasm_section *sect, dwarf2_section_data *dsd)
297 { 324 {
298 /*@dependent@*/ yasm_symrec *lastsym = NULL; 325 /*@dependent@*/ yasm_symrec *lastsym = NULL;
299 /*@null@*/ yasm_bytecode *bc; 326 /*@null@*/ yasm_bytecode *bc;
300 /*@null@*/ dwarf2_loc *loc; 327 /*@null@*/ dwarf2_loc *loc;
301 328
302 bc = yasm_section_bcs_first(sect); 329 bc = yasm_section_bcs_first(sect);
303 STAILQ_FOREACH(loc, &dsd->locs, link) { 330 STAILQ_FOREACH(loc, &dsd->locs, link) {
304 /* Find the first bytecode following this loc by looking at 331 /* Find the first bytecode following this loc by looking at
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 if (state->file != loc->file) { 364 if (state->file != loc->file) {
338 state->file = loc->file; 365 state->file = loc->file;
339 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_set_file, 366 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_set_file,
340 yasm_intnum_create_uint(state->file)); 367 yasm_intnum_create_uint(state->file));
341 } 368 }
342 if (state->column != loc->column) { 369 if (state->column != loc->column) {
343 state->column = loc->column; 370 state->column = loc->column;
344 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_set_column, 371 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_set_column,
345 yasm_intnum_create_uint(state->column)); 372 yasm_intnum_create_uint(state->column));
346 } 373 }
374 if (loc->discriminator != 0) {
375 dwarf2_dbgfmt_append_line_ext_op_int(debug_line,
376 DW_LNE_set_discriminator,
377 yasm_intnum_create_uint(loc->discriminator));
378 }
347 #ifdef WITH_DWARF3 379 #ifdef WITH_DWARF3
348 if (loc->isa_change) { 380 if (loc->isa_change) {
349 state->isa = loc->isa; 381 state->isa = loc->isa;
350 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_set_isa, 382 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_set_isa,
351 yasm_intnum_create_uint(state->isa)); 383 yasm_intnum_create_uint(state->isa));
352 } 384 }
353 #endif 385 #endif
354 if (state->is_stmt == 0 && loc->is_stmt == IS_STMT_SET) { 386 if (state->is_stmt == 0 && loc->is_stmt == IS_STMT_SET) {
355 state->is_stmt = 1; 387 state->is_stmt = 1;
356 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_negate_stmt, NULL); 388 dwarf2_dbgfmt_append_line_op(debug_line, DW_LNS_negate_stmt, NULL);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 yasm_section *debug_line; 478 yasm_section *debug_line;
447 yasm_object *object; 479 yasm_object *object;
448 yasm_linemap *linemap; 480 yasm_linemap *linemap;
449 yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2; 481 yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2;
450 dwarf2_line_state *state; 482 dwarf2_line_state *state;
451 dwarf2_loc loc; 483 dwarf2_loc loc;
452 unsigned long lastfile; 484 unsigned long lastfile;
453 } dwarf2_line_bc_info; 485 } dwarf2_line_bc_info;
454 486
455 static int 487 static int
488 dwarf2_filename_equals(const dwarf2_filename *fn,
489 char **dirs,
490 const char *pathname,
491 unsigned long dirlen,
492 const char *filename)
493 {
494 /* check directory */
495 if (fn->dir == 0) {
496 if (dirlen != 0)
497 return 0;
498 } else {
499 if (strncmp(dirs[fn->dir-1], pathname, dirlen) != 0 ||
500 dirs[fn->dir-1][dirlen] != '\0')
501 return 0;
502 }
503
504 /* check filename */
505 return strcmp(fn->filename, filename) == 0;
506 }
507
508 static int
456 dwarf2_generate_line_bc(yasm_bytecode *bc, /*@null@*/ void *d) 509 dwarf2_generate_line_bc(yasm_bytecode *bc, /*@null@*/ void *d)
457 { 510 {
458 dwarf2_line_bc_info *info = (dwarf2_line_bc_info *)d; 511 dwarf2_line_bc_info *info = (dwarf2_line_bc_info *)d;
459 yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2 = info->dbgfmt_dwarf2; 512 yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2 = info->dbgfmt_dwarf2;
460 unsigned long i; 513 unsigned long i;
461 const char *filename; 514 size_t dirlen;
515 const char *pathname, *filename;
462 /*@null@*/ yasm_bytecode *nextbc = yasm_bc__next(bc); 516 /*@null@*/ yasm_bytecode *nextbc = yasm_bc__next(bc);
463 517
464 if (nextbc && bc->offset == nextbc->offset) 518 if (nextbc && bc->offset == nextbc->offset)
465 return 0; 519 return 0;
466 520
467 info->loc.vline = bc->line; 521 info->loc.vline = bc->line;
468 info->loc.bc = bc; 522 info->loc.bc = bc;
469 523
470 /* Keep track of last symbol seen */ 524 /* Keep track of last symbol seen */
471 if (bc->symrecs) { 525 if (bc->symrecs) {
472 i = 0; 526 i = 0;
473 while (bc->symrecs[i]) { 527 while (bc->symrecs[i]) {
474 info->loc.sym = bc->symrecs[i]; 528 info->loc.sym = bc->symrecs[i];
475 i++; 529 i++;
476 } 530 }
477 } 531 }
478 532
479 yasm_linemap_lookup(info->linemap, bc->line, &filename, &info->loc.line); 533 yasm_linemap_lookup(info->linemap, bc->line, &pathname, &info->loc.line);
534 dirlen = yasm__splitpath(pathname, &filename);
535
480 /* Find file index; just linear search it unless it was the last used */ 536 /* Find file index; just linear search it unless it was the last used */
481 if (info->lastfile > 0 537 if (info->lastfile > 0
482 && strcmp(filename, dbgfmt_dwarf2->filenames[info->lastfile-1].pathname) 538 && dwarf2_filename_equals(&dbgfmt_dwarf2->filenames[info->lastfile-1],
483 == 0) 539 dbgfmt_dwarf2->dirs, pathname, dirlen,
540 filename))
484 info->loc.file = info->lastfile; 541 info->loc.file = info->lastfile;
485 else { 542 else {
486 for (i=0; i<dbgfmt_dwarf2->filenames_size; i++) { 543 for (i=0; i<dbgfmt_dwarf2->filenames_size; i++) {
487 if (strcmp(filename, dbgfmt_dwarf2->filenames[i].pathname) == 0) 544 if (dwarf2_filename_equals(&dbgfmt_dwarf2->filenames[i],
545 dbgfmt_dwarf2->dirs, pathname, dirlen,
546 filename))
488 break; 547 break;
489 } 548 }
490 if (i >= dbgfmt_dwarf2->filenames_size) 549 if (i >= dbgfmt_dwarf2->filenames_size)
491 yasm_internal_error(N_("could not find filename in table")); 550 yasm_internal_error(N_("could not find filename in table"));
492 info->loc.file = i+1; 551 info->loc.file = i+1;
493 info->lastfile = i+1; 552 info->lastfile = i+1;
494 } 553 }
495 if (dwarf2_dbgfmt_gen_line_op(info->debug_line, info->state, &info->loc, 554 if (dwarf2_dbgfmt_gen_line_op(info->debug_line, info->state, &info->loc,
496 NULL)) 555 NULL))
497 return 1; 556 return 1;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 dwarf2_line_bc_info bcinfo; 613 dwarf2_line_bc_info bcinfo;
555 614
556 bcinfo.debug_line = info->debug_line; 615 bcinfo.debug_line = info->debug_line;
557 bcinfo.object = info->object; 616 bcinfo.object = info->object;
558 bcinfo.linemap = info->linemap; 617 bcinfo.linemap = info->linemap;
559 bcinfo.dbgfmt_dwarf2 = dbgfmt_dwarf2; 618 bcinfo.dbgfmt_dwarf2 = dbgfmt_dwarf2;
560 bcinfo.state = &state; 619 bcinfo.state = &state;
561 bcinfo.lastfile = 0; 620 bcinfo.lastfile = 0;
562 bcinfo.loc.isa_change = 0; 621 bcinfo.loc.isa_change = 0;
563 bcinfo.loc.column = 0; 622 bcinfo.loc.column = 0;
623 bcinfo.loc.discriminator = 0;
564 bcinfo.loc.is_stmt = IS_STMT_NOCHANGE; 624 bcinfo.loc.is_stmt = IS_STMT_NOCHANGE;
565 bcinfo.loc.basic_block = 0; 625 bcinfo.loc.basic_block = 0;
566 bcinfo.loc.prologue_end = 0; 626 bcinfo.loc.prologue_end = 0;
567 bcinfo.loc.epilogue_begin = 0; 627 bcinfo.loc.epilogue_begin = 0;
568 bcinfo.loc.sym = NULL; 628 bcinfo.loc.sym = NULL;
569 629
570 /* bcs_traverse() skips first "dummy" bytecode, so look at it 630 /* bcs_traverse() skips first "dummy" bytecode, so look at it
571 * separately to determine the initial symrec. 631 * separately to determine the initial symrec.
572 */ 632 */
573 bc = yasm_section_bcs_first(sect); 633 bc = yasm_section_bcs_first(sect);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 static int 770 static int
711 dwarf2_spp_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, 771 dwarf2_spp_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span,
712 void *add_span_data) 772 void *add_span_data)
713 { 773 {
714 yasm_internal_error(N_("tried to calc_len a dwarf2 spp bytecode")); 774 yasm_internal_error(N_("tried to calc_len a dwarf2 spp bytecode"));
715 /*@notreached@*/ 775 /*@notreached@*/
716 return 0; 776 return 0;
717 } 777 }
718 778
719 static int 779 static int
720 dwarf2_spp_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d, 780 dwarf2_spp_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp,
781 unsigned char *bufstart, void *d,
721 yasm_output_value_func output_value, 782 yasm_output_value_func output_value,
722 yasm_output_reloc_func output_reloc) 783 yasm_output_reloc_func output_reloc)
723 { 784 {
724 yasm_object *object = yasm_section_get_object(bc->section); 785 yasm_object *object = yasm_section_get_object(bc->section);
725 yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2 = (yasm_dbgfmt_dwarf2 *)object->dbgfmt; 786 yasm_dbgfmt_dwarf2 *dbgfmt_dwarf2 = (yasm_dbgfmt_dwarf2 *)object->dbgfmt;
726 unsigned char *buf = *bufp; 787 unsigned char *buf = *bufp;
727 yasm_intnum *cval; 788 yasm_intnum *cval;
728 size_t i, len; 789 size_t i, len;
729 790
730 /* Prologue length (following this field) */ 791 /* Prologue length (following this field) */
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 yasm_intnum_destroy(cval); 834 yasm_intnum_destroy(cval);
774 return 0; 835 return 0;
775 } 836 }
776 837
777 static void 838 static void
778 dwarf2_line_op_bc_destroy(void *contents) 839 dwarf2_line_op_bc_destroy(void *contents)
779 { 840 {
780 dwarf2_line_op *line_op = (dwarf2_line_op *)contents; 841 dwarf2_line_op *line_op = (dwarf2_line_op *)contents;
781 if (line_op->operand) 842 if (line_op->operand)
782 yasm_intnum_destroy(line_op->operand); 843 yasm_intnum_destroy(line_op->operand);
844 if (line_op->ext_operand_int)
845 yasm_intnum_destroy(line_op->ext_operand_int);
783 yasm_xfree(contents); 846 yasm_xfree(contents);
784 } 847 }
785 848
786 static void 849 static void
787 dwarf2_line_op_bc_print(const void *contents, FILE *f, int indent_level) 850 dwarf2_line_op_bc_print(const void *contents, FILE *f, int indent_level)
788 { 851 {
789 /* TODO */ 852 /* TODO */
790 } 853 }
791 854
792 static int 855 static int
793 dwarf2_line_op_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span, 856 dwarf2_line_op_bc_calc_len(yasm_bytecode *bc, yasm_bc_add_span_func add_span,
794 void *add_span_data) 857 void *add_span_data)
795 { 858 {
796 yasm_internal_error(N_("tried to calc_len a dwarf2 line_op bytecode")); 859 yasm_internal_error(N_("tried to calc_len a dwarf2 line_op bytecode"));
797 /*@notreached@*/ 860 /*@notreached@*/
798 return 0; 861 return 0;
799 } 862 }
800 863
801 static int 864 static int
802 dwarf2_line_op_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp, void *d, 865 dwarf2_line_op_bc_tobytes(yasm_bytecode *bc, unsigned char **bufp,
866 unsigned char *bufstart, void *d,
803 yasm_output_value_func output_value, 867 yasm_output_value_func output_value,
804 yasm_output_reloc_func output_reloc) 868 yasm_output_reloc_func output_reloc)
805 { 869 {
806 dwarf2_line_op *line_op = (dwarf2_line_op *)bc->contents; 870 dwarf2_line_op *line_op = (dwarf2_line_op *)bc->contents;
807 unsigned char *buf = *bufp; 871 unsigned char *buf = *bufp;
808 872
809 YASM_WRITE_8(buf, line_op->opcode); 873 YASM_WRITE_8(buf, line_op->opcode);
810 if (line_op->operand) 874 if (line_op->operand)
811 buf += yasm_intnum_get_leb128(line_op->operand, buf, 875 buf += yasm_intnum_get_leb128(line_op->operand, buf,
812 line_op->opcode == DW_LNS_advance_line); 876 line_op->opcode == DW_LNS_advance_line);
813 if (line_op->ext_opcode > 0) { 877 if (line_op->ext_opcode > 0) {
814 YASM_WRITE_8(buf, line_op->ext_opcode); 878 YASM_WRITE_8(buf, line_op->ext_opcode);
815 if (line_op->ext_operand) { 879 if (line_op->ext_operand) {
816 yasm_value value; 880 yasm_value value;
817 yasm_value_init_sym(&value, line_op->ext_operand, 881 yasm_value_init_sym(&value, line_op->ext_operand,
818 line_op->ext_operandsize*8); 882 line_op->ext_operandsize*8);
819 output_value(&value, buf, line_op->ext_operandsize, 883 output_value(&value, buf, line_op->ext_operandsize,
820 (unsigned long)(buf-*bufp), bc, 0, d); 884 (unsigned long)(buf-bufstart), bc, 0, d);
821 buf += line_op->ext_operandsize; 885 buf += line_op->ext_operandsize;
822 } 886 }
887 if (line_op->ext_operand_int) {
888 buf += yasm_intnum_get_leb128(line_op->ext_operand_int, buf, 0);
889 }
823 } 890 }
824 891
825 *bufp = buf; 892 *bufp = buf;
826 return 0; 893 return 0;
827 } 894 }
828 895
829 void 896 void
830 yasm_dwarf2__dir_loc(yasm_object *object, yasm_valparamhead *valparams, 897 yasm_dwarf2__dir_loc(yasm_object *object, yasm_valparamhead *valparams,
831 yasm_valparamhead *objext_valparams, unsigned long line) 898 yasm_valparamhead *objext_valparams, unsigned long line)
832 { 899 {
833 yasm_valparam *vp; 900 yasm_valparam *vp;
834 int in_is_stmt = 0, in_isa = 0; 901 int in_is_stmt = 0, in_isa = 0, in_discriminator = 0;
835 902
836 /*@dependent@*/ /*@null@*/ const yasm_intnum *intn; 903 /*@dependent@*/ /*@null@*/ const yasm_intnum *intn;
837 dwarf2_section_data *dsd; 904 dwarf2_section_data *dsd;
838 dwarf2_loc *loc = yasm_xmalloc(sizeof(dwarf2_loc)); 905 dwarf2_loc *loc = yasm_xmalloc(sizeof(dwarf2_loc));
839 906
840 /* File number (required) */ 907 /* File number (required) */
841 if (!valparams || !(vp = yasm_vps_first(valparams)) || 908 if (!valparams || !(vp = yasm_vps_first(valparams)) ||
842 vp->val || vp->type != YASM_PARAM_EXPR) { 909 vp->val || vp->type != YASM_PARAM_EXPR) {
843 yasm_error_set(YASM_ERROR_SYNTAX, N_("file number required")); 910 yasm_error_set(YASM_ERROR_SYNTAX, N_("file number required"));
844 yasm_xfree(loc); 911 yasm_xfree(loc);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 &yasm_dwarf2__section_data_cb); 952 &yasm_dwarf2__section_data_cb);
886 if (!dsd) { 953 if (!dsd) {
887 dsd = yasm_xmalloc(sizeof(dwarf2_section_data)); 954 dsd = yasm_xmalloc(sizeof(dwarf2_section_data));
888 STAILQ_INIT(&dsd->locs); 955 STAILQ_INIT(&dsd->locs);
889 yasm_section_add_data(object->cur_section, 956 yasm_section_add_data(object->cur_section,
890 &yasm_dwarf2__section_data_cb, dsd); 957 &yasm_dwarf2__section_data_cb, dsd);
891 } 958 }
892 959
893 /* Defaults for optional settings */ 960 /* Defaults for optional settings */
894 loc->column = 0; 961 loc->column = 0;
962 loc->discriminator = 0;
895 loc->isa_change = 0; 963 loc->isa_change = 0;
896 loc->isa = 0; 964 loc->isa = 0;
897 loc->is_stmt = IS_STMT_NOCHANGE; 965 loc->is_stmt = IS_STMT_NOCHANGE;
898 loc->basic_block = 0; 966 loc->basic_block = 0;
899 loc->prologue_end = 0; 967 loc->prologue_end = 0;
900 loc->epilogue_begin = 0; 968 loc->epilogue_begin = 0;
901 969
902 /* Optional column number */ 970 /* Optional column number */
903 vp = yasm_vps_next(vp); 971 vp = yasm_vps_next(vp);
904 if (vp && !vp->val && vp->type == YASM_PARAM_EXPR) { 972 if (vp && !vp->val && vp->type == YASM_PARAM_EXPR) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 if (yasm_intnum_sign(intn) < 0) { 1027 if (yasm_intnum_sign(intn) < 0) {
960 yasm_error_set(YASM_ERROR_VALUE, 1028 yasm_error_set(YASM_ERROR_VALUE,
961 N_("isa value less than zero")); 1029 N_("isa value less than zero"));
962 yasm_xfree(loc); 1030 yasm_xfree(loc);
963 yasm_expr_destroy(e); 1031 yasm_expr_destroy(e);
964 return; 1032 return;
965 } 1033 }
966 loc->isa_change = 1; 1034 loc->isa_change = 1;
967 loc->isa = yasm_intnum_get_uint(intn); 1035 loc->isa = yasm_intnum_get_uint(intn);
968 yasm_expr_destroy(e); 1036 yasm_expr_destroy(e);
1037 } else if (in_discriminator) {
1038 in_discriminator = 0;
1039 if (!(e = yasm_vp_expr(vp, object->symtab, line)) ||
1040 !(intn = yasm_expr_get_intnum(&e, 0))) {
1041 yasm_error_set(YASM_ERROR_NOT_CONSTANT,
1042 N_("discriminator value is not a constant"));
1043 yasm_xfree(loc);
1044 if (e)
1045 yasm_expr_destroy(e);
1046 return;
1047 }
1048 if (yasm_intnum_sign(intn) < 0) {
1049 yasm_error_set(YASM_ERROR_VALUE,
1050 N_("discriminator value less than zero"));
1051 yasm_xfree(loc);
1052 yasm_expr_destroy(e);
1053 return;
1054 }
1055 loc->discriminator = yasm_intnum_get_uint(intn);
1056 yasm_expr_destroy(e);
969 } else if (!vp->val && (s = yasm_vp_id(vp))) { 1057 } else if (!vp->val && (s = yasm_vp_id(vp))) {
970 if (yasm__strcasecmp(s, "is_stmt") == 0) 1058 if (yasm__strcasecmp(s, "is_stmt") == 0)
971 in_is_stmt = 1; 1059 in_is_stmt = 1;
972 else if (yasm__strcasecmp(s, "isa") == 0) 1060 else if (yasm__strcasecmp(s, "isa") == 0)
973 in_isa = 1; 1061 in_isa = 1;
1062 else if (yasm__strcasecmp(s, "discriminator") == 0)
1063 in_discriminator = 1;
974 else if (yasm__strcasecmp(s, "basic_block") == 0) 1064 else if (yasm__strcasecmp(s, "basic_block") == 0)
975 loc->basic_block = 1; 1065 loc->basic_block = 1;
976 else if (yasm__strcasecmp(s, "prologue_end") == 0) 1066 else if (yasm__strcasecmp(s, "prologue_end") == 0)
977 loc->prologue_end = 1; 1067 loc->prologue_end = 1;
978 else if (yasm__strcasecmp(s, "epilogue_begin") == 0) 1068 else if (yasm__strcasecmp(s, "epilogue_begin") == 0)
979 loc->epilogue_begin = 1; 1069 loc->epilogue_begin = 1;
980 else 1070 else
981 yasm_warn_set(YASM_WARN_GENERAL, 1071 yasm_warn_set(YASM_WARN_GENERAL,
982 N_("unrecognized loc option `%s'"), s); 1072 N_("unrecognized loc option `%s'"), s);
983 } else if (!vp->val) { 1073 } else if (!vp->val) {
984 yasm_warn_set(YASM_WARN_GENERAL, 1074 yasm_warn_set(YASM_WARN_GENERAL,
985 N_("unrecognized numeric qualifier")); 1075 N_("unrecognized numeric qualifier"));
986 } else if (yasm__strcasecmp(vp->val, "is_stmt") == 0) { 1076 } else if (yasm__strcasecmp(vp->val, "is_stmt") == 0) {
987 in_is_stmt = 1; 1077 in_is_stmt = 1;
988 goto restart; /* don't go to the next valparam */ 1078 goto restart; /* don't go to the next valparam */
989 } else if (yasm__strcasecmp(vp->val, "isa") == 0) { 1079 } else if (yasm__strcasecmp(vp->val, "isa") == 0) {
990 in_isa = 1; 1080 in_isa = 1;
991 goto restart; /* don't go to the next valparam */ 1081 goto restart; /* don't go to the next valparam */
1082 } else if (yasm__strcasecmp(vp->val, "discriminator") == 0) {
1083 in_discriminator = 1;
1084 goto restart; /* don't go to the next valparam */
992 } else 1085 } else
993 yasm_warn_set(YASM_WARN_GENERAL, 1086 yasm_warn_set(YASM_WARN_GENERAL,
994 N_("unrecognized loc option `%s'"), vp->val); 1087 N_("unrecognized loc option `%s'"), vp->val);
995 vp = yasm_vps_next(vp); 1088 vp = yasm_vps_next(vp);
996 } 1089 }
997 1090
998 if (in_is_stmt || in_isa) { 1091 if (in_is_stmt || in_isa || in_discriminator) {
999 yasm_error_set(YASM_ERROR_SYNTAX, N_("%s requires value"), 1092 yasm_error_set(YASM_ERROR_SYNTAX, N_("%s requires value"),
1000 in_is_stmt ? "is_stmt" : "isa"); 1093 in_is_stmt ? "is_stmt" :
1094 (in_isa ? "isa" : "discriminator"));
1001 yasm_xfree(loc); 1095 yasm_xfree(loc);
1002 return; 1096 return;
1003 } 1097 }
1004 1098
1005 /* Append new location */ 1099 /* Append new location */
1006 loc->vline = line; 1100 loc->vline = line;
1007 loc->bc = NULL; 1101 loc->bc = NULL;
1008 loc->sym = NULL; 1102 loc->sym = NULL;
1009 STAILQ_INSERT_TAIL(&dsd->locs, loc, link); 1103 STAILQ_INSERT_TAIL(&dsd->locs, loc, link);
1010 } 1104 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 1136
1043 vp = yasm_vps_next(vp); 1137 vp = yasm_vps_next(vp);
1044 if (!yasm_vp_string(vp)) { 1138 if (!yasm_vp_string(vp)) {
1045 yasm_error_set(YASM_ERROR_SYNTAX, 1139 yasm_error_set(YASM_ERROR_SYNTAX,
1046 N_("file number given but no filename")); 1140 N_("file number given but no filename"));
1047 return; 1141 return;
1048 } 1142 }
1049 1143
1050 dwarf2_dbgfmt_add_file(dbgfmt_dwarf2, filenum, yasm_vp_string(vp)); 1144 dwarf2_dbgfmt_add_file(dbgfmt_dwarf2, filenum, yasm_vp_string(vp));
1051 } 1145 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698