Author: hans Date: Wed Jul 26 10:57:50 2017 New Revision: 309143 URL: http://llvm.org/viewvc/llvm-project?rev=309143&view=rev Log: Merging r308871: ------------------------------------------------------------------------ r308871 | chill | 2017-07-24 02:19:32 -0700 (Mon, 24 Jul 2017) | 17 lines
[libunwind] Handle .ARM.exidx tables without sentinel last entry UnwindCursor<A, R>::getInfoFromEHABISection assumes the last entry in the index table never corresponds to a real function. Indeed, GNU ld always inserts an EXIDX_CANTUNWIND entry, containing the end of the .text section. However, the EHABI specification (http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf) does not seem to contain text that requires the presence of a sentinel entry. In that sense the libunwind implementation isn't compliant with the specification. This patch makes getInfoFromEHABISection examine the last entry in the index table if upper_bound returns the end iterator. Fixes https://bugs.llvm.org/show_bug.cgi?id=31091 Differential revision: https://reviews.llvm.org/D35265 ------------------------------------------------------------------------ Modified: libunwind/branches/release_50/ (props changed) libunwind/branches/release_50/src/UnwindCursor.hpp Propchange: libunwind/branches/release_50/ ------------------------------------------------------------------------------ svn:mergeinfo = /libunwind/trunk:308871 Modified: libunwind/branches/release_50/src/UnwindCursor.hpp URL: http://llvm.org/viewvc/llvm-project/libunwind/branches/release_50/src/UnwindCursor.hpp?rev=309143&r1=309142&r2=309143&view=diff ============================================================================== --- libunwind/branches/release_50/src/UnwindCursor.hpp (original) +++ libunwind/branches/release_50/src/UnwindCursor.hpp Wed Jul 26 10:57:50 2017 @@ -744,14 +744,21 @@ bool UnwindCursor<A, R>::getInfoFromEHAB EHABISectionIterator<A>::begin(_addressSpace, sects); EHABISectionIterator<A> end = EHABISectionIterator<A>::end(_addressSpace, sects); + if (begin == end) + return false; EHABISectionIterator<A> itNextPC = std::upper_bound(begin, end, pc); - if (itNextPC == begin || itNextPC == end) + if (itNextPC == begin) return false; EHABISectionIterator<A> itThisPC = itNextPC - 1; pint_t thisPC = itThisPC.functionAddress(); - pint_t nextPC = itNextPC.functionAddress(); + // If an exception is thrown from a function, corresponding to the last entry + // in the table, we don't really know the function extent and have to choose a + // value for nextPC. Choosing max() will allow the range check during trace to + // succeed. + pint_t nextPC = (itNextPC == end) ? std::numeric_limits<pint_t>::max() + : itNextPC.functionAddress(); pint_t indexDataAddr = itThisPC.dataAddress(); if (indexDataAddr == 0) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits