@ -53,8 +53,27 @@ d_m3BeginExternC
# define jumpOp(PC) jumpOpDirect(PC)
# define jumpOp(PC) jumpOpDirect(PC)
# if d_m3RecordBacktraces
# define pushBacktraceFrame() (PushBacktraceFrame (_mem->runtime, _pc - 1))
# define fillBacktraceFrame(FUNCTION) (FillBacktraceFunctionInfo (_mem->runtime, function))
# define newTrap(err) return (pushBacktraceFrame (), err)
# define forwardTrap(err) return err
# else
# define pushBacktraceFrame() do {} while (0)
# define fillBacktraceFrame(FUNCTION) do {} while (0)
# define newTrap(err) return err
# define forwardTrap(err) return err
# endif
d_m3RetSig Call ( d_m3OpSig )
d_m3RetSig Call ( d_m3OpSig )
{
{
# if d_m3RecordBacktraces
if ( _mem )
ClearBacktrace ( _mem - > runtime ) ;
# endif // d_m3RecordBacktraces
m3ret_t possible_trap = m3_Yield ( ) ;
m3ret_t possible_trap = m3_Yield ( ) ;
if ( UNLIKELY ( possible_trap ) ) return possible_trap ;
if ( UNLIKELY ( possible_trap ) ) return possible_trap ;
@ -482,13 +501,15 @@ d_m3Op (Call)
m3stack_t sp = _sp + stackOffset ;
m3stack_t sp = _sp + stackOffset ;
m3ret_t r = Call ( callPC , sp , _mem , d_m3OpDefaultArgs ) ;
m3ret_t r = Call ( callPC , sp , _mem , d_m3OpDefaultArgs ) ;
_mem = memory - > mallocated ;
if ( r = = 0 )
if ( r = = 0 )
{
_mem = memory - > mallocated ;
nextOp ( ) ;
nextOp ( ) ;
else
{
pushBacktraceFrame ( ) ;
forwardTrap ( r ) ;
}
}
else trapOp ( r ) ;
}
}
@ -518,11 +539,14 @@ d_m3Op (CallIndirect)
if ( not r )
if ( not r )
{
{
r = Call ( function - > compiled , sp , _mem , d_m3OpDefaultArgs ) ;
r = Call ( function - > compiled , sp , _mem , d_m3OpDefaultArgs ) ;
_mem = memory - > mallocated ;
if ( not r )
if ( not r )
{
_mem = memory - > mallocated ;
nextOpDirect ( ) ;
nextOpDirect ( ) ;
else
{
pushBacktraceFrame ( ) ;
forwardTrap ( r ) ;
}
}
}
}
}
}
@ -532,7 +556,9 @@ d_m3Op (CallIndirect)
}
}
else r = m3Err_trapTableIndexOutOfRange ;
else r = m3Err_trapTableIndexOutOfRange ;
trapOp ( r ) ;
if ( r )
newTrap ( r ) ;
else forwardTrap ( r ) ;
}
}
@ -544,6 +570,7 @@ d_m3Op (CallRawFunction)
ctx . function = immediate ( IM3Function ) ;
ctx . function = immediate ( IM3Function ) ;
ctx . userdata = immediate ( void * ) ;
ctx . userdata = immediate ( void * ) ;
u64 * const sp = ( ( u64 * ) _sp ) ;
u64 * const sp = ( ( u64 * ) _sp ) ;
IM3Memory memory = m3MemInfo ( _mem ) ;
IM3Runtime runtime = m3MemRuntime ( _mem ) ;
IM3Runtime runtime = m3MemRuntime ( _mem ) ;
@ -594,7 +621,11 @@ d_m3Op (CallRawFunction)
}
}
# endif
# endif
trapOp ( possible_trap ) ;
if ( possible_trap ) {
_mem = memory - > mallocated ;
pushBacktraceFrame ( ) ;
}
forwardTrap ( possible_trap ) ;
}
}
@ -659,7 +690,7 @@ d_m3Op (Compile)
}
}
else ReportError2 ( function , result ) ;
else ReportError2 ( function , result ) ;
trapO p ( result ) ;
newTra p ( result ) ;
}
}
@ -669,6 +700,7 @@ d_m3Op (Entry)
d_m3ClearRegisters
d_m3ClearRegisters
IM3Function function = immediate ( IM3Function ) ;
IM3Function function = immediate ( IM3Function ) ;
IM3Memory memory = m3MemInfo ( _mem ) ;
# if d_m3SkipStackCheck
# if d_m3SkipStackCheck
if ( true )
if ( true )
@ -692,6 +724,8 @@ d_m3Op (Entry)
}
}
m3ret_t r = nextOpImpl ( ) ;
m3ret_t r = nextOpImpl ( ) ;
// _mem needs to be valid for a potential fillBacktraceFrame call later
_mem = memory - > mallocated ;
# if d_m3LogExec
# if d_m3LogExec
char str [ 100 ] = { ' ! ' , 0 } ;
char str [ 100 ] = { ' ! ' , 0 } ;
@ -705,9 +739,11 @@ d_m3Op (Entry)
printf ( " ** %s %p \n " , GetFunctionName ( function ) , _sp ) ;
printf ( " ** %s %p \n " , GetFunctionName ( function ) , _sp ) ;
# endif
# endif
return r ;
if ( r )
fillBacktraceFrame ( ) ;
forwardTrap ( r ) ;
}
}
else trapOp ( m3Err_trapStackOverflow ) ;
else newTra p ( m3Err_trapStackOverflow ) ;
}
}
@ -730,7 +766,7 @@ d_m3Op (Loop)
}
}
while ( r = = _pc ) ;
while ( r = = _pc ) ;
trapO p ( r ) ;
forwardTra p ( r ) ;
}
}
@ -993,7 +1029,7 @@ d_m3Select_f (f64, _fp0, s, slot (i32))
d_m3Op ( Return )
d_m3Op ( Return )
{
{
m3StackCheck ( ) ;
m3StackCheck ( ) ;
trapOp ( m3Err_none ) ;
return m3Err_none ;
}
}
@ -1054,7 +1090,7 @@ d_m3Op (ContinueLoop)
// has the potential to increase its native-stack usage. (don't forget ContinueLoopIf too.)
// has the potential to increase its native-stack usage. (don't forget ContinueLoopIf too.)
void * loopId = immediate ( void * ) ;
void * loopId = immediate ( void * ) ;
trapOp ( loopId ) ;
return loopId ;
}
}
@ -1065,7 +1101,7 @@ d_m3Op (ContinueLoopIf)
if ( condition )
if ( condition )
{
{
trapOp ( loopId ) ;
return loopId ;
}
}
else nextOp ( ) ;
else nextOp ( ) ;
}
}
@ -1089,20 +1125,20 @@ d_m3Op (Const64)
d_m3Op ( Unsupported )
d_m3Op ( Unsupported )
{ m3log ( exec , " *** unsupported *** " ) ;
{ m3log ( exec , " *** unsupported *** " ) ;
trapO p ( " unsupported instruction executed " ) ;
newTra p ( " unsupported instruction executed " ) ;
}
}
d_m3Op ( Unreachable )
d_m3Op ( Unreachable )
{ m3log ( exec , " *** trapping *** " ) ;
{ m3log ( exec , " *** trapping *** " ) ;
m3StackCheck ( ) ;
m3StackCheck ( ) ;
trapO p ( m3Err_trapUnreachable ) ;
newTra p ( m3Err_trapUnreachable ) ;
}
}
d_m3Op ( End )
d_m3Op ( End )
{
{
m3StackCheck ( ) ;
m3StackCheck ( ) ;
trapOp ( m3Err_none ) ;
return m3Err_none ;
}
}
@ -1150,11 +1186,11 @@ d_m3Op (SetGlobal_f64)
# endif
# endif
# ifdef DEBUG
# ifdef DEBUG
# define d_outOfBounds trapO p (ErrorRuntime (m3Err_trapOutOfBoundsMemoryAccess, \
# define d_outOfBounds newTra p (ErrorRuntime (m3Err_trapOutOfBoundsMemoryAccess, \
_mem - > runtime , " memory size: %zu; access offset: %zu " , \
_mem - > runtime , " memory size: %zu; access offset: %zu " , \
_mem - > length , operand ) )
_mem - > length , operand ) )
# else
# else
# define d_outOfBounds trapO p (m3Err_trapOutOfBoundsMemoryAccess)
# define d_outOfBounds newTra p (m3Err_trapOutOfBoundsMemoryAccess)
# endif
# endif
// memcpy here is to support non-aligned access on some platforms.
// memcpy here is to support non-aligned access on some platforms.