1 /* Return line number information of CU. 2 Copyright (C) 2004-2010, 2013, 2014, 2015, 2016, 2018 Red Hat, Inc. 3 This file is part of elfutils. 4 5 This file is free software; you can redistribute it and/or modify 6 it under the terms of either 7 8 * the GNU Lesser General Public License as published by the Free 9 Software Foundation; either version 3 of the License, or (at 10 your option) any later version 11 12 or 13 14 * the GNU General Public License as published by the Free 15 Software Foundation; either version 2 of the License, or (at 16 your option) any later version 17 18 or both in parallel, as here. 19 20 elfutils is distributed in the hope that it will be useful, but 21 WITHOUT ANY WARRANTY; without even the implied warranty of 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23 General Public License for more details. 24 25 You should have received copies of the GNU General Public License and 26 the GNU Lesser General Public License along with this program. If 27 not, see <http://www.gnu.org/licenses/>. */ 28 29 #ifdef HAVE_CONFIG_H 30 # include <config.h> 31 #endif 32 33 #include <assert.h> 34 #include <stdlib.h> 35 #include <string.h> 36 #include <search.h> 37 38 #include "dwarf.h" 39 #include "libdwP.h" 40 41 42 struct filelist 43 { 44 Dwarf_Fileinfo info; 45 struct filelist *next; 46 }; 47 48 struct linelist 49 { 50 Dwarf_Line line; 51 struct linelist *next; 52 size_t sequence; 53 }; 54 55 56 /* Compare by Dwarf_Line.addr, given pointers into an array of pointers. */ 57 static int 58 compare_lines (const void *a, const void *b) 59 { 60 struct linelist *const *p1 = a; 61 struct linelist *const *p2 = b; 62 struct linelist *list1 = *p1; 63 struct linelist *list2 = *p2; 64 Dwarf_Line *line1 = &list1->line; 65 Dwarf_Line *line2 = &list2->line; 66 67 if (line1->addr != line2->addr) 68 return (line1->addr < line2->addr) ? -1 : 1; 69 70 /* An end_sequence marker precedes a normal record at the same address. */ 71 if (line1->end_sequence != line2->end_sequence) 72 return line2->end_sequence - line1->end_sequence; 73 74 /* Otherwise, the linelist sequence maintains a stable sort. */ 75 return (list1->sequence < list2->sequence) ? -1 76 : (list1->sequence > list2->sequence) ? 1 77 : 0; 78 } 79 80 struct line_state 81 { 82 Dwarf_Word addr; 83 unsigned int op_index; 84 unsigned int file; 85 int64_t line; 86 unsigned int column; 87 uint_fast8_t is_stmt; 88 bool basic_block; 89 bool prologue_end; 90 bool epilogue_begin; 91 unsigned int isa; 92 unsigned int discriminator; 93 struct linelist *linelist; 94 size_t nlinelist; 95 unsigned int end_sequence; 96 }; 97 98 static inline void 99 run_advance_pc (struct line_state *state, unsigned int op_advance, 100 uint_fast8_t minimum_instr_len, uint_fast8_t max_ops_per_instr) 101 { 102 state->addr += minimum_instr_len * ((state->op_index + op_advance) 103 / max_ops_per_instr); 104 state->op_index = (state->op_index + op_advance) % max_ops_per_instr; 105 } 106 107 static inline bool 108 add_new_line (struct line_state *state, struct linelist *new_line) 109 { 110 /* Set the line information. For some fields we use bitfields, 111 so we would lose information if the encoded values are too large. 112 Check just for paranoia, and call the data "invalid" if it 113 violates our assumptions on reasonable limits for the values. */ 114 new_line->next = state->linelist; 115 new_line->sequence = state->nlinelist; 116 state->linelist = new_line; 117 ++(state->nlinelist); 118 119 /* Set the line information. For some fields we use bitfields, 120 so we would lose information if the encoded values are too large. 121 Check just for paranoia, and call the data "invalid" if it 122 violates our assumptions on reasonable limits for the values. */ 123 #define SET(field) \ 124 do { \ 125 new_line->line.field = state->field; \ 126 if (unlikely (new_line->line.field != state->field)) \ 127 return true; \ 128 } while (0) 129 130 SET (addr); 131 SET (op_index); 132 SET (file); 133 SET (line); 134 SET (column); 135 SET (is_stmt); 136 SET (basic_block); 137 SET (end_sequence); 138 SET (prologue_end); 139 SET (epilogue_begin); 140 SET (isa); 141 SET (discriminator); 142 143 #undef SET 144 145 return false; 146 } 147 148 static int 149 read_srclines (Dwarf *dbg, 150 const unsigned char *linep, const unsigned char *lineendp, 151 const char *comp_dir, unsigned address_size, 152 Dwarf_Lines **linesp, Dwarf_Files **filesp) 153 { 154 int res = -1; 155 156 struct filelist *filelist = NULL; 157 size_t nfilelist = 0; 158 size_t ndirlist = 0; 159 160 /* If there are a large number of lines, files or dirs don't blow up 161 the stack. Stack allocate some entries, only dynamically malloc 162 when more than MAX. */ 163 #define MAX_STACK_ALLOC 4096 164 #define MAX_STACK_LINES MAX_STACK_ALLOC 165 #define MAX_STACK_FILES (MAX_STACK_ALLOC / 4) 166 #define MAX_STACK_DIRS (MAX_STACK_ALLOC / 16) 167 168 /* Initial statement program state (except for stmt_list, see below). */ 169 struct line_state state = 170 { 171 .linelist = NULL, 172 .nlinelist = 0, 173 .addr = 0, 174 .op_index = 0, 175 .file = 1, 176 /* We only store int but want to check for overflow (see SET above). */ 177 .line = 1, 178 .column = 0, 179 .basic_block = false, 180 .prologue_end = false, 181 .epilogue_begin = false, 182 .isa = 0, 183 .discriminator = 0 184 }; 185 186 /* The dirs normally go on the stack, but if there are too many 187 we alloc them all. Set up stack storage early, so we can check on 188 error if we need to free them or not. */ 189 struct dirlist 190 { 191 const char *dir; 192 size_t len; 193 }; 194 struct dirlist dirstack[MAX_STACK_DIRS]; 195 struct dirlist *dirarray = dirstack; 196 197 if (unlikely (linep + 4 > lineendp)) 198 { 199 invalid_data: 200 __libdw_seterrno (DWARF_E_INVALID_DEBUG_LINE); 201 goto out; 202 } 203 204 Dwarf_Word unit_length = read_4ubyte_unaligned_inc (dbg, linep); 205 unsigned int length = 4; 206 if (unlikely (unit_length == DWARF3_LENGTH_64_BIT)) 207 { 208 if (unlikely (linep + 8 > lineendp)) 209 goto invalid_data; 210 unit_length = read_8ubyte_unaligned_inc (dbg, linep); 211 length = 8; 212 } 213 214 /* Check whether we have enough room in the section. */ 215 if (unlikely (unit_length > (size_t) (lineendp - linep))) 216 goto invalid_data; 217 lineendp = linep + unit_length; 218 219 /* The next element of the header is the version identifier. */ 220 if ((size_t) (lineendp - linep) < 2) 221 goto invalid_data; 222 uint_fast16_t version = read_2ubyte_unaligned_inc (dbg, linep); 223 if (unlikely (version < 2) || unlikely (version > 5)) 224 { 225 __libdw_seterrno (DWARF_E_VERSION); 226 goto out; 227 } 228 229 /* DWARF5 explicitly lists address and segment_selector sizes. */ 230 if (version >= 5) 231 { 232 if ((size_t) (lineendp - linep) < 2) 233 goto invalid_data; 234 size_t line_address_size = *linep++; 235 size_t segment_selector_size = *linep++; 236 if (line_address_size != address_size || segment_selector_size != 0) 237 goto invalid_data; 238 } 239 240 /* Next comes the header length. */ 241 Dwarf_Word header_length; 242 if (length == 4) 243 { 244 if ((size_t) (lineendp - linep) < 4) 245 goto invalid_data; 246 header_length = read_4ubyte_unaligned_inc (dbg, linep); 247 } 248 else 249 { 250 if ((size_t) (lineendp - linep) < 8) 251 goto invalid_data; 252 header_length = read_8ubyte_unaligned_inc (dbg, linep); 253 } 254 const unsigned char *header_start = linep; 255 256 /* Next the minimum instruction length. */ 257 uint_fast8_t minimum_instr_len = *linep++; 258 259 /* Next the maximum operations per instruction, in version 4 format. */ 260 uint_fast8_t max_ops_per_instr = 1; 261 if (version >= 4) 262 { 263 if (unlikely ((size_t) (lineendp - linep) < 1)) 264 goto invalid_data; 265 max_ops_per_instr = *linep++; 266 if (unlikely (max_ops_per_instr == 0)) 267 goto invalid_data; 268 } 269 270 /* 4 more bytes, is_stmt, line_base, line_range and opcode_base. */ 271 if ((size_t) (lineendp - linep) < 4) 272 goto invalid_data; 273 274 /* Then the flag determining the default value of the is_stmt 275 register. */ 276 uint_fast8_t default_is_stmt = *linep++; 277 278 /* Now the line base. */ 279 int_fast8_t line_base = (int8_t) *linep++; 280 281 /* And the line range. */ 282 uint_fast8_t line_range = *linep++; 283 284 /* The opcode base. */ 285 uint_fast8_t opcode_base = *linep++; 286 287 /* Remember array with the standard opcode length (-1 to account for 288 the opcode with value zero not being mentioned). */ 289 const uint8_t *standard_opcode_lengths = linep - 1; 290 if (unlikely (lineendp - linep < opcode_base - 1)) 291 goto invalid_data; 292 linep += opcode_base - 1; 293 294 /* To read DWARF5 dir and file lists we need to know the forms. For 295 now we skip everything, except the DW_LNCT_path and 296 DW_LNCT_directory_index. */ 297 uint16_t forms[256]; 298 unsigned char nforms = 0; 299 unsigned char form_path = -1; /* Which forms is DW_LNCT_path. */ 300 unsigned char form_idx = -1; /* And which is DW_LNCT_directory_index. */ 301 302 /* To read/skip form data. */ 303 Dwarf_CU fake_cu = { 304 .dbg = dbg, 305 .sec_idx = IDX_debug_line, 306 .version = 5, 307 .offset_size = length, 308 .address_size = address_size, 309 .startp = (void *) linep, 310 .endp = (void *) lineendp, 311 }; 312 313 /* First count the entries. */ 314 size_t ndirs = 0; 315 if (version < 5) 316 { 317 const unsigned char *dirp = linep; 318 while (dirp < lineendp && *dirp != 0) 319 { 320 uint8_t *endp = memchr (dirp, '\0', lineendp - dirp); 321 if (endp == NULL) 322 goto invalid_data; 323 ++ndirs; 324 dirp = endp + 1; 325 } 326 if (dirp >= lineendp || *dirp != '\0') 327 goto invalid_data; 328 ndirs = ndirs + 1; /* There is always the "unknown" dir. */ 329 } 330 else 331 { 332 if ((size_t) (lineendp - linep) < 1) 333 goto invalid_data; 334 nforms = *linep++; 335 for (int i = 0; i < nforms; i++) 336 { 337 uint16_t desc, form; 338 if ((size_t) (lineendp - linep) < 1) 339 goto invalid_data; 340 get_uleb128 (desc, linep, lineendp); 341 if ((size_t) (lineendp - linep) < 1) 342 goto invalid_data; 343 get_uleb128 (form, linep, lineendp); 344 345 if (! libdw_valid_user_form (form)) 346 goto invalid_data; 347 348 forms[i] = form; 349 if (desc == DW_LNCT_path) 350 form_path = i; 351 } 352 353 if (nforms > 0 && form_path == (unsigned char) -1) 354 goto invalid_data; 355 356 if ((size_t) (lineendp - linep) < 1) 357 goto invalid_data; 358 get_uleb128 (ndirs, linep, lineendp); 359 360 if (nforms == 0 && ndirs != 0) 361 goto invalid_data; 362 363 /* Assume there is at least 1 byte needed per form to describe 364 the directory. Filters out insanely large ndirs. */ 365 if (nforms != 0 && ndirs > (size_t) (lineendp - linep) / nforms) 366 goto invalid_data; 367 } 368 369 /* Arrange the list in array form. */ 370 ndirlist = ndirs; 371 if (ndirlist >= MAX_STACK_DIRS) 372 { 373 if (ndirlist > SIZE_MAX / sizeof (*dirarray)) 374 goto no_mem; 375 dirarray = (struct dirlist *) malloc (ndirlist * sizeof (*dirarray)); 376 if (unlikely (dirarray == NULL)) 377 { 378 no_mem: 379 __libdw_seterrno (DWARF_E_NOMEM); 380 goto out; 381 } 382 } 383 384 /* Entry zero is implicit for older versions, but explicit for 5+. */ 385 struct dirlist comp_dir_elem; 386 if (version < 5) 387 { 388 /* First comes the list of directories. Add the compilation 389 directory first since the index zero is used for it. */ 390 comp_dir_elem.dir = comp_dir; 391 comp_dir_elem.len = comp_dir ? strlen (comp_dir) : 0, 392 dirarray[0] = comp_dir_elem; 393 for (unsigned int n = 1; n < ndirlist; n++) 394 { 395 dirarray[n].dir = (char *) linep; 396 uint8_t *endp = memchr (linep, '\0', lineendp - linep); 397 assert (endp != NULL); // Checked above when calculating ndirlist. 398 dirarray[n].len = endp - linep; 399 linep = endp + 1; 400 } 401 /* Skip the final NUL byte. */ 402 assert (*linep == '\0'); // Checked above when calculating ndirlist. 403 ++linep; 404 } 405 else 406 { 407 Dwarf_Attribute attr; 408 attr.code = DW_AT_name; 409 attr.cu = &fake_cu; 410 for (unsigned int n = 0; n < ndirlist; n++) 411 { 412 const char *dir = NULL; 413 for (unsigned char m = 0; m < nforms; m++) 414 { 415 if (m == form_path) 416 { 417 attr.form = forms[m]; 418 attr.valp = (void *) linep; 419 dir = dwarf_formstring (&attr); 420 } 421 422 size_t len = __libdw_form_val_len (&fake_cu, forms[m], linep); 423 if ((size_t) (lineendp - linep) < len) 424 goto invalid_data; 425 426 linep += len; 427 } 428 429 if (dir == NULL) 430 goto invalid_data; 431 432 dirarray[n].dir = dir; 433 dirarray[n].len = strlen (dir); 434 } 435 } 436 437 /* File index zero doesn't exist for DWARF < 5. Files are indexed 438 starting from 1. But for DWARF5 they are indexed starting from 439 zero, but the default index is still 1. In both cases the 440 "first" file is special and refers to the main compile unit file, 441 equal to the DW_AT_name of the DW_TAG_compile_unit. */ 442 struct filelist null_file = 443 { 444 .info = 445 { 446 .name = "???", 447 .mtime = 0, 448 .length = 0 449 }, 450 .next = NULL 451 }; 452 filelist = &null_file; 453 nfilelist = 1; 454 455 /* Allocate memory for a new file. For the first MAX_STACK_FILES 456 entries just return a slot in the preallocated stack array. 457 This is slightly complicated because in DWARF < 5 new files could 458 be defined with DW_LNE_define_file after the normal file list was 459 read. */ 460 struct filelist flstack[MAX_STACK_FILES]; 461 #define NEW_FILE() ({ \ 462 struct filelist *fl = (nfilelist < MAX_STACK_FILES \ 463 ? &flstack[nfilelist] \ 464 : malloc (sizeof (struct filelist))); \ 465 if (unlikely (fl == NULL)) \ 466 goto no_mem; \ 467 ++nfilelist; \ 468 fl->next = filelist; \ 469 filelist = fl; \ 470 fl; }) 471 472 /* Now read the files. */ 473 if (version < 5) 474 { 475 if (unlikely (linep >= lineendp)) 476 goto invalid_data; 477 while (linep < lineendp && *linep != '\0') 478 { 479 struct filelist *new_file = NEW_FILE (); 480 481 /* First comes the file name. */ 482 char *fname = (char *) linep; 483 uint8_t *endp = memchr (fname, '\0', lineendp - linep); 484 if (endp == NULL) 485 goto invalid_data; 486 size_t fnamelen = endp - (uint8_t *) fname; 487 linep = endp + 1; 488 489 /* Then the index. */ 490 Dwarf_Word diridx; 491 if (unlikely (linep >= lineendp)) 492 goto invalid_data; 493 get_uleb128 (diridx, linep, lineendp); 494 if (unlikely (diridx >= ndirlist)) 495 { 496 __libdw_seterrno (DWARF_E_INVALID_DIR_IDX); 497 goto out; 498 } 499 500 if (*fname == '/') 501 /* It's an absolute path. */ 502 new_file->info.name = fname; 503 else 504 { 505 new_file->info.name = libdw_alloc (dbg, char, 1, 506 dirarray[diridx].len + 1 507 + fnamelen + 1); 508 char *cp = new_file->info.name; 509 510 if (dirarray[diridx].dir != NULL) 511 { 512 /* This value could be NULL in case the DW_AT_comp_dir 513 was not present. We cannot do much in this case. 514 Just keep the file relative. */ 515 cp = stpcpy (cp, dirarray[diridx].dir); 516 *cp++ = '/'; 517 } 518 strcpy (cp, fname); 519 assert (strlen (new_file->info.name) 520 < dirarray[diridx].len + 1 + fnamelen + 1); 521 } 522 523 /* Next comes the modification time. */ 524 if (unlikely (linep >= lineendp)) 525 goto invalid_data; 526 get_uleb128 (new_file->info.mtime, linep, lineendp); 527 528 /* Finally the length of the file. */ 529 if (unlikely (linep >= lineendp)) 530 goto invalid_data; 531 get_uleb128 (new_file->info.length, linep, lineendp); 532 } 533 if (linep >= lineendp || *linep != '\0') 534 goto invalid_data; 535 /* Skip the final NUL byte. */ 536 ++linep; 537 } 538 else 539 { 540 if ((size_t) (lineendp - linep) < 1) 541 goto invalid_data; 542 nforms = *linep++; 543 form_path = form_idx = -1; 544 for (int i = 0; i < nforms; i++) 545 { 546 uint16_t desc, form; 547 if ((size_t) (lineendp - linep) < 1) 548 goto invalid_data; 549 get_uleb128 (desc, linep, lineendp); 550 if ((size_t) (lineendp - linep) < 1) 551 goto invalid_data; 552 get_uleb128 (form, linep, lineendp); 553 554 if (! libdw_valid_user_form (form)) 555 goto invalid_data; 556 557 forms[i] = form; 558 if (desc == DW_LNCT_path) 559 form_path = i; 560 else if (desc == DW_LNCT_directory_index) 561 form_idx = i; 562 } 563 564 if (nforms > 0 && (form_path == (unsigned char) -1 565 || form_idx == (unsigned char) -1)) 566 goto invalid_data; 567 568 size_t nfiles; 569 get_uleb128 (nfiles, linep, lineendp); 570 571 if (nforms == 0 && nfiles != 0) 572 goto invalid_data; 573 574 /* Assume there is at least 1 byte needed per form to describe 575 the file. Filters out insanely large nfiles. */ 576 if (nforms != 0 && nfiles > (size_t) (lineendp - linep) / nforms) 577 goto invalid_data; 578 579 Dwarf_Attribute attr; 580 attr.cu = &fake_cu; 581 for (unsigned int n = 0; n < nfiles; n++) 582 { 583 const char *fname = NULL; 584 Dwarf_Word diridx = (Dwarf_Word) -1; 585 for (unsigned char m = 0; m < nforms; m++) 586 { 587 if (m == form_path) 588 { 589 attr.code = DW_AT_name; 590 attr.form = forms[m]; 591 attr.valp = (void *) linep; 592 fname = dwarf_formstring (&attr); 593 } 594 else if (m == form_idx) 595 { 596 attr.code = DW_AT_decl_file; /* Close enough. */ 597 attr.form = forms[m]; 598 attr.valp = (void *) linep; 599 if (dwarf_formudata (&attr, &diridx) != 0) 600 diridx = (Dwarf_Word) -1; 601 } 602 603 size_t len = __libdw_form_val_len (&fake_cu, forms[m], linep); 604 if ((size_t) (lineendp - linep) < len) 605 goto invalid_data; 606 607 linep += len; 608 } 609 610 if (fname == NULL || diridx == (Dwarf_Word) -1) 611 goto invalid_data; 612 613 size_t fnamelen = strlen (fname); 614 615 if (unlikely (diridx >= ndirlist)) 616 { 617 __libdw_seterrno (DWARF_E_INVALID_DIR_IDX); 618 goto out; 619 } 620 621 /* Yes, weird. Looks like an off-by-one in the spec. */ 622 struct filelist *new_file = n == 0 ? &null_file : NEW_FILE (); 623 624 /* We follow the same rules as above for DWARF < 5, even 625 though the standard doesn't explicitly mention absolute 626 paths and ignoring the dir index. */ 627 if (*fname == '/') 628 /* It's an absolute path. */ 629 new_file->info.name = (char *) fname; 630 else 631 { 632 new_file->info.name = libdw_alloc (dbg, char, 1, 633 dirarray[diridx].len + 1 634 + fnamelen + 1); 635 char *cp = new_file->info.name; 636 637 /* In the DWARF >= 5 case, dir can never be NULL. */ 638 cp = stpcpy (cp, dirarray[diridx].dir); 639 *cp++ = '/'; 640 strcpy (cp, fname); 641 assert (strlen (new_file->info.name) 642 < dirarray[diridx].len + 1 + fnamelen + 1); 643 } 644 645 /* For now we just ignore the modification time and file length. */ 646 new_file->info.mtime = 0; 647 new_file->info.length = 0; 648 } 649 } 650 651 /* Consistency check. */ 652 if (unlikely (linep != header_start + header_length)) 653 { 654 __libdw_seterrno (DWARF_E_INVALID_DWARF); 655 goto out; 656 } 657 658 /* We are about to process the statement program. Most state machine 659 registers have already been initialize above. Just add the is_stmt 660 default. See 6.2.2 in the v2.1 specification. */ 661 state.is_stmt = default_is_stmt; 662 663 /* Apply the "operation advance" from a special opcode or 664 DW_LNS_advance_pc (as per DWARF4 6.2.5.1). */ 665 #define advance_pc(op_advance) \ 666 run_advance_pc (&state, op_advance, minimum_instr_len, max_ops_per_instr) 667 668 /* Process the instructions. */ 669 670 /* Adds a new line to the matrix. For the first MAX_STACK_LINES 671 entries just return a slot in the preallocated stack array. */ 672 struct linelist llstack[MAX_STACK_LINES]; 673 #define NEW_LINE(end_seq) \ 674 do { \ 675 struct linelist *ll = (state.nlinelist < MAX_STACK_LINES \ 676 ? &llstack[state.nlinelist] \ 677 : malloc (sizeof (struct linelist))); \ 678 if (unlikely (ll == NULL)) \ 679 goto no_mem; \ 680 state.end_sequence = end_seq; \ 681 if (unlikely (add_new_line (&state, ll))) \ 682 goto invalid_data; \ 683 } while (0) 684 685 while (linep < lineendp) 686 { 687 unsigned int opcode; 688 unsigned int u128; 689 int s128; 690 691 /* Read the opcode. */ 692 opcode = *linep++; 693 694 /* Is this a special opcode? */ 695 if (likely (opcode >= opcode_base)) 696 { 697 if (unlikely (line_range == 0)) 698 goto invalid_data; 699 700 /* Yes. Handling this is quite easy since the opcode value 701 is computed with 702 703 opcode = (desired line increment - line_base) 704 + (line_range * address advance) + opcode_base 705 */ 706 int line_increment = (line_base 707 + (opcode - opcode_base) % line_range); 708 709 /* Perform the increments. */ 710 state.line += line_increment; 711 advance_pc ((opcode - opcode_base) / line_range); 712 713 /* Add a new line with the current state machine values. */ 714 NEW_LINE (0); 715 716 /* Reset the flags. */ 717 state.basic_block = false; 718 state.prologue_end = false; 719 state.epilogue_begin = false; 720 state.discriminator = 0; 721 } 722 else if (opcode == 0) 723 { 724 /* This an extended opcode. */ 725 if (unlikely (lineendp - linep < 2)) 726 goto invalid_data; 727 728 /* The length. */ 729 uint_fast8_t len = *linep++; 730 731 if (unlikely ((size_t) (lineendp - linep) < len)) 732 goto invalid_data; 733 734 /* The sub-opcode. */ 735 opcode = *linep++; 736 737 switch (opcode) 738 { 739 case DW_LNE_end_sequence: 740 /* Add a new line with the current state machine values. 741 The is the end of the sequence. */ 742 NEW_LINE (1); 743 744 /* Reset the registers. */ 745 state.addr = 0; 746 state.op_index = 0; 747 state.file = 1; 748 state.line = 1; 749 state.column = 0; 750 state.is_stmt = default_is_stmt; 751 state.basic_block = false; 752 state.prologue_end = false; 753 state.epilogue_begin = false; 754 state.isa = 0; 755 state.discriminator = 0; 756 break; 757 758 case DW_LNE_set_address: 759 /* The value is an address. The size is defined as 760 apporiate for the target machine. We use the 761 address size field from the CU header. */ 762 state.op_index = 0; 763 if (unlikely (lineendp - linep < (uint8_t) address_size)) 764 goto invalid_data; 765 if (__libdw_read_address_inc (dbg, IDX_debug_line, &linep, 766 address_size, &state.addr)) 767 goto out; 768 break; 769 770 case DW_LNE_define_file: 771 { 772 char *fname = (char *) linep; 773 uint8_t *endp = memchr (linep, '\0', lineendp - linep); 774 if (endp == NULL) 775 goto invalid_data; 776 size_t fnamelen = endp - linep; 777 linep = endp + 1; 778 779 unsigned int diridx; 780 if (unlikely (linep >= lineendp)) 781 goto invalid_data; 782 get_uleb128 (diridx, linep, lineendp); 783 if (unlikely (diridx >= ndirlist)) 784 { 785 __libdw_seterrno (DWARF_E_INVALID_DIR_IDX); 786 goto invalid_data; 787 } 788 Dwarf_Word mtime; 789 if (unlikely (linep >= lineendp)) 790 goto invalid_data; 791 get_uleb128 (mtime, linep, lineendp); 792 Dwarf_Word filelength; 793 if (unlikely (linep >= lineendp)) 794 goto invalid_data; 795 get_uleb128 (filelength, linep, lineendp); 796 797 struct filelist *new_file = NEW_FILE (); 798 if (fname[0] == '/') 799 new_file->info.name = fname; 800 else 801 { 802 new_file->info.name = 803 libdw_alloc (dbg, char, 1, (dirarray[diridx].len + 1 804 + fnamelen + 1)); 805 char *cp = new_file->info.name; 806 807 if (dirarray[diridx].dir != NULL) 808 /* This value could be NULL in case the 809 DW_AT_comp_dir was not present. We 810 cannot do much in this case. Just 811 keep the file relative. */ 812 { 813 cp = stpcpy (cp, dirarray[diridx].dir); 814 *cp++ = '/'; 815 } 816 strcpy (cp, fname); 817 } 818 819 new_file->info.mtime = mtime; 820 new_file->info.length = filelength; 821 } 822 break; 823 824 case DW_LNE_set_discriminator: 825 /* Takes one ULEB128 parameter, the discriminator. */ 826 if (unlikely (standard_opcode_lengths[opcode] != 1)) 827 goto invalid_data; 828 829 if (unlikely (linep >= lineendp)) 830 goto invalid_data; 831 get_uleb128 (state.discriminator, linep, lineendp); 832 break; 833 834 default: 835 /* Unknown, ignore it. */ 836 if (unlikely ((size_t) (lineendp - (linep - 1)) < len)) 837 goto invalid_data; 838 linep += len - 1; 839 break; 840 } 841 } 842 else if (opcode <= DW_LNS_set_isa) 843 { 844 /* This is a known standard opcode. */ 845 switch (opcode) 846 { 847 case DW_LNS_copy: 848 /* Takes no argument. */ 849 if (unlikely (standard_opcode_lengths[opcode] != 0)) 850 goto invalid_data; 851 852 /* Add a new line with the current state machine values. */ 853 NEW_LINE (0); 854 855 /* Reset the flags. */ 856 state.basic_block = false; 857 state.prologue_end = false; 858 state.epilogue_begin = false; 859 state.discriminator = 0; 860 break; 861 862 case DW_LNS_advance_pc: 863 /* Takes one uleb128 parameter which is added to the 864 address. */ 865 if (unlikely (standard_opcode_lengths[opcode] != 1)) 866 goto invalid_data; 867 868 if (unlikely (linep >= lineendp)) 869 goto invalid_data; 870 get_uleb128 (u128, linep, lineendp); 871 advance_pc (u128); 872 break; 873 874 case DW_LNS_advance_line: 875 /* Takes one sleb128 parameter which is added to the 876 line. */ 877 if (unlikely (standard_opcode_lengths[opcode] != 1)) 878 goto invalid_data; 879 880 if (unlikely (linep >= lineendp)) 881 goto invalid_data; 882 get_sleb128 (s128, linep, lineendp); 883 state.line += s128; 884 break; 885 886 case DW_LNS_set_file: 887 /* Takes one uleb128 parameter which is stored in file. */ 888 if (unlikely (standard_opcode_lengths[opcode] != 1)) 889 goto invalid_data; 890 891 if (unlikely (linep >= lineendp)) 892 goto invalid_data; 893 get_uleb128 (u128, linep, lineendp); 894 state.file = u128; 895 break; 896 897 case DW_LNS_set_column: 898 /* Takes one uleb128 parameter which is stored in column. */ 899 if (unlikely (standard_opcode_lengths[opcode] != 1)) 900 goto invalid_data; 901 902 if (unlikely (linep >= lineendp)) 903 goto invalid_data; 904 get_uleb128 (u128, linep, lineendp); 905 state.column = u128; 906 break; 907 908 case DW_LNS_negate_stmt: 909 /* Takes no argument. */ 910 if (unlikely (standard_opcode_lengths[opcode] != 0)) 911 goto invalid_data; 912 913 state.is_stmt = 1 - state.is_stmt; 914 break; 915 916 case DW_LNS_set_basic_block: 917 /* Takes no argument. */ 918 if (unlikely (standard_opcode_lengths[opcode] != 0)) 919 goto invalid_data; 920 921 state.basic_block = true; 922 break; 923 924 case DW_LNS_const_add_pc: 925 /* Takes no argument. */ 926 if (unlikely (standard_opcode_lengths[opcode] != 0)) 927 goto invalid_data; 928 929 if (unlikely (line_range == 0)) 930 goto invalid_data; 931 932 advance_pc ((255 - opcode_base) / line_range); 933 break; 934 935 case DW_LNS_fixed_advance_pc: 936 /* Takes one 16 bit parameter which is added to the 937 address. */ 938 if (unlikely (standard_opcode_lengths[opcode] != 1) 939 || unlikely (lineendp - linep < 2)) 940 goto invalid_data; 941 942 state.addr += read_2ubyte_unaligned_inc (dbg, linep); 943 state.op_index = 0; 944 break; 945 946 case DW_LNS_set_prologue_end: 947 /* Takes no argument. */ 948 if (unlikely (standard_opcode_lengths[opcode] != 0)) 949 goto invalid_data; 950 951 state.prologue_end = true; 952 break; 953 954 case DW_LNS_set_epilogue_begin: 955 /* Takes no argument. */ 956 if (unlikely (standard_opcode_lengths[opcode] != 0)) 957 goto invalid_data; 958 959 state.epilogue_begin = true; 960 break; 961 962 case DW_LNS_set_isa: 963 /* Takes one uleb128 parameter which is stored in isa. */ 964 if (unlikely (standard_opcode_lengths[opcode] != 1)) 965 goto invalid_data; 966 967 if (unlikely (linep >= lineendp)) 968 goto invalid_data; 969 get_uleb128 (state.isa, linep, lineendp); 970 break; 971 } 972 } 973 else 974 { 975 /* This is a new opcode the generator but not we know about. 976 Read the parameters associated with it but then discard 977 everything. Read all the parameters for this opcode. */ 978 for (int n = standard_opcode_lengths[opcode]; n > 0; --n) 979 { 980 if (unlikely (linep >= lineendp)) 981 goto invalid_data; 982 get_uleb128 (u128, linep, lineendp); 983 } 984 985 /* Next round, ignore this opcode. */ 986 continue; 987 } 988 } 989 990 /* Put all the files in an array. */ 991 Dwarf_Files *files = libdw_alloc (dbg, Dwarf_Files, 992 sizeof (Dwarf_Files) 993 + nfilelist * sizeof (Dwarf_Fileinfo) 994 + (ndirlist + 1) * sizeof (char *), 995 1); 996 const char **dirs = (void *) &files->info[nfilelist]; 997 998 struct filelist *fileslist = filelist; 999 files->nfiles = nfilelist; 1000 for (size_t n = nfilelist; n > 0; n--) 1001 { 1002 files->info[n - 1] = fileslist->info; 1003 fileslist = fileslist->next; 1004 } 1005 assert (fileslist == NULL); 1006 1007 /* Put all the directory strings in an array. */ 1008 files->ndirs = ndirlist; 1009 for (unsigned int i = 0; i < ndirlist; ++i) 1010 dirs[i] = dirarray[i].dir; 1011 dirs[ndirlist] = NULL; 1012 1013 /* Pass the file data structure to the caller. */ 1014 if (filesp != NULL) 1015 *filesp = files; 1016 1017 size_t buf_size = (sizeof (Dwarf_Lines) 1018 + (sizeof (Dwarf_Line) * state.nlinelist)); 1019 void *buf = libdw_alloc (dbg, Dwarf_Lines, buf_size, 1); 1020 1021 /* First use the buffer for the pointers, and sort the entries. 1022 We'll write the pointers in the end of the buffer, and then 1023 copy into the buffer from the beginning so the overlap works. */ 1024 assert (sizeof (Dwarf_Line) >= sizeof (struct linelist *)); 1025 struct linelist **sortlines = (buf + buf_size 1026 - sizeof (struct linelist **) * state.nlinelist); 1027 1028 /* The list is in LIFO order and usually they come in clumps with 1029 ascending addresses. So fill from the back to probably start with 1030 runs already in order before we sort. */ 1031 struct linelist *lineslist = state.linelist; 1032 for (size_t i = state.nlinelist; i-- > 0; ) 1033 { 1034 sortlines[i] = lineslist; 1035 lineslist = lineslist->next; 1036 } 1037 assert (lineslist == NULL); 1038 1039 /* Sort by ascending address. */ 1040 qsort (sortlines, state.nlinelist, sizeof sortlines[0], &compare_lines); 1041 1042 /* Now that they are sorted, put them in the final array. 1043 The buffers overlap, so we've clobbered the early elements 1044 of SORTLINES by the time we're reading the later ones. */ 1045 Dwarf_Lines *lines = buf; 1046 lines->nlines = state.nlinelist; 1047 for (size_t i = 0; i < state.nlinelist; ++i) 1048 { 1049 lines->info[i] = sortlines[i]->line; 1050 lines->info[i].files = files; 1051 } 1052 1053 /* Make sure the highest address for the CU is marked as end_sequence. 1054 This is required by the DWARF spec, but some compilers forget and 1055 dwfl_module_getsrc depends on it. */ 1056 if (state.nlinelist > 0) 1057 lines->info[state.nlinelist - 1].end_sequence = 1; 1058 1059 /* Pass the line structure back to the caller. */ 1060 if (linesp != NULL) 1061 *linesp = lines; 1062 1063 /* Success. */ 1064 res = 0; 1065 1066 out: 1067 /* Free malloced line records, if any. */ 1068 for (size_t i = MAX_STACK_LINES; i < state.nlinelist; i++) 1069 { 1070 struct linelist *ll = state.linelist->next; 1071 free (state.linelist); 1072 state.linelist = ll; 1073 } 1074 if (dirarray != dirstack) 1075 free (dirarray); 1076 for (size_t i = MAX_STACK_FILES; i < nfilelist; i++) 1077 { 1078 struct filelist *fl = filelist->next; 1079 free (filelist); 1080 filelist = fl; 1081 } 1082 1083 return res; 1084 } 1085 1086 static int 1087 files_lines_compare (const void *p1, const void *p2) 1088 { 1089 const struct files_lines_s *t1 = p1; 1090 const struct files_lines_s *t2 = p2; 1091 1092 if (t1->debug_line_offset < t2->debug_line_offset) 1093 return -1; 1094 if (t1->debug_line_offset > t2->debug_line_offset) 1095 return 1; 1096 1097 return 0; 1098 } 1099 1100 int 1101 internal_function 1102 __libdw_getsrclines (Dwarf *dbg, Dwarf_Off debug_line_offset, 1103 const char *comp_dir, unsigned address_size, 1104 Dwarf_Lines **linesp, Dwarf_Files **filesp) 1105 { 1106 struct files_lines_s fake = { .debug_line_offset = debug_line_offset }; 1107 struct files_lines_s **found = tfind (&fake, &dbg->files_lines, 1108 files_lines_compare); 1109 if (found == NULL) 1110 { 1111 Elf_Data *data = __libdw_checked_get_data (dbg, IDX_debug_line); 1112 if (data == NULL 1113 || __libdw_offset_in_section (dbg, IDX_debug_line, 1114 debug_line_offset, 1) != 0) 1115 return -1; 1116 1117 const unsigned char *linep = data->d_buf + debug_line_offset; 1118 const unsigned char *lineendp = data->d_buf + data->d_size; 1119 1120 struct files_lines_s *node = libdw_alloc (dbg, struct files_lines_s, 1121 sizeof *node, 1); 1122 1123 if (read_srclines (dbg, linep, lineendp, comp_dir, address_size, 1124 &node->lines, &node->files) != 0) 1125 return -1; 1126 1127 node->debug_line_offset = debug_line_offset; 1128 1129 found = tsearch (node, &dbg->files_lines, files_lines_compare); 1130 if (found == NULL) 1131 { 1132 __libdw_seterrno (DWARF_E_NOMEM); 1133 return -1; 1134 } 1135 } 1136 1137 if (linesp != NULL) 1138 *linesp = (*found)->lines; 1139 1140 if (filesp != NULL) 1141 *filesp = (*found)->files; 1142 1143 return 0; 1144 } 1145 1146 /* Get the compilation directory, if any is set. */ 1147 const char * 1148 __libdw_getcompdir (Dwarf_Die *cudie) 1149 { 1150 Dwarf_Attribute compdir_attr_mem; 1151 Dwarf_Attribute *compdir_attr = INTUSE(dwarf_attr) (cudie, 1152 DW_AT_comp_dir, 1153 &compdir_attr_mem); 1154 return INTUSE(dwarf_formstring) (compdir_attr); 1155 } 1156 1157 int 1158 dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines) 1159 { 1160 if (cudie == NULL) 1161 return -1; 1162 if (! is_cudie (cudie)) 1163 { 1164 __libdw_seterrno (DWARF_E_NOT_CUDIE); 1165 return -1; 1166 } 1167 1168 /* Get the information if it is not already known. */ 1169 struct Dwarf_CU *const cu = cudie->cu; 1170 if (cu->lines == NULL) 1171 { 1172 /* For split units always pick the lines from the skeleton. */ 1173 if (cu->unit_type == DW_UT_split_compile 1174 || cu->unit_type == DW_UT_split_type) 1175 { 1176 /* We tries, assume we fail... */ 1177 cu->lines = (void *) -1l; 1178 1179 Dwarf_CU *skel = __libdw_find_split_unit (cu); 1180 if (skel != NULL) 1181 { 1182 Dwarf_Die skeldie = CUDIE (skel); 1183 int res = INTUSE(dwarf_getsrclines) (&skeldie, lines, nlines); 1184 if (res == 0) 1185 { 1186 cu->lines = skel->lines; 1187 *lines = cu->lines; 1188 *nlines = cu->lines->nlines; 1189 } 1190 return res; 1191 } 1192 1193 __libdw_seterrno (DWARF_E_NO_DEBUG_LINE); 1194 return -1; 1195 } 1196 1197 /* Failsafe mode: no data found. */ 1198 cu->lines = (void *) -1l; 1199 cu->files = (void *) -1l; 1200 1201 /* The die must have a statement list associated. */ 1202 Dwarf_Attribute stmt_list_mem; 1203 Dwarf_Attribute *stmt_list = INTUSE(dwarf_attr) (cudie, DW_AT_stmt_list, 1204 &stmt_list_mem); 1205 1206 /* Get the offset into the .debug_line section. NB: this call 1207 also checks whether the previous dwarf_attr call failed. */ 1208 Dwarf_Off debug_line_offset; 1209 if (__libdw_formptr (stmt_list, IDX_debug_line, DWARF_E_NO_DEBUG_LINE, 1210 NULL, &debug_line_offset) == NULL) 1211 return -1; 1212 1213 if (__libdw_getsrclines (cu->dbg, debug_line_offset, 1214 __libdw_getcompdir (cudie), 1215 cu->address_size, &cu->lines, &cu->files) < 0) 1216 return -1; 1217 } 1218 else if (cu->lines == (void *) -1l) 1219 return -1; 1220 1221 *lines = cu->lines; 1222 *nlines = cu->lines->nlines; 1223 1224 // XXX Eventually: unlocking here. 1225 1226 return 0; 1227 } 1228 INTDEF(dwarf_getsrclines) 1229