AMD64 fixes
parent
fdbcf006d3
commit
423a2f10fc
2
Makefile
2
Makefile
|
@ -9,7 +9,7 @@ DISK_IMAGE = Factor-$(VERSION).dmg
|
|||
LIBPATH = -L/usr/X11R6/lib
|
||||
|
||||
ifdef DEBUG
|
||||
CFLAGS = -g
|
||||
CFLAGS = -g -std=gnu99
|
||||
STRIP = touch
|
||||
else
|
||||
CFLAGS = -Wall -O3 -ffast-math -std=gnu99 $(SITE_CFLAGS)
|
||||
|
|
|
@ -46,5 +46,4 @@ M: float-regs fastcall-regs vregs ;
|
|||
: %prologue ( n -- )
|
||||
\ stack-reserve set stack-reg stack-increment SUB ;
|
||||
|
||||
: %epilogue ( -- )
|
||||
stack-reg stack-increment ADD ;
|
||||
: %epilogue ( -- ) stack-reg stack-increment ADD ;
|
||||
|
|
|
@ -1,12 +1,28 @@
|
|||
IN: temporary
|
||||
USING: errors compiler test namespaces sequences kernel-internals ;
|
||||
USING: errors compiler test namespaces sequences
|
||||
kernel-internals kernel math ;
|
||||
|
||||
: nice-stack-trace
|
||||
error-stack-trace get symbolic-stack-trace [ second ] map ;
|
||||
|
||||
: foo 3 throw 7 ;
|
||||
: bar foo 4 ;
|
||||
: baz bar 5 ;
|
||||
\ baz compile
|
||||
[ 3 ] [ [ baz ] catch ] unit-test
|
||||
[ { foo bar baz } ] [
|
||||
error-stack-trace get symbolic-stack-trace
|
||||
[ second ] map [ ] subset
|
||||
[ { foo bar baz } ] [ nice-stack-trace ] unit-test
|
||||
|
||||
: bleh [ 3 + ] map [ 0 > ] subset ;
|
||||
\ bleh compile
|
||||
|
||||
: stack-trace-contains? nice-stack-trace memq? ;
|
||||
|
||||
[ t ] [
|
||||
[ { 1 "hi" } bleh ] catch drop \ + stack-trace-contains?
|
||||
] unit-test
|
||||
|
||||
[ f t ] [
|
||||
[ { C{ 1 2 } } bleh ] catch drop
|
||||
\ + stack-trace-contains?
|
||||
\ > stack-trace-contains?
|
||||
] unit-test
|
||||
|
|
|
@ -9,5 +9,4 @@ void *native_stack_pointer(void) */
|
|||
.globl MANGLE(native_stack_pointer)
|
||||
MANGLE(native_stack_pointer):
|
||||
mov %rsp,%rax
|
||||
add $8,%rax
|
||||
ret
|
||||
|
|
|
@ -8,10 +8,7 @@ INLINE void flush_icache(CELL start, CELL len) {}
|
|||
|
||||
void *native_stack_pointer(void);
|
||||
|
||||
typedef struct _F_STACK_FRAME {
|
||||
struct _F_STACK_FRAME *previous;
|
||||
CELL return_address;
|
||||
} F_STACK_FRAME;
|
||||
typedef CELL F_STACK_FRAME;
|
||||
|
||||
#define PREVIOUS_FRAME(frame) (frame->previous)
|
||||
#define RETURN_ADDRESS(frame) (frame->return_address)
|
||||
#define PREVIOUS_FRAME(frame) (frame + 1)
|
||||
#define RETURN_ADDRESS(frame) (*(frame))
|
||||
|
|
6
vm/run.c
6
vm/run.c
|
@ -276,14 +276,16 @@ CELL allot_native_stack_trace(void)
|
|||
GROWABLE_ADD(array,cell);
|
||||
}
|
||||
|
||||
if(PREVIOUS_FRAME(frame) <= frame)
|
||||
F_STACK_FRAME *prev = PREVIOUS_FRAME(frame);
|
||||
|
||||
if(prev <= frame)
|
||||
{
|
||||
fprintf(stderr,"*** Unusual C stack layout (why?)\n");
|
||||
fflush(stderr);
|
||||
break;
|
||||
}
|
||||
|
||||
frame = PREVIOUS_FRAME(frame);
|
||||
frame = prev;
|
||||
}
|
||||
|
||||
GROWABLE_TRIM(array);
|
||||
|
|
|
@ -46,8 +46,13 @@ F_ARRAY *allot_array(CELL type, F_FIXNUM capacity, CELL fill)
|
|||
/* size is in bytes this time */
|
||||
F_ARRAY *allot_byte_array(F_FIXNUM size)
|
||||
{
|
||||
F_FIXNUM byte_size = (F_FIXNUM)(size + sizeof(CELL) - 1)
|
||||
/ (F_FIXNUM)sizeof(CELL);
|
||||
if(size < 0)
|
||||
{
|
||||
general_error(ERROR_NEGATIVE_ARRAY_SIZE,allot_integer(size),F,true);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CELL byte_size = (size + sizeof(CELL) - 1) / sizeof(CELL);
|
||||
return allot_array(BYTE_ARRAY_TYPE,byte_size,0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue