* _Unwind_SetGR/_Unwind_GetGR/_Unwind_SetIP/_Unwind_GetIP implementation for

ARM EABI

git-svn-id: branches/debug_eh@41214 -
This commit is contained in:
Jonas Maebe 2019-02-03 21:10:07 +00:00
parent ef1757a5a7
commit 1b48e6abe8

View File

@ -61,10 +61,6 @@ function FPC_psabieh_GetExceptionWrapper(exceptionObject: PFPC_Unwind_Exception)
function _Unwind_Resume_or_Rethrow (context:PFPC_Unwind_Context): FPC_Unwind_Reason_Code;cdecl;external;
procedure _Unwind_DeleteException(context:PFPC_Unwind_Context);cdecl;external;
function _Unwind_GetGR(context:PFPC_Unwind_Context; index:cint):PtrUInt;cdecl;external;
procedure _Unwind_SetGR(context:PFPC_Unwind_Context; index:cint; new_value:PtrUInt);cdecl;external;
function _Unwind_GetIP(context:PFPC_Unwind_Context):PtrUInt;cdecl;external;
procedure _Unwind_SetIP(_para1:PFPC_Unwind_Context; new_value:PtrUInt);cdecl;external;
function _Unwind_GetRegionStart(context:PFPC_Unwind_Context):PtrUInt;cdecl;external;
function _Unwind_GetLanguageSpecificData(context:PFPC_Unwind_Context):PtrUInt;cdecl;external;
@ -74,6 +70,69 @@ function _Unwind_GetTextRelBase(context:PFPC_Unwind_Context):PtrUInt;cdecl;exter
{$ifdef __ARM_EABI_UNWINDER__}
procedure _Unwind_Complete(exceptionObject: PFPC_Unwind_Exception);cdecl;external;
function __gnu_unwind_frame(exception:PFPC_Unwind_Exception;context:PFPC_Unwind_Context):FPC_Unwind_Reason_Code;cdecl;external;
type
FPC_Unwind_VRS_RegClass = UInt32;
const
FPC_UVRSC_CORE = FPC_Unwind_VRS_RegClass(0); // integer register
FPC_UVRSC_VFP = FPC_Unwind_VRS_RegClass(1); // vfp
FPC_UVRSC_FPA = FPC_Unwind_VRS_RegClass(2); // fpa
FPC_UVRSC_WMMXD = FPC_Unwind_VRS_RegClass(3); // Intel WMMX data register
FPC_UVRSC_WMMXC = FPC_Unwind_VRS_RegClass(4); // Intel WMMX control register
type
FPC_Unwind_VRS_DataRepresentation = UInt32;
const
FPC_UVRSD_UINT32 = FPC_Unwind_VRS_DataRepresentation(0);
FPC_UVRSD_VFPX = FPC_Unwind_VRS_DataRepresentation(1);
FPC_UVRSD_FPAX = FPC_Unwind_VRS_DataRepresentation(2);
FPC_UVRSD_UINT64 = FPC_Unwind_VRS_DataRepresentation(3);
FPC_UVRSD_FLOAT = FPC_Unwind_VRS_DataRepresentation(4);
FPC_UVRSD_DOUBLE = FPC_Unwind_VRS_DataRepresentation(5);
type
FPC_Unwind_VRS_Result = UInt32;
const
FPC_UVRSR_OK = FPC_Unwind_VRS_Result(0);
FPC_UVRSR_NOT_IMPLEMENTED = FPC_Unwind_VRS_Result(1);
FPC_UVRSR_FAILED = FPC_Unwind_VRS_Result(2);
Function _Unwind_VRS_Set(context: PFPC_Unwind_Context; regclass: FPC_Unwind_VRS_RegClass;
regnr: PTRUint {uw}; repr: FPC_Unwind_VRS_DataRepresentation;
value: pointer): FPC_Unwind_VRS_Result; cdecl; external;
function _Unwind_VRS_Get(context: PFPC_Unwind_Context; regclass: FPC_Unwind_VRS_RegClass;
regnr: PTRUint {uw}; repr: FPC_Unwind_VRS_DataRepresentation;
value: pointer): FPC_Unwind_VRS_Result; cdecl; external;
procedure _Unwind_SetGR(context:PFPC_Unwind_Context;index:cint; new_value:PtrUInt); inline;
begin
_Unwind_VRS_Set(context,FPC_UVRSC_CORE, index, FPC_UVRSD_UINT32, @new_Value);
end;
function _Unwind_GetGR(context:PFPC_Unwind_Context;index:cint):PtrUInt; inline;
begin
_Unwind_VRS_Get(context,FPC_UVRSC_CORE, index, FPC_UVRSD_UINT32, @result);
end;
procedure _Unwind_SetIP(context:PFPC_Unwind_Context;new_value:PtrUInt); inline;
begin
_Unwind_SetGR(context,15,new_value or (_Unwind_GetGR(context,15) and 1));
end;
function _Unwind_GetIP(context:PFPC_Unwind_Context):PtrUInt;cdecl; inline;
begin
result:=_Unwind_GetGR(context,15) and not(1);
end;
{$else}
function _Unwind_GetGR(context:PFPC_Unwind_Context; index:cint):PtrUInt;cdecl;external;
procedure _Unwind_SetGR(context:PFPC_Unwind_Context; index:cint; new_value:PtrUInt);cdecl;external;
function _Unwind_GetIP(context:PFPC_Unwind_Context):PtrUInt;cdecl;external;
procedure _Unwind_SetIP(context:PFPC_Unwind_Context; new_value:PtrUInt);cdecl;external;
{$endif}
{ _Unwind_Backtrace() is a gcc extension that walks the stack and calls the }