1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * probe-finder.c : C expression to kprobe event converter 4 * 5 * Written by Masami Hiramatsu <mhiramat@redhat.com> 6 */ 7 8 #include <inttypes.h> 9 #include <sys/utsname.h> 10 #include <sys/types.h> 11 #include <sys/stat.h> 12 #include <fcntl.h> 13 #include <errno.h> 14 #include <stdio.h> 15 #include <unistd.h> 16 #include <stdlib.h> 17 #include <string.h> 18 #include <stdarg.h> 19 #include <dwarf-regs.h> 20 21 #include <linux/bitops.h> 22 #include <linux/zalloc.h> 23 #include "event.h" 24 #include "dso.h" 25 #include "debug.h" 26 #include "intlist.h" 27 #include "strbuf.h" 28 #include "strlist.h" 29 #include "symbol.h" 30 #include "probe-finder.h" 31 #include "probe-file.h" 32 #include "string2.h" 33 34 /* Kprobe tracer basic type is up to u64 */ 35 #define MAX_BASIC_TYPE_BITS 64 36 37 /* Dwarf FL wrappers */ 38 static char *debuginfo_path; /* Currently dummy */ 39 40 static const Dwfl_Callbacks offline_callbacks = { 41 .find_debuginfo = dwfl_standard_find_debuginfo, 42 .debuginfo_path = &debuginfo_path, 43 44 .section_address = dwfl_offline_section_address, 45 46 /* We use this table for core files too. */ 47 .find_elf = dwfl_build_id_find_elf, 48 }; 49 50 /* Get a Dwarf from offline image */ 51 static int debuginfo__init_offline_dwarf(struct debuginfo *dbg, 52 const char *path) 53 { 54 int fd; 55 56 fd = open(path, O_RDONLY); 57 if (fd < 0) 58 return fd; 59 60 dbg->dwfl = dwfl_begin(&offline_callbacks); 61 if (!dbg->dwfl) 62 goto error; 63 64 dwfl_report_begin(dbg->dwfl); 65 dbg->mod = dwfl_report_offline(dbg->dwfl, "", "", fd); 66 if (!dbg->mod) 67 goto error; 68 69 dbg->dbg = dwfl_module_getdwarf(dbg->mod, &dbg->bias); 70 if (!dbg->dbg) 71 goto error; 72 73 dwfl_report_end(dbg->dwfl, NULL, NULL); 74 75 return 0; 76 error: 77 if (dbg->dwfl) 78 dwfl_end(dbg->dwfl); 79 else 80 close(fd); 81 memset(dbg, 0, sizeof(*dbg)); 82 83 return -ENOENT; 84 } 85 86 static struct debuginfo *__debuginfo__new(const char *path) 87 { 88 struct debuginfo *dbg = zalloc(sizeof(*dbg)); 89 if (!dbg) 90 return NULL; 91 92 if (debuginfo__init_offline_dwarf(dbg, path) < 0) 93 zfree(&dbg); 94 if (dbg) 95 pr_debug("Open Debuginfo file: %s\n", path); 96 return dbg; 97 } 98 99 enum dso_binary_type distro_dwarf_types[] = { 100 DSO_BINARY_TYPE__FEDORA_DEBUGINFO, 101 DSO_BINARY_TYPE__UBUNTU_DEBUGINFO, 102 DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, 103 DSO_BINARY_TYPE__BUILDID_DEBUGINFO, 104 DSO_BINARY_TYPE__NOT_FOUND, 105 }; 106 107 struct debuginfo *debuginfo__new(const char *path) 108 { 109 enum dso_binary_type *type; 110 char buf[PATH_MAX], nil = '\0'; 111 struct dso *dso; 112 struct debuginfo *dinfo = NULL; 113 114 /* Try to open distro debuginfo files */ 115 dso = dso__new(path); 116 if (!dso) 117 goto out; 118 119 for (type = distro_dwarf_types; 120 !dinfo && *type != DSO_BINARY_TYPE__NOT_FOUND; 121 type++) { 122 if (dso__read_binary_type_filename(dso, *type, &nil, 123 buf, PATH_MAX) < 0) 124 continue; 125 dinfo = __debuginfo__new(buf); 126 } 127 dso__put(dso); 128 129 out: 130 /* if failed to open all distro debuginfo, open given binary */ 131 return dinfo ? : __debuginfo__new(path); 132 } 133 134 void debuginfo__delete(struct debuginfo *dbg) 135 { 136 if (dbg) { 137 if (dbg->dwfl) 138 dwfl_end(dbg->dwfl); 139 free(dbg); 140 } 141 } 142 143 /* 144 * Probe finder related functions 145 */ 146 147 static struct probe_trace_arg_ref *alloc_trace_arg_ref(long offs) 148 { 149 struct probe_trace_arg_ref *ref; 150 ref = zalloc(sizeof(struct probe_trace_arg_ref)); 151 if (ref != NULL) 152 ref->offset = offs; 153 return ref; 154 } 155 156 /* 157 * Convert a location into trace_arg. 158 * If tvar == NULL, this just checks variable can be converted. 159 * If fentry == true and vr_die is a parameter, do huristic search 160 * for the location fuzzed by function entry mcount. 161 */ 162 static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr, 163 Dwarf_Op *fb_ops, Dwarf_Die *sp_die, 164 unsigned int machine, 165 struct probe_trace_arg *tvar) 166 { 167 Dwarf_Attribute attr; 168 Dwarf_Addr tmp = 0; 169 Dwarf_Op *op; 170 size_t nops; 171 unsigned int regn; 172 Dwarf_Word offs = 0; 173 bool ref = false; 174 const char *regs; 175 int ret, ret2 = 0; 176 177 if (dwarf_attr(vr_die, DW_AT_external, &attr) != NULL) 178 goto static_var; 179 180 /* Constant value */ 181 if (dwarf_attr(vr_die, DW_AT_const_value, &attr) && 182 immediate_value_is_supported()) { 183 Dwarf_Sword snum; 184 185 dwarf_formsdata(&attr, &snum); 186 ret = asprintf(&tvar->value, "\\%ld", (long)snum); 187 188 return ret < 0 ? -ENOMEM : 0; 189 } 190 191 /* TODO: handle more than 1 exprs */ 192 if (dwarf_attr(vr_die, DW_AT_location, &attr) == NULL) 193 return -EINVAL; /* Broken DIE ? */ 194 if (dwarf_getlocation_addr(&attr, addr, &op, &nops, 1) <= 0) { 195 ret = dwarf_entrypc(sp_die, &tmp); 196 if (ret) 197 return -ENOENT; 198 199 if (probe_conf.show_location_range && 200 (dwarf_tag(vr_die) == DW_TAG_variable)) { 201 ret2 = -ERANGE; 202 } else if (addr != tmp || 203 dwarf_tag(vr_die) != DW_TAG_formal_parameter) { 204 return -ENOENT; 205 } 206 207 ret = dwarf_highpc(sp_die, &tmp); 208 if (ret) 209 return -ENOENT; 210 /* 211 * This is fuzzed by fentry mcount. We try to find the 212 * parameter location at the earliest address. 213 */ 214 for (addr += 1; addr <= tmp; addr++) { 215 if (dwarf_getlocation_addr(&attr, addr, &op, 216 &nops, 1) > 0) 217 goto found; 218 } 219 return -ENOENT; 220 } 221 found: 222 if (nops == 0) 223 /* TODO: Support const_value */ 224 return -ENOENT; 225 226 if (op->atom == DW_OP_addr) { 227 static_var: 228 if (!tvar) 229 return ret2; 230 /* Static variables on memory (not stack), make @varname */ 231 ret = strlen(dwarf_diename(vr_die)); 232 tvar->value = zalloc(ret + 2); 233 if (tvar->value == NULL) 234 return -ENOMEM; 235 snprintf(tvar->value, ret + 2, "@%s", dwarf_diename(vr_die)); 236 tvar->ref = alloc_trace_arg_ref((long)offs); 237 if (tvar->ref == NULL) 238 return -ENOMEM; 239 return ret2; 240 } 241 242 /* If this is based on frame buffer, set the offset */ 243 if (op->atom == DW_OP_fbreg) { 244 if (fb_ops == NULL) 245 return -ENOTSUP; 246 ref = true; 247 offs = op->number; 248 op = &fb_ops[0]; 249 } 250 251 if (op->atom >= DW_OP_breg0 && op->atom <= DW_OP_breg31) { 252 regn = op->atom - DW_OP_breg0; 253 offs += op->number; 254 ref = true; 255 } else if (op->atom >= DW_OP_reg0 && op->atom <= DW_OP_reg31) { 256 regn = op->atom - DW_OP_reg0; 257 } else if (op->atom == DW_OP_bregx) { 258 regn = op->number; 259 offs += op->number2; 260 ref = true; 261 } else if (op->atom == DW_OP_regx) { 262 regn = op->number; 263 } else { 264 pr_debug("DW_OP %x is not supported.\n", op->atom); 265 return -ENOTSUP; 266 } 267 268 if (!tvar) 269 return ret2; 270 271 regs = get_dwarf_regstr(regn, machine); 272 if (!regs) { 273 /* This should be a bug in DWARF or this tool */ 274 pr_warning("Mapping for the register number %u " 275 "missing on this architecture.\n", regn); 276 return -ENOTSUP; 277 } 278 279 tvar->value = strdup(regs); 280 if (tvar->value == NULL) 281 return -ENOMEM; 282 283 if (ref) { 284 tvar->ref = alloc_trace_arg_ref((long)offs); 285 if (tvar->ref == NULL) 286 return -ENOMEM; 287 } 288 return ret2; 289 } 290 291 #define BYTES_TO_BITS(nb) ((nb) * BITS_PER_LONG / sizeof(long)) 292 293 static int convert_variable_type(Dwarf_Die *vr_die, 294 struct probe_trace_arg *tvar, 295 const char *cast, bool user_access) 296 { 297 struct probe_trace_arg_ref **ref_ptr = &tvar->ref; 298 Dwarf_Die type; 299 char buf[16]; 300 char sbuf[STRERR_BUFSIZE]; 301 int bsize, boffs, total; 302 int ret; 303 char prefix; 304 305 /* TODO: check all types */ 306 if (cast && strcmp(cast, "string") != 0 && strcmp(cast, "ustring") && 307 strcmp(cast, "x") != 0 && 308 strcmp(cast, "s") != 0 && strcmp(cast, "u") != 0) { 309 /* Non string type is OK */ 310 /* and respect signedness/hexadecimal cast */ 311 tvar->type = strdup(cast); 312 return (tvar->type == NULL) ? -ENOMEM : 0; 313 } 314 315 bsize = dwarf_bitsize(vr_die); 316 if (bsize > 0) { 317 /* This is a bitfield */ 318 boffs = dwarf_bitoffset(vr_die); 319 total = dwarf_bytesize(vr_die); 320 if (boffs < 0 || total < 0) 321 return -ENOENT; 322 ret = snprintf(buf, 16, "b%d@%d/%zd", bsize, boffs, 323 BYTES_TO_BITS(total)); 324 goto formatted; 325 } 326 327 if (die_get_real_type(vr_die, &type) == NULL) { 328 pr_warning("Failed to get a type information of %s.\n", 329 dwarf_diename(vr_die)); 330 return -ENOENT; 331 } 332 333 pr_debug("%s type is %s.\n", 334 dwarf_diename(vr_die), dwarf_diename(&type)); 335 336 if (cast && (!strcmp(cast, "string") || !strcmp(cast, "ustring"))) { 337 /* String type */ 338 ret = dwarf_tag(&type); 339 if (ret != DW_TAG_pointer_type && 340 ret != DW_TAG_array_type) { 341 pr_warning("Failed to cast into string: " 342 "%s(%s) is not a pointer nor array.\n", 343 dwarf_diename(vr_die), dwarf_diename(&type)); 344 return -EINVAL; 345 } 346 if (die_get_real_type(&type, &type) == NULL) { 347 pr_warning("Failed to get a type" 348 " information.\n"); 349 return -ENOENT; 350 } 351 if (ret == DW_TAG_pointer_type) { 352 while (*ref_ptr) 353 ref_ptr = &(*ref_ptr)->next; 354 /* Add new reference with offset +0 */ 355 *ref_ptr = zalloc(sizeof(struct probe_trace_arg_ref)); 356 if (*ref_ptr == NULL) { 357 pr_warning("Out of memory error\n"); 358 return -ENOMEM; 359 } 360 (*ref_ptr)->user_access = user_access; 361 } 362 if (!die_compare_name(&type, "char") && 363 !die_compare_name(&type, "unsigned char")) { 364 pr_warning("Failed to cast into string: " 365 "%s is not (unsigned) char *.\n", 366 dwarf_diename(vr_die)); 367 return -EINVAL; 368 } 369 tvar->type = strdup(cast); 370 return (tvar->type == NULL) ? -ENOMEM : 0; 371 } 372 373 if (cast && (strcmp(cast, "u") == 0)) 374 prefix = 'u'; 375 else if (cast && (strcmp(cast, "s") == 0)) 376 prefix = 's'; 377 else if (cast && (strcmp(cast, "x") == 0) && 378 probe_type_is_available(PROBE_TYPE_X)) 379 prefix = 'x'; 380 else 381 prefix = die_is_signed_type(&type) ? 's' : 382 probe_type_is_available(PROBE_TYPE_X) ? 'x' : 'u'; 383 384 ret = dwarf_bytesize(&type); 385 if (ret <= 0) 386 /* No size ... try to use default type */ 387 return 0; 388 ret = BYTES_TO_BITS(ret); 389 390 /* Check the bitwidth */ 391 if (ret > MAX_BASIC_TYPE_BITS) { 392 pr_info("%s exceeds max-bitwidth. Cut down to %d bits.\n", 393 dwarf_diename(&type), MAX_BASIC_TYPE_BITS); 394 ret = MAX_BASIC_TYPE_BITS; 395 } 396 ret = snprintf(buf, 16, "%c%d", prefix, ret); 397 398 formatted: 399 if (ret < 0 || ret >= 16) { 400 if (ret >= 16) 401 ret = -E2BIG; 402 pr_warning("Failed to convert variable type: %s\n", 403 str_error_r(-ret, sbuf, sizeof(sbuf))); 404 return ret; 405 } 406 tvar->type = strdup(buf); 407 if (tvar->type == NULL) 408 return -ENOMEM; 409 return 0; 410 } 411 412 static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname, 413 struct perf_probe_arg_field *field, 414 struct probe_trace_arg_ref **ref_ptr, 415 Dwarf_Die *die_mem, bool user_access) 416 { 417 struct probe_trace_arg_ref *ref = *ref_ptr; 418 Dwarf_Die type; 419 Dwarf_Word offs; 420 int ret, tag; 421 422 pr_debug("converting %s in %s\n", field->name, varname); 423 if (die_get_real_type(vr_die, &type) == NULL) { 424 pr_warning("Failed to get the type of %s.\n", varname); 425 return -ENOENT; 426 } 427 pr_debug2("Var real type: %s (%x)\n", dwarf_diename(&type), 428 (unsigned)dwarf_dieoffset(&type)); 429 tag = dwarf_tag(&type); 430 431 if (field->name[0] == '[' && 432 (tag == DW_TAG_array_type || tag == DW_TAG_pointer_type)) { 433 /* Save original type for next field or type */ 434 memcpy(die_mem, &type, sizeof(*die_mem)); 435 /* Get the type of this array */ 436 if (die_get_real_type(&type, &type) == NULL) { 437 pr_warning("Failed to get the type of %s.\n", varname); 438 return -ENOENT; 439 } 440 pr_debug2("Array real type: %s (%x)\n", dwarf_diename(&type), 441 (unsigned)dwarf_dieoffset(&type)); 442 if (tag == DW_TAG_pointer_type) { 443 ref = zalloc(sizeof(struct probe_trace_arg_ref)); 444 if (ref == NULL) 445 return -ENOMEM; 446 if (*ref_ptr) 447 (*ref_ptr)->next = ref; 448 else 449 *ref_ptr = ref; 450 } 451 ref->offset += dwarf_bytesize(&type) * field->index; 452 ref->user_access = user_access; 453 goto next; 454 } else if (tag == DW_TAG_pointer_type) { 455 /* Check the pointer and dereference */ 456 if (!field->ref) { 457 pr_err("Semantic error: %s must be referred by '->'\n", 458 field->name); 459 return -EINVAL; 460 } 461 /* Get the type pointed by this pointer */ 462 if (die_get_real_type(&type, &type) == NULL) { 463 pr_warning("Failed to get the type of %s.\n", varname); 464 return -ENOENT; 465 } 466 /* Verify it is a data structure */ 467 tag = dwarf_tag(&type); 468 if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) { 469 pr_warning("%s is not a data structure nor a union.\n", 470 varname); 471 return -EINVAL; 472 } 473 474 ref = zalloc(sizeof(struct probe_trace_arg_ref)); 475 if (ref == NULL) 476 return -ENOMEM; 477 if (*ref_ptr) 478 (*ref_ptr)->next = ref; 479 else 480 *ref_ptr = ref; 481 } else { 482 /* Verify it is a data structure */ 483 if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) { 484 pr_warning("%s is not a data structure nor a union.\n", 485 varname); 486 return -EINVAL; 487 } 488 if (field->name[0] == '[') { 489 pr_err("Semantic error: %s is not a pointer" 490 " nor array.\n", varname); 491 return -EINVAL; 492 } 493 /* While prcessing unnamed field, we don't care about this */ 494 if (field->ref && dwarf_diename(vr_die)) { 495 pr_err("Semantic error: %s must be referred by '.'\n", 496 field->name); 497 return -EINVAL; 498 } 499 if (!ref) { 500 pr_warning("Structure on a register is not " 501 "supported yet.\n"); 502 return -ENOTSUP; 503 } 504 } 505 506 if (die_find_member(&type, field->name, die_mem) == NULL) { 507 pr_warning("%s(type:%s) has no member %s.\n", varname, 508 dwarf_diename(&type), field->name); 509 return -EINVAL; 510 } 511 512 /* Get the offset of the field */ 513 if (tag == DW_TAG_union_type) { 514 offs = 0; 515 } else { 516 ret = die_get_data_member_location(die_mem, &offs); 517 if (ret < 0) { 518 pr_warning("Failed to get the offset of %s.\n", 519 field->name); 520 return ret; 521 } 522 } 523 ref->offset += (long)offs; 524 ref->user_access = user_access; 525 526 /* If this member is unnamed, we need to reuse this field */ 527 if (!dwarf_diename(die_mem)) 528 return convert_variable_fields(die_mem, varname, field, 529 &ref, die_mem, user_access); 530 531 next: 532 /* Converting next field */ 533 if (field->next) 534 return convert_variable_fields(die_mem, field->name, 535 field->next, &ref, die_mem, user_access); 536 else 537 return 0; 538 } 539 540 static void print_var_not_found(const char *varname) 541 { 542 pr_err("Failed to find the location of the '%s' variable at this address.\n" 543 " Perhaps it has been optimized out.\n" 544 " Use -V with the --range option to show '%s' location range.\n", 545 varname, varname); 546 } 547 548 /* Show a variables in kprobe event format */ 549 static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf) 550 { 551 Dwarf_Die die_mem; 552 int ret; 553 554 pr_debug("Converting variable %s into trace event.\n", 555 dwarf_diename(vr_die)); 556 557 ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops, 558 &pf->sp_die, pf->machine, pf->tvar); 559 if (ret == -ENOENT && pf->skip_empty_arg) 560 /* This can be found in other place. skip it */ 561 return 0; 562 if (ret == -ENOENT || ret == -EINVAL) { 563 print_var_not_found(pf->pvar->var); 564 } else if (ret == -ENOTSUP) 565 pr_err("Sorry, we don't support this variable location yet.\n"); 566 else if (ret == 0 && pf->pvar->field) { 567 ret = convert_variable_fields(vr_die, pf->pvar->var, 568 pf->pvar->field, &pf->tvar->ref, 569 &die_mem, pf->pvar->user_access); 570 vr_die = &die_mem; 571 } 572 if (ret == 0) 573 ret = convert_variable_type(vr_die, pf->tvar, pf->pvar->type, 574 pf->pvar->user_access); 575 /* *expr will be cached in libdw. Don't free it. */ 576 return ret; 577 } 578 579 /* Find a variable in a scope DIE */ 580 static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf) 581 { 582 Dwarf_Die vr_die; 583 char *buf, *ptr; 584 int ret = 0; 585 586 /* Copy raw parameters */ 587 if (!is_c_varname(pf->pvar->var)) 588 return copy_to_probe_trace_arg(pf->tvar, pf->pvar); 589 590 if (pf->pvar->name) 591 pf->tvar->name = strdup(pf->pvar->name); 592 else { 593 buf = synthesize_perf_probe_arg(pf->pvar); 594 if (!buf) 595 return -ENOMEM; 596 ptr = strchr(buf, ':'); /* Change type separator to _ */ 597 if (ptr) 598 *ptr = '_'; 599 pf->tvar->name = buf; 600 } 601 if (pf->tvar->name == NULL) 602 return -ENOMEM; 603 604 pr_debug("Searching '%s' variable in context.\n", pf->pvar->var); 605 /* Search child die for local variables and parameters. */ 606 if (!die_find_variable_at(sc_die, pf->pvar->var, pf->addr, &vr_die)) { 607 /* Search again in global variables */ 608 if (!die_find_variable_at(&pf->cu_die, pf->pvar->var, 609 0, &vr_die)) { 610 if (pf->skip_empty_arg) 611 return 0; 612 pr_warning("Failed to find '%s' in this function.\n", 613 pf->pvar->var); 614 ret = -ENOENT; 615 } 616 } 617 if (ret >= 0) 618 ret = convert_variable(&vr_die, pf); 619 620 return ret; 621 } 622 623 /* Convert subprogram DIE to trace point */ 624 static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod, 625 Dwarf_Addr paddr, bool retprobe, 626 const char *function, 627 struct probe_trace_point *tp) 628 { 629 Dwarf_Addr eaddr; 630 GElf_Sym sym; 631 const char *symbol; 632 633 /* Verify the address is correct */ 634 if (!dwarf_haspc(sp_die, paddr)) { 635 pr_warning("Specified offset is out of %s\n", 636 dwarf_diename(sp_die)); 637 return -EINVAL; 638 } 639 640 if (dwarf_entrypc(sp_die, &eaddr) == 0) { 641 /* If the DIE has entrypc, use it. */ 642 symbol = dwarf_diename(sp_die); 643 } else { 644 /* Try to get actual symbol name and address from symtab */ 645 symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL); 646 eaddr = sym.st_value; 647 } 648 if (!symbol) { 649 pr_warning("Failed to find symbol at 0x%lx\n", 650 (unsigned long)paddr); 651 return -ENOENT; 652 } 653 654 tp->offset = (unsigned long)(paddr - eaddr); 655 tp->address = (unsigned long)paddr; 656 tp->symbol = strdup(symbol); 657 if (!tp->symbol) 658 return -ENOMEM; 659 660 /* Return probe must be on the head of a subprogram */ 661 if (retprobe) { 662 if (eaddr != paddr) { 663 pr_warning("Failed to find \"%s%%return\",\n" 664 " because %s is an inlined function and" 665 " has no return point.\n", function, 666 function); 667 return -EINVAL; 668 } 669 tp->retprobe = true; 670 } 671 672 return 0; 673 } 674 675 /* Call probe_finder callback with scope DIE */ 676 static int call_probe_finder(Dwarf_Die *sc_die, struct probe_finder *pf) 677 { 678 Dwarf_Attribute fb_attr; 679 Dwarf_Frame *frame = NULL; 680 size_t nops; 681 int ret; 682 683 if (!sc_die) { 684 pr_err("Caller must pass a scope DIE. Program error.\n"); 685 return -EINVAL; 686 } 687 688 /* If not a real subprogram, find a real one */ 689 if (!die_is_func_def(sc_die)) { 690 if (!die_find_realfunc(&pf->cu_die, pf->addr, &pf->sp_die)) { 691 if (die_find_tailfunc(&pf->cu_die, pf->addr, &pf->sp_die)) { 692 pr_warning("Ignoring tail call from %s\n", 693 dwarf_diename(&pf->sp_die)); 694 return 0; 695 } else { 696 pr_warning("Failed to find probe point in any " 697 "functions.\n"); 698 return -ENOENT; 699 } 700 } 701 } else 702 memcpy(&pf->sp_die, sc_die, sizeof(Dwarf_Die)); 703 704 /* Get the frame base attribute/ops from subprogram */ 705 dwarf_attr(&pf->sp_die, DW_AT_frame_base, &fb_attr); 706 ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1); 707 if (ret <= 0 || nops == 0) { 708 pf->fb_ops = NULL; 709 #if _ELFUTILS_PREREQ(0, 142) 710 } else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa && 711 (pf->cfi_eh != NULL || pf->cfi_dbg != NULL)) { 712 if ((dwarf_cfi_addrframe(pf->cfi_eh, pf->addr, &frame) != 0 && 713 (dwarf_cfi_addrframe(pf->cfi_dbg, pf->addr, &frame) != 0)) || 714 dwarf_frame_cfa(frame, &pf->fb_ops, &nops) != 0) { 715 pr_warning("Failed to get call frame on 0x%jx\n", 716 (uintmax_t)pf->addr); 717 free(frame); 718 return -ENOENT; 719 } 720 #endif 721 } 722 723 /* Call finder's callback handler */ 724 ret = pf->callback(sc_die, pf); 725 726 /* Since *pf->fb_ops can be a part of frame. we should free it here. */ 727 free(frame); 728 pf->fb_ops = NULL; 729 730 return ret; 731 } 732 733 struct find_scope_param { 734 const char *function; 735 const char *file; 736 int line; 737 int diff; 738 Dwarf_Die *die_mem; 739 bool found; 740 }; 741 742 static int find_best_scope_cb(Dwarf_Die *fn_die, void *data) 743 { 744 struct find_scope_param *fsp = data; 745 const char *file; 746 int lno; 747 748 /* Skip if declared file name does not match */ 749 if (fsp->file) { 750 file = dwarf_decl_file(fn_die); 751 if (!file || strcmp(fsp->file, file) != 0) 752 return 0; 753 } 754 /* If the function name is given, that's what user expects */ 755 if (fsp->function) { 756 if (die_match_name(fn_die, fsp->function)) { 757 memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die)); 758 fsp->found = true; 759 return 1; 760 } 761 } else { 762 /* With the line number, find the nearest declared DIE */ 763 dwarf_decl_line(fn_die, &lno); 764 if (lno < fsp->line && fsp->diff > fsp->line - lno) { 765 /* Keep a candidate and continue */ 766 fsp->diff = fsp->line - lno; 767 memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die)); 768 fsp->found = true; 769 } 770 } 771 return 0; 772 } 773 774 /* Return innermost DIE */ 775 static int find_inner_scope_cb(Dwarf_Die *fn_die, void *data) 776 { 777 struct find_scope_param *fsp = data; 778 779 memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die)); 780 fsp->found = true; 781 return 1; 782 } 783 784 /* Find an appropriate scope fits to given conditions */ 785 static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem) 786 { 787 struct find_scope_param fsp = { 788 .function = pf->pev->point.function, 789 .file = pf->fname, 790 .line = pf->lno, 791 .diff = INT_MAX, 792 .die_mem = die_mem, 793 .found = false, 794 }; 795 int ret; 796 797 ret = cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb, 798 &fsp); 799 if (!ret && !fsp.found) 800 cu_walk_functions_at(&pf->cu_die, pf->addr, 801 find_inner_scope_cb, &fsp); 802 803 return fsp.found ? die_mem : NULL; 804 } 805 806 static int verify_representive_line(struct probe_finder *pf, const char *fname, 807 int lineno, Dwarf_Addr addr) 808 { 809 const char *__fname, *__func = NULL; 810 Dwarf_Die die_mem; 811 int __lineno; 812 813 /* Verify line number and address by reverse search */ 814 if (cu_find_lineinfo(&pf->cu_die, addr, &__fname, &__lineno) < 0) 815 return 0; 816 817 pr_debug2("Reversed line: %s:%d\n", __fname, __lineno); 818 if (strcmp(fname, __fname) || lineno == __lineno) 819 return 0; 820 821 pr_warning("This line is sharing the address with other lines.\n"); 822 823 if (pf->pev->point.function) { 824 /* Find best match function name and lines */ 825 pf->addr = addr; 826 if (find_best_scope(pf, &die_mem) 827 && die_match_name(&die_mem, pf->pev->point.function) 828 && dwarf_decl_line(&die_mem, &lineno) == 0) { 829 __func = dwarf_diename(&die_mem); 830 __lineno -= lineno; 831 } 832 } 833 pr_warning("Please try to probe at %s:%d instead.\n", 834 __func ? : __fname, __lineno); 835 836 return -ENOENT; 837 } 838 839 static int probe_point_line_walker(const char *fname, int lineno, 840 Dwarf_Addr addr, void *data) 841 { 842 struct probe_finder *pf = data; 843 Dwarf_Die *sc_die, die_mem; 844 int ret; 845 846 if (lineno != pf->lno || strtailcmp(fname, pf->fname) != 0) 847 return 0; 848 849 if (verify_representive_line(pf, fname, lineno, addr)) 850 return -ENOENT; 851 852 pf->addr = addr; 853 sc_die = find_best_scope(pf, &die_mem); 854 if (!sc_die) { 855 pr_warning("Failed to find scope of probe point.\n"); 856 return -ENOENT; 857 } 858 859 ret = call_probe_finder(sc_die, pf); 860 861 /* Continue if no error, because the line will be in inline function */ 862 return ret < 0 ? ret : 0; 863 } 864 865 /* Find probe point from its line number */ 866 static int find_probe_point_by_line(struct probe_finder *pf) 867 { 868 return die_walk_lines(&pf->cu_die, probe_point_line_walker, pf); 869 } 870 871 /* Find lines which match lazy pattern */ 872 static int find_lazy_match_lines(struct intlist *list, 873 const char *fname, const char *pat) 874 { 875 FILE *fp; 876 char *line = NULL; 877 size_t line_len; 878 ssize_t len; 879 int count = 0, linenum = 1; 880 char sbuf[STRERR_BUFSIZE]; 881 882 fp = fopen(fname, "r"); 883 if (!fp) { 884 pr_warning("Failed to open %s: %s\n", fname, 885 str_error_r(errno, sbuf, sizeof(sbuf))); 886 return -errno; 887 } 888 889 while ((len = getline(&line, &line_len, fp)) > 0) { 890 891 if (line[len - 1] == '\n') 892 line[len - 1] = '\0'; 893 894 if (strlazymatch(line, pat)) { 895 intlist__add(list, linenum); 896 count++; 897 } 898 linenum++; 899 } 900 901 if (ferror(fp)) 902 count = -errno; 903 free(line); 904 fclose(fp); 905 906 if (count == 0) 907 pr_debug("No matched lines found in %s.\n", fname); 908 return count; 909 } 910 911 static int probe_point_lazy_walker(const char *fname, int lineno, 912 Dwarf_Addr addr, void *data) 913 { 914 struct probe_finder *pf = data; 915 Dwarf_Die *sc_die, die_mem; 916 int ret; 917 918 if (!intlist__has_entry(pf->lcache, lineno) || 919 strtailcmp(fname, pf->fname) != 0) 920 return 0; 921 922 pr_debug("Probe line found: line:%d addr:0x%llx\n", 923 lineno, (unsigned long long)addr); 924 pf->addr = addr; 925 pf->lno = lineno; 926 sc_die = find_best_scope(pf, &die_mem); 927 if (!sc_die) { 928 pr_warning("Failed to find scope of probe point.\n"); 929 return -ENOENT; 930 } 931 932 ret = call_probe_finder(sc_die, pf); 933 934 /* 935 * Continue if no error, because the lazy pattern will match 936 * to other lines 937 */ 938 return ret < 0 ? ret : 0; 939 } 940 941 /* Find probe points from lazy pattern */ 942 static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf) 943 { 944 int ret = 0; 945 char *fpath; 946 947 if (intlist__empty(pf->lcache)) { 948 const char *comp_dir; 949 950 comp_dir = cu_get_comp_dir(&pf->cu_die); 951 ret = get_real_path(pf->fname, comp_dir, &fpath); 952 if (ret < 0) { 953 pr_warning("Failed to find source file path.\n"); 954 return ret; 955 } 956 957 /* Matching lazy line pattern */ 958 ret = find_lazy_match_lines(pf->lcache, fpath, 959 pf->pev->point.lazy_line); 960 free(fpath); 961 if (ret <= 0) 962 return ret; 963 } 964 965 return die_walk_lines(sp_die, probe_point_lazy_walker, pf); 966 } 967 968 static void skip_prologue(Dwarf_Die *sp_die, struct probe_finder *pf) 969 { 970 struct perf_probe_point *pp = &pf->pev->point; 971 972 /* Not uprobe? */ 973 if (!pf->pev->uprobes) 974 return; 975 976 /* Compiled with optimization? */ 977 if (die_is_optimized_target(&pf->cu_die)) 978 return; 979 980 /* Don't know entrypc? */ 981 if (!pf->addr) 982 return; 983 984 /* Only FUNC and FUNC@SRC are eligible. */ 985 if (!pp->function || pp->line || pp->retprobe || pp->lazy_line || 986 pp->offset || pp->abs_address) 987 return; 988 989 /* Not interested in func parameter? */ 990 if (!perf_probe_with_var(pf->pev)) 991 return; 992 993 pr_info("Target program is compiled without optimization. Skipping prologue.\n" 994 "Probe on address 0x%" PRIx64 " to force probing at the function entry.\n\n", 995 pf->addr); 996 997 die_skip_prologue(sp_die, &pf->cu_die, &pf->addr); 998 } 999 1000 static int probe_point_inline_cb(Dwarf_Die *in_die, void *data) 1001 { 1002 struct probe_finder *pf = data; 1003 struct perf_probe_point *pp = &pf->pev->point; 1004 Dwarf_Addr addr; 1005 int ret; 1006 1007 if (pp->lazy_line) 1008 ret = find_probe_point_lazy(in_die, pf); 1009 else { 1010 /* Get probe address */ 1011 if (die_entrypc(in_die, &addr) != 0) { 1012 pr_warning("Failed to get entry address of %s.\n", 1013 dwarf_diename(in_die)); 1014 return -ENOENT; 1015 } 1016 if (addr == 0) { 1017 pr_debug("%s has no valid entry address. skipped.\n", 1018 dwarf_diename(in_die)); 1019 return -ENOENT; 1020 } 1021 pf->addr = addr; 1022 pf->addr += pp->offset; 1023 pr_debug("found inline addr: 0x%jx\n", 1024 (uintmax_t)pf->addr); 1025 1026 ret = call_probe_finder(in_die, pf); 1027 } 1028 1029 return ret; 1030 } 1031 1032 /* Callback parameter with return value for libdw */ 1033 struct dwarf_callback_param { 1034 void *data; 1035 int retval; 1036 }; 1037 1038 /* Search function from function name */ 1039 static int probe_point_search_cb(Dwarf_Die *sp_die, void *data) 1040 { 1041 struct dwarf_callback_param *param = data; 1042 struct probe_finder *pf = param->data; 1043 struct perf_probe_point *pp = &pf->pev->point; 1044 1045 /* Check tag and diename */ 1046 if (!die_is_func_def(sp_die) || 1047 !die_match_name(sp_die, pp->function)) 1048 return DWARF_CB_OK; 1049 1050 /* Check declared file */ 1051 if (pp->file && strtailcmp(pp->file, dwarf_decl_file(sp_die))) 1052 return DWARF_CB_OK; 1053 1054 pr_debug("Matched function: %s [%lx]\n", dwarf_diename(sp_die), 1055 (unsigned long)dwarf_dieoffset(sp_die)); 1056 pf->fname = dwarf_decl_file(sp_die); 1057 if (pp->line) { /* Function relative line */ 1058 dwarf_decl_line(sp_die, &pf->lno); 1059 pf->lno += pp->line; 1060 param->retval = find_probe_point_by_line(pf); 1061 } else if (die_is_func_instance(sp_die)) { 1062 /* Instances always have the entry address */ 1063 die_entrypc(sp_die, &pf->addr); 1064 /* But in some case the entry address is 0 */ 1065 if (pf->addr == 0) { 1066 pr_debug("%s has no entry PC. Skipped\n", 1067 dwarf_diename(sp_die)); 1068 param->retval = 0; 1069 /* Real function */ 1070 } else if (pp->lazy_line) 1071 param->retval = find_probe_point_lazy(sp_die, pf); 1072 else { 1073 skip_prologue(sp_die, pf); 1074 pf->addr += pp->offset; 1075 /* TODO: Check the address in this function */ 1076 param->retval = call_probe_finder(sp_die, pf); 1077 } 1078 } else if (!probe_conf.no_inlines) { 1079 /* Inlined function: search instances */ 1080 param->retval = die_walk_instances(sp_die, 1081 probe_point_inline_cb, (void *)pf); 1082 /* This could be a non-existed inline definition */ 1083 if (param->retval == -ENOENT) 1084 param->retval = 0; 1085 } 1086 1087 /* We need to find other candidates */ 1088 if (strisglob(pp->function) && param->retval >= 0) { 1089 param->retval = 0; /* We have to clear the result */ 1090 return DWARF_CB_OK; 1091 } 1092 1093 return DWARF_CB_ABORT; /* Exit; no same symbol in this CU. */ 1094 } 1095 1096 static int find_probe_point_by_func(struct probe_finder *pf) 1097 { 1098 struct dwarf_callback_param _param = {.data = (void *)pf, 1099 .retval = 0}; 1100 dwarf_getfuncs(&pf->cu_die, probe_point_search_cb, &_param, 0); 1101 return _param.retval; 1102 } 1103 1104 struct pubname_callback_param { 1105 char *function; 1106 char *file; 1107 Dwarf_Die *cu_die; 1108 Dwarf_Die *sp_die; 1109 int found; 1110 }; 1111 1112 static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data) 1113 { 1114 struct pubname_callback_param *param = data; 1115 1116 if (dwarf_offdie(dbg, gl->die_offset, param->sp_die)) { 1117 if (dwarf_tag(param->sp_die) != DW_TAG_subprogram) 1118 return DWARF_CB_OK; 1119 1120 if (die_match_name(param->sp_die, param->function)) { 1121 if (!dwarf_offdie(dbg, gl->cu_offset, param->cu_die)) 1122 return DWARF_CB_OK; 1123 1124 if (param->file && 1125 strtailcmp(param->file, dwarf_decl_file(param->sp_die))) 1126 return DWARF_CB_OK; 1127 1128 param->found = 1; 1129 return DWARF_CB_ABORT; 1130 } 1131 } 1132 1133 return DWARF_CB_OK; 1134 } 1135 1136 static int debuginfo__find_probe_location(struct debuginfo *dbg, 1137 struct probe_finder *pf) 1138 { 1139 struct perf_probe_point *pp = &pf->pev->point; 1140 Dwarf_Off off, noff; 1141 size_t cuhl; 1142 Dwarf_Die *diep; 1143 int ret = 0; 1144 1145 off = 0; 1146 pf->lcache = intlist__new(NULL); 1147 if (!pf->lcache) 1148 return -ENOMEM; 1149 1150 /* Fastpath: lookup by function name from .debug_pubnames section */ 1151 if (pp->function && !strisglob(pp->function)) { 1152 struct pubname_callback_param pubname_param = { 1153 .function = pp->function, 1154 .file = pp->file, 1155 .cu_die = &pf->cu_die, 1156 .sp_die = &pf->sp_die, 1157 .found = 0, 1158 }; 1159 struct dwarf_callback_param probe_param = { 1160 .data = pf, 1161 }; 1162 1163 dwarf_getpubnames(dbg->dbg, pubname_search_cb, 1164 &pubname_param, 0); 1165 if (pubname_param.found) { 1166 ret = probe_point_search_cb(&pf->sp_die, &probe_param); 1167 if (ret) 1168 goto found; 1169 } 1170 } 1171 1172 /* Loop on CUs (Compilation Unit) */ 1173 while (!dwarf_nextcu(dbg->dbg, off, &noff, &cuhl, NULL, NULL, NULL)) { 1174 /* Get the DIE(Debugging Information Entry) of this CU */ 1175 diep = dwarf_offdie(dbg->dbg, off + cuhl, &pf->cu_die); 1176 if (!diep) 1177 continue; 1178 1179 /* Check if target file is included. */ 1180 if (pp->file) 1181 pf->fname = cu_find_realpath(&pf->cu_die, pp->file); 1182 else 1183 pf->fname = NULL; 1184 1185 if (!pp->file || pf->fname) { 1186 if (pp->function) 1187 ret = find_probe_point_by_func(pf); 1188 else if (pp->lazy_line) 1189 ret = find_probe_point_lazy(&pf->cu_die, pf); 1190 else { 1191 pf->lno = pp->line; 1192 ret = find_probe_point_by_line(pf); 1193 } 1194 if (ret < 0) 1195 break; 1196 } 1197 off = noff; 1198 } 1199 1200 found: 1201 intlist__delete(pf->lcache); 1202 pf->lcache = NULL; 1203 1204 return ret; 1205 } 1206 1207 /* Find probe points from debuginfo */ 1208 static int debuginfo__find_probes(struct debuginfo *dbg, 1209 struct probe_finder *pf) 1210 { 1211 int ret = 0; 1212 Elf *elf; 1213 GElf_Ehdr ehdr; 1214 1215 if (pf->cfi_eh || pf->cfi_dbg) 1216 return debuginfo__find_probe_location(dbg, pf); 1217 1218 /* Get the call frame information from this dwarf */ 1219 elf = dwarf_getelf(dbg->dbg); 1220 if (elf == NULL) 1221 return -EINVAL; 1222 1223 if (gelf_getehdr(elf, &ehdr) == NULL) 1224 return -EINVAL; 1225 1226 pf->machine = ehdr.e_machine; 1227 1228 #if _ELFUTILS_PREREQ(0, 142) 1229 do { 1230 GElf_Shdr shdr; 1231 1232 if (elf_section_by_name(elf, &ehdr, &shdr, ".eh_frame", NULL) && 1233 shdr.sh_type == SHT_PROGBITS) 1234 pf->cfi_eh = dwarf_getcfi_elf(elf); 1235 1236 pf->cfi_dbg = dwarf_getcfi(dbg->dbg); 1237 } while (0); 1238 #endif 1239 1240 ret = debuginfo__find_probe_location(dbg, pf); 1241 return ret; 1242 } 1243 1244 struct local_vars_finder { 1245 struct probe_finder *pf; 1246 struct perf_probe_arg *args; 1247 bool vars; 1248 int max_args; 1249 int nargs; 1250 int ret; 1251 }; 1252 1253 /* Collect available variables in this scope */ 1254 static int copy_variables_cb(Dwarf_Die *die_mem, void *data) 1255 { 1256 struct local_vars_finder *vf = data; 1257 struct probe_finder *pf = vf->pf; 1258 int tag; 1259 1260 tag = dwarf_tag(die_mem); 1261 if (tag == DW_TAG_formal_parameter || 1262 (tag == DW_TAG_variable && vf->vars)) { 1263 if (convert_variable_location(die_mem, vf->pf->addr, 1264 vf->pf->fb_ops, &pf->sp_die, 1265 pf->machine, NULL) == 0) { 1266 vf->args[vf->nargs].var = (char *)dwarf_diename(die_mem); 1267 if (vf->args[vf->nargs].var == NULL) { 1268 vf->ret = -ENOMEM; 1269 return DIE_FIND_CB_END; 1270 } 1271 pr_debug(" %s", vf->args[vf->nargs].var); 1272 vf->nargs++; 1273 } 1274 } 1275 1276 if (dwarf_haspc(die_mem, vf->pf->addr)) 1277 return DIE_FIND_CB_CONTINUE; 1278 else 1279 return DIE_FIND_CB_SIBLING; 1280 } 1281 1282 static int expand_probe_args(Dwarf_Die *sc_die, struct probe_finder *pf, 1283 struct perf_probe_arg *args) 1284 { 1285 Dwarf_Die die_mem; 1286 int i; 1287 int n = 0; 1288 struct local_vars_finder vf = {.pf = pf, .args = args, .vars = false, 1289 .max_args = MAX_PROBE_ARGS, .ret = 0}; 1290 1291 for (i = 0; i < pf->pev->nargs; i++) { 1292 /* var never be NULL */ 1293 if (strcmp(pf->pev->args[i].var, PROBE_ARG_VARS) == 0) 1294 vf.vars = true; 1295 else if (strcmp(pf->pev->args[i].var, PROBE_ARG_PARAMS) != 0) { 1296 /* Copy normal argument */ 1297 args[n] = pf->pev->args[i]; 1298 n++; 1299 continue; 1300 } 1301 pr_debug("Expanding %s into:", pf->pev->args[i].var); 1302 vf.nargs = n; 1303 /* Special local variables */ 1304 die_find_child(sc_die, copy_variables_cb, (void *)&vf, 1305 &die_mem); 1306 pr_debug(" (%d)\n", vf.nargs - n); 1307 if (vf.ret < 0) 1308 return vf.ret; 1309 n = vf.nargs; 1310 } 1311 return n; 1312 } 1313 1314 static bool trace_event_finder_overlap(struct trace_event_finder *tf) 1315 { 1316 int i; 1317 1318 for (i = 0; i < tf->ntevs; i++) { 1319 if (tf->pf.addr == tf->tevs[i].point.address) 1320 return true; 1321 } 1322 return false; 1323 } 1324 1325 /* Add a found probe point into trace event list */ 1326 static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf) 1327 { 1328 struct trace_event_finder *tf = 1329 container_of(pf, struct trace_event_finder, pf); 1330 struct perf_probe_point *pp = &pf->pev->point; 1331 struct probe_trace_event *tev; 1332 struct perf_probe_arg *args = NULL; 1333 int ret, i; 1334 1335 /* 1336 * For some reason (e.g. different column assigned to same address) 1337 * This callback can be called with the address which already passed. 1338 * Ignore it first. 1339 */ 1340 if (trace_event_finder_overlap(tf)) 1341 return 0; 1342 1343 /* Check number of tevs */ 1344 if (tf->ntevs == tf->max_tevs) { 1345 pr_warning("Too many( > %d) probe point found.\n", 1346 tf->max_tevs); 1347 return -ERANGE; 1348 } 1349 tev = &tf->tevs[tf->ntevs++]; 1350 1351 /* Trace point should be converted from subprogram DIE */ 1352 ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr, 1353 pp->retprobe, pp->function, &tev->point); 1354 if (ret < 0) 1355 goto end; 1356 1357 tev->point.realname = strdup(dwarf_diename(sc_die)); 1358 if (!tev->point.realname) { 1359 ret = -ENOMEM; 1360 goto end; 1361 } 1362 1363 pr_debug("Probe point found: %s+%lu\n", tev->point.symbol, 1364 tev->point.offset); 1365 1366 /* Expand special probe argument if exist */ 1367 args = zalloc(sizeof(struct perf_probe_arg) * MAX_PROBE_ARGS); 1368 if (args == NULL) { 1369 ret = -ENOMEM; 1370 goto end; 1371 } 1372 1373 ret = expand_probe_args(sc_die, pf, args); 1374 if (ret < 0) 1375 goto end; 1376 1377 tev->nargs = ret; 1378 tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs); 1379 if (tev->args == NULL) { 1380 ret = -ENOMEM; 1381 goto end; 1382 } 1383 1384 /* Find each argument */ 1385 for (i = 0; i < tev->nargs; i++) { 1386 pf->pvar = &args[i]; 1387 pf->tvar = &tev->args[i]; 1388 /* Variable should be found from scope DIE */ 1389 ret = find_variable(sc_die, pf); 1390 if (ret != 0) 1391 break; 1392 } 1393 1394 end: 1395 if (ret) { 1396 clear_probe_trace_event(tev); 1397 tf->ntevs--; 1398 } 1399 free(args); 1400 return ret; 1401 } 1402 1403 static int fill_empty_trace_arg(struct perf_probe_event *pev, 1404 struct probe_trace_event *tevs, int ntevs) 1405 { 1406 char **valp; 1407 char *type; 1408 int i, j, ret; 1409 1410 for (i = 0; i < pev->nargs; i++) { 1411 type = NULL; 1412 for (j = 0; j < ntevs; j++) { 1413 if (tevs[j].args[i].value) { 1414 type = tevs[j].args[i].type; 1415 break; 1416 } 1417 } 1418 if (j == ntevs) { 1419 print_var_not_found(pev->args[i].var); 1420 return -ENOENT; 1421 } 1422 for (j = 0; j < ntevs; j++) { 1423 valp = &tevs[j].args[i].value; 1424 if (*valp) 1425 continue; 1426 1427 ret = asprintf(valp, "\\%lx", probe_conf.magic_num); 1428 if (ret < 0) 1429 return -ENOMEM; 1430 /* Note that type can be NULL */ 1431 if (type) { 1432 tevs[j].args[i].type = strdup(type); 1433 if (!tevs[j].args[i].type) 1434 return -ENOMEM; 1435 } 1436 } 1437 } 1438 return 0; 1439 } 1440 1441 /* Find probe_trace_events specified by perf_probe_event from debuginfo */ 1442 int debuginfo__find_trace_events(struct debuginfo *dbg, 1443 struct perf_probe_event *pev, 1444 struct probe_trace_event **tevs) 1445 { 1446 struct trace_event_finder tf = { 1447 .pf = {.pev = pev, .callback = add_probe_trace_event}, 1448 .max_tevs = probe_conf.max_probes, .mod = dbg->mod}; 1449 int ret, i; 1450 1451 /* Allocate result tevs array */ 1452 *tevs = zalloc(sizeof(struct probe_trace_event) * tf.max_tevs); 1453 if (*tevs == NULL) 1454 return -ENOMEM; 1455 1456 tf.tevs = *tevs; 1457 tf.ntevs = 0; 1458 1459 if (pev->nargs != 0 && immediate_value_is_supported()) 1460 tf.pf.skip_empty_arg = true; 1461 1462 ret = debuginfo__find_probes(dbg, &tf.pf); 1463 if (ret >= 0 && tf.pf.skip_empty_arg) 1464 ret = fill_empty_trace_arg(pev, tf.tevs, tf.ntevs); 1465 1466 if (ret < 0) { 1467 for (i = 0; i < tf.ntevs; i++) 1468 clear_probe_trace_event(&tf.tevs[i]); 1469 zfree(tevs); 1470 return ret; 1471 } 1472 1473 return (ret < 0) ? ret : tf.ntevs; 1474 } 1475 1476 /* Collect available variables in this scope */ 1477 static int collect_variables_cb(Dwarf_Die *die_mem, void *data) 1478 { 1479 struct available_var_finder *af = data; 1480 struct variable_list *vl; 1481 struct strbuf buf = STRBUF_INIT; 1482 int tag, ret; 1483 1484 vl = &af->vls[af->nvls - 1]; 1485 1486 tag = dwarf_tag(die_mem); 1487 if (tag == DW_TAG_formal_parameter || 1488 tag == DW_TAG_variable) { 1489 ret = convert_variable_location(die_mem, af->pf.addr, 1490 af->pf.fb_ops, &af->pf.sp_die, 1491 af->pf.machine, NULL); 1492 if (ret == 0 || ret == -ERANGE) { 1493 int ret2; 1494 bool externs = !af->child; 1495 1496 if (strbuf_init(&buf, 64) < 0) 1497 goto error; 1498 1499 if (probe_conf.show_location_range) { 1500 if (!externs) 1501 ret2 = strbuf_add(&buf, 1502 ret ? "[INV]\t" : "[VAL]\t", 6); 1503 else 1504 ret2 = strbuf_add(&buf, "[EXT]\t", 6); 1505 if (ret2) 1506 goto error; 1507 } 1508 1509 ret2 = die_get_varname(die_mem, &buf); 1510 1511 if (!ret2 && probe_conf.show_location_range && 1512 !externs) { 1513 if (strbuf_addch(&buf, '\t') < 0) 1514 goto error; 1515 ret2 = die_get_var_range(&af->pf.sp_die, 1516 die_mem, &buf); 1517 } 1518 1519 pr_debug("Add new var: %s\n", buf.buf); 1520 if (ret2 == 0) { 1521 strlist__add(vl->vars, 1522 strbuf_detach(&buf, NULL)); 1523 } 1524 strbuf_release(&buf); 1525 } 1526 } 1527 1528 if (af->child && dwarf_haspc(die_mem, af->pf.addr)) 1529 return DIE_FIND_CB_CONTINUE; 1530 else 1531 return DIE_FIND_CB_SIBLING; 1532 error: 1533 strbuf_release(&buf); 1534 pr_debug("Error in strbuf\n"); 1535 return DIE_FIND_CB_END; 1536 } 1537 1538 static bool available_var_finder_overlap(struct available_var_finder *af) 1539 { 1540 int i; 1541 1542 for (i = 0; i < af->nvls; i++) { 1543 if (af->pf.addr == af->vls[i].point.address) 1544 return true; 1545 } 1546 return false; 1547 1548 } 1549 1550 /* Add a found vars into available variables list */ 1551 static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf) 1552 { 1553 struct available_var_finder *af = 1554 container_of(pf, struct available_var_finder, pf); 1555 struct perf_probe_point *pp = &pf->pev->point; 1556 struct variable_list *vl; 1557 Dwarf_Die die_mem; 1558 int ret; 1559 1560 /* 1561 * For some reason (e.g. different column assigned to same address), 1562 * this callback can be called with the address which already passed. 1563 * Ignore it first. 1564 */ 1565 if (available_var_finder_overlap(af)) 1566 return 0; 1567 1568 /* Check number of tevs */ 1569 if (af->nvls == af->max_vls) { 1570 pr_warning("Too many( > %d) probe point found.\n", af->max_vls); 1571 return -ERANGE; 1572 } 1573 vl = &af->vls[af->nvls++]; 1574 1575 /* Trace point should be converted from subprogram DIE */ 1576 ret = convert_to_trace_point(&pf->sp_die, af->mod, pf->addr, 1577 pp->retprobe, pp->function, &vl->point); 1578 if (ret < 0) 1579 return ret; 1580 1581 pr_debug("Probe point found: %s+%lu\n", vl->point.symbol, 1582 vl->point.offset); 1583 1584 /* Find local variables */ 1585 vl->vars = strlist__new(NULL, NULL); 1586 if (vl->vars == NULL) 1587 return -ENOMEM; 1588 af->child = true; 1589 die_find_child(sc_die, collect_variables_cb, (void *)af, &die_mem); 1590 1591 /* Find external variables */ 1592 if (!probe_conf.show_ext_vars) 1593 goto out; 1594 /* Don't need to search child DIE for external vars. */ 1595 af->child = false; 1596 die_find_child(&pf->cu_die, collect_variables_cb, (void *)af, &die_mem); 1597 1598 out: 1599 if (strlist__empty(vl->vars)) { 1600 strlist__delete(vl->vars); 1601 vl->vars = NULL; 1602 } 1603 1604 return ret; 1605 } 1606 1607 /* 1608 * Find available variables at given probe point 1609 * Return the number of found probe points. Return 0 if there is no 1610 * matched probe point. Return <0 if an error occurs. 1611 */ 1612 int debuginfo__find_available_vars_at(struct debuginfo *dbg, 1613 struct perf_probe_event *pev, 1614 struct variable_list **vls) 1615 { 1616 struct available_var_finder af = { 1617 .pf = {.pev = pev, .callback = add_available_vars}, 1618 .mod = dbg->mod, 1619 .max_vls = probe_conf.max_probes}; 1620 int ret; 1621 1622 /* Allocate result vls array */ 1623 *vls = zalloc(sizeof(struct variable_list) * af.max_vls); 1624 if (*vls == NULL) 1625 return -ENOMEM; 1626 1627 af.vls = *vls; 1628 af.nvls = 0; 1629 1630 ret = debuginfo__find_probes(dbg, &af.pf); 1631 if (ret < 0) { 1632 /* Free vlist for error */ 1633 while (af.nvls--) { 1634 zfree(&af.vls[af.nvls].point.symbol); 1635 strlist__delete(af.vls[af.nvls].vars); 1636 } 1637 zfree(vls); 1638 return ret; 1639 } 1640 1641 return (ret < 0) ? ret : af.nvls; 1642 } 1643 1644 /* For the kernel module, we need a special code to get a DIE */ 1645 int debuginfo__get_text_offset(struct debuginfo *dbg, Dwarf_Addr *offs, 1646 bool adjust_offset) 1647 { 1648 int n, i; 1649 Elf32_Word shndx; 1650 Elf_Scn *scn; 1651 Elf *elf; 1652 GElf_Shdr mem, *shdr; 1653 const char *p; 1654 1655 elf = dwfl_module_getelf(dbg->mod, &dbg->bias); 1656 if (!elf) 1657 return -EINVAL; 1658 1659 /* Get the number of relocations */ 1660 n = dwfl_module_relocations(dbg->mod); 1661 if (n < 0) 1662 return -ENOENT; 1663 /* Search the relocation related .text section */ 1664 for (i = 0; i < n; i++) { 1665 p = dwfl_module_relocation_info(dbg->mod, i, &shndx); 1666 if (strcmp(p, ".text") == 0) { 1667 /* OK, get the section header */ 1668 scn = elf_getscn(elf, shndx); 1669 if (!scn) 1670 return -ENOENT; 1671 shdr = gelf_getshdr(scn, &mem); 1672 if (!shdr) 1673 return -ENOENT; 1674 *offs = shdr->sh_addr; 1675 if (adjust_offset) 1676 *offs -= shdr->sh_offset; 1677 } 1678 } 1679 return 0; 1680 } 1681 1682 /* Reverse search */ 1683 int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, 1684 struct perf_probe_point *ppt) 1685 { 1686 Dwarf_Die cudie, spdie, indie; 1687 Dwarf_Addr _addr = 0, baseaddr = 0; 1688 const char *fname = NULL, *func = NULL, *basefunc = NULL, *tmp; 1689 int baseline = 0, lineno = 0, ret = 0; 1690 1691 /* We always need to relocate the address for aranges */ 1692 if (debuginfo__get_text_offset(dbg, &baseaddr, false) == 0) 1693 addr += baseaddr; 1694 /* Find cu die */ 1695 if (!dwarf_addrdie(dbg->dbg, (Dwarf_Addr)addr, &cudie)) { 1696 pr_warning("Failed to find debug information for address %lx\n", 1697 addr); 1698 ret = -EINVAL; 1699 goto end; 1700 } 1701 1702 /* Find a corresponding line (filename and lineno) */ 1703 cu_find_lineinfo(&cudie, addr, &fname, &lineno); 1704 /* Don't care whether it failed or not */ 1705 1706 /* Find a corresponding function (name, baseline and baseaddr) */ 1707 if (die_find_realfunc(&cudie, (Dwarf_Addr)addr, &spdie)) { 1708 /* Get function entry information */ 1709 func = basefunc = dwarf_diename(&spdie); 1710 if (!func || 1711 die_entrypc(&spdie, &baseaddr) != 0 || 1712 dwarf_decl_line(&spdie, &baseline) != 0) { 1713 lineno = 0; 1714 goto post; 1715 } 1716 1717 fname = dwarf_decl_file(&spdie); 1718 if (addr == (unsigned long)baseaddr) { 1719 /* Function entry - Relative line number is 0 */ 1720 lineno = baseline; 1721 goto post; 1722 } 1723 1724 /* Track down the inline functions step by step */ 1725 while (die_find_top_inlinefunc(&spdie, (Dwarf_Addr)addr, 1726 &indie)) { 1727 /* There is an inline function */ 1728 if (die_entrypc(&indie, &_addr) == 0 && 1729 _addr == addr) { 1730 /* 1731 * addr is at an inline function entry. 1732 * In this case, lineno should be the call-site 1733 * line number. (overwrite lineinfo) 1734 */ 1735 lineno = die_get_call_lineno(&indie); 1736 fname = die_get_call_file(&indie); 1737 break; 1738 } else { 1739 /* 1740 * addr is in an inline function body. 1741 * Since lineno points one of the lines 1742 * of the inline function, baseline should 1743 * be the entry line of the inline function. 1744 */ 1745 tmp = dwarf_diename(&indie); 1746 if (!tmp || 1747 dwarf_decl_line(&indie, &baseline) != 0) 1748 break; 1749 func = tmp; 1750 spdie = indie; 1751 } 1752 } 1753 /* Verify the lineno and baseline are in a same file */ 1754 tmp = dwarf_decl_file(&spdie); 1755 if (!tmp || strcmp(tmp, fname) != 0) 1756 lineno = 0; 1757 } 1758 1759 post: 1760 /* Make a relative line number or an offset */ 1761 if (lineno) 1762 ppt->line = lineno - baseline; 1763 else if (basefunc) { 1764 ppt->offset = addr - (unsigned long)baseaddr; 1765 func = basefunc; 1766 } 1767 1768 /* Duplicate strings */ 1769 if (func) { 1770 ppt->function = strdup(func); 1771 if (ppt->function == NULL) { 1772 ret = -ENOMEM; 1773 goto end; 1774 } 1775 } 1776 if (fname) { 1777 ppt->file = strdup(fname); 1778 if (ppt->file == NULL) { 1779 zfree(&ppt->function); 1780 ret = -ENOMEM; 1781 goto end; 1782 } 1783 } 1784 end: 1785 if (ret == 0 && (fname || func)) 1786 ret = 1; /* Found a point */ 1787 return ret; 1788 } 1789 1790 /* Add a line and store the src path */ 1791 static int line_range_add_line(const char *src, unsigned int lineno, 1792 struct line_range *lr) 1793 { 1794 /* Copy source path */ 1795 if (!lr->path) { 1796 lr->path = strdup(src); 1797 if (lr->path == NULL) 1798 return -ENOMEM; 1799 } 1800 return intlist__add(lr->line_list, lineno); 1801 } 1802 1803 static int line_range_walk_cb(const char *fname, int lineno, 1804 Dwarf_Addr addr __maybe_unused, 1805 void *data) 1806 { 1807 struct line_finder *lf = data; 1808 const char *__fname; 1809 int __lineno; 1810 int err; 1811 1812 if ((strtailcmp(fname, lf->fname) != 0) || 1813 (lf->lno_s > lineno || lf->lno_e < lineno)) 1814 return 0; 1815 1816 /* Make sure this line can be reversable */ 1817 if (cu_find_lineinfo(&lf->cu_die, addr, &__fname, &__lineno) > 0 1818 && (lineno != __lineno || strcmp(fname, __fname))) 1819 return 0; 1820 1821 err = line_range_add_line(fname, lineno, lf->lr); 1822 if (err < 0 && err != -EEXIST) 1823 return err; 1824 1825 return 0; 1826 } 1827 1828 /* Find line range from its line number */ 1829 static int find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf) 1830 { 1831 int ret; 1832 1833 ret = die_walk_lines(sp_die ?: &lf->cu_die, line_range_walk_cb, lf); 1834 1835 /* Update status */ 1836 if (ret >= 0) 1837 if (!intlist__empty(lf->lr->line_list)) 1838 ret = lf->found = 1; 1839 else 1840 ret = 0; /* Lines are not found */ 1841 else { 1842 zfree(&lf->lr->path); 1843 } 1844 return ret; 1845 } 1846 1847 static int line_range_inline_cb(Dwarf_Die *in_die, void *data) 1848 { 1849 int ret = find_line_range_by_line(in_die, data); 1850 1851 /* 1852 * We have to check all instances of inlined function, because 1853 * some execution paths can be optimized out depends on the 1854 * function argument of instances. However, if an error occurs, 1855 * it should be handled by the caller. 1856 */ 1857 return ret < 0 ? ret : 0; 1858 } 1859 1860 /* Search function definition from function name */ 1861 static int line_range_search_cb(Dwarf_Die *sp_die, void *data) 1862 { 1863 struct dwarf_callback_param *param = data; 1864 struct line_finder *lf = param->data; 1865 struct line_range *lr = lf->lr; 1866 1867 /* Check declared file */ 1868 if (lr->file && strtailcmp(lr->file, dwarf_decl_file(sp_die))) 1869 return DWARF_CB_OK; 1870 1871 if (die_is_func_def(sp_die) && 1872 die_match_name(sp_die, lr->function)) { 1873 lf->fname = dwarf_decl_file(sp_die); 1874 dwarf_decl_line(sp_die, &lr->offset); 1875 pr_debug("fname: %s, lineno:%d\n", lf->fname, lr->offset); 1876 lf->lno_s = lr->offset + lr->start; 1877 if (lf->lno_s < 0) /* Overflow */ 1878 lf->lno_s = INT_MAX; 1879 lf->lno_e = lr->offset + lr->end; 1880 if (lf->lno_e < 0) /* Overflow */ 1881 lf->lno_e = INT_MAX; 1882 pr_debug("New line range: %d to %d\n", lf->lno_s, lf->lno_e); 1883 lr->start = lf->lno_s; 1884 lr->end = lf->lno_e; 1885 if (!die_is_func_instance(sp_die)) 1886 param->retval = die_walk_instances(sp_die, 1887 line_range_inline_cb, lf); 1888 else 1889 param->retval = find_line_range_by_line(sp_die, lf); 1890 return DWARF_CB_ABORT; 1891 } 1892 return DWARF_CB_OK; 1893 } 1894 1895 static int find_line_range_by_func(struct line_finder *lf) 1896 { 1897 struct dwarf_callback_param param = {.data = (void *)lf, .retval = 0}; 1898 dwarf_getfuncs(&lf->cu_die, line_range_search_cb, ¶m, 0); 1899 return param.retval; 1900 } 1901 1902 int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr) 1903 { 1904 struct line_finder lf = {.lr = lr, .found = 0}; 1905 int ret = 0; 1906 Dwarf_Off off = 0, noff; 1907 size_t cuhl; 1908 Dwarf_Die *diep; 1909 const char *comp_dir; 1910 1911 /* Fastpath: lookup by function name from .debug_pubnames section */ 1912 if (lr->function) { 1913 struct pubname_callback_param pubname_param = { 1914 .function = lr->function, .file = lr->file, 1915 .cu_die = &lf.cu_die, .sp_die = &lf.sp_die, .found = 0}; 1916 struct dwarf_callback_param line_range_param = { 1917 .data = (void *)&lf, .retval = 0}; 1918 1919 dwarf_getpubnames(dbg->dbg, pubname_search_cb, 1920 &pubname_param, 0); 1921 if (pubname_param.found) { 1922 line_range_search_cb(&lf.sp_die, &line_range_param); 1923 if (lf.found) 1924 goto found; 1925 } 1926 } 1927 1928 /* Loop on CUs (Compilation Unit) */ 1929 while (!lf.found && ret >= 0) { 1930 if (dwarf_nextcu(dbg->dbg, off, &noff, &cuhl, 1931 NULL, NULL, NULL) != 0) 1932 break; 1933 1934 /* Get the DIE(Debugging Information Entry) of this CU */ 1935 diep = dwarf_offdie(dbg->dbg, off + cuhl, &lf.cu_die); 1936 if (!diep) 1937 continue; 1938 1939 /* Check if target file is included. */ 1940 if (lr->file) 1941 lf.fname = cu_find_realpath(&lf.cu_die, lr->file); 1942 else 1943 lf.fname = 0; 1944 1945 if (!lr->file || lf.fname) { 1946 if (lr->function) 1947 ret = find_line_range_by_func(&lf); 1948 else { 1949 lf.lno_s = lr->start; 1950 lf.lno_e = lr->end; 1951 ret = find_line_range_by_line(NULL, &lf); 1952 } 1953 } 1954 off = noff; 1955 } 1956 1957 found: 1958 /* Store comp_dir */ 1959 if (lf.found) { 1960 comp_dir = cu_get_comp_dir(&lf.cu_die); 1961 if (comp_dir) { 1962 lr->comp_dir = strdup(comp_dir); 1963 if (!lr->comp_dir) 1964 ret = -ENOMEM; 1965 } 1966 } 1967 1968 pr_debug("path: %s\n", lr->path); 1969 return (ret < 0) ? ret : lf.found; 1970 } 1971 1972 /* 1973 * Find a src file from a DWARF tag path. Prepend optional source path prefix 1974 * and chop off leading directories that do not exist. Result is passed back as 1975 * a newly allocated path on success. 1976 * Return 0 if file was found and readable, -errno otherwise. 1977 */ 1978 int get_real_path(const char *raw_path, const char *comp_dir, 1979 char **new_path) 1980 { 1981 const char *prefix = symbol_conf.source_prefix; 1982 1983 if (!prefix) { 1984 if (raw_path[0] != '/' && comp_dir) 1985 /* If not an absolute path, try to use comp_dir */ 1986 prefix = comp_dir; 1987 else { 1988 if (access(raw_path, R_OK) == 0) { 1989 *new_path = strdup(raw_path); 1990 return *new_path ? 0 : -ENOMEM; 1991 } else 1992 return -errno; 1993 } 1994 } 1995 1996 *new_path = malloc((strlen(prefix) + strlen(raw_path) + 2)); 1997 if (!*new_path) 1998 return -ENOMEM; 1999 2000 for (;;) { 2001 sprintf(*new_path, "%s/%s", prefix, raw_path); 2002 2003 if (access(*new_path, R_OK) == 0) 2004 return 0; 2005 2006 if (!symbol_conf.source_prefix) { 2007 /* In case of searching comp_dir, don't retry */ 2008 zfree(new_path); 2009 return -errno; 2010 } 2011 2012 switch (errno) { 2013 case ENAMETOOLONG: 2014 case ENOENT: 2015 case EROFS: 2016 case EFAULT: 2017 raw_path = strchr(++raw_path, '/'); 2018 if (!raw_path) { 2019 zfree(new_path); 2020 return -ENOENT; 2021 } 2022 continue; 2023 2024 default: 2025 zfree(new_path); 2026 return -errno; 2027 } 2028 } 2029 } 2030