https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111731

Dimitar Yordanov <dimitar.yordanov at sap dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dimitar.yordanov at sap dot com

--- Comment #3 from Dimitar Yordanov <dimitar.yordanov at sap dot com> ---
Hi,

what I can further add as a detail to the code below is that in the error case
"begin" is after "range[0]" as calculated by get_pc_range

-----------------
void
__register_frame_info_bases (const void *begin, struct object *ob,
                             void *tbase, void *dbase)
{
 .....

  // Register the object itself to know the base pointer on deregistration.
  btree_insert (&registered_frames, (uintptr_type) begin, 1, ob);

  // Register the frame in the b-tree
  uintptr_type range[2];
  get_pc_range (ob, range);
  btree_insert (&registered_frames, range[0], range[1] - range[0], ob);
-----------------

and pc_begin comes from the following with "((encoding & 0x70) ==
DW_EH_PE_pcrel" being true

-----------------
static const unsigned char *
read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
                              const unsigned char *p, _Unwind_Ptr *val)
{
....
        case DW_EH_PE_sdata8:
          result = u->s8;
          p += 8;
....
        result += ((encoding & 0x70) == DW_EH_PE_pcrel
                     ? (_Unwind_Internal_Ptr) u : base);

-----------------
E.g. u->s8 has a value of 0xffffffffffffe6f8 u 0x7fa7fc22f908 and with that
result 0x7fa7fc22e000 which is lower as the begin 0x7fa7fc22f160

Reply via email to