Made compiler working on Linux too

This commit is contained in:
Roman Venediktov 2024-07-01 11:37:41 +02:00
parent 468caac0f2
commit 85b838ea2b
10 changed files with 188 additions and 128 deletions

View file

@ -51,8 +51,8 @@ runtime.o: runtime.c runtime.h
runtime64.o: runtime.c runtime.h
$(CC) $(PROD_FLAGS) -c runtime.c -o runtime64.o
printf.o: printf.s
$(CC) $(PROD_FLAGS) -c -g printf.s -o printf.o
printf.o: printf.S
$(CC) $(PROD_FLAGS) -x assembler-with-cpp -c -g printf.S -o printf.o
clean:
$(RM) *.a *.o *~ negative_scenarios/*.err

View file

@ -26,9 +26,13 @@ static extra_roots_pool extra_roots;
size_t __gc_stack_top = 0, __gc_stack_bottom = 0;
#ifdef LAMA_ENV
#ifdef __linux__
extern const size_t __start_custom_data, __stop_custom_data;
#elif defined(__APPLE__)
extern const size_t __start_custom_data __asm("section$start$__DATA$custom_data");
extern const size_t __stop_custom_data __asm("section$end$__DATA$custom_data");
#endif
#endif
#ifdef DEBUG_VERSION
memory_chunk heap;

View file

@ -1,22 +1,27 @@
#ifdef __linux__
#define PREFIXED(name) name
#elif defined(__APPLE__)
#define PREFIXED(name) _##name
#endif
.data
.global _Lprintf
.extern _Bprintf
.global PREFIXED(Lprintf)
.extern PREFIXED(Bprintf)
.global _Lfprintf
.extern _Bfprintf
.global PREFIXED(Lfprintf)
.extern PREFIXED(Bfprintf)
.global _Lsprintf
.extern _Bsprintf
.global PREFIXED(Lsprintf)
.extern PREFIXED(Bsprintf)
.global _Lfailure
.extern _failure
.global PREFIXED(Lfailure)
.extern PREFIXED(failure)
.extern cnt_percentage_sign
.text
_Lprintf:
PREFIXED(Lprintf):
# save return address
popq %r14
@ -28,22 +33,22 @@ _Lprintf:
movq %rsp, %rax
# rdi --- format string
# r11 --- number of arguments except format string
_Lprintf_loop:
PREFIXED(Lprintf_loop):
movq $0, %r12
cmpq %r11, %r12
jz _Lprintf_continue
jz PREFIXED(Lprintf_continue)
decq %r11
movq (%rax), %r10
testq $1, %r10
jz _Lprintf_loop_end
jz PREFIXED(Lprintf_loop_end)
# unbox value
sarq %r10
movq %r10, (%rax)
_Lprintf_loop_end:
PREFIXED(Lprintf_loop_end):
addq $8, %rax
jmp _Lprintf_loop
_Lprintf_continue:
jmp PREFIXED(Lprintf_loop)
PREFIXED(Lprintf_continue):
popq %rsi
popq %rdx
popq %rcx
@ -51,9 +56,9 @@ _Lprintf_continue:
popq %r9
# restore return address
pushq %r14
jmp _Bprintf
jmp PREFIXED(Bprintf)
_Lfprintf:
PREFIXED(Lfprintf):
# save return address
popq %r14
@ -65,31 +70,31 @@ _Lfprintf:
# rdi --- FILE*
# rsi --- format string
# r11 --- number of arguments except format string
_Lfprintf_loop:
PREFIXED(Lfprintf_loop):
movq $0, %r12
cmpq %r11, %r12
jz _Lfprintf_continue
jz PREFIXED(Lfprintf_continue)
decq %r11
movq (%rax), %r10
testq $1, %r10
jz _Lfprintf_loop_end
jz PREFIXED(Lfprintf_loop_end)
# unbox value
sarq %r10
movq %r10, (%rax)
_Lfprintf_loop_end:
PREFIXED(Lfprintf_loop_end):
addq $8, %rax
jmp _Lfprintf_loop
_Lfprintf_continue:
jmp PREFIXED(Lfprintf_loop)
PREFIXED(Lfprintf_continue):
popq %rdx
popq %rcx
popq %r8
popq %r9
# restore return address
pushq %r14
jmp _Bfprintf
jmp PREFIXED(Bfprintf)
_Lsprintf:
PREFIXED(Lsprintf):
# save return address
popq %r14
@ -101,22 +106,22 @@ _Lsprintf:
movq %rsp, %rax
# rdi --- format string
# r11 --- number of arguments except format string
_Lsprintf_loop:
PREFIXED(Lsprintf_loop):
movq $0, %r12
cmpq %r11, %r12
jz _Lsprintf_continue
jz PREFIXED(Lsprintf_continue)
decq %r11
movq (%rax), %r10
testq $1, %r10
jz _Lsprintf_loop_end
jz PREFIXED(Lsprintf_loop_end)
# unbox value
sarq %r10
movq %r10, (%rax)
_Lsprintf_loop_end:
PREFIXED(Lsprintf_loop_end):
addq $8, %rax
jmp _Lsprintf_loop
_Lsprintf_continue:
jmp PREFIXED(Lsprintf_loop)
PREFIXED(Lsprintf_continue):
popq %rsi
popq %rdx
popq %rcx
@ -124,9 +129,9 @@ _Lsprintf_continue:
popq %r9
# restore return address
pushq %r14
jmp _Bsprintf
jmp PREFIXED(Bsprintf)
_Lfailure:
PREFIXED(Lfailure):
# save return address
popq %r14
@ -138,22 +143,22 @@ _Lfailure:
movq %rsp, %rax
# rdi --- format string
# r11 --- number of arguments except format string
_Lfailure_loop:
PREFIXED(Lfailure_loop):
movq $0, %r12
cmpq %r11, %r12
jz _Lfailure_continue
jz PREFIXED(Lfailure_continue)
decq %r11
movq (%rax), %r10
testq $1, %r10
jz _Lfailure_loop_end
jz PREFIXED(Lfailure_loop_end)
# unbox value
sarq %r10
movq %r10, (%rax)
_Lfailure_loop_end:
PREFIXED(Lfailure_loop_end):
addq $8, %rax
jmp _Lfailure_loop
_Lfailure_continue:
jmp PREFIXED(Lfailure_loop)
PREFIXED(Lfailure_continue):
popq %rsi
popq %rdx
popq %rcx
@ -161,4 +166,4 @@ _Lfailure_continue:
popq %r9
# restore return address
pushq %r14
jmp _failure
jmp PREFIXED(failure)