Thread View: gmane.comp.gcc.patches
1 messages
1 total messages
Started by Eric Botcazou
Tue, 25 Mar 2014 13:21
[ARM] Fix PR target/60504
Author: Eric Botcazou
Date: Tue, 25 Mar 2014 13:21
Date: Tue, 25 Mar 2014 13:21
139 lines
4320 bytes
4320 bytes
--nextPart4259747.EYSjzGb5R3 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Hi, because of popular demand we switched the Ada compiler to ZCX, i.e. table- driven EH scheme, on ARM/Linux, only to discover that GCC doesn't generate correct EH tables, which means that the Ada compiler cannot catch exceptions. See also the earlier message posted by Tristan: http://gcc.gnu.org/ml/gcc/2013-12/msg00157.html The problem is the discrepancy between the declared encoding and the actual encoding of the TType. The latter is specified by the EABI: symbols must be relocated with an R_ARM_TARGET2 relocation, as visible in the assembly: .LLSDACSE0: .byte 0x1 @ Action record table .byte 0 .align 2 .word _ZTIi(TARGET2) R_ARM_TARGET2 means DW_EH_PE_pcrel | DW_EH_PE_indirect in DWARF parlance on Linux, but the declared TType encoding is different: .LLSDA0: .byte 0xff @ @LPStart format (omit) .byte 0 @ @TType format (absolute) .uleb128 .LLSDATT0-.LLSDATTD0 @ @TType base offset i.e. it's the DW_EH_PE_absptr default. This works in C++ because of the _GLIBCXX_OVERRIDE_TTYPE_ENCODING kludge, which overrides the declared encoding during the parsing of the EH table: // Find @TType, the base of the handler and exception spec type data. 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; } else info->TType = 0; This comes from http://gcc.gnu.org/ml/gcc-patches/2011-09/msg00765.html Note that the above comment suggests that Paul's intent was to fix the bogus declared encoding in newer toolchains, but he didn't because of a misplaced #endif as spotted by Tristan. Hence the attached patch, which aligns the declared encoding with the actual encoding and yields the correct: .LLSDA0: .byte 0xff @ @LPStart format (omit) .byte 0x90 @ @TType format (indirect pcrel) .uleb128 .LLSDATT0-.LLSDATTD0 @ @TType base offset which fixes the Ada failures in the process. It was kindly tested by Bernd Edlinger on armv7l-unknown-linux-gnueabihf (all languages) with no regressions so we would like to have it for 4.9.x. 2014-04-25 Douglas B Rupp <rupp@adacore.com> PR target/60504 * config/arm/arm.h (ASM_PREFERRED_EH_DATA_FORMAT): Expose from ARM_TARGET2_DWARF_FORMAT. 2014-04-25 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/test_raise_from_pure.adb: UnXFAIL for ARM. -- Eric Botcazou --nextPart4259747.EYSjzGb5R3 Content-Disposition: attachment; filename="t.C" Content-Transfer-Encoding: 7Bit Content-Type: text/x-c++src; charset="utf-8"; name="t.C" extern void foo (); int bar () { try { foo (); } catch (int) { return 1; } return 0; } --nextPart4259747.EYSjzGb5R3 Content-Disposition: attachment; filename="pr60504.diff" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="pr60504.diff" Index: config/arm/arm.h =================================================================== --- config/arm/arm.h (revision 208763) +++ config/arm/arm.h (working copy) @@ -937,13 +937,13 @@ extern int arm_arch_crc; #ifndef ARM_TARGET2_DWARF_FORMAT #define ARM_TARGET2_DWARF_FORMAT DW_EH_PE_pcrel +#endif /* ttype entries (the only interesting data references used) use TARGET2 relocations. */ #define ASM_PREFERRED_EH_DATA_FORMAT(code, data) \ (((code) == 0 && (data) == 1 && ARM_UNWIND_INFO) ? ARM_TARGET2_DWARF_FORMAT \ : DW_EH_PE_absptr) -#endif /* The native (Norcroft) Pascal compiler for the ARM passes the static chain as an invisible last argument (possible since varargs don't exist in Index: testsuite/gnat.dg/test_raise_from_pure.adb =================================================================== --- testsuite/gnat.dg/test_raise_from_pure.adb (revision 208763) +++ testsuite/gnat.dg/test_raise_from_pure.adb (working copy) @@ -1,4 +1,4 @@ --- { dg-do run { xfail arm*-*-* } } +-- { dg-do run } -- { dg-options "-O2" } -- This is an optimization test and its failure is only a missed optimization. --nextPart4259747.EYSjzGb5R3--
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads