#2 Fix arm build (libc++abi issue)
Merged 5 years ago by spot. Opened 5 years ago by avsej.
Unknown source master  into  master

@@ -0,0 +1,236 @@

+ diff -Nru v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp

+ --- v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp	2018-03-06 14:20:54.000000000 -0500

+ +++ v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp	2018-05-07 11:01:44.464845299 -0400

+ @@ -36,13 +36,10 @@

+          {

+              _Unwind_Exception* unwind_exception =

+                  reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1;

+ -            bool native_exception =

+ -                (unwind_exception->exception_class   & get_vendor_and_language) == 

+ -                                 (kOurExceptionClass & get_vendor_and_language);

+ -            if (native_exception)

+ +            if (__isOurExceptionClass(unwind_exception))

+              {

+                  void* thrown_object =

+ -                    unwind_exception->exception_class == kOurDependentExceptionClass ?

+ +                    __getExceptionClass(unwind_exception) == kOurDependentExceptionClass ?

+                          ((__cxa_dependent_exception*)exception_header)->primaryException :

+                          exception_header + 1;

+                  const __shim_type_info* thrown_type =

+ diff -Nru v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_exception.cpp v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_exception.cpp

+ --- v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_exception.cpp	2018-03-06 14:20:54.000000000 -0500

+ +++ v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_exception.cpp	2018-05-07 11:01:44.472845276 -0400

+ @@ -78,22 +78,37 @@

+                                     alignof(__cxa_exception));

+  }

+  

+ -static void setExceptionClass(_Unwind_Exception* unwind_exception) {

+ -    unwind_exception->exception_class = kOurExceptionClass;

+ +void __setExceptionClass(_Unwind_Exception* unwind_exception, uint64_t newValue) {

+ +	::memcpy(&unwind_exception->exception_class, &newValue, sizeof(newValue));

+ +	}

+ +	

+ +

+ +static void setOurExceptionClass(_Unwind_Exception* unwind_exception) {

+ +    __setExceptionClass(unwind_exception, kOurExceptionClass);

+  }

+  

+  static void setDependentExceptionClass(_Unwind_Exception* unwind_exception) {

+ -    unwind_exception->exception_class = kOurDependentExceptionClass;

+ +    __setExceptionClass(unwind_exception, kOurDependentExceptionClass);

+  }

+  

+  //  Is it one of ours?

+ -static bool isOurExceptionClass(const _Unwind_Exception* unwind_exception) {

+ -    return (unwind_exception->exception_class & get_vendor_and_language) == 

+ -           (kOurExceptionClass                & get_vendor_and_language);

+ +uint64_t __getExceptionClass(const _Unwind_Exception* unwind_exception) {

+ +//	On x86 and some ARM unwinders, unwind_exception->exception_class is

+ +//		a uint64_t. On other ARM unwinders, it is a char[8]

+ +//	See: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf

+ +//	So we just copy it into a uint64_t to be sure.

+ +	uint64_t exClass;

+ +	::memcpy(&exClass, &unwind_exception->exception_class, sizeof(exClass));

+ +	return exClass;

+ +}

+ +

+ +bool __isOurExceptionClass(const _Unwind_Exception* unwind_exception) {

+ +    return (__getExceptionClass(unwind_exception) & get_vendor_and_language) == 

+ +           (kOurExceptionClass                    & get_vendor_and_language);

+  }

+  

+  static bool isDependentException(_Unwind_Exception* unwind_exception) {

+ -    return (unwind_exception->exception_class & 0xFF) == 0x01;

+ +    return (__getExceptionClass(unwind_exception) & 0xFF) == 0x01;

+  }

+  

+  //  This does not need to be atomic

+ @@ -248,7 +263,7 @@

+      exception_header->terminateHandler  = std::get_terminate();

+      exception_header->exceptionType = tinfo;

+      exception_header->exceptionDestructor = dest;

+ -    setExceptionClass(&exception_header->unwindHeader);

+ +    setOurExceptionClass(&exception_header->unwindHeader);

+      exception_header->referenceCount = 1;  // This is a newly allocated exception, no need for thread safety.

+      globals->uncaughtExceptions += 1;   // Not atomically, since globals are thread-local

+  

+ @@ -299,7 +314,7 @@

+      __cxa_exception* exception_header =

+          cxa_exception_from_exception_unwind_exception(unwind_exception);

+  

+ -    if (isOurExceptionClass(unwind_exception))

+ +    if (__isOurExceptionClass(unwind_exception))

+      {

+          if (0 == exception_header->propagationCount)

+          {

+ @@ -342,7 +357,7 @@

+          std::terminate();

+      }

+  

+ -    if (isOurExceptionClass(&exception_header->unwindHeader))

+ +    if (__isOurExceptionClass(&exception_header->unwindHeader))

+      {

+          --exception_header->propagationCount;

+          if (0 == exception_header->propagationCount)

+ @@ -407,7 +422,7 @@

+  __cxa_begin_catch(void* unwind_arg) throw()

+  {

+      _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(unwind_arg);

+ -    bool native_exception = isOurExceptionClass(unwind_exception);

+ +    bool native_exception = __isOurExceptionClass(unwind_exception);

+      __cxa_eh_globals* globals = __cxa_get_globals();

+      // exception_header is a hackish offset from a foreign exception, but it

+      //   works as long as we're careful not to try to access any __cxa_exception

+ @@ -484,7 +499,7 @@

+      //    nothing more to be done.  Do nothing!

+      if (NULL != exception_header)

+      {

+ -        bool native_exception = isOurExceptionClass(&exception_header->unwindHeader);

+ +        bool native_exception = __isOurExceptionClass(&exception_header->unwindHeader);

+          if (native_exception)

+          {

+              // This is a native exception

+ @@ -549,7 +564,7 @@

+      __cxa_exception *exception_header = globals->caughtExceptions;

+      if (NULL == exception_header)

+          return NULL;        //  No current exception

+ -    if (!isOurExceptionClass(&exception_header->unwindHeader))

+ +    if (!__isOurExceptionClass(&exception_header->unwindHeader))

+          return NULL;

+      return exception_header->exceptionType;

+  }

+ @@ -571,7 +586,7 @@

+      __cxa_exception* exception_header = globals->caughtExceptions;

+      if (NULL == exception_header)

+          std::terminate();      // throw; called outside of a exception handler

+ -    bool native_exception = isOurExceptionClass(&exception_header->unwindHeader);

+ +    bool native_exception = __isOurExceptionClass(&exception_header->unwindHeader);

+      if (native_exception)

+      {

+          //  Mark the exception as being rethrown (reverse the effects of __cxa_begin_catch)

+ @@ -660,7 +675,7 @@

+      __cxa_exception* exception_header = globals->caughtExceptions;

+      if (NULL == exception_header)

+          return NULL;        //  No current exception

+ -    if (!isOurExceptionClass(&exception_header->unwindHeader))

+ +    if (!__isOurExceptionClass(&exception_header->unwindHeader))

+          return NULL;        // Can't capture a foreign exception (no way to refcount it)

+      if (isDependentException(&exception_header->unwindHeader)) {

+          __cxa_dependent_exception* dep_exception_header =

+ diff -Nru v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_exception.hpp v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_exception.hpp

+ --- v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_exception.hpp	2018-03-06 14:20:54.000000000 -0500

+ +++ v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_exception.hpp	2018-05-07 13:09:05.371652989 -0400

+ @@ -24,6 +24,17 @@

+  static const uint64_t kOurDependentExceptionClass = 0x434C4E47432B2B01; // CLNGC++\1

+  static const uint64_t get_vendor_and_language     = 0xFFFFFFFFFFFFFF00; // mask for CLNGC++

+  

+ +uint64_t __getExceptionClass  (const _Unwind_Exception*);

+ +void     __setExceptionClass  (      _Unwind_Exception*, uint64_t);

+ +bool     __isOurExceptionClass(const _Unwind_Exception*);

+ +

+ +#if defined(__arm__) && defined(__GNUC__)

+ +// missing values from _Unwind_Reason_Code enum

+ +#define _URC_FATAL_PHASE2_ERROR ((_Unwind_Reason_Code)2)

+ +#define _URC_FATAL_PHASE1_ERROR ((_Unwind_Reason_Code)3)

+ +#define _URC_NORMAL_STOP ((_Unwind_Reason_Code)4)

+ +#endif

+ +

+  struct _LIBCXXABI_HIDDEN __cxa_exception {

+  #if defined(__LP64__) || defined(_LIBCXXABI_ARM_EHABI)

+      // This is a new field to support C++ 0x exception_ptr.

+ diff -Nru v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_handlers.cpp v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_handlers.cpp

+ --- v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_handlers.cpp	2018-03-06 14:20:54.000000000 -0500

+ +++ v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_handlers.cpp	2018-05-07 11:01:44.474845270 -0400

+ @@ -89,10 +89,7 @@

+          {

+              _Unwind_Exception* unwind_exception =

+                  reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1;

+ -            bool native_exception =

+ -                (unwind_exception->exception_class & get_vendor_and_language) ==

+ -                               (kOurExceptionClass & get_vendor_and_language);

+ -            if (native_exception)

+ +            if (__isOurExceptionClass(unwind_exception))

+                  __terminate(exception_header->terminateHandler);

+          }

+      }

+ diff -Nru v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_personality.cpp v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_personality.cpp

+ --- v8-6.7.17.orig/buildtools/third_party/libc++abi/trunk/src/cxa_personality.cpp	2018-03-06 14:20:54.000000000 -0500

+ +++ v8-6.7.17/buildtools/third_party/libc++abi/trunk/src/cxa_personality.cpp	2018-05-07 15:08:40.666231128 -0400

+ @@ -492,7 +492,7 @@

+      // Even for foreign exceptions, the exception object is *probably* at unwind_exception + 1

+      //    Regardless, this library is prohibited from touching a foreign exception

+      void* adjustedPtr = unwind_exception + 1;

+ -    if (unwind_exception->exception_class == kOurDependentExceptionClass)

+ +    if (__getExceptionClass(unwind_exception) == kOurDependentExceptionClass)

+          adjustedPtr = ((__cxa_dependent_exception*)adjustedPtr - 1)->primaryException;

+      return adjustedPtr;

+  }

+ @@ -1073,8 +1073,7 @@

+      if (unwind_exception == 0 || context == 0)

+          return _URC_FATAL_PHASE1_ERROR;

+  

+ -    bool native_exception = (unwind_exception->exception_class & get_vendor_and_language) ==

+ -                            (kOurExceptionClass & get_vendor_and_language);

+ +    bool native_exception = __isOurExceptionClass(unwind_exception);

+  

+  #if !defined(LIBCXXABI_USE_LLVM_UNWINDER)

+      // Copy the address of _Unwind_Control_Block to r12 so that

+ @@ -1085,7 +1084,7 @@

+  

+      // Check the undocumented force unwinding behavior

+      bool is_force_unwinding = state & _US_FORCE_UNWIND;

+ -    state &= ~_US_FORCE_UNWIND;

+ +    state = (_Unwind_State)(state & ~_US_FORCE_UNWIND);

+  

+      scan_results results;

+      switch (state) {

+ @@ -1178,9 +1177,7 @@

+      if (unwind_exception == 0)

+          call_terminate(false, unwind_exception);

+      __cxa_begin_catch(unwind_exception);

+ -    bool native_old_exception =

+ -        (unwind_exception->exception_class & get_vendor_and_language) ==

+ -        (kOurExceptionClass                & get_vendor_and_language);

+ +    bool native_old_exception = __isOurExceptionClass(unwind_exception);

+      std::unexpected_handler u_handler;

+      std::terminate_handler t_handler;

+      __cxa_exception* old_exception_header = 0;

+ @@ -1242,16 +1239,14 @@

+              if (new_exception_header == 0)

+                  // This shouldn't be able to happen!

+                  std::__terminate(t_handler);

+ -            bool native_new_exception =

+ -                (new_exception_header->unwindHeader.exception_class & get_vendor_and_language) ==

+ -                                                (kOurExceptionClass & get_vendor_and_language);

+ +            bool native_new_exception = __isOurExceptionClass(&new_exception_header->unwindHeader);

+              void* adjustedPtr;

+              if (native_new_exception && (new_exception_header != old_exception_header))

+              {

+                  const __shim_type_info* excpType =

+                      static_cast<const __shim_type_info*>(new_exception_header->exceptionType);

+                  adjustedPtr =

+ -                    new_exception_header->unwindHeader.exception_class == kOurDependentExceptionClass ?

+ +                    __getExceptionClass(&new_exception_header->unwindHeader) == kOurDependentExceptionClass ?

+                          ((__cxa_dependent_exception*)new_exception_header)->primaryException :

+                          new_exception_header + 1;

+                  if (!exception_spec_can_catch(ttypeIndex, classInfo, ttypeEncoding,

file modified
+9 -1
@@ -25,7 +25,7 @@

  

  Name:		v8

  Version:	%{somajor}.%{sominor}.%{sobuild}

- Release:	2%{?dist}

+ Release:	3%{?dist}

  Epoch:		1

  Summary:	JavaScript Engine

  Group:		System Environment/Libraries
@@ -75,6 +75,10 @@

  Patch12:	v8-6.7.17-fixme.patch

  # Use Fedora optflags

  Patch13:	v8-6.7.17-optflags.patch

+ # Reconcile libc++abi with unwind.h from gcc

+ # https://bugs.llvm.org/show_bug.cgi?id=35945

+ # Modified patch from https://reviews.llvm.org/D42242

+ Patch14:        v8-6.7.17-fix-gcc-unwind-header.patch

  

  # PPC64 doesn't like libcxx code.

  # error: '(9.223372036854775807e+18 / 1.0e+9)' is not a constant expression
@@ -137,6 +141,7 @@

  %patch11 -p1 -b .fabi11

  %patch12 -p1 -b .fixme

  %patch13 -p1 -b .optflags

+ %patch14 -p1 -b .unwind

  

  SPLITOPTFLAGS=""

  for i in `echo %{optflags} | sed 's/ /\n/g'`; do
@@ -304,6 +309,9 @@

  %{python_sitelib}/j*.py*

  

  %changelog

+ * Tue May 8 2018 Sergey Avseyev <sergey.avseyev@gmail.com> - 1:6.7.17-3

+ - Fix ARM build. Integrate fix for https://bugs.llvm.org/show_bug.cgi?id=35945

+ 

  * Mon Apr 30 2018 Pete Walter <pwalter@fedoraproject.org> - 1:6.7.17-2

  - Rebuild for ICU 61.1