Re: [libunwind] r295948 - Revert r295944.

2017-02-23 Thread Ed Schouten via cfe-commits
Hi there,

2017-02-23 10:37 GMT+01:00 Asiri Rathnayake :
> 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.

No problem whatsoever! It looks like the change I made doesn't just
break the *-noexceptions builders; it breaks ARM in general:

http://lab.llvm.org:8011/builders/libcxx-libcxxabi-libunwind-arm-linux/builds/396

Still good that we uncovered a potential misconfiguration in the
builders as a result.

Best regards,
-- 
Ed Schouten 
Nuxi, 's-Hertogenbosch, the Netherlands
KvK-nr.: 62051717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: [libunwind] r295948 - Revert r295944.

2017-02-23 Thread Asiri Rathnayake via cfe-commits
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@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 
> +#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 
>  #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(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];
>  

[libunwind] r295948 - Revert r295944.

2017-02-23 Thread Ed Schouten via cfe-commits
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 
+#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 
 #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(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(found);
+#else
+#error "_LIBUNWIND_SUPPORT_DWARF_UNWIND requires 
_LIBUNWIND_SUPPORT_DWARF_INDEX on this platform."
+#endif
 #endif
 
   return false;


___