#include "dwarf2.h"
#include "dwarf2expr.h"
#include "dwarf2loc.h"
+#include "dwarf2read.h"
#include "dwarf2-frame.h"
#include "compile/compile.h"
#include "common/selftest.h"
}
/* Callback function for dwarf2_evaluate_loc_desc.
- Fetch the address indexed by DW_OP_GNU_addr_index. */
+ Fetch the address indexed by DW_OP_addrx or DW_OP_GNU_addr_index. */
CORE_ADDR get_addr_index (unsigned int index) override
{
{
struct call_site_chain *retval = NULL;
- TRY
+ try
{
retval = call_site_find_chain_1 (gdbarch, caller_pc, callee_pc);
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
if (e.error == NO_ENTRY_VALUE_ERROR)
{
return NULL;
}
else
- throw_exception (e);
+ throw;
}
- END_CATCH
return retval;
}
ctx.ref_addr_size = dwarf2_per_cu_ref_addr_size (per_cu);
ctx.offset = dwarf2_per_cu_text_offset (per_cu);
- TRY
+ try
{
ctx.eval (data, size);
}
- CATCH (ex, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &ex)
{
if (ex.error == NOT_AVAILABLE_ERROR)
{
return allocate_optimized_out_value (subobj_type);
}
else
- throw_exception (ex);
+ throw;
}
- END_CATCH
if (ctx.pieces.size () > 0)
{
ctx.ref_addr_size = dwarf2_per_cu_ref_addr_size (dlbaton->per_cu);
ctx.offset = dwarf2_per_cu_text_offset (dlbaton->per_cu);
- TRY
+ try
{
ctx.eval (dlbaton->data, dlbaton->size);
}
- CATCH (ex, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &ex)
{
if (ex.error == NOT_AVAILABLE_ERROR)
{
return 0;
}
else
- throw_exception (ex);
+ throw;
}
- END_CATCH
switch (ctx.location)
{
struct value *val;
for (pinfo = addr_stack; pinfo != NULL; pinfo = pinfo->next)
- if (pinfo->type == baton->referenced_type)
- break;
+ {
+ /* This approach lets us avoid checking the qualifiers. */
+ if (TYPE_MAIN_TYPE (pinfo->type)
+ == TYPE_MAIN_TYPE (baton->referenced_type))
+ break;
+ }
if (pinfo == NULL)
error (_("cannot find reference address for offset property"));
if (pinfo->valaddr != NULL)
push_address (0, 0);
}
- /* DW_OP_GNU_addr_index doesn't require a frame. */
+ /* DW_OP_addrx and DW_OP_GNU_addr_index doesn't require a frame. */
CORE_ADDR get_addr_index (unsigned int index) override
{
fprintf_filtered (stream, " offset %s", phex_nz (ul, 4));
break;
+ case DW_OP_addrx:
case DW_OP_GNU_addr_index:
data = safe_read_uleb128 (data, end, &ul);
ul = dwarf2_read_addr_index (per_cu, ul);