> -----Original Message-----
> From: Moore, Catherine
> Sent: Tuesday, January 05, 2016 8:53 AM
> To: Richard Henderson; ja...@redhat.com
> Cc: gcc-patches@gcc.gnu.org
> Subject: FW: [RFA] Compact EH Patch [Ping * 2]
> 
> Ping, Ping.
> 
> -----Original Message-----
> From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
> ow...@gcc.gnu.org] On Behalf Of Moore, Catherine
> Sent: Monday, December 21, 2015 9:22 AM
> To: Richard Henderson; gcc-patches@gcc.gnu.org
> Cc: ja...@redhat.com; Matthew Fortune
> Subject: RE: [RFA] Compact EH Patch [Ping]
> 
> 
> 
> > -----Original Message-----
> > From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
> > ow...@gcc.gnu.org] On Behalf Of Moore, Catherine
> > Sent: Sunday, December 13, 2015 5:12 PM
> > To: Richard Henderson; gcc-patches@gcc.gnu.org
> > Cc: ja...@redhat.com; Matthew Fortune
> > Subject: RE: [RFA] Compact EH Patch
> >
> > I've now updated the patch.  I'd like to get this in GCC 6.0; please
> > let me know if that is possible.
> > I've also updated the spec (https://github.com/MentorEmbedded/cxx-
> > abi/MIPSCompactEH.pdf).
> >  rth commented that there was no versioning info provision for the
> > personality routines.  The now spec identifies a couple of bits in the
> > header that can be used for that.  A couple of new unwind opcodes were
> > also added.
> >
> > With the exception of Matthew's comment about disabling Compact EH for
> > those ABIs that don't support it, I have not addressed the
> > MIPS-specific comments.  I will post a follow-on patch next week to take
> care of that.
> > There is also a problem with N64 ABI support that requires a follow-on
> > binutils patch.  I have disabled Compact EH for N64 on Linux in this
> > version of the patch.  I plan to re-enable it after binutils is updated.
> >
> > Okay to commit?
> >
> > Thanks,
> > Catherine
> >
> >
> > > -----Original Message-----
> > > From: Richard Henderson [mailto:r...@redhat.com]
> > > Sent: Friday, September 18, 2015 3:25 PM
> > > To: Moore, Catherine; gcc-patches@gcc.gnu.org
> > > Cc: ja...@redhat.com; Matthew Fortune
> > > Subject: Re: [RFA] Compact EH Patch
> > >
> > > > Index: libgcc/libgcc-std.ver.in
> > > >
> > >
> >
> ==========================================================
> > > =========
> > > > --- libgcc/libgcc-std.ver.in    (revision 226409)
> > > > +++ libgcc/libgcc-std.ver.in    (working copy)
> > > > @@ -1918,6 +1918,7 @@ GCC_4.6.0 {
> > > >    __morestack_current_segment
> > > >    __morestack_initial_sp
> > > >    __splitstack_find
> > > > +  _Unwind_GetEhEncoding
> > > >  }
> > > >
> > > >  %inherit GCC_4.7.0 GCC_4.6.0
> > > > @@ -1938,3 +1939,8 @@ GCC_4.7.0 {
> > > >  %inherit GCC_4.8.0 GCC_4.7.0
> > > >  GCC_4.8.0 {
> > > >  }
> > > > +
> > > > +%inherit GCC_4.8.0 GCC_4.7.0
> > > > +GCC_4.8.0 {
> > > > +  __register_frame_info_header_bases
> > > > +}
> > >
> > > You can't push new symbols into old versions.  These have to go into
> > > the version for the current gcc.
> >
> > Done.
> > >
> > > > Index: libstdc++-v3/config/abi/pre/gnu.ver
> > > >
> > >
> >
> ==========================================================
> > > =========
> > > > --- libstdc++-v3/config/abi/pre/gnu.ver (revision 226409)
> > > > +++ libstdc++-v3/config/abi/pre/gnu.ver (working copy)
> > > > @@ -1909,6 +1909,7 @@ CXXABI_1.3 {
> > > >      __gxx_personality_v0;
> > > >      __gxx_personality_sj0;
> > > >      __gxx_personality_seh0;
> > > > +    __gnu_compact_pr2;
> > > >      __dynamic_cast;
> > > >
> > > >      # *_type_info classes, ctor and dtor
> >
> > Done.
> >
> > > > Index: libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
> > > >
> > >
> >
> ==========================================================
> > > =========
> > > > --- libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
> > >   (revision 226409)
> > > > +++ libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
> > >   (working copy)
> > > > @@ -200,6 +200,7 @@ CXXABI_2.0 {
> > > >      __cxa_vec_new;
> > > >      __gxx_personality_v0;
> > > >      __gxx_personality_sj0;
> > > > +    __gnu_compact_pr2;
> > > >      __dynamic_cast;
> > > >
> > > >      # std::exception_ptr
> > >
> > Jonathan says that CXXABI_2.0 is correct here.
> > >
> > > > +  if (data.type != CET_not_found)
> > > > +    return data.type;
> > > > +
> > > > +  return CET_not_found;
> > >
> > > Return data.type unconditionally.
> >
> > Done.
> > >
> > > > +++ libgcc/unwind-pe.h  (working copy)
> > > > @@ -44,6 +44,7 @@
> > > >  #define DW_EH_PE_udata2         0x02
> > > >  #define DW_EH_PE_udata4         0x03
> > > >  #define DW_EH_PE_udata8         0x04
> > > > +#define DW_EH_PE_udata1         0x05
> > > >  #define DW_EH_PE_sleb128        0x09
> > > >  #define DW_EH_PE_sdata2         0x0A
> > > >  #define DW_EH_PE_sdata4         0x0B
> > >
> > > If we're going to add udata1, we might as well add sdata1 for consistency.
> >
> > Done.
> > >
> > > > @@ -184,6 +187,7 @@ read_encoded_value_with_base (unsigned char
> > > encodi
> > > >    union unaligned
> > > >      {
> > > >        void *ptr;
> > > > +      unsigned u1 __attribute__ ((mode (QI)));
> > > >        unsigned u2 __attribute__ ((mode (HI)));
> > > >        unsigned u4 __attribute__ ((mode (SI)));
> > > >        unsigned u8 __attribute__ ((mode (DI)));
> > >
> > > This is silly.  Access to a single byte never requires alignment
> > > help from the compiler...
> > >
> > > > +       case DW_EH_PE_udata1:
> > > > +         result = u->u1;
> > > > +         p += 1;
> > > > +         break;
> > >
> > >     result = *p;
> >
> > Done.
> >
> > >
> > > > +  read_encoded_value_with_base (DW_EH_PE_absptr |
> > > DW_EH_PE_udata4, 0,
> > > > +                               hdr + 4, &nrec);
> > >
> > > Err... that encoding type makes no sense: absptr is "pointer size".
> > > Combining that with an explicit size, like udata4, means that udata4
> > > wins.  So this is the same as simply writing DW_EH_PE_udata4.
> > >
> > > At which point you're loading a 4 byte unsigned quantity from an
> > > aligned address.  You might as well use *(uint32_t *)(hdr + 4).
> > >
> >
> > Done.
> > > > +__register_frame_info_header_bases (const void *begin, struct
> > > > +object
> > > *ob,
> > > > +                                   void *tbase, void *dbase) {
> > > > +  /* Only register compact EH frame headers.  */
> > > > +  if (begin == NULL || *(const char *) begin != 2)
> > > > +    return;
> > >
> > > Check for no entries before registering?
> >
> > Done.
> > >
> > > > +extern char __GNU_EH_FRAME_HDR[] TARGET_ATTRIBUTE_WEAK;
> > >
> > > Don't you have some guaranteed alignment for this table?
> > > That perhaps ought to be seen in either the type or an attribute.
> > >
> > > +      if (op < 0x40)
> > > +      else if (op < 0x48)
> > > +      else if (op < 0x50)
> > > +      else if (op < 0x58)
> > > +      else if (op == 0x58)
> > > +      else if (op == 0x59)
> > > +      else if (op == 0x5a)
> > > +      else if (op == 0x5b)
> > > +      else if (op == 0x5c)
> > > +      else if (op == 0x5d)
> > > +      else if (op == 0x5e)
> > > +      else if (op == 0x5f)
> > > +      else if (op >= 0x60 && op < 0x6c)
> > >
> > > Better as a switch statement surely, using the gcc case x ... y: 
> > > extension.
> >
> > Done.
> > >
> > > > +static _Unwind_Reason_Code
> > > > +uw_frame_state_compact (struct _Unwind_Context *context,
> > > > +                       _Unwind_FrameState *fs,
> > > > +                       enum compact_entry_type entry_type,
> > > > +                       struct compact_eh_bases *bases) {
> > > > +  const unsigned char *p;
> > > > +  unsigned int pr_index;
> > > > +  _Unwind_Ptr personality;
> > > > +  unsigned char buf[4];
> > > > +  _Unwind_Reason_Code rc;
> > > > +
> > > > +  p = bases->entry;
> > > > +  pr_index = *(p++);
> > > > +  switch (pr_index) {
> > > > +  case 0:
> > > > +      p = read_encoded_value (context, bases->eh_encoding, p,
> > > &personality);
> > > > +      fs->personality = (_Unwind_Personality_Fn) personality;
> > > > +      break;
> > > > +  case 1:
> > > > +      fs->personality = __gnu_compact_pr1;
> > > > +      break;
> > > > +  case 2:
> > > > +      fs->personality = __gnu_compact_pr2;
> > > > +      break;
> > > > +  default:
> > > > +      fs->personality = NULL;
> > > > +  }
> > >
> > > This is the aspect of this spec about which I am least keen.  The
> > > existing method whereby the personality function is explicit in each
> > > object file means that we've got automatic version control on data
> > > that is private to the object file.
> > >
> > > That is, if we should ever change the format of the LSDA -- as in
> > > fact you are doing here -- then all we need do is change
> > > __gcc_personality_v0 to __gcc_personality_v1, and all is well.  One
> > > can mix and match object files from different compiler versions and
> > > all that is required for correctness is that the runtime libraries
> > > must
> > continue to provide all previous versions.
> > >
> > > What you're doing here doesn't allow the format of index {1,2,3} to
> > > *ever* change.  You've fixed it forever, barring abandoning those
> > > indices and always using index 0.
> > >
> > > I know that the ARM EH format made exactly the same mistake, but
> > > let's see if we can find some way of not replicating it, eh?
> >
> >
> > This has been addressed with a specification update to allocate some
> > additional bits for versioning.
> > >
> > >
> > > > @@ -206,4 +206,14 @@ _Unwind_SetIP (struct _Unwind_Context
> > > *context, _U
> > > >    return __libunwind_Unwind_SetIP (context, val);  }  symver
> > > > (_Unwind_SetIP, GCC_3.0);
> > > > +
> > > > +extern unsigned char __libunwind_Unwind_GetEhEncoding
> > > > +  (struct _Unwind_Context *);
> > > > +
> > > > +unsigned char
> > > > +_Unwind_GetEhEncoding (struct _Unwind_Context *context) {
> > > > +  return __libunwind_Unwind_GetEhEncoding (context, val); }
> > > > +symver (_Unwind_GetEhEncoding, GCC_3.0);
> > > >  #endif
> > >
> > > There is no such __libunwind symbol, is there?
> >
> > Removed.
> > >
> > > > +mcompact-eh
> > > > +Target Var(TARGET_COMPACT_EH) Init(1) Use compact exception
> > > unwinding
> > > > +tables.
> > >
> > > This ought to be automatically disabled with -fasynchronous-unwind-
> > tables.
> >
> > We don't disable it, but we emit dwarf-based unwind information.  The
> > compact header knows that it's DWARF and processes it accordingly.
> > See Section 10 in the spec -- we have compact-inline, compact-outline
> > and legacy-style unwind info.
> >
> > >
> > > >           /* "Save" $sp in itself so we don't use the fake CFA.
> > > >              This is: DW_CFA_val_expression r29, { DW_OP_reg29 }.  */
> > > > -         fprintf (asm_out_file, "\t.cfi_escape 0x16,29,1,0x6d\n");
> > > > +         if (dwarf2out_do_frame ()
> > > > +             && (flag_unwind_tables || flag_exceptions))
> > > > +           /* "Save" $sp in itself so we don't use the fake CFA.
> > > > +              This is: DW_CFA_val_expression r29, { DW_OP_reg29 }.  */
> > > > +           fprintf (asm_out_file, "\t.cfi_fde_data 0x5b\n");
> > > > +         else
> > > > +           fprintf (asm_out_file, "\t.cfi_escape 0x16,29,1,0x6d\n");
> > >
> > > The commentary appears to be messed up?
> >
> > Fixed.
> >

Reply via email to