[libunwind] r295948 - Revert r295944.
Asiri Rathnayake via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 23 01:37:35 PST 2017
Hi Ed,
I have a feeling that the no-exceptions builders are missing a few
configuration bits.
"No-exceptions" libraries should not require libunwind...
Looking at the cmake configs:
http://lab.llvm.org:8011/builders/libcxx-libcxxabi-libunwind-arm-linux-noexceptions/builds/430/steps/cmake/logs/stdio
I see that it's missing the -DLIBCXXABI_ENALBE_EXCEPTIONS=OFF flag and the
-DLIBCXX_USE_LLVM_UNWINDER=ON should also be dropped I think.
I'll upload a patch to fix this soon, and ask Galina to restart the
build-master. You will be able to continue with your work afterward.
Sorry about the trouble.
/ Asiri
On Thu, Feb 23, 2017 at 9:13 AM, Ed Schouten via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: ed
> Date: Thu Feb 23 03:13:22 2017
> New Revision: 295948
>
> URL: http://llvm.org/viewvc/llvm-project?rev=295948&view=rev
> Log:
> Revert r295944.
>
> Even though the change works perfectly fine on CloudABI, it fails to
> work on the libcxx-libcxxabi-libunwind-arm-linux-noexceptions build bot.
> Looking at the code, this may be attributed to the fact that the code
> doesn't take the PT_LOAD addresses into consideration.
>
> I will rework this change to fix that and send out an updated version
> for review in the nearby future.
>
> Modified:
> libunwind/trunk/src/AddressSpace.hpp
>
> Modified: libunwind/trunk/src/AddressSpace.hpp
> URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/
> AddressSpace.hpp?rev=295948&r1=295947&r2=295948&view=diff
> ============================================================
> ==================
> --- libunwind/trunk/src/AddressSpace.hpp (original)
> +++ libunwind/trunk/src/AddressSpace.hpp Thu Feb 23 03:13:22 2017
> @@ -35,17 +35,29 @@ namespace libunwind {
> #include "Registers.hpp"
>
> #if _LIBUNWIND_ARM_EHABI
> +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
> +
> +typedef void *_Unwind_Ptr;
> +
> +#elif defined(__linux__)
> +
> +typedef long unsigned int *_Unwind_Ptr;
> +extern "C" _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr addr, int
> *len);
> +
> +// Emulate the BSD dl_unwind_find_exidx API when on a GNU libdl system.
> +#define dl_unwind_find_exidx __gnu_Unwind_Find_exidx
> +
> +#elif !defined(_LIBUNWIND_IS_BAREMETAL)
> +#include <link.h>
> +#else // !defined(_LIBUNWIND_IS_BAREMETAL)
> +// When statically linked on bare-metal, the symbols for the EH table are
> looked
> +// up without going through the dynamic loader.
> struct EHTEntry {
> uint32_t functionOffset;
> uint32_t unwindOpcodes;
> };
> -#if defined(_LIBUNWIND_IS_BAREMETAL)
> -// When statically linked on bare-metal, the symbols for the EH table are
> looked
> -// up without going through the dynamic loader.
> extern EHTEntry __exidx_start;
> extern EHTEntry __exidx_end;
> -#else
> -#include <link.h>
> #endif // !defined(_LIBUNWIND_IS_BAREMETAL)
> #endif // _LIBUNWIND_ARM_EHABI
>
> @@ -356,15 +368,23 @@ inline bool LocalAddressSpace::findUnwin
> info.compact_unwind_section_length = dyldInfo.compact_unwind_
> section_length;
> return true;
> }
> -#elif _LIBUNWIND_ARM_EHABI && defined(_LIBUNWIND_IS_BAREMETAL)
> +#elif _LIBUNWIND_ARM_EHABI
> + #ifdef _LIBUNWIND_IS_BAREMETAL
> // Bare metal is statically linked, so no need to ask the dynamic loader
> info.arm_section = (uintptr_t)(&__exidx_start);
> info.arm_section_length = (uintptr_t)(&__exidx_end - &__exidx_start);
> + #else
> + int length = 0;
> + info.arm_section = (uintptr_t) dl_unwind_find_exidx(
> + (_Unwind_Ptr) targetAddr, &length);
> + info.arm_section_length = (uintptr_t)length;
> + #endif
> _LIBUNWIND_TRACE_UNWINDING("findUnwindSections: section %X length %x",
> info.arm_section, info.arm_section_length);
> if (info.arm_section && info.arm_section_length)
> return true;
> -#elif _LIBUNWIND_ARM_EHABI || _LIBUNWIND_SUPPORT_DWARF_UNWIND
> +#elif _LIBUNWIND_SUPPORT_DWARF_UNWIND
> +#if _LIBUNWIND_SUPPORT_DWARF_INDEX
> struct dl_iterate_cb_data {
> LocalAddressSpace *addressSpace;
> UnwindInfoSections *sects;
> @@ -375,6 +395,9 @@ inline bool LocalAddressSpace::findUnwin
> int found = dl_iterate_phdr(
> [](struct dl_phdr_info *pinfo, size_t, void *data) -> int {
> auto cbdata = static_cast<dl_iterate_cb_data *>(data);
> + size_t object_length;
> + bool found_obj = false;
> + bool found_hdr = false;
>
> assert(cbdata);
> assert(cbdata->sects);
> @@ -390,14 +413,6 @@ inline bool LocalAddressSpace::findUnwin
> typedef ElfW(Phdr) Elf_Phdr;
> #endif
>
> - #if _LIBUNWIND_SUPPORT_DWARF_UNWIND
> - #if !_LIBUNWIND_SUPPORT_DWARF_INDEX
> - #error "_LIBUNWIND_SUPPORT_DWARF_UNWIND requires
> _LIBUNWIND_SUPPORT_DWARF_INDEX on this platform."
> - #endif
> - size_t object_length;
> - bool found_obj = false;
> - bool found_hdr = false;
> -
> for (Elf_Half i = 0; i < pinfo->dlpi_phnum; i++) {
> const Elf_Phdr *phdr = &pinfo->dlpi_phdr[i];
> if (phdr->p_type == PT_LOAD) {
> @@ -427,22 +442,12 @@ inline bool LocalAddressSpace::findUnwin
> } else {
> return false;
> }
> - #else // _LIBUNWIND_ARM_EHABI
> - for (Elf_Half i = 0; i < pinfo->dlpi_phnum; i++) {
> - const Elf_Phdr *phdr = &pinfo->dlpi_phdr[i];
> - if (phdr->p_type == PT_ARM_EXIDX) {
> - uintptr_t exidx_start = pinfo->dlpi_addr + phdr->p_vaddr;
> - cbdata->sects->arm_section = exidx_start;
> - cbdata->sects->arm_section_length = phdr->p_memsz /
> - sizeof(EHTEntry);
> - return true;
> - }
> - }
> - return false;
> - #endif
> },
> &cb_data);
> return static_cast<bool>(found);
> +#else
> +#error "_LIBUNWIND_SUPPORT_DWARF_UNWIND requires
> _LIBUNWIND_SUPPORT_DWARF_INDEX on this platform."
> +#endif
> #endif
>
> return false;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170223/6b4bbac2/attachment.html>
More information about the cfe-commits
mailing list