Re: [patch] C6X unwinding/exception handling

Matthias Klose <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.java.devel
Message-ID <[email protected]>
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.orig    2011-07-21 15:33:57.000000000 +0000
+++ libobjc/exception.c 2011-10-09 10:53:12.554940776 +0000
@@ -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  <[email protected]>
>  
> 	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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.