Re: [patch] C6X unwinding/exception handling

2011-10-20 Thread Bernd Schmidt
On 10/17/11 16:10, Nicola Pero wrote:
>>> I checked the attached patch, test results at
>>> http://gcc.gnu.org/ml/gcc-testresults/2011-10/msg01377.html
>>>
>>> which are the same as with my suggested patch.
>>>
>>> Ok for the trunk?
>>
>> I probably don't have authority to approve this, but looks OK to me.
> 
> The libobjc bits are Ok for trunk.

This is just making sure libjava/libobjc match libsupc++, correct? OK if
Andrew doesn't object in the next day or so.


Bernd



Re: [patch] C6X unwinding/exception handling

2011-10-17 Thread Nicola Pero
>> I checked the attached patch, test results at
>> http://gcc.gnu.org/ml/gcc-testresults/2011-10/msg01377.html
>> 
>> which are the same as with my suggested patch.
>> 
>> Ok for the trunk?
>
> I probably don't have authority to approve this, but looks OK to me.

The libobjc bits are Ok for trunk.

Thanks



Re: [patch] C6X unwinding/exception handling

2011-10-17 Thread Paul Brook
> I checked the attached patch, test results at
> http://gcc.gnu.org/ml/gcc-testresults/2011-10/msg01377.html
> 
> which are the same as with my suggested patch.
> 
> Ok for the trunk?

I probably don't have authority to approve this, but looks OK to me.

Paul


Re: [patch] C6X unwinding/exception handling

2011-10-17 Thread Matthias Klose
On 10/10/2011 02:23 PM, Paul Brook wrote:
>> Index: libjava/exception.cc
>> ===
>> --- libjava/exception.cc (revision 179739)
>> +++ libjava/exception.cc (working copy)
>> @@ -135,6 +135,7 @@
>>  {
>>_Unwind_Ptr Start;
>>_Unwind_Ptr LPStart;
>> +  _Unwind_Ptr ttype_base;
>>const unsigned char *TType;
>>const unsigned char *action_table;
>>unsigned char ttype_encoding;
>> @@ -184,7 +185,7 @@
>>_Unwind_Ptr ptr;
>>
>>ptr = (_Unwind_Ptr) (info->TType - (i * 4));
>> -  ptr = _Unwind_decode_target2(ptr);
>> +  ptr = _Unwind_decode_typeinfo_ptr (info->ttype_base, (_Unwind_Word)
>> ptr);
>>
>>return reinterpret_cast(ptr);
>>  }
>> @@ -325,6 +326,7 @@
>>
>>// Parse the LSDA header.
>>p = parse_lsda_header (context, language_specific_data, &info);
>> +  info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
>>  #ifdef HAVE_GETIPINFO
>>ip = _Unwind_GetIPInfo (context, &ip_before_insn);
>>  #else
> 
> No.  The purpose of my patch was to remove the arm specific code.
> 
> The only difference I can see in this bit of code is that libstdc++ uses 
> base_of_encoded_value/read_encoded_value_with_base whereas libjava uses 
> context/read_encoded_value.
> 
> I expect you want something like the patch below (completely untested).

I checked the attached patch, test results at
http://gcc.gnu.org/ml/gcc-testresults/2011-10/msg01377.html

which are the same as with my suggested patch.

Ok for the trunk?

 Matthias
libjava/
2011-10-17  Paul Brook  

* exception.cc (parse_lsda_header): hardcode ttype_encoding for older
ARM EABI toolchains.
(get_ttype_entry) Remove __ARM_EABI_UNWINDER__ variant.

libobjc/
2011-10-17  Paul Brook  
Matthias Klose  

* exception.c (parse_lsda_header): hardcode ttype_encoding for older
ARM EABI toolchains.
(get_ttype_entry) Remove __ARM_EABI_UNWINDER__ variant.

Index: libjava/exception.cc
===
--- libjava/exception.cc(revision 180086)
+++ libjava/exception.cc(working copy)
@@ -161,6 +161,11 @@
   info->ttype_encoding = *p++;
   if (info->ttype_encoding != DW_EH_PE_omit)
 {
+#if _GLIBCXX_OVERRIDE_TTYPE_ENCODING
+  /* Older ARM EABI toolchains set this value incorrectly, so use a
+hardcoded OS-specific format.  */
+  info->ttype_encoding = _GLIBCXX_OVERRIDE_TTYPE_ENCODING;
+#endif
   p = read_uleb128 (p, &tmp);
   info->TType = p + tmp;
 }
@@ -176,22 +181,7 @@
   return p;
 }
 
-#ifdef __ARM_EABI_UNWINDER__
-
 static void **
-get_ttype_entry(_Unwind_Context *, lsda_header_info* info, _uleb128_t i)
-{
-  _Unwind_Ptr ptr;
-
-  ptr = (_Unwind_Ptr) (info->TType - (i * 4));
-  ptr = _Unwind_decode_target2(ptr);
-  
-  return reinterpret_cast(ptr);
-}
-
-#else
-
-static void **
 get_ttype_entry (_Unwind_Context *context, lsda_header_info *info, long i)
 {
   _Unwind_Ptr ptr;
@@ -202,8 +192,6 @@
   return reinterpret_cast(ptr);
 }
 
-#endif
-
 // Using a different personality function name causes link failures
 // when trying to mix code using different exception handling models.
 #ifdef SJLJ_EXCEPTIONS

Index: libobjc/exception.c
===
--- libobjc/exception.c (revision 180086)
+++ libobjc/exception.c (working copy)
@@ -159,6 +159,11 @@
   info->ttype_encoding = *p++;
   if (info->ttype_encoding != DW_EH_PE_omit)
 {
+#if _GLIBCXX_OVERRIDE_TTYPE_ENCODING
+  /* Older ARM EABI toolchains set this value incorrectly, so use a
+hardcoded OS-specific format.  */
+  info->ttype_encoding = _GLIBCXX_OVERRIDE_TTYPE_ENCODING;
+#endif
   p = read_uleb128 (p, &tmp);
   info->TType = p + tmp;
 }
@@ -174,27 +179,7 @@
   return p;
 }
 
-#ifdef __ARM_EABI_UNWINDER__
-
 static Class
-get_ttype_entry (struct lsda_header_info *info, _uleb128_t i)
-{
-  _Unwind_Ptr ptr;
-  
-  ptr = (_Unwind_Ptr) (info->TType - (i * 4));
-  ptr = _Unwind_decode_target2 (ptr);
-
-  /* NULL ptr means catch-all.  Note that if the class is not found,
- this will abort the program.  */
-  if (ptr)
-return objc_getRequiredClass ((const char *) ptr);
-  else
-return 0;
-}
-
-#else
-
-static Class
 get_ttype_entry (struct lsda_header_info *info, _Unwind_Word i)
 {
   _Unwind_Ptr ptr;
@@ -211,8 +196,6 @@
 return 0;
 }
 
-#endif
-
 /* Using a different personality function name causes link failures
when trying to mix code using different exception handling
models.  */


Re: [patch] C6X unwinding/exception handling

2011-10-10 Thread Paul Brook
> Index: libjava/exception.cc
> ===
> --- libjava/exception.cc  (revision 179739)
> +++ libjava/exception.cc  (working copy)
> @@ -135,6 +135,7 @@
>  {
>_Unwind_Ptr Start;
>_Unwind_Ptr LPStart;
> +  _Unwind_Ptr ttype_base;
>const unsigned char *TType;
>const unsigned char *action_table;
>unsigned char ttype_encoding;
> @@ -184,7 +185,7 @@
>_Unwind_Ptr ptr;
> 
>ptr = (_Unwind_Ptr) (info->TType - (i * 4));
> -  ptr = _Unwind_decode_target2(ptr);
> +  ptr = _Unwind_decode_typeinfo_ptr (info->ttype_base, (_Unwind_Word)
> ptr);
> 
>return reinterpret_cast(ptr);
>  }
> @@ -325,6 +326,7 @@
> 
>// Parse the LSDA header.
>p = parse_lsda_header (context, language_specific_data, &info);
> +  info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
>  #ifdef HAVE_GETIPINFO
>ip = _Unwind_GetIPInfo (context, &ip_before_insn);
>  #else

No.  The purpose of my patch was to remove the arm specific code.

The only difference I can see in this bit of code is that libstdc++ uses 
base_of_encoded_value/read_encoded_value_with_base whereas libjava uses 
context/read_encoded_value.

I expect you want something like the patch below (completely untested).

Paul

Index: exception.cc
===
--- exception.cc(revision 178906)
+++ exception.cc(working copy)
@@ -161,6 +161,11 @@ parse_lsda_header (_Unwind_Context *cont
   info->ttype_encoding = *p++;
   if (info->ttype_encoding != DW_EH_PE_omit)
 {
+#if _GLIBCXX_OVERRIDE_TTYPE_ENCODING
+  /* Older ARM EABI toolchains set this value incorrectly, so use a
+hardcoded OS-specific format.  */
+  info->ttype_encoding = _GLIBCXX_OVERRIDE_TTYPE_ENCODING;
+#endif
   p = read_uleb128 (p, &tmp);
   info->TType = p + tmp;
 }
@@ -176,21 +181,6 @@ parse_lsda_header (_Unwind_Context *cont
   return p;
 }
 
-#ifdef __ARM_EABI_UNWINDER__
-
-static void **
-get_ttype_entry(_Unwind_Context *, lsda_header_info* info, _uleb128_t i)
-{
-  _Unwind_Ptr ptr;
-
-  ptr = (_Unwind_Ptr) (info->TType - (i * 4));
-  ptr = _Unwind_decode_target2(ptr);
-  
-  return reinterpret_cast(ptr);
-}
-
-#else
-
 static void **
 get_ttype_entry (_Unwind_Context *context, lsda_header_info *info, long i)
 {
@@ -202,8 +192,6 @@ get_ttype_entry (_Unwind_Context *contex
   return reinterpret_cast(ptr);
 }
 
-#endif
-
 // Using a different personality function name causes link failures
 // when trying to mix code using different exception handling models.
 #ifdef SJLJ_EXCEPTIONS


Re: [patch] C6X unwinding/exception handling

2011-10-10 Thread Matthias Klose
On 10/10/2011 12:32 PM, Andrew Haley wrote:
> On 10/09/2011 12:09 PM, Matthias Klose wrote:
>> This did break libobjc and libjava on arm-linux-gnueabi.
>>
>> libobjc now has an undefined reference to _Unwind_decode_target2, which can 
>> be
>> avoided with

with this patch, the libobjc testsuite results looks as before this change.

>>
>> --- libobjc/exception.c.orig2011-07-21 15:33:57.0 +
>> +++ libobjc/exception.c 2011-10-09 10:53:12.554940776 +
>> @@ -182,7 +182,7 @@
>>_Unwind_Ptr ptr;
>>
>>ptr = (_Unwind_Ptr) (info->TType - (i * 4));
>> -  ptr = _Unwind_decode_target2 (ptr);
>> +  ptr = _Unwind_decode_typeinfo_ptr (info->ttype_base, (_Unwind_Word) ptr);
>>
>>/* NULL ptr means catch-all.  Note that if the class is not found,
>>   this will abort the program.  */
>>
>> libjava fails to build, the same change doesn't work for 
>> libjava/exception.cc,
>> because the struct lsda_header_info in exception.cc is missing the ttype_base
>> member. Any suggestions?
> 
> Is this fixable without backing out Paul Brooks' patch?

currently testing

Index: libjava/exception.cc
===
--- libjava/exception.cc(revision 179739)
+++ libjava/exception.cc(working copy)
@@ -135,6 +135,7 @@
 {
   _Unwind_Ptr Start;
   _Unwind_Ptr LPStart;
+  _Unwind_Ptr ttype_base;
   const unsigned char *TType;
   const unsigned char *action_table;
   unsigned char ttype_encoding;
@@ -184,7 +185,7 @@
   _Unwind_Ptr ptr;

   ptr = (_Unwind_Ptr) (info->TType - (i * 4));
-  ptr = _Unwind_decode_target2(ptr);
+  ptr = _Unwind_decode_typeinfo_ptr (info->ttype_base, (_Unwind_Word) ptr);

   return reinterpret_cast(ptr);
 }
@@ -325,6 +326,7 @@

   // Parse the LSDA header.
   p = parse_lsda_header (context, language_specific_data, &info);
+  info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
 #ifdef HAVE_GETIPINFO
   ip = _Unwind_GetIPInfo (context, &ip_before_insn);
 #else




Re: [patch] C6X unwinding/exception handling

2011-10-10 Thread Andrew Haley
On 10/09/2011 12:09 PM, Matthias Klose wrote:
> This did break libobjc and libjava on arm-linux-gnueabi.
>
> libobjc now has an undefined reference to _Unwind_decode_target2, which can be
> avoided with
>
> --- libobjc/exception.c.orig2011-07-21 15:33:57.0 +
> +++ libobjc/exception.c 2011-10-09 10:53:12.554940776 +
> @@ -182,7 +182,7 @@
>_Unwind_Ptr ptr;
>
>ptr = (_Unwind_Ptr) (info->TType - (i * 4));
> -  ptr = _Unwind_decode_target2 (ptr);
> +  ptr = _Unwind_decode_typeinfo_ptr (info->ttype_base, (_Unwind_Word) ptr);
>
>/* NULL ptr means catch-all.  Note that if the class is not found,
>   this will abort the program.  */
>
> libjava fails to build, the same change doesn't work for libjava/exception.cc,
> because the struct lsda_header_info in exception.cc is missing the ttype_base
> member. Any suggestions?

Is this fixable without backing out Paul Brooks' patch?

Andrew.



Re: [patch] C6X unwinding/exception handling

2011-10-09 Thread Matthias Klose
This did break libobjc and libjava on arm-linux-gnueabi.

libobjc now has an undefined reference to _Unwind_decode_target2, which can be
avoided with

--- libobjc/exception.c.orig2011-07-21 15:33:57.0 +
+++ libobjc/exception.c 2011-10-09 10:53:12.554940776 +
@@ -182,7 +182,7 @@
   _Unwind_Ptr ptr;

   ptr = (_Unwind_Ptr) (info->TType - (i * 4));
-  ptr = _Unwind_decode_target2 (ptr);
+  ptr = _Unwind_decode_typeinfo_ptr (info->ttype_base, (_Unwind_Word) ptr);

   /* NULL ptr means catch-all.  Note that if the class is not found,
  this will abort the program.  */

libjava fails to build, the same change doesn't work for libjava/exception.cc,
because the struct lsda_header_info in exception.cc is missing the ttype_base
member. Any suggestions?

On 09/13/2011 02:48 PM, Paul Brook wrote:
>> C6X uses an unwinding/exception handling echeme very similar to that
>> defined by the ARM EABI.  The core of the unwinder is the same, so I've
>> pulled it out into a common file.
>>
>> Other than the obvious target specific bits, the main compiler visible
>> difference is that the C6X assembler generates the unwinding tables from
>> DWARF .cfi directives, rather than the separate set of directives used by
>> the ARM assembler.
>>
>> The libstdc++ changes probably deserve a bit of explanation. The ttype_base
>> field was clearly used in an early draft of the ARM EABI, and the current
>> ARM definition is a compatible subset of that used by C6X.
>> _GLIBCXX_OVERRIDE_TTYPE_ENCODING is an unfortunate hack because when doing
>> the ARM implementation I failed to realise ttype_encoding was the same
>> thing as R_ARM_TARGET2.  We now have a lot of ARM binaries floating around
>> with that field set incorrectly, so it's either this or an ABI bump.
> 
> I've updated the patch to accomodate the move to libgcc/, done a quick sanity 
> recheck of arm-linux and c6x-elf and applied to svn.
> 
> P.S. in case it's not clear from my description, the libstdc++ changes aren't 
> really a new hack, it's just making an old one more obvious.
> 
> Paul
> 
> 2011-09-13  Paul Brook  
>  
>   gcc/
>   * config/arm/arm.h (ASM_PREFERRED_EH_DATA_FORMAT): Define.
>   (ARM_TARGET2_DWARF_FORMAT): Provide default definition.
>   * config/arm/linux-eabi.h (ARM_TARGET2_DWARF_FORMAT): Define.
>   * config/arm/symbian.h (ARM_TARGET2_DWARF_FORMAT): Define.
>   * config/arm/uclinux-eabi.h(ARM_TARGET2_DWARF_FORMAT): Define.
>   * config/arm/t-bpabi (EXTRA_HEADERS): Add unwind-arm-common.h.
>   * config/arm/t-symbian (EXTRA_HEADERS): Add unwind-arm-common.h.
>   * config/c6x/c6x.c (c6x_output_file_unwind): Don't rely on dwarf2 code
>   enabling unwind tables.
>   (c6x_debug_unwind_info): New function.
>   (TARGET_ARM_EABI_UNWINDER): Define.
>   (TARGET_DEBUG_UNWIND_INFO): Define.
>   * config/c6x/c6x.h (DWARF_FRAME_RETURN_COLUMN): Define.
>   (TARGET_EXTRA_CFI_SECTION): Remove.
>   * config/c6x/t-c6x-elf (EXTRA_HEADERS): Set.
>   * ginclude/unwind-arm-common.h: New file.
> 
>   libgcc/
>   * config.host (tic6x-*-*): Add c6x/t-c6x-elf.  Set unwind_header.
>   * unwind-c.c (PERSONALITY_FUNCTION): Use UNWIND_POINTER_REG.
>   * unwind-arm-common.inc: New file.
>   * config/arm/unwind-arm.c: Use unwind-arm-common.inc.
>   * config/arm/unwind-arm.h: Use unwind-arm-common.h.
>   (_GLIBCXX_OVERRIDE_TTYPE_ENCODING): Define.
>   * config/c6x/libunwind.S: New file.
>   * config/c6x/pr-support.c: New file.
>   * config/c6x/unwind-c6x.c: New file.
>   * config/c6x/unwind-c6x.h: New file.
>   * config/c6x/t-c6x-elf: New file.
> 
> 
>   libstdc++-v3/
>   * libsupc++/eh_arm.cc (__cxa_end_cleanup): Add C6X implementation.
>   * libsupc++/eh_call.cc (__cxa_call_unexpected): Set rtti_base.
>   * libsupc++/eh_personality.cc (NO_SIZE_OF_ENCODED_VALUE): Remove
>   __ARM_EABI_UNWINDER__ check.
>   (parse_lsda_header): Check _GLIBCXX_OVERRIDE_TTYPE_ENCODING.
>   (get_ttype_entry): Use generic implementation on ARM EABI.
>   (check_exception_spec): Use _Unwind_decode_typeinfo_ptr and
>   UNWIND_STACK_REG.
>   (PERSONALITY_FUNCTION): Set ttype_base.



Re: [patch] C6X unwinding/exception handling

2011-08-05 Thread Bernd Schmidt
On 08/04/11 16:31, Paul Brook wrote:
> C6X uses an unwinding/exception handling echeme very similar to that defined 
> by the ARM EABI.  The core of the unwinder is the same, so I've pulled it out 
> into a common file.
> 
> Other than the obvious target specific bits, the main compiler visible 
> difference is that the C6X assembler generates the unwinding tables from 
> DWARF 
> .cfi directives, rather than the separate set of directives used by the ARM 
> assembler.
> 
> The libstdc++ changes probably deserve a bit of explanation. The ttype_base 
> field was clearly used in an early draft of the ARM EABI, and the current ARM 
> definition is a compatible subset of that used by C6X.  
> _GLIBCXX_OVERRIDE_TTYPE_ENCODING is an unfortunate hack because when doing 
> the 
> ARM implementation I failed to realise ttype_encoding was the same thing as 
> R_ARM_TARGET2.  We now have a lot of ARM binaries floating around with that 
> field set incorrectly, so it's either this or an ABI bump.

Just for the record, no objections to the C6X parts of the patch if the
rest is approved.

It would probably help to say what kind of testing you did on ARM.


Bernd