svn commit: r357036 - projects/clang1000-import/contrib/llvm-project/libunwind/src
Dimitry Andric
dim at FreeBSD.org
Thu Jan 23 07:10:25 UTC 2020
Author: dim
Date: Thu Jan 23 07:10:23 2020
New Revision: 357036
URL: https://svnweb.freebsd.org/changeset/base/357036
Log:
Merge ^/vendor/llvm-libunwind/dist up to its last change, and resolve conflicts.
Modified:
projects/clang1000-import/contrib/llvm-project/libunwind/src/AddressSpace.hpp
projects/clang1000-import/contrib/llvm-project/libunwind/src/RWMutex.hpp
projects/clang1000-import/contrib/llvm-project/libunwind/src/Unwind-EHABI.cpp
projects/clang1000-import/contrib/llvm-project/libunwind/src/UnwindCursor.hpp
projects/clang1000-import/contrib/llvm-project/libunwind/src/libunwind.cpp
Directory Properties:
projects/clang1000-import/contrib/llvm-project/libunwind/ (props changed)
Modified: projects/clang1000-import/contrib/llvm-project/libunwind/src/AddressSpace.hpp
==============================================================================
--- projects/clang1000-import/contrib/llvm-project/libunwind/src/AddressSpace.hpp Thu Jan 23 07:06:18 2020 (r357035)
+++ projects/clang1000-import/contrib/llvm-project/libunwind/src/AddressSpace.hpp Thu Jan 23 07:10:23 2020 (r357036)
@@ -27,11 +27,18 @@
#if _LIBUNWIND_USE_DLADDR
#include <dlfcn.h>
-#if defined(__unix__) && defined(__ELF__) && defined(_LIBUNWIND_HAS_COMMENT_LIB_PRAGMA)
+#if defined(__unix__) && defined(__ELF__) && defined(_LIBUNWIND_HAS_COMMENT_LIB_PRAGMA)
#pragma comment(lib, "dl")
#endif
#endif
+#if defined(_LIBUNWIND_ARM_EHABI)
+struct EHABIIndexEntry {
+ uint32_t functionOffset;
+ uint32_t data;
+};
+#endif
+
#ifdef __APPLE__
#include <mach-o/getsect.h>
namespace libunwind {
@@ -462,12 +469,13 @@ inline bool LocalAddressSpace::findUnwindSections(pint
(void)targetAddr;
(void)info;
return true;
-#elif defined(_LIBUNWIND_ARM_EHABI) && defined(__BIONIC__) && \
- (__ANDROID_API__ < 21)
+#elif defined(_LIBUNWIND_ARM_EHABI) && defined(__BIONIC__)
+ // For ARM EHABI, Bionic didn't implement dl_iterate_phdr until API 21. After
+ // API 21, dl_iterate_phdr exists, but dl_unwind_find_exidx is much faster.
int length = 0;
info.arm_section =
(uintptr_t)dl_unwind_find_exidx((_Unwind_Ptr)targetAddr, &length);
- info.arm_section_length = (uintptr_t)length;
+ info.arm_section_length = (uintptr_t)length * sizeof(EHABIIndexEntry);
if (info.arm_section && info.arm_section_length)
return true;
#elif defined(_LIBUNWIND_ARM_EHABI) || defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
@@ -497,32 +505,40 @@ inline bool LocalAddressSpace::findUnwindSections(pint
#if !defined(Elf_Phdr)
typedef ElfW(Phdr) Elf_Phdr;
#endif
-#if !defined(Elf_Addr) && defined(__ANDROID__)
+#if !defined(Elf_Addr)
typedef ElfW(Addr) Elf_Addr;
#endif
+ Elf_Addr image_base = pinfo->dlpi_addr;
+
+#if defined(__ANDROID__) && __ANDROID_API__ < 18
+ if (image_base == 0) {
+ // Normally, an image base of 0 indicates a non-PIE executable. On
+ // versions of Android prior to API 18, the dynamic linker reported a
+ // dlpi_addr of 0 for PIE executables. Compute the true image base
+ // using the PT_PHDR segment.
+ // See https://github.com/android/ndk/issues/505.
+ for (Elf_Half i = 0; i < pinfo->dlpi_phnum; i++) {
+ const Elf_Phdr *phdr = &pinfo->dlpi_phdr[i];
+ if (phdr->p_type == PT_PHDR) {
+ image_base = reinterpret_cast<Elf_Addr>(pinfo->dlpi_phdr) -
+ phdr->p_vaddr;
+ break;
+ }
+ }
+ }
+#endif
+
#if defined(_LIBUNWIND_SUPPORT_DWARF_UNWIND)
#if !defined(_LIBUNWIND_SUPPORT_DWARF_INDEX)
#error "_LIBUNWIND_SUPPORT_DWARF_UNWIND requires _LIBUNWIND_SUPPORT_DWARF_INDEX on this platform."
#endif
size_t object_length;
-#if defined(__ANDROID__)
- Elf_Addr image_base =
- pinfo->dlpi_phnum
- ? reinterpret_cast<Elf_Addr>(pinfo->dlpi_phdr) -
- reinterpret_cast<const Elf_Phdr *>(pinfo->dlpi_phdr)
- ->p_offset
- : 0;
-#endif
for (Elf_Half i = 0; i < pinfo->dlpi_phnum; i++) {
const Elf_Phdr *phdr = &pinfo->dlpi_phdr[i];
if (phdr->p_type == PT_LOAD) {
- uintptr_t begin = pinfo->dlpi_addr + phdr->p_vaddr;
-#if defined(__ANDROID__)
- if (pinfo->dlpi_addr == 0 && phdr->p_vaddr < image_base)
- begin = begin + image_base;
-#endif
+ uintptr_t begin = image_base + phdr->p_vaddr;
uintptr_t end = begin + phdr->p_memsz;
if (cbdata->targetAddr >= begin && cbdata->targetAddr < end) {
cbdata->sects->dso_base = begin;
@@ -531,11 +547,7 @@ inline bool LocalAddressSpace::findUnwindSections(pint
}
} else if (phdr->p_type == PT_GNU_EH_FRAME) {
EHHeaderParser<LocalAddressSpace>::EHHeaderInfo hdrInfo;
- uintptr_t eh_frame_hdr_start = pinfo->dlpi_addr + phdr->p_vaddr;
-#if defined(__ANDROID__)
- if (pinfo->dlpi_addr == 0 && phdr->p_vaddr < image_base)
- eh_frame_hdr_start = eh_frame_hdr_start + image_base;
-#endif
+ uintptr_t eh_frame_hdr_start = image_base + phdr->p_vaddr;
cbdata->sects->dwarf_index_section = eh_frame_hdr_start;
cbdata->sects->dwarf_index_section_length = phdr->p_memsz;
found_hdr = EHHeaderParser<LocalAddressSpace>::decodeEHHdr(
@@ -556,12 +568,12 @@ inline bool LocalAddressSpace::findUnwindSections(pint
for (Elf_Half i = 0; i < pinfo->dlpi_phnum; i++) {
const Elf_Phdr *phdr = &pinfo->dlpi_phdr[i];
if (phdr->p_type == PT_LOAD) {
- uintptr_t begin = pinfo->dlpi_addr + phdr->p_vaddr;
+ uintptr_t begin = image_base + phdr->p_vaddr;
uintptr_t end = begin + phdr->p_memsz;
if (cbdata->targetAddr >= begin && cbdata->targetAddr < end)
found_obj = true;
} else if (phdr->p_type == PT_ARM_EXIDX) {
- uintptr_t exidx_start = pinfo->dlpi_addr + phdr->p_vaddr;
+ uintptr_t exidx_start = image_base + phdr->p_vaddr;
cbdata->sects->arm_section = exidx_start;
cbdata->sects->arm_section_length = phdr->p_memsz;
found_hdr = true;
Modified: projects/clang1000-import/contrib/llvm-project/libunwind/src/RWMutex.hpp
==============================================================================
--- projects/clang1000-import/contrib/llvm-project/libunwind/src/RWMutex.hpp Thu Jan 23 07:06:18 2020 (r357035)
+++ projects/clang1000-import/contrib/llvm-project/libunwind/src/RWMutex.hpp Thu Jan 23 07:10:23 2020 (r357036)
@@ -17,7 +17,7 @@
#include <windows.h>
#elif !defined(_LIBUNWIND_HAS_NO_THREADS)
#include <pthread.h>
-#if defined(__unix__) && defined(__ELF__) && defined(_LIBUNWIND_HAS_COMMENT_LIB_PRAGMA)
+#if defined(__unix__) && !defined(__ANDROID__) && defined(__ELF__) && defined(_LIBUNWIND_HAS_COMMENT_LIB_PRAGMA)
#pragma comment(lib, "pthread")
#endif
#endif
Modified: projects/clang1000-import/contrib/llvm-project/libunwind/src/Unwind-EHABI.cpp
==============================================================================
--- projects/clang1000-import/contrib/llvm-project/libunwind/src/Unwind-EHABI.cpp Thu Jan 23 07:06:18 2020 (r357035)
+++ projects/clang1000-import/contrib/llvm-project/libunwind/src/Unwind-EHABI.cpp Thu Jan 23 07:10:23 2020 (r357036)
@@ -941,8 +941,13 @@ _Unwind_VRS_Pop(_Unwind_Context *context, _Unwind_VRS_
// format 1", which is equivalent to FSTMD + a padding word.
for (uint32_t i = first; i < end; ++i) {
// SP is only 32-bit aligned so don't copy 64-bit at a time.
- uint64_t value = *sp++;
- value |= ((uint64_t)(*sp++)) << 32;
+ uint64_t w0 = *sp++;
+ uint64_t w1 = *sp++;
+#ifdef __LITTLE_ENDIAN__
+ uint64_t value = (w1 << 32) | w0;
+#else
+ uint64_t value = (w0 << 32) | w1;
+#endif
if (_Unwind_VRS_Set(context, regclass, i, representation, &value) !=
_UVRSR_OK)
return _UVRSR_FAILED;
Modified: projects/clang1000-import/contrib/llvm-project/libunwind/src/UnwindCursor.hpp
==============================================================================
--- projects/clang1000-import/contrib/llvm-project/libunwind/src/UnwindCursor.hpp Thu Jan 23 07:06:18 2020 (r357035)
+++ projects/clang1000-import/contrib/llvm-project/libunwind/src/UnwindCursor.hpp Thu Jan 23 07:10:23 2020 (r357036)
@@ -1228,11 +1228,6 @@ template <typename A, typename R> bool UnwindCursor<A,
#endif // defined(_LIBUNWIND_SUPPORT_SEH_UNWIND)
#if defined(_LIBUNWIND_ARM_EHABI)
-struct EHABIIndexEntry {
- uint32_t functionOffset;
- uint32_t data;
-};
-
template<typename A>
struct EHABISectionIterator {
typedef EHABISectionIterator _Self;
@@ -1997,7 +1992,10 @@ int UnwindCursor<A, R>::step() {
template <typename A, typename R>
void UnwindCursor<A, R>::getInfo(unw_proc_info_t *info) {
- *info = _info;
+ if (_unwindInfoMissing)
+ memset(info, 0, sizeof(*info));
+ else
+ *info = _info;
}
template <typename A, typename R>
Modified: projects/clang1000-import/contrib/llvm-project/libunwind/src/libunwind.cpp
==============================================================================
--- projects/clang1000-import/contrib/llvm-project/libunwind/src/libunwind.cpp Thu Jan 23 07:06:18 2020 (r357035)
+++ projects/clang1000-import/contrib/llvm-project/libunwind/src/libunwind.cpp Thu Jan 23 07:10:23 2020 (r357036)
@@ -173,8 +173,7 @@ _LIBUNWIND_HIDDEN int __unw_get_proc_info(unw_cursor_t
co->getInfo(info);
if (info->end_ip == 0)
return UNW_ENOINFO;
- else
- return UNW_ESUCCESS;
+ return UNW_ESUCCESS;
}
_LIBUNWIND_WEAK_ALIAS(__unw_get_proc_info, unw_get_proc_info)
@@ -196,8 +195,7 @@ _LIBUNWIND_HIDDEN int __unw_get_proc_name(unw_cursor_t
AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
if (co->getFunctionName(buf, bufLen, offset))
return UNW_ESUCCESS;
- else
- return UNW_EUNSPEC;
+ return UNW_EUNSPEC;
}
_LIBUNWIND_WEAK_ALIAS(__unw_get_proc_name, unw_get_proc_name)
More information about the svn-src-projects
mailing list