> 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<void **>(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<void **>(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<void **>(ptr); } -#endif - // Using a different personality function name causes link failures // when trying to mix code using different exception handling models. #ifdef SJLJ_EXCEPTIONS