}
case FIELD_LOC_KIND_PHYSADDR:
- return FIELD_STATIC_PHYSADDR (call_site->target);
+ {
+ dwarf2_per_objfile *per_objfile = call_site->per_objfile;
+ compunit_symtab *cust = per_objfile->get_symtab (call_site->per_cu);
+ int sect_idx = COMPUNIT_BLOCK_LINE_SECTION (cust);
+ CORE_ADDR delta = per_objfile->objfile->section_offsets[sect_idx];
+
+ return FIELD_STATIC_PHYSADDR (call_site->target) + delta;
+ }
default:
internal_error (__FILE__, __LINE__, _("invalid call site target kind"));
}
pc = attr->as_address () + baseaddr;
pc = gdbarch_adjust_dwarf2_addr (gdbarch, pc);
+ pc -= baseaddr;
if (cu->call_site_htab == NULL)
cu->call_site_htab = htab_create_alloc_ex (16, call_site::hash,
sect_offset_str (die->sect_off), objfile_name (objfile));
else
{
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr);
+ lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr)
+ - baseaddr);
SET_FIELD_PHYSADDR (call_site->target, lowpc);
}
}
CORE_ADDR
call_site::pc () const
{
- return m_pc;
+ compunit_symtab *cust = this->per_objfile->get_symtab (this->per_cu);
+ CORE_ADDR delta
+ = this->per_objfile->objfile->section_offsets[COMPUNIT_BLOCK_LINE_SECTION (cust)];
+ return m_unrelocated_pc + delta;
}
void _initialize_gdbtypes ();
{
call_site (CORE_ADDR pc, dwarf2_per_cu_data *per_cu,
dwarf2_per_objfile *per_objfile)
- : per_cu (per_cu), per_objfile (per_objfile), m_pc (pc)
+ : per_cu (per_cu), per_objfile (per_objfile), m_unrelocated_pc (pc)
{}
static int
eq (const call_site *a, const call_site *b)
{
- return core_addr_eq (&a->m_pc, &b->m_pc);
+ return core_addr_eq (&a->m_unrelocated_pc, &b->m_unrelocated_pc);
}
static hashval_t
hash (const call_site *a)
{
- return core_addr_hash (&a->m_pc);
+ return core_addr_hash (&a->m_unrelocated_pc);
}
static int
dwarf2_per_objfile *const per_objfile = nullptr;
private:
- /* Address of the first instruction after this call. */
- const CORE_ADDR m_pc;
+ /* Unrelocated address of the first instruction after this call. */
+ const CORE_ADDR m_unrelocated_pc;
public:
/* * Describe DW_TAG_call_site's DW_TAG_formal_parameter. */
if (m_call_site_htab == nullptr)
return nullptr;
- struct call_site call_site_local (pc, nullptr, nullptr);
+ CORE_ADDR delta
+ = this->objfile->section_offsets[COMPUNIT_BLOCK_LINE_SECTION (this)];
+ CORE_ADDR unrelocated_pc = pc - delta;
+
+ struct call_site call_site_local (unrelocated_pc, nullptr, nullptr);
void **slot
= htab_find_slot (m_call_site_htab, &call_site_local, NO_INSERT);
if (slot == nullptr)