mirror of
				https://git.proxmox.com/git/llvm-toolchain
				synced 2025-10-31 17:31:04 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			119 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Fix arm EHABI code to work. armhf had exception test failing without EHABI support.
 | |
| 
 | |
| No known upstream bug about this. Actual code change is more like workaround than
 | |
| something that upstream would accept. Proper fix would be adding _Unwind_Control_Block
 | |
| to clang unwind.h. _Unwind_Control_Block should also extend _Unwind_Exception to make
 | |
| sure their ABI stays in sync.
 | |
| 
 | |
| No known upstream bug about this.
 | |
| 
 | |
| Index: llvm-toolchain-snapshot_11~++20200326111000+4673699a470/libcxxabi/src/cxa_exception.cpp
 | |
| ===================================================================
 | |
| --- llvm-toolchain-snapshot_11~++20200326111000+4673699a470.orig/libcxxabi/src/cxa_exception.cpp
 | |
| +++ llvm-toolchain-snapshot_11~++20200326111000+4673699a470/libcxxabi/src/cxa_exception.cpp
 | |
| @@ -275,15 +275,16 @@ __cxa_throw(void *thrown_object, std::ty
 | |
|  
 | |
|  #ifdef __USING_SJLJ_EXCEPTIONS__
 | |
|      _Unwind_SjLj_RaiseException(&exception_header->unwindHeader);
 | |
| -#else
 | |
| +#elif !LIBCXXABI_ARM_EHABI
 | |
|      _Unwind_RaiseException(&exception_header->unwindHeader);
 | |
| +#else
 | |
| +    _Unwind_RaiseException(exception_header->unwindHeader);
 | |
|  #endif
 | |
|      //  This only happens when there is no handler, or some unexpected unwinding
 | |
|      //     error happens.
 | |
|      failed_throw(exception_header);
 | |
|  }
 | |
|  
 | |
| -
 | |
|  // 2.5.3 Exception Handlers
 | |
|  /*
 | |
|  The adjusted pointer is computed by the personality routine during phase 1
 | |
| @@ -546,7 +547,11 @@ void __cxa_end_catch() {
 | |
|              //    to touch a foreign exception in any way, that is undefined
 | |
|              //     behavior.  They likely can't since the only way to catch
 | |
|              //     a foreign exception is with catch (...)!
 | |
| +#if !LIBCXXABI_ARM_EHABI
 | |
|              _Unwind_DeleteException(&globals->caughtExceptions->unwindHeader);
 | |
| +#else
 | |
| +            _Unwind_DeleteException(globals->caughtExceptions->unwindHeader);
 | |
| +#endif
 | |
|              globals->caughtExceptions = 0;
 | |
|          }
 | |
|      }
 | |
| @@ -603,8 +608,10 @@ void __cxa_rethrow() {
 | |
|      }
 | |
|  #ifdef __USING_SJLJ_EXCEPTIONS__
 | |
|      _Unwind_SjLj_RaiseException(&exception_header->unwindHeader);
 | |
| -#else
 | |
| +#elif !LIBCXXABI_ARM_EHABI
 | |
|      _Unwind_RaiseException(&exception_header->unwindHeader);
 | |
| +#else
 | |
| +    _Unwind_RaiseException(exception_header->unwindHeader);
 | |
|  #endif
 | |
|  
 | |
|      //  If we get here, some kind of unwinding error has occurred.
 | |
| @@ -728,8 +735,10 @@ __cxa_rethrow_primary_exception(void* th
 | |
|          dep_exception_header->unwindHeader.exception_cleanup = dependent_exception_cleanup;
 | |
|  #ifdef __USING_SJLJ_EXCEPTIONS__
 | |
|          _Unwind_SjLj_RaiseException(&dep_exception_header->unwindHeader);
 | |
| +#elif !LIBCXXABI_ARM_EHABI
 | |
| +	_Unwind_RaiseException(&dep_exception_header->unwindHeader);
 | |
|  #else
 | |
| -        _Unwind_RaiseException(&dep_exception_header->unwindHeader);
 | |
| +	_Unwind_RaiseException(dep_exception_header->unwindHeader);
 | |
|  #endif
 | |
|          // Some sort of unwinding error.  Note that terminate is a handler.
 | |
|          __cxa_begin_catch(&dep_exception_header->unwindHeader);
 | |
| Index: llvm-toolchain-snapshot_11~++20200326111000+4673699a470/libcxxabi/src/cxa_exception.h
 | |
| ===================================================================
 | |
| --- llvm-toolchain-snapshot_11~++20200326111000+4673699a470.orig/libcxxabi/src/cxa_exception.h
 | |
| +++ llvm-toolchain-snapshot_11~++20200326111000+4673699a470/libcxxabi/src/cxa_exception.h
 | |
| @@ -27,6 +27,45 @@ _LIBCXXABI_HIDDEN uint64_t __getExceptio
 | |
|  _LIBCXXABI_HIDDEN void     __setExceptionClass  (      _Unwind_Exception*, uint64_t);
 | |
|  _LIBCXXABI_HIDDEN bool     __isOurExceptionClass(const _Unwind_Exception*);
 | |
|  
 | |
| +#if LIBCXXABI_ARM_EHABI
 | |
| +// GCC has _Unwind_Control_Block in unwind.h (unwind_arm_common.h)
 | |
| +#if defined(__clang__)
 | |
| +struct _Unwind_Control_Block
 | |
| +{
 | |
| +	uint64_t exception_class;
 | |
| +	void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *);
 | |
| +	struct {
 | |
| +		_Unwind_Word reserved1;
 | |
| +		_Unwind_Word reserved2;
 | |
| +		_Unwind_Word reserved3;
 | |
| +		_Unwind_Word reserved4;
 | |
| +		_Unwind_Word reserved5;
 | |
| +	} unwinder_cache;
 | |
| +	struct {
 | |
| +		_Unwind_Word sp;
 | |
| +		_Unwind_Word bitpattern[5];
 | |
| +	} barrier_cache;
 | |
| +	struct {
 | |
| +		_Unwind_Word bitpattern[4];
 | |
| +	} cleanup_cache;
 | |
| +	struct {
 | |
| +		_Unwind_Word fnstart;
 | |
| +		_Unwind_Word *ehtp;
 | |
| +		_Unwind_Word additional;
 | |
| +		_Unwind_Word reserved1;
 | |
| +	} pr_cache;
 | |
| +	long long int :0;
 | |
| +	operator _Unwind_Exception*() noexcept
 | |
| +	{
 | |
| +		return reinterpret_cast<_Unwind_Exception*>(this);
 | |
| +	}
 | |
| +};
 | |
| +
 | |
| +#endif
 | |
| +
 | |
| +#define _Unwind_Exception _Unwind_Control_Block
 | |
| +#endif
 | |
| +
 | |
|  struct _LIBCXXABI_HIDDEN __cxa_exception {
 | |
|  #if defined(__LP64__) || defined(_WIN64) || defined(_LIBCXXABI_ARM_EHABI)
 | |
|      // Now _Unwind_Exception is marked with __attribute__((aligned)),
 | 
