forked from OSchip/llvm-project
[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 llvm-svn: 308871
This commit is contained in:
parent
f7face4bc4
commit
81806c5d4d
|
@ -744,14 +744,21 @@ bool UnwindCursor<A, R>::getInfoFromEHABISection(
|
|||
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)
|
||||
|
|
Loading…
Reference in New Issue