1 /* 2 * dwarf-aux.c : libdw auxiliary interfaces 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 * 18 */ 19 20 #include <stdbool.h> 21 #include "util.h" 22 #include "debug.h" 23 #include "dwarf-aux.h" 24 25 /** 26 * cu_find_realpath - Find the realpath of the target file 27 * @cu_die: A DIE(dwarf information entry) of CU(compilation Unit) 28 * @fname: The tail filename of the target file 29 * 30 * Find the real(long) path of @fname in @cu_die. 31 */ 32 const char *cu_find_realpath(Dwarf_Die *cu_die, const char *fname) 33 { 34 Dwarf_Files *files; 35 size_t nfiles, i; 36 const char *src = NULL; 37 int ret; 38 39 if (!fname) 40 return NULL; 41 42 ret = dwarf_getsrcfiles(cu_die, &files, &nfiles); 43 if (ret != 0) 44 return NULL; 45 46 for (i = 0; i < nfiles; i++) { 47 src = dwarf_filesrc(files, i, NULL, NULL); 48 if (strtailcmp(src, fname) == 0) 49 break; 50 } 51 if (i == nfiles) 52 return NULL; 53 return src; 54 } 55 56 /** 57 * cu_get_comp_dir - Get the path of compilation directory 58 * @cu_die: a CU DIE 59 * 60 * Get the path of compilation directory of given @cu_die. 61 * Since this depends on DW_AT_comp_dir, older gcc will not 62 * embedded it. In that case, this returns NULL. 63 */ 64 const char *cu_get_comp_dir(Dwarf_Die *cu_die) 65 { 66 Dwarf_Attribute attr; 67 if (dwarf_attr(cu_die, DW_AT_comp_dir, &attr) == NULL) 68 return NULL; 69 return dwarf_formstring(&attr); 70 } 71 72 /** 73 * cu_find_lineinfo - Get a line number and file name for given address 74 * @cu_die: a CU DIE 75 * @addr: An address 76 * @fname: a pointer which returns the file name string 77 * @lineno: a pointer which returns the line number 78 * 79 * Find a line number and file name for @addr in @cu_die. 80 */ 81 int cu_find_lineinfo(Dwarf_Die *cu_die, unsigned long addr, 82 const char **fname, int *lineno) 83 { 84 Dwarf_Line *line; 85 Dwarf_Addr laddr; 86 87 line = dwarf_getsrc_die(cu_die, (Dwarf_Addr)addr); 88 if (line && dwarf_lineaddr(line, &laddr) == 0 && 89 addr == (unsigned long)laddr && dwarf_lineno(line, lineno) == 0) { 90 *fname = dwarf_linesrc(line, NULL, NULL); 91 if (!*fname) 92 /* line number is useless without filename */ 93 *lineno = 0; 94 } 95 96 return *lineno ?: -ENOENT; 97 } 98 99 static int __die_find_inline_cb(Dwarf_Die *die_mem, void *data); 100 101 /** 102 * cu_walk_functions_at - Walk on function DIEs at given address 103 * @cu_die: A CU DIE 104 * @addr: An address 105 * @callback: A callback which called with found DIEs 106 * @data: A user data 107 * 108 * Walk on function DIEs at given @addr in @cu_die. Passed DIEs 109 * should be subprogram or inlined-subroutines. 110 */ 111 int cu_walk_functions_at(Dwarf_Die *cu_die, Dwarf_Addr addr, 112 int (*callback)(Dwarf_Die *, void *), void *data) 113 { 114 Dwarf_Die die_mem; 115 Dwarf_Die *sc_die; 116 int ret = -ENOENT; 117 118 /* Inlined function could be recursive. Trace it until fail */ 119 for (sc_die = die_find_realfunc(cu_die, addr, &die_mem); 120 sc_die != NULL; 121 sc_die = die_find_child(sc_die, __die_find_inline_cb, &addr, 122 &die_mem)) { 123 ret = callback(sc_die, data); 124 if (ret) 125 break; 126 } 127 128 return ret; 129 130 } 131 132 /** 133 * die_get_linkage_name - Get the linkage name of the object 134 * @dw_die: A DIE of the object 135 * 136 * Get the linkage name attiribute of given @dw_die. 137 * For C++ binary, the linkage name will be the mangled symbol. 138 */ 139 const char *die_get_linkage_name(Dwarf_Die *dw_die) 140 { 141 Dwarf_Attribute attr; 142 143 if (dwarf_attr_integrate(dw_die, DW_AT_linkage_name, &attr) == NULL) 144 return NULL; 145 return dwarf_formstring(&attr); 146 } 147 148 /** 149 * die_compare_name - Compare diename and tname 150 * @dw_die: a DIE 151 * @tname: a string of target name 152 * 153 * Compare the name of @dw_die and @tname. Return false if @dw_die has no name. 154 */ 155 bool die_compare_name(Dwarf_Die *dw_die, const char *tname) 156 { 157 const char *name; 158 159 name = dwarf_diename(dw_die); 160 return name ? (strcmp(tname, name) == 0) : false; 161 } 162 163 /** 164 * die_match_name - Match diename/linkage name and glob 165 * @dw_die: a DIE 166 * @glob: a string of target glob pattern 167 * 168 * Glob matching the name of @dw_die and @glob. Return false if matching fail. 169 * This also match linkage name. 170 */ 171 bool die_match_name(Dwarf_Die *dw_die, const char *glob) 172 { 173 const char *name; 174 175 name = dwarf_diename(dw_die); 176 if (name && strglobmatch(name, glob)) 177 return true; 178 /* fall back to check linkage name */ 179 name = die_get_linkage_name(dw_die); 180 if (name && strglobmatch(name, glob)) 181 return true; 182 183 return false; 184 } 185 186 /** 187 * die_get_call_lineno - Get callsite line number of inline-function instance 188 * @in_die: a DIE of an inlined function instance 189 * 190 * Get call-site line number of @in_die. This means from where the inline 191 * function is called. 192 */ 193 int die_get_call_lineno(Dwarf_Die *in_die) 194 { 195 Dwarf_Attribute attr; 196 Dwarf_Word ret; 197 198 if (!dwarf_attr(in_die, DW_AT_call_line, &attr)) 199 return -ENOENT; 200 201 dwarf_formudata(&attr, &ret); 202 return (int)ret; 203 } 204 205 /** 206 * die_get_type - Get type DIE 207 * @vr_die: a DIE of a variable 208 * @die_mem: where to store a type DIE 209 * 210 * Get a DIE of the type of given variable (@vr_die), and store 211 * it to die_mem. Return NULL if fails to get a type DIE. 212 */ 213 Dwarf_Die *die_get_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) 214 { 215 Dwarf_Attribute attr; 216 217 if (dwarf_attr_integrate(vr_die, DW_AT_type, &attr) && 218 dwarf_formref_die(&attr, die_mem)) 219 return die_mem; 220 else 221 return NULL; 222 } 223 224 /* Get a type die, but skip qualifiers */ 225 static Dwarf_Die *__die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) 226 { 227 int tag; 228 229 do { 230 vr_die = die_get_type(vr_die, die_mem); 231 if (!vr_die) 232 break; 233 tag = dwarf_tag(vr_die); 234 } while (tag == DW_TAG_const_type || 235 tag == DW_TAG_restrict_type || 236 tag == DW_TAG_volatile_type || 237 tag == DW_TAG_shared_type); 238 239 return vr_die; 240 } 241 242 /** 243 * die_get_real_type - Get a type die, but skip qualifiers and typedef 244 * @vr_die: a DIE of a variable 245 * @die_mem: where to store a type DIE 246 * 247 * Get a DIE of the type of given variable (@vr_die), and store 248 * it to die_mem. Return NULL if fails to get a type DIE. 249 * If the type is qualifiers (e.g. const) or typedef, this skips it 250 * and tries to find real type (structure or basic types, e.g. int). 251 */ 252 Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem) 253 { 254 do { 255 vr_die = __die_get_real_type(vr_die, die_mem); 256 } while (vr_die && dwarf_tag(vr_die) == DW_TAG_typedef); 257 258 return vr_die; 259 } 260 261 /* Get attribute and translate it as a udata */ 262 static int die_get_attr_udata(Dwarf_Die *tp_die, unsigned int attr_name, 263 Dwarf_Word *result) 264 { 265 Dwarf_Attribute attr; 266 267 if (dwarf_attr(tp_die, attr_name, &attr) == NULL || 268 dwarf_formudata(&attr, result) != 0) 269 return -ENOENT; 270 271 return 0; 272 } 273 274 /* Get attribute and translate it as a sdata */ 275 static int die_get_attr_sdata(Dwarf_Die *tp_die, unsigned int attr_name, 276 Dwarf_Sword *result) 277 { 278 Dwarf_Attribute attr; 279 280 if (dwarf_attr(tp_die, attr_name, &attr) == NULL || 281 dwarf_formsdata(&attr, result) != 0) 282 return -ENOENT; 283 284 return 0; 285 } 286 287 /** 288 * die_is_signed_type - Check whether a type DIE is signed or not 289 * @tp_die: a DIE of a type 290 * 291 * Get the encoding of @tp_die and return true if the encoding 292 * is signed. 293 */ 294 bool die_is_signed_type(Dwarf_Die *tp_die) 295 { 296 Dwarf_Word ret; 297 298 if (die_get_attr_udata(tp_die, DW_AT_encoding, &ret)) 299 return false; 300 301 return (ret == DW_ATE_signed_char || ret == DW_ATE_signed || 302 ret == DW_ATE_signed_fixed); 303 } 304 305 /** 306 * die_is_func_def - Ensure that this DIE is a subprogram and definition 307 * @dw_die: a DIE 308 * 309 * Ensure that this DIE is a subprogram and NOT a declaration. This 310 * returns true if @dw_die is a function definition. 311 **/ 312 bool die_is_func_def(Dwarf_Die *dw_die) 313 { 314 Dwarf_Attribute attr; 315 316 return (dwarf_tag(dw_die) == DW_TAG_subprogram && 317 dwarf_attr(dw_die, DW_AT_declaration, &attr) == NULL); 318 } 319 320 /** 321 * die_is_func_instance - Ensure that this DIE is an instance of a subprogram 322 * @dw_die: a DIE 323 * 324 * Ensure that this DIE is an instance (which has an entry address). 325 * This returns true if @dw_die is a function instance. If not, you need to 326 * call die_walk_instances() to find actual instances. 327 **/ 328 bool die_is_func_instance(Dwarf_Die *dw_die) 329 { 330 Dwarf_Addr tmp; 331 332 /* Actually gcc optimizes non-inline as like as inlined */ 333 return !dwarf_func_inline(dw_die) && dwarf_entrypc(dw_die, &tmp) == 0; 334 } 335 /** 336 * die_get_data_member_location - Get the data-member offset 337 * @mb_die: a DIE of a member of a data structure 338 * @offs: The offset of the member in the data structure 339 * 340 * Get the offset of @mb_die in the data structure including @mb_die, and 341 * stores result offset to @offs. If any error occurs this returns errno. 342 */ 343 int die_get_data_member_location(Dwarf_Die *mb_die, Dwarf_Word *offs) 344 { 345 Dwarf_Attribute attr; 346 Dwarf_Op *expr; 347 size_t nexpr; 348 int ret; 349 350 if (dwarf_attr(mb_die, DW_AT_data_member_location, &attr) == NULL) 351 return -ENOENT; 352 353 if (dwarf_formudata(&attr, offs) != 0) { 354 /* DW_AT_data_member_location should be DW_OP_plus_uconst */ 355 ret = dwarf_getlocation(&attr, &expr, &nexpr); 356 if (ret < 0 || nexpr == 0) 357 return -ENOENT; 358 359 if (expr[0].atom != DW_OP_plus_uconst || nexpr != 1) { 360 pr_debug("Unable to get offset:Unexpected OP %x (%zd)\n", 361 expr[0].atom, nexpr); 362 return -ENOTSUP; 363 } 364 *offs = (Dwarf_Word)expr[0].number; 365 } 366 return 0; 367 } 368 369 /* Get the call file index number in CU DIE */ 370 static int die_get_call_fileno(Dwarf_Die *in_die) 371 { 372 Dwarf_Sword idx; 373 374 if (die_get_attr_sdata(in_die, DW_AT_call_file, &idx) == 0) 375 return (int)idx; 376 else 377 return -ENOENT; 378 } 379 380 /* Get the declared file index number in CU DIE */ 381 static int die_get_decl_fileno(Dwarf_Die *pdie) 382 { 383 Dwarf_Sword idx; 384 385 if (die_get_attr_sdata(pdie, DW_AT_decl_file, &idx) == 0) 386 return (int)idx; 387 else 388 return -ENOENT; 389 } 390 391 /** 392 * die_get_call_file - Get callsite file name of inlined function instance 393 * @in_die: a DIE of an inlined function instance 394 * 395 * Get call-site file name of @in_die. This means from which file the inline 396 * function is called. 397 */ 398 const char *die_get_call_file(Dwarf_Die *in_die) 399 { 400 Dwarf_Die cu_die; 401 Dwarf_Files *files; 402 int idx; 403 404 idx = die_get_call_fileno(in_die); 405 if (idx < 0 || !dwarf_diecu(in_die, &cu_die, NULL, NULL) || 406 dwarf_getsrcfiles(&cu_die, &files, NULL) != 0) 407 return NULL; 408 409 return dwarf_filesrc(files, idx, NULL, NULL); 410 } 411 412 413 /** 414 * die_find_child - Generic DIE search function in DIE tree 415 * @rt_die: a root DIE 416 * @callback: a callback function 417 * @data: a user data passed to the callback function 418 * @die_mem: a buffer for result DIE 419 * 420 * Trace DIE tree from @rt_die and call @callback for each child DIE. 421 * If @callback returns DIE_FIND_CB_END, this stores the DIE into 422 * @die_mem and returns it. If @callback returns DIE_FIND_CB_CONTINUE, 423 * this continues to trace the tree. Optionally, @callback can return 424 * DIE_FIND_CB_CHILD and DIE_FIND_CB_SIBLING, those means trace only 425 * the children and trace only the siblings respectively. 426 * Returns NULL if @callback can't find any appropriate DIE. 427 */ 428 Dwarf_Die *die_find_child(Dwarf_Die *rt_die, 429 int (*callback)(Dwarf_Die *, void *), 430 void *data, Dwarf_Die *die_mem) 431 { 432 Dwarf_Die child_die; 433 int ret; 434 435 ret = dwarf_child(rt_die, die_mem); 436 if (ret != 0) 437 return NULL; 438 439 do { 440 ret = callback(die_mem, data); 441 if (ret == DIE_FIND_CB_END) 442 return die_mem; 443 444 if ((ret & DIE_FIND_CB_CHILD) && 445 die_find_child(die_mem, callback, data, &child_die)) { 446 memcpy(die_mem, &child_die, sizeof(Dwarf_Die)); 447 return die_mem; 448 } 449 } while ((ret & DIE_FIND_CB_SIBLING) && 450 dwarf_siblingof(die_mem, die_mem) == 0); 451 452 return NULL; 453 } 454 455 struct __addr_die_search_param { 456 Dwarf_Addr addr; 457 Dwarf_Die *die_mem; 458 }; 459 460 static int __die_search_func_tail_cb(Dwarf_Die *fn_die, void *data) 461 { 462 struct __addr_die_search_param *ad = data; 463 Dwarf_Addr addr = 0; 464 465 if (dwarf_tag(fn_die) == DW_TAG_subprogram && 466 !dwarf_highpc(fn_die, &addr) && 467 addr == ad->addr) { 468 memcpy(ad->die_mem, fn_die, sizeof(Dwarf_Die)); 469 return DWARF_CB_ABORT; 470 } 471 return DWARF_CB_OK; 472 } 473 474 /** 475 * die_find_tailfunc - Search for a non-inlined function with tail call at 476 * given address 477 * @cu_die: a CU DIE which including @addr 478 * @addr: target address 479 * @die_mem: a buffer for result DIE 480 * 481 * Search for a non-inlined function DIE with tail call at @addr. Stores the 482 * DIE to @die_mem and returns it if found. Returns NULL if failed. 483 */ 484 Dwarf_Die *die_find_tailfunc(Dwarf_Die *cu_die, Dwarf_Addr addr, 485 Dwarf_Die *die_mem) 486 { 487 struct __addr_die_search_param ad; 488 ad.addr = addr; 489 ad.die_mem = die_mem; 490 /* dwarf_getscopes can't find subprogram. */ 491 if (!dwarf_getfuncs(cu_die, __die_search_func_tail_cb, &ad, 0)) 492 return NULL; 493 else 494 return die_mem; 495 } 496 497 /* die_find callback for non-inlined function search */ 498 static int __die_search_func_cb(Dwarf_Die *fn_die, void *data) 499 { 500 struct __addr_die_search_param *ad = data; 501 502 /* 503 * Since a declaration entry doesn't has given pc, this always returns 504 * function definition entry. 505 */ 506 if (dwarf_tag(fn_die) == DW_TAG_subprogram && 507 dwarf_haspc(fn_die, ad->addr)) { 508 memcpy(ad->die_mem, fn_die, sizeof(Dwarf_Die)); 509 return DWARF_CB_ABORT; 510 } 511 return DWARF_CB_OK; 512 } 513 514 /** 515 * die_find_realfunc - Search a non-inlined function at given address 516 * @cu_die: a CU DIE which including @addr 517 * @addr: target address 518 * @die_mem: a buffer for result DIE 519 * 520 * Search a non-inlined function DIE which includes @addr. Stores the 521 * DIE to @die_mem and returns it if found. Returns NULL if failed. 522 */ 523 Dwarf_Die *die_find_realfunc(Dwarf_Die *cu_die, Dwarf_Addr addr, 524 Dwarf_Die *die_mem) 525 { 526 struct __addr_die_search_param ad; 527 ad.addr = addr; 528 ad.die_mem = die_mem; 529 /* dwarf_getscopes can't find subprogram. */ 530 if (!dwarf_getfuncs(cu_die, __die_search_func_cb, &ad, 0)) 531 return NULL; 532 else 533 return die_mem; 534 } 535 536 /* die_find callback for inline function search */ 537 static int __die_find_inline_cb(Dwarf_Die *die_mem, void *data) 538 { 539 Dwarf_Addr *addr = data; 540 541 if (dwarf_tag(die_mem) == DW_TAG_inlined_subroutine && 542 dwarf_haspc(die_mem, *addr)) 543 return DIE_FIND_CB_END; 544 545 return DIE_FIND_CB_CONTINUE; 546 } 547 548 /** 549 * die_find_top_inlinefunc - Search the top inlined function at given address 550 * @sp_die: a subprogram DIE which including @addr 551 * @addr: target address 552 * @die_mem: a buffer for result DIE 553 * 554 * Search an inlined function DIE which includes @addr. Stores the 555 * DIE to @die_mem and returns it if found. Returns NULL if failed. 556 * Even if several inlined functions are expanded recursively, this 557 * doesn't trace it down, and returns the topmost one. 558 */ 559 Dwarf_Die *die_find_top_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr, 560 Dwarf_Die *die_mem) 561 { 562 return die_find_child(sp_die, __die_find_inline_cb, &addr, die_mem); 563 } 564 565 /** 566 * die_find_inlinefunc - Search an inlined function at given address 567 * @sp_die: a subprogram DIE which including @addr 568 * @addr: target address 569 * @die_mem: a buffer for result DIE 570 * 571 * Search an inlined function DIE which includes @addr. Stores the 572 * DIE to @die_mem and returns it if found. Returns NULL if failed. 573 * If several inlined functions are expanded recursively, this trace 574 * it down and returns deepest one. 575 */ 576 Dwarf_Die *die_find_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr, 577 Dwarf_Die *die_mem) 578 { 579 Dwarf_Die tmp_die; 580 581 sp_die = die_find_child(sp_die, __die_find_inline_cb, &addr, &tmp_die); 582 if (!sp_die) 583 return NULL; 584 585 /* Inlined function could be recursive. Trace it until fail */ 586 while (sp_die) { 587 memcpy(die_mem, sp_die, sizeof(Dwarf_Die)); 588 sp_die = die_find_child(sp_die, __die_find_inline_cb, &addr, 589 &tmp_die); 590 } 591 592 return die_mem; 593 } 594 595 struct __instance_walk_param { 596 void *addr; 597 int (*callback)(Dwarf_Die *, void *); 598 void *data; 599 int retval; 600 }; 601 602 static int __die_walk_instances_cb(Dwarf_Die *inst, void *data) 603 { 604 struct __instance_walk_param *iwp = data; 605 Dwarf_Attribute attr_mem; 606 Dwarf_Die origin_mem; 607 Dwarf_Attribute *attr; 608 Dwarf_Die *origin; 609 int tmp; 610 611 attr = dwarf_attr(inst, DW_AT_abstract_origin, &attr_mem); 612 if (attr == NULL) 613 return DIE_FIND_CB_CONTINUE; 614 615 origin = dwarf_formref_die(attr, &origin_mem); 616 if (origin == NULL || origin->addr != iwp->addr) 617 return DIE_FIND_CB_CONTINUE; 618 619 /* Ignore redundant instances */ 620 if (dwarf_tag(inst) == DW_TAG_inlined_subroutine) { 621 dwarf_decl_line(origin, &tmp); 622 if (die_get_call_lineno(inst) == tmp) { 623 tmp = die_get_decl_fileno(origin); 624 if (die_get_call_fileno(inst) == tmp) 625 return DIE_FIND_CB_CONTINUE; 626 } 627 } 628 629 iwp->retval = iwp->callback(inst, iwp->data); 630 631 return (iwp->retval) ? DIE_FIND_CB_END : DIE_FIND_CB_CONTINUE; 632 } 633 634 /** 635 * die_walk_instances - Walk on instances of given DIE 636 * @or_die: an abstract original DIE 637 * @callback: a callback function which is called with instance DIE 638 * @data: user data 639 * 640 * Walk on the instances of give @in_die. @in_die must be an inlined function 641 * declartion. This returns the return value of @callback if it returns 642 * non-zero value, or -ENOENT if there is no instance. 643 */ 644 int die_walk_instances(Dwarf_Die *or_die, int (*callback)(Dwarf_Die *, void *), 645 void *data) 646 { 647 Dwarf_Die cu_die; 648 Dwarf_Die die_mem; 649 struct __instance_walk_param iwp = { 650 .addr = or_die->addr, 651 .callback = callback, 652 .data = data, 653 .retval = -ENOENT, 654 }; 655 656 if (dwarf_diecu(or_die, &cu_die, NULL, NULL) == NULL) 657 return -ENOENT; 658 659 die_find_child(&cu_die, __die_walk_instances_cb, &iwp, &die_mem); 660 661 return iwp.retval; 662 } 663 664 /* Line walker internal parameters */ 665 struct __line_walk_param { 666 bool recursive; 667 line_walk_callback_t callback; 668 void *data; 669 int retval; 670 }; 671 672 static int __die_walk_funclines_cb(Dwarf_Die *in_die, void *data) 673 { 674 struct __line_walk_param *lw = data; 675 Dwarf_Addr addr = 0; 676 const char *fname; 677 int lineno; 678 679 if (dwarf_tag(in_die) == DW_TAG_inlined_subroutine) { 680 fname = die_get_call_file(in_die); 681 lineno = die_get_call_lineno(in_die); 682 if (fname && lineno > 0 && dwarf_entrypc(in_die, &addr) == 0) { 683 lw->retval = lw->callback(fname, lineno, addr, lw->data); 684 if (lw->retval != 0) 685 return DIE_FIND_CB_END; 686 } 687 } 688 if (!lw->recursive) 689 /* Don't need to search recursively */ 690 return DIE_FIND_CB_SIBLING; 691 692 if (addr) { 693 fname = dwarf_decl_file(in_die); 694 if (fname && dwarf_decl_line(in_die, &lineno) == 0) { 695 lw->retval = lw->callback(fname, lineno, addr, lw->data); 696 if (lw->retval != 0) 697 return DIE_FIND_CB_END; 698 } 699 } 700 701 /* Continue to search nested inlined function call-sites */ 702 return DIE_FIND_CB_CONTINUE; 703 } 704 705 /* Walk on lines of blocks included in given DIE */ 706 static int __die_walk_funclines(Dwarf_Die *sp_die, bool recursive, 707 line_walk_callback_t callback, void *data) 708 { 709 struct __line_walk_param lw = { 710 .recursive = recursive, 711 .callback = callback, 712 .data = data, 713 .retval = 0, 714 }; 715 Dwarf_Die die_mem; 716 Dwarf_Addr addr; 717 const char *fname; 718 int lineno; 719 720 /* Handle function declaration line */ 721 fname = dwarf_decl_file(sp_die); 722 if (fname && dwarf_decl_line(sp_die, &lineno) == 0 && 723 dwarf_entrypc(sp_die, &addr) == 0) { 724 lw.retval = callback(fname, lineno, addr, data); 725 if (lw.retval != 0) 726 goto done; 727 } 728 die_find_child(sp_die, __die_walk_funclines_cb, &lw, &die_mem); 729 done: 730 return lw.retval; 731 } 732 733 static int __die_walk_culines_cb(Dwarf_Die *sp_die, void *data) 734 { 735 struct __line_walk_param *lw = data; 736 737 lw->retval = __die_walk_funclines(sp_die, true, lw->callback, lw->data); 738 if (lw->retval != 0) 739 return DWARF_CB_ABORT; 740 741 return DWARF_CB_OK; 742 } 743 744 /** 745 * die_walk_lines - Walk on lines inside given DIE 746 * @rt_die: a root DIE (CU, subprogram or inlined_subroutine) 747 * @callback: callback routine 748 * @data: user data 749 * 750 * Walk on all lines inside given @rt_die and call @callback on each line. 751 * If the @rt_die is a function, walk only on the lines inside the function, 752 * otherwise @rt_die must be a CU DIE. 753 * Note that this walks not only dwarf line list, but also function entries 754 * and inline call-site. 755 */ 756 int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) 757 { 758 Dwarf_Lines *lines; 759 Dwarf_Line *line; 760 Dwarf_Addr addr; 761 const char *fname, *decf = NULL; 762 int lineno, ret = 0; 763 int decl = 0, inl; 764 Dwarf_Die die_mem, *cu_die; 765 size_t nlines, i; 766 767 /* Get the CU die */ 768 if (dwarf_tag(rt_die) != DW_TAG_compile_unit) { 769 cu_die = dwarf_diecu(rt_die, &die_mem, NULL, NULL); 770 dwarf_decl_line(rt_die, &decl); 771 decf = dwarf_decl_file(rt_die); 772 } else 773 cu_die = rt_die; 774 if (!cu_die) { 775 pr_debug2("Failed to get CU from given DIE.\n"); 776 return -EINVAL; 777 } 778 779 /* Get lines list in the CU */ 780 if (dwarf_getsrclines(cu_die, &lines, &nlines) != 0) { 781 pr_debug2("Failed to get source lines on this CU.\n"); 782 return -ENOENT; 783 } 784 pr_debug2("Get %zd lines from this CU\n", nlines); 785 786 /* Walk on the lines on lines list */ 787 for (i = 0; i < nlines; i++) { 788 line = dwarf_onesrcline(lines, i); 789 if (line == NULL || 790 dwarf_lineno(line, &lineno) != 0 || 791 dwarf_lineaddr(line, &addr) != 0) { 792 pr_debug2("Failed to get line info. " 793 "Possible error in debuginfo.\n"); 794 continue; 795 } 796 /* Filter lines based on address */ 797 if (rt_die != cu_die) { 798 /* 799 * Address filtering 800 * The line is included in given function, and 801 * no inline block includes it. 802 */ 803 if (!dwarf_haspc(rt_die, addr)) 804 continue; 805 if (die_find_inlinefunc(rt_die, addr, &die_mem)) { 806 dwarf_decl_line(&die_mem, &inl); 807 if (inl != decl || 808 decf != dwarf_decl_file(&die_mem)) 809 continue; 810 } 811 } 812 /* Get source line */ 813 fname = dwarf_linesrc(line, NULL, NULL); 814 815 ret = callback(fname, lineno, addr, data); 816 if (ret != 0) 817 return ret; 818 } 819 820 /* 821 * Dwarf lines doesn't include function declarations and inlined 822 * subroutines. We have to check functions list or given function. 823 */ 824 if (rt_die != cu_die) 825 /* 826 * Don't need walk functions recursively, because nested 827 * inlined functions don't have lines of the specified DIE. 828 */ 829 ret = __die_walk_funclines(rt_die, false, callback, data); 830 else { 831 struct __line_walk_param param = { 832 .callback = callback, 833 .data = data, 834 .retval = 0, 835 }; 836 dwarf_getfuncs(cu_die, __die_walk_culines_cb, ¶m, 0); 837 ret = param.retval; 838 } 839 840 return ret; 841 } 842 843 struct __find_variable_param { 844 const char *name; 845 Dwarf_Addr addr; 846 }; 847 848 static int __die_find_variable_cb(Dwarf_Die *die_mem, void *data) 849 { 850 struct __find_variable_param *fvp = data; 851 Dwarf_Attribute attr; 852 int tag; 853 854 tag = dwarf_tag(die_mem); 855 if ((tag == DW_TAG_formal_parameter || 856 tag == DW_TAG_variable) && 857 die_compare_name(die_mem, fvp->name) && 858 /* Does the DIE have location information or external instance? */ 859 (dwarf_attr(die_mem, DW_AT_external, &attr) || 860 dwarf_attr(die_mem, DW_AT_location, &attr))) 861 return DIE_FIND_CB_END; 862 if (dwarf_haspc(die_mem, fvp->addr)) 863 return DIE_FIND_CB_CONTINUE; 864 else 865 return DIE_FIND_CB_SIBLING; 866 } 867 868 /** 869 * die_find_variable_at - Find a given name variable at given address 870 * @sp_die: a function DIE 871 * @name: variable name 872 * @addr: address 873 * @die_mem: a buffer for result DIE 874 * 875 * Find a variable DIE called @name at @addr in @sp_die. 876 */ 877 Dwarf_Die *die_find_variable_at(Dwarf_Die *sp_die, const char *name, 878 Dwarf_Addr addr, Dwarf_Die *die_mem) 879 { 880 struct __find_variable_param fvp = { .name = name, .addr = addr}; 881 882 return die_find_child(sp_die, __die_find_variable_cb, (void *)&fvp, 883 die_mem); 884 } 885 886 static int __die_find_member_cb(Dwarf_Die *die_mem, void *data) 887 { 888 const char *name = data; 889 890 if (dwarf_tag(die_mem) == DW_TAG_member) { 891 if (die_compare_name(die_mem, name)) 892 return DIE_FIND_CB_END; 893 else if (!dwarf_diename(die_mem)) { /* Unnamed structure */ 894 Dwarf_Die type_die, tmp_die; 895 if (die_get_type(die_mem, &type_die) && 896 die_find_member(&type_die, name, &tmp_die)) 897 return DIE_FIND_CB_END; 898 } 899 } 900 return DIE_FIND_CB_SIBLING; 901 } 902 903 /** 904 * die_find_member - Find a given name member in a data structure 905 * @st_die: a data structure type DIE 906 * @name: member name 907 * @die_mem: a buffer for result DIE 908 * 909 * Find a member DIE called @name in @st_die. 910 */ 911 Dwarf_Die *die_find_member(Dwarf_Die *st_die, const char *name, 912 Dwarf_Die *die_mem) 913 { 914 return die_find_child(st_die, __die_find_member_cb, (void *)name, 915 die_mem); 916 } 917 918 /** 919 * die_get_typename - Get the name of given variable DIE 920 * @vr_die: a variable DIE 921 * @buf: a strbuf for result type name 922 * 923 * Get the name of @vr_die and stores it to @buf. Return 0 if succeeded. 924 * and Return -ENOENT if failed to find type name. 925 * Note that the result will stores typedef name if possible, and stores 926 * "*(function_type)" if the type is a function pointer. 927 */ 928 int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf) 929 { 930 Dwarf_Die type; 931 int tag, ret; 932 const char *tmp = ""; 933 934 if (__die_get_real_type(vr_die, &type) == NULL) 935 return -ENOENT; 936 937 tag = dwarf_tag(&type); 938 if (tag == DW_TAG_array_type || tag == DW_TAG_pointer_type) 939 tmp = "*"; 940 else if (tag == DW_TAG_subroutine_type) { 941 /* Function pointer */ 942 return strbuf_add(buf, "(function_type)", 15); 943 } else { 944 if (!dwarf_diename(&type)) 945 return -ENOENT; 946 if (tag == DW_TAG_union_type) 947 tmp = "union "; 948 else if (tag == DW_TAG_structure_type) 949 tmp = "struct "; 950 else if (tag == DW_TAG_enumeration_type) 951 tmp = "enum "; 952 /* Write a base name */ 953 return strbuf_addf(buf, "%s%s", tmp, dwarf_diename(&type)); 954 } 955 ret = die_get_typename(&type, buf); 956 return ret ? ret : strbuf_addstr(buf, tmp); 957 } 958 959 /** 960 * die_get_varname - Get the name and type of given variable DIE 961 * @vr_die: a variable DIE 962 * @buf: a strbuf for type and variable name 963 * 964 * Get the name and type of @vr_die and stores it in @buf as "type\tname". 965 */ 966 int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf) 967 { 968 int ret; 969 970 ret = die_get_typename(vr_die, buf); 971 if (ret < 0) { 972 pr_debug("Failed to get type, make it unknown.\n"); 973 ret = strbuf_add(buf, " (unknown_type)", 14); 974 } 975 976 return ret < 0 ? ret : strbuf_addf(buf, "\t%s", dwarf_diename(vr_die)); 977 } 978 979 #ifdef HAVE_DWARF_GETLOCATIONS 980 /** 981 * die_get_var_innermost_scope - Get innermost scope range of given variable DIE 982 * @sp_die: a subprogram DIE 983 * @vr_die: a variable DIE 984 * @buf: a strbuf for variable byte offset range 985 * 986 * Get the innermost scope range of @vr_die and stores it in @buf as 987 * "@<function_name+[NN-NN,NN-NN]>". 988 */ 989 static int die_get_var_innermost_scope(Dwarf_Die *sp_die, Dwarf_Die *vr_die, 990 struct strbuf *buf) 991 { 992 Dwarf_Die *scopes; 993 int count; 994 size_t offset = 0; 995 Dwarf_Addr base; 996 Dwarf_Addr start, end; 997 Dwarf_Addr entry; 998 int ret; 999 bool first = true; 1000 const char *name; 1001 1002 ret = dwarf_entrypc(sp_die, &entry); 1003 if (ret) 1004 return ret; 1005 1006 name = dwarf_diename(sp_die); 1007 if (!name) 1008 return -ENOENT; 1009 1010 count = dwarf_getscopes_die(vr_die, &scopes); 1011 1012 /* (*SCOPES)[1] is the DIE for the scope containing that scope */ 1013 if (count <= 1) { 1014 ret = -EINVAL; 1015 goto out; 1016 } 1017 1018 while ((offset = dwarf_ranges(&scopes[1], offset, &base, 1019 &start, &end)) > 0) { 1020 start -= entry; 1021 end -= entry; 1022 1023 if (first) { 1024 ret = strbuf_addf(buf, "@<%s+[%" PRIu64 "-%" PRIu64, 1025 name, start, end); 1026 first = false; 1027 } else { 1028 ret = strbuf_addf(buf, ",%" PRIu64 "-%" PRIu64, 1029 start, end); 1030 } 1031 if (ret < 0) 1032 goto out; 1033 } 1034 1035 if (!first) 1036 ret = strbuf_add(buf, "]>", 2); 1037 1038 out: 1039 free(scopes); 1040 return ret; 1041 } 1042 1043 /** 1044 * die_get_var_range - Get byte offset range of given variable DIE 1045 * @sp_die: a subprogram DIE 1046 * @vr_die: a variable DIE 1047 * @buf: a strbuf for type and variable name and byte offset range 1048 * 1049 * Get the byte offset range of @vr_die and stores it in @buf as 1050 * "@<function_name+[NN-NN,NN-NN]>". 1051 */ 1052 int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die *vr_die, struct strbuf *buf) 1053 { 1054 int ret = 0; 1055 Dwarf_Addr base; 1056 Dwarf_Addr start, end; 1057 Dwarf_Addr entry; 1058 Dwarf_Op *op; 1059 size_t nops; 1060 size_t offset = 0; 1061 Dwarf_Attribute attr; 1062 bool first = true; 1063 const char *name; 1064 1065 ret = dwarf_entrypc(sp_die, &entry); 1066 if (ret) 1067 return ret; 1068 1069 name = dwarf_diename(sp_die); 1070 if (!name) 1071 return -ENOENT; 1072 1073 if (dwarf_attr(vr_die, DW_AT_location, &attr) == NULL) 1074 return -EINVAL; 1075 1076 while ((offset = dwarf_getlocations(&attr, offset, &base, 1077 &start, &end, &op, &nops)) > 0) { 1078 if (start == 0) { 1079 /* Single Location Descriptions */ 1080 ret = die_get_var_innermost_scope(sp_die, vr_die, buf); 1081 goto out; 1082 } 1083 1084 /* Location Lists */ 1085 start -= entry; 1086 end -= entry; 1087 if (first) { 1088 ret = strbuf_addf(buf, "@<%s+[%" PRIu64 "-%" PRIu64, 1089 name, start, end); 1090 first = false; 1091 } else { 1092 ret = strbuf_addf(buf, ",%" PRIu64 "-%" PRIu64, 1093 start, end); 1094 } 1095 if (ret < 0) 1096 goto out; 1097 } 1098 1099 if (!first) 1100 ret = strbuf_add(buf, "]>", 2); 1101 out: 1102 return ret; 1103 } 1104 #else 1105 int die_get_var_range(Dwarf_Die *sp_die __maybe_unused, 1106 Dwarf_Die *vr_die __maybe_unused, 1107 struct strbuf *buf __maybe_unused) 1108 { 1109 return -ENOTSUP; 1110 } 1111 #endif 1112 1113 /* 1114 * die_has_loclist - Check if DW_AT_location of @vr_die is a location list 1115 * @vr_die: a variable DIE 1116 */ 1117 static bool die_has_loclist(Dwarf_Die *vr_die) 1118 { 1119 Dwarf_Attribute loc; 1120 int tag = dwarf_tag(vr_die); 1121 1122 if (tag != DW_TAG_formal_parameter && 1123 tag != DW_TAG_variable) 1124 return false; 1125 1126 return (dwarf_attr_integrate(vr_die, DW_AT_location, &loc) && 1127 dwarf_whatform(&loc) == DW_FORM_sec_offset); 1128 } 1129 1130 /* 1131 * die_is_optimized_target - Check if target program is compiled with 1132 * optimization 1133 * @cu_die: a CU DIE 1134 * 1135 * For any object in given CU whose DW_AT_location is a location list, 1136 * target program is compiled with optimization. This is applicable to 1137 * clang as well. 1138 */ 1139 bool die_is_optimized_target(Dwarf_Die *cu_die) 1140 { 1141 Dwarf_Die tmp_die; 1142 1143 if (die_has_loclist(cu_die)) 1144 return true; 1145 1146 if (!dwarf_child(cu_die, &tmp_die) && 1147 die_is_optimized_target(&tmp_die)) 1148 return true; 1149 1150 if (!dwarf_siblingof(cu_die, &tmp_die) && 1151 die_is_optimized_target(&tmp_die)) 1152 return true; 1153 1154 return false; 1155 } 1156 1157 /* 1158 * die_search_idx - Search index of given line address 1159 * @lines: Line records of single CU 1160 * @nr_lines: Number of @lines 1161 * @addr: address we are looking for 1162 * @idx: index to be set by this function (return value) 1163 * 1164 * Search for @addr by looping over every lines of CU. If address 1165 * matches, set index of that line in @idx. Note that single source 1166 * line can have multiple line records. i.e. single source line can 1167 * have multiple index. 1168 */ 1169 static bool die_search_idx(Dwarf_Lines *lines, unsigned long nr_lines, 1170 Dwarf_Addr addr, unsigned long *idx) 1171 { 1172 unsigned long i; 1173 Dwarf_Addr tmp; 1174 1175 for (i = 0; i < nr_lines; i++) { 1176 if (dwarf_lineaddr(dwarf_onesrcline(lines, i), &tmp)) 1177 return false; 1178 1179 if (tmp == addr) { 1180 *idx = i; 1181 return true; 1182 } 1183 } 1184 return false; 1185 } 1186 1187 /* 1188 * die_get_postprologue_addr - Search next address after function prologue 1189 * @entrypc_idx: entrypc index 1190 * @lines: Line records of single CU 1191 * @nr_lines: Number of @lines 1192 * @hignpc: high PC address of function 1193 * @postprologue_addr: Next address after function prologue (return value) 1194 * 1195 * Look for prologue-end marker. If there is no explicit marker, return 1196 * address of next line record or next source line. 1197 */ 1198 static bool die_get_postprologue_addr(unsigned long entrypc_idx, 1199 Dwarf_Lines *lines, 1200 unsigned long nr_lines, 1201 Dwarf_Addr highpc, 1202 Dwarf_Addr *postprologue_addr) 1203 { 1204 unsigned long i; 1205 int entrypc_lno, lno; 1206 Dwarf_Line *line; 1207 Dwarf_Addr addr; 1208 bool p_end; 1209 1210 /* entrypc_lno is actual source line number */ 1211 line = dwarf_onesrcline(lines, entrypc_idx); 1212 if (dwarf_lineno(line, &entrypc_lno)) 1213 return false; 1214 1215 for (i = entrypc_idx; i < nr_lines; i++) { 1216 line = dwarf_onesrcline(lines, i); 1217 1218 if (dwarf_lineaddr(line, &addr) || 1219 dwarf_lineno(line, &lno) || 1220 dwarf_lineprologueend(line, &p_end)) 1221 return false; 1222 1223 /* highpc is exclusive. [entrypc,highpc) */ 1224 if (addr >= highpc) 1225 break; 1226 1227 /* clang supports prologue-end marker */ 1228 if (p_end) 1229 break; 1230 1231 /* Actual next line in source */ 1232 if (lno != entrypc_lno) 1233 break; 1234 1235 /* 1236 * Single source line can have multiple line records. 1237 * For Example, 1238 * void foo() { printf("hello\n"); } 1239 * contains two line records. One points to declaration and 1240 * other points to printf() line. Variable 'lno' won't get 1241 * incremented in this case but 'i' will. 1242 */ 1243 if (i != entrypc_idx) 1244 break; 1245 } 1246 1247 dwarf_lineaddr(line, postprologue_addr); 1248 if (*postprologue_addr >= highpc) 1249 dwarf_lineaddr(dwarf_onesrcline(lines, i - 1), 1250 postprologue_addr); 1251 1252 return true; 1253 } 1254 1255 /* 1256 * die_skip_prologue - Use next address after prologue as probe location 1257 * @sp_die: a subprogram DIE 1258 * @cu_die: a CU DIE 1259 * @entrypc: entrypc of the function 1260 * 1261 * Function prologue prepares stack and registers before executing function 1262 * logic. When target program is compiled without optimization, function 1263 * parameter information is only valid after prologue. When we probe entrypc 1264 * of the function, and try to record function parameter, it contains 1265 * garbage value. 1266 */ 1267 void die_skip_prologue(Dwarf_Die *sp_die, Dwarf_Die *cu_die, 1268 Dwarf_Addr *entrypc) 1269 { 1270 size_t nr_lines = 0; 1271 unsigned long entrypc_idx = 0; 1272 Dwarf_Lines *lines = NULL; 1273 Dwarf_Addr postprologue_addr; 1274 Dwarf_Addr highpc; 1275 1276 if (dwarf_highpc(sp_die, &highpc)) 1277 return; 1278 1279 if (dwarf_getsrclines(cu_die, &lines, &nr_lines)) 1280 return; 1281 1282 if (!die_search_idx(lines, nr_lines, *entrypc, &entrypc_idx)) 1283 return; 1284 1285 if (!die_get_postprologue_addr(entrypc_idx, lines, nr_lines, 1286 highpc, &postprologue_addr)) 1287 return; 1288 1289 *entrypc = postprologue_addr; 1290 } 1291