[libunwind] r309143 - Merging r308871:

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 26 10:57:50 PDT 2017


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)




More information about the cfe-commits mailing list