[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