Skip to content

Commit

Permalink
Merge pull request #11 from petrhosek/unwind-cherry-pick
Browse files Browse the repository at this point in the history
Drop the dependency on <algorithm>, add placement new inline
  • Loading branch information
alexcrichton authored Apr 2, 2019
2 parents 1f484cb + 63090cf commit 84abffd
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 34 deletions.
25 changes: 3 additions & 22 deletions libunwind/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,9 @@ unwind_append_if(LIBUNWIND_CXX_FLAGS LIBUNWIND_HAS_EHSC_FLAG -EHsc)

unwind_append_if(LIBUNWIND_C_FLAGS LIBUNWIND_HAS_FUNWIND_TABLES -funwind-tables)

# Ensure that we don't depend on C++ standard library.
unwind_append_if(LIBUNWIND_CXX_FLAGS LIBUNWIND_HAS_NOSTDINCXX_FLAG -nostdinc++)

# Assert
string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
if (LIBUNWIND_ENABLE_ASSERTIONS)
Expand Down Expand Up @@ -339,28 +342,6 @@ endif()

include_directories(include)

find_path(
LIBUNWIND_LIBCXX_INCLUDES_INTERNAL
__libcpp_version
PATHS ${LLVM_MAIN_SRC_DIR}/projects/libcxx/include
${LLVM_MAIN_SRC_DIR}/runtimes/libcxx/include
${LLVM_MAIN_SRC_DIR}/../libcxx/include
NO_DEFAULT_PATH
NO_CMAKE_FIND_ROOT_PATH
)
if ((NOT LIBUNWIND_STANDALONE_BUILD OR HAVE_LIBCXX) AND
IS_DIRECTORY "${LIBUNWIND_LIBCXX_INCLUDES_INTERNAL}")
set(LIBUNWIND_CXX_INCLUDE_PATHS_DEFAULT "${LIBUNWIND_LIBCXX_INCLUDES_INTERNAL}")
endif()

set(LIBUNWIND_CXX_INCLUDE_PATHS "${LIBUNWIND_CXX_INCLUDE_PATHS_DEFAULT}" CACHE PATH
"Paths to C++ header directories separated by ';'.")

if (NOT LIBUNWIND_CXX_INCLUDE_PATHS STREQUAL "")
list(APPEND LIBUNWIND_CXX_FLAGS -nostdinc++)
include_directories("${LIBUNWIND_CXX_INCLUDE_PATHS}")
endif()

add_subdirectory(src)

if (LIBUNWIND_INCLUDE_DOCS)
Expand Down
2 changes: 0 additions & 2 deletions libunwind/src/Unwind-EHABI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
#include <stdlib.h>
#include <string.h>

#include <type_traits>

#include "config.h"
#include "libunwind.h"
#include "libunwind_ext.h"
Expand Down
4 changes: 4 additions & 0 deletions libunwind/src/Unwind-seh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ using namespace libunwind;
/// Class of foreign exceptions based on unrecognized SEH exceptions.
static const uint64_t kSEHExceptionClass = 0x434C4E4753454800; // CLNGSEH\0

// libunwind does not and should not depend on C++ library which means that we
// need our own declaration of global placement new.
void *operator new(size_t, void*);

/// Exception cleanup routine used by \c _GCC_specific_handler to
/// free foreign exceptions.
static void seh_exc_cleanup(_Unwind_Reason_Code urc, _Unwind_Exception *exc) {
Expand Down
31 changes: 25 additions & 6 deletions libunwind/src/UnwindCursor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#ifndef __UNWINDCURSOR_HPP__
#define __UNWINDCURSOR_HPP__

#include <algorithm>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
Expand Down Expand Up @@ -106,7 +105,6 @@ class _LIBUNWIND_HIDDEN DwarfFDECache {
static void dyldUnloadHook(const struct mach_header *mh, intptr_t slide);
static bool _registeredForDyldUnloads;
#endif
// Can't use std::vector<> here because this code is below libc++.
static entry *_buffer;
static entry *_bufferUsed;
static entry *_bufferEnd;
Expand Down Expand Up @@ -1229,7 +1227,6 @@ template<typename A>
struct EHABISectionIterator {
typedef EHABISectionIterator _Self;

typedef std::random_access_iterator_tag iterator_category;
typedef typename A::pint_t value_type;
typedef typename A::pint_t* pointer;
typedef typename A::pint_t& reference;
Expand Down Expand Up @@ -1283,6 +1280,29 @@ struct EHABISectionIterator {
const UnwindInfoSections* _sects;
};

namespace {

template <typename A>
EHABISectionIterator<A> EHABISectionUpperBound(
EHABISectionIterator<A> first,
EHABISectionIterator<A> last,
typename A::pint_t value) {
size_t len = last - first;
while (len > 0) {
size_t l2 = len / 2;
EHABISectionIterator<A> m = first + l2;
if (value < *m) {
len = l2;
} else {
first = ++m;
len -= l2 + 1;
}
}
return first;
}

}

template <typename A, typename R>
bool UnwindCursor<A, R>::getInfoFromEHABISection(
pint_t pc,
Expand All @@ -1294,7 +1314,7 @@ bool UnwindCursor<A, R>::getInfoFromEHABISection(
if (begin == end)
return false;

EHABISectionIterator<A> itNextPC = std::upper_bound(begin, end, pc);
EHABISectionIterator<A> itNextPC = EHABISectionUpperBound(begin, end, pc);
if (itNextPC == begin)
return false;
EHABISectionIterator<A> itThisPC = itNextPC - 1;
Expand All @@ -1304,8 +1324,7 @@ bool UnwindCursor<A, R>::getInfoFromEHABISection(
// 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 nextPC = (itNextPC == end) ? UINTPTR_MAX : itNextPC.functionAddress();
pint_t indexDataAddr = itThisPC.dataAddress();

if (indexDataAddr == 0)
Expand Down
8 changes: 4 additions & 4 deletions libunwind/src/libunwind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@

#include <libunwind.h>

#ifndef NDEBUG
#include <cstdlib> // getenv
#endif

#include "libunwind_ext.h"
#include "config.h"

Expand All @@ -28,6 +24,10 @@

using namespace libunwind;

// libunwind does not and should not depend on C++ library which means that we
// need our own declaration of global placement new.
void *operator new(size_t, void*);

/// internal object to represent this processes address space
LocalAddressSpace LocalAddressSpace::sThisAddressSpace;

Expand Down

0 comments on commit 84abffd

Please sign in to comment.