mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-02 18:58:15 +00:00
Arm fixes in cxa_personality.cpp and a little refactoring.
llvm-svn: 152966
This commit is contained in:
parent
7de79f3297
commit
0f73197364
@ -398,6 +398,41 @@ get_thrown_object_ptr(_Unwind_Exception* unwind_exception)
|
||||
return adjustedPtr;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
struct scan_results
|
||||
{
|
||||
int64_t ttypeIndex; // > 0 catch handler, < 0 exception spec handler, == 0 a cleanup
|
||||
const uint8_t* actionRecord; // Currently unused. Retained to ease future maintenance.
|
||||
const uint8_t* languageSpecificData; // Needed only for __cxa_call_unexpected
|
||||
uintptr_t landingPad; // null -> nothing found, else something found
|
||||
void* adjustedPtr; // Used in cxa_exception.cpp
|
||||
_Unwind_Reason_Code reason; // One of _URC_FATAL_PHASE1_ERROR,
|
||||
// _URC_FATAL_PHASE2_ERROR,
|
||||
// _URC_CONTINUE_UNWIND,
|
||||
// _URC_HANDLER_FOUND
|
||||
};
|
||||
|
||||
} // unnamed namespace
|
||||
|
||||
static
|
||||
void
|
||||
set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context,
|
||||
const scan_results& results)
|
||||
{
|
||||
#if __arm__
|
||||
_Unwind_SetGR(context, 0, reinterpret_cast<uintptr_t>(unwind_exception));
|
||||
_Unwind_SetGR(context, 1, static_cast<uintptr_t>(results.ttypeIndex));
|
||||
#else
|
||||
_Unwind_SetGR(context, __builtin_eh_return_data_regno(0),
|
||||
reinterpret_cast<uintptr_t>(unwind_exception));
|
||||
_Unwind_SetGR(context, __builtin_eh_return_data_regno(1),
|
||||
static_cast<uintptr_t>(results.ttypeIndex));
|
||||
#endif
|
||||
_Unwind_SetIP(context, results.landingPad);
|
||||
}
|
||||
|
||||
/*
|
||||
There are 3 types of scans needed:
|
||||
|
||||
@ -419,24 +454,6 @@ get_thrown_object_ptr(_Unwind_Exception* unwind_exception)
|
||||
_UA_CLEANUP_PHASE && !_UA_HANDLER_FRAME
|
||||
*/
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
struct scan_results
|
||||
{
|
||||
int64_t ttypeIndex; // > 0 catch handler, < 0 exception spec handler, == 0 a cleanup
|
||||
const uint8_t* actionRecord; // Currently unused. Retained to ease future maintenance.
|
||||
const uint8_t* languageSpecificData; // Needed only for __cxa_call_unexpected
|
||||
uintptr_t landingPad; // null -> nothing found, else something found
|
||||
void* adjustedPtr; // Used in cxa_exception.cpp
|
||||
_Unwind_Reason_Code reason; // One of _URC_FATAL_PHASE1_ERROR,
|
||||
// _URC_FATAL_PHASE2_ERROR,
|
||||
// _URC_CONTINUE_UNWIND,
|
||||
// _URC_HANDLER_FOUND
|
||||
};
|
||||
|
||||
} // unnamed namespace
|
||||
|
||||
static
|
||||
void
|
||||
scan_eh_tab(scan_results& results, _Unwind_Action actions, bool native_exception,
|
||||
@ -554,6 +571,7 @@ scan_eh_tab(scan_results& results, _Unwind_Action actions, bool native_exception
|
||||
#endif // __arm__
|
||||
{
|
||||
// Found the call site containing ip.
|
||||
#if !__arm__
|
||||
if (landingPad == 0)
|
||||
{
|
||||
// No handler here
|
||||
@ -561,6 +579,9 @@ scan_eh_tab(scan_results& results, _Unwind_Action actions, bool native_exception
|
||||
return;
|
||||
}
|
||||
landingPad = (uintptr_t)lpStart + landingPad;
|
||||
#else // __arm__
|
||||
++landingPad;
|
||||
#endif // __arm__
|
||||
if (actionEntry == 0)
|
||||
{
|
||||
// Found a cleanup
|
||||
@ -878,9 +899,7 @@ __gxx_personality_v0
|
||||
call_terminate(native_exception, unwind_exception);
|
||||
}
|
||||
// Jump to the handler
|
||||
_Unwind_SetGR(context, __builtin_eh_return_data_regno(0), (uintptr_t)unwind_exception);
|
||||
_Unwind_SetGR(context, __builtin_eh_return_data_regno(1), (uintptr_t)results.ttypeIndex);
|
||||
_Unwind_SetIP(context, results.landingPad);
|
||||
set_registers(unwind_exception, context, results);
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
}
|
||||
// Either we didn't do a phase 1 search (due to forced unwinding), or
|
||||
@ -890,9 +909,7 @@ __gxx_personality_v0
|
||||
if (results.reason == _URC_HANDLER_FOUND)
|
||||
{
|
||||
// Found a non-catching handler. Jump to it:
|
||||
_Unwind_SetGR(context, __builtin_eh_return_data_regno(0), (uintptr_t)unwind_exception);
|
||||
_Unwind_SetGR(context, __builtin_eh_return_data_regno(1), (uintptr_t)results.ttypeIndex);
|
||||
_Unwind_SetIP(context, results.landingPad);
|
||||
set_registers(unwind_exception, context, results);
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
}
|
||||
// Did not find a cleanup. Return the results of the scan
|
||||
|
Loading…
Reference in New Issue
Block a user