Lines Matching refs:dloc

512 static enum type_match_result check_variable(struct data_loc_info *dloc,  in check_variable()  argument
523 else if (reg == dloc->fbreg || is_fbreg) in check_variable()
525 else if (arch__is(dloc->arch, "x86") && reg == X86_REG_SP) in check_variable()
652 static struct global_var_entry *global_var__find(struct data_loc_info *dloc, u64 addr) in global_var__find() argument
654 struct dso *dso = map__dso(dloc->ms->map); in global_var__find()
664 static bool global_var__add(struct data_loc_info *dloc, u64 addr, in global_var__add() argument
667 struct dso *dso = map__dso(dloc->ms->map); in global_var__add()
706 bool get_global_var_info(struct data_loc_info *dloc, u64 addr, in get_global_var_info() argument
714 mem_addr = addr + map__reloc(dloc->ms->map); in get_global_var_info()
717 sym = thread__find_symbol_fb(dloc->thread, dloc->cpumode, in get_global_var_info()
733 static void global_var__collect(struct data_loc_info *dloc) in global_var__collect() argument
735 Dwarf *dwarf = dloc->di->dbg; in global_var__collect()
764 if (!get_global_var_info(dloc, pos->addr, &var_name, in global_var__collect()
771 global_var__add(dloc, pos->addr, var_name, &type_die); in global_var__collect()
780 bool get_global_var_type(Dwarf_Die *cu_die, struct data_loc_info *dloc, in get_global_var_type() argument
788 struct dso *dso = map__dso(dloc->ms->map); in get_global_var_type()
792 global_var__collect(dloc); in get_global_var_type()
794 gvar = global_var__find(dloc, var_addr); in get_global_var_type()
796 if (!dwarf_offdie(dloc->di->dbg, gvar->die_offset, type_die)) in get_global_var_type()
805 check_variable(dloc, &var_die, type_die, DWARF_REG_PC, offset, in get_global_var_type()
812 if (!get_global_var_info(dloc, var_addr, &var_name, var_offset)) in get_global_var_type()
815 pc = map__rip_2objdump(dloc->ms->map, ip); in get_global_var_type()
819 check_variable(dloc, &var_die, type_die, DWARF_REG_PC, *var_offset, in get_global_var_type()
827 global_var__add(dloc, var_addr - *var_offset, var_name, type_die); in get_global_var_type()
847 static void update_var_state(struct type_state *state, struct data_loc_info *dloc, in update_var_state() argument
852 int fbreg = dloc->fbreg; in update_var_state()
855 if (dloc->fb_cfa) { in update_var_state()
856 if (die_get_cfa(dloc->di->dbg, addr, &fbreg, &fb_offset) < 0) in update_var_state()
864 if (!dwarf_offdie(dloc->di->dbg, var->die_off, &mem_die)) in update_var_state()
951 static void update_insn_state(struct type_state *state, struct data_loc_info *dloc, in update_insn_state() argument
954 if (dloc->arch->update_insn_state) in update_insn_state()
955 dloc->arch->update_insn_state(state, dloc, cu_die, dl); in update_insn_state()
1031 static void setup_stack_canary(struct data_loc_info *dloc) in setup_stack_canary() argument
1033 if (arch__is(dloc->arch, "x86")) { in setup_stack_canary()
1034 dloc->op->segment = INSN_SEG_X86_GS; in setup_stack_canary()
1035 dloc->op->imm = true; in setup_stack_canary()
1036 dloc->op->offset = 40; in setup_stack_canary()
1046 struct data_loc_info *dloc, in check_matching_type() argument
1053 int reg = dloc->op->reg1; in check_matching_type()
1054 int offset = dloc->op->offset; in check_matching_type()
1085 if (dloc->op->offset < 0 && reg != state->stack_reg) in check_matching_type()
1095 dloc->type_offset = dloc->op->offset; in check_matching_type()
1104 (unsigned)dloc->type_offset >= size) in check_matching_type()
1119 dloc->type_offset = dloc->op->offset; in check_matching_type()
1123 (unsigned)dloc->type_offset >= size) in check_matching_type()
1137 setup_stack_canary(dloc); in check_matching_type()
1143 u64 var_addr = dloc->op->offset; in check_matching_type()
1148 if (dloc->op->multi_regs) { in check_matching_type()
1149 int reg2 = dloc->op->reg2; in check_matching_type()
1151 if (dloc->op->reg2 == reg) in check_matching_type()
1152 reg2 = dloc->op->reg1; in check_matching_type()
1159 if (get_global_var_type(cu_die, dloc, dloc->ip, var_addr, in check_matching_type()
1161 dloc->type_offset = var_offset; in check_matching_type()
1169 if (reg == dloc->fbreg || reg == state->stack_reg) { in check_matching_type()
1172 pr_debug_dtp("%s", reg == dloc->fbreg ? "fbreg" : "stack"); in check_matching_type()
1174 stack = find_stack_state(state, dloc->type_offset); in check_matching_type()
1181 update_insn_state(state, dloc, cu_die, dl); in check_matching_type()
1188 setup_stack_canary(dloc); in check_matching_type()
1197 dloc->type_offset -= stack->offset; in check_matching_type()
1202 if (dloc->fb_cfa) { in check_matching_type()
1204 u64 pc = map__rip_2objdump(dloc->ms->map, dloc->ip); in check_matching_type()
1209 if (die_get_cfa(dloc->di->dbg, pc, &fbreg, &fboff) < 0) in check_matching_type()
1215 stack = find_stack_state(state, dloc->type_offset - fboff); in check_matching_type()
1222 update_insn_state(state, dloc, cu_die, dl); in check_matching_type()
1229 setup_stack_canary(dloc); in check_matching_type()
1238 dloc->type_offset -= fboff + stack->offset; in check_matching_type()
1244 if (dso__kernel(map__dso(dloc->ms->map))) { in check_matching_type()
1248 if (dloc->op->segment == INSN_SEG_X86_GS && dloc->op->imm && in check_matching_type()
1249 arch__is(dloc->arch, "x86")) { in check_matching_type()
1252 addr = dloc->op->offset; in check_matching_type()
1254 if (get_global_var_type(cu_die, dloc, dloc->ip, addr, in check_matching_type()
1256 dloc->type_offset = offset; in check_matching_type()
1263 if (dloc->op->offset < 0 && reg != state->stack_reg) { in check_matching_type()
1264 addr = (s64) dloc->op->offset; in check_matching_type()
1266 if (get_global_var_type(cu_die, dloc, dloc->ip, addr, in check_matching_type()
1270 dloc->type_offset = offset; in check_matching_type()
1281 static enum type_match_result find_data_type_insn(struct data_loc_info *dloc, in find_data_type_insn() argument
1288 struct symbol *sym = dloc->ms->sym; in find_data_type_insn()
1293 init_type_state(&state, dloc->arch); in find_data_type_insn()
1305 u64 addr = map__rip_2objdump(dloc->ms->map, this_ip); in find_data_type_insn()
1312 update_var_state(&state, dloc, addr, dl->al.offset, var_types); in find_data_type_insn()
1314 if (this_ip == dloc->ip) { in find_data_type_insn()
1315 ret = check_matching_type(&state, dloc, in find_data_type_insn()
1322 update_insn_state(&state, dloc, cu_die, dl); in find_data_type_insn()
1333 static int arch_supports_insn_tracking(struct data_loc_info *dloc) in arch_supports_insn_tracking() argument
1335 if ((arch__is(dloc->arch, "x86")) || (arch__is(dloc->arch, "powerpc"))) in arch_supports_insn_tracking()
1344 static enum type_match_result find_data_type_block(struct data_loc_info *dloc, in find_data_type_block() argument
1356 if (!arch_supports_insn_tracking(dloc)) in find_data_type_block()
1359 prev_dst_ip = dst_ip = dloc->ip; in find_data_type_block()
1370 src_ip = map__objdump_2rip(dloc->ms->map, start); in find_data_type_block()
1374 if (annotate_get_basic_blocks(dloc->ms->sym, src_ip, dst_ip, in find_data_type_block()
1383 src_ip - dloc->ms->sym->start, in find_data_type_block()
1384 dst_ip - dloc->ms->sym->start); in find_data_type_block()
1394 ret = find_data_type_insn(dloc, &basic_blocks, var_types, in find_data_type_block()
1398 int offset = dloc->op->offset; in find_data_type_block()
1406 if (dloc->op->multi_regs) in find_data_type_block()
1408 dloc->op->reg1, dloc->op->reg2); in find_data_type_block()
1410 snprintf(buf, sizeof(buf), "reg%d", dloc->op->reg1); in find_data_type_block()
1413 offset_sign, offset, buf, dloc->type_offset); in find_data_type_block()
1431 static int find_data_type_die(struct data_loc_info *dloc, Dwarf_Die *type_die) in find_data_type_die() argument
1433 struct annotated_op_loc *loc = dloc->op; in find_data_type_die()
1448 if (dloc->op->multi_regs) in find_data_type_die()
1449 snprintf(buf, sizeof(buf), "reg%d, reg%d", dloc->op->reg1, dloc->op->reg2); in find_data_type_die()
1450 else if (dloc->op->reg1 == DWARF_REG_PC) in find_data_type_die()
1453 snprintf(buf, sizeof(buf), "reg%d", dloc->op->reg1); in find_data_type_die()
1463 dloc->ms->sym->name, dloc->ip - dloc->ms->sym->start); in find_data_type_die()
1470 pc = map__rip_2objdump(dloc->ms->map, dloc->ip); in find_data_type_die()
1473 if (!find_cu_die(dloc->di, pc, &cu_die)) { in find_data_type_die()
1486 if (get_global_var_type(&cu_die, dloc, dloc->ip, dloc->var_addr, in find_data_type_die()
1488 dloc->type_offset = offset; in find_data_type_die()
1491 dloc->var_addr, offset); in find_data_type_die()
1510 fbreg = dloc->fbreg = *block.data - DW_OP_reg0; in find_data_type_die()
1513 dloc->fb_cfa = true; in find_data_type_die()
1514 if (die_get_cfa(dloc->di->dbg, pc, &fbreg, in find_data_type_die()
1523 dloc->fb_cfa, fbreg); in find_data_type_die()
1538 if (!die_find_variable_by_addr(&scopes[i], dloc->var_addr, in find_data_type_die()
1553 result = check_variable(dloc, &var_die, &mem_die, reg, type_offset, is_fbreg); in find_data_type_die()
1557 dloc->var_addr, type_offset); in find_data_type_die()
1567 dloc->type_offset = type_offset; in find_data_type_die()
1584 result = find_data_type_block(dloc, &cu_die, scopes, in find_data_type_die()
1641 struct annotated_data_type *find_data_type(struct data_loc_info *dloc) in find_data_type() argument
1643 struct dso *dso = map__dso(dloc->ms->map); in find_data_type()
1650 dloc->type_offset = dloc->op->offset; in find_data_type()
1652 dloc->fbreg = -1; in find_data_type()
1654 if (find_data_type_die(dloc, &type_die) < 0) in find_data_type()