mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-11-23 08:32:39 +00:00
Moved malloc/free trivial implementations to stdlib
This commit is contained in:
parent
430c128cc3
commit
06147e2634
@ -229,11 +229,6 @@ public class Compiler {
|
||||
}
|
||||
}
|
||||
|
||||
private void pass2Optimize() {
|
||||
List<Pass2SsaOptimization> optimizations = getPass2Optimizations();
|
||||
pass2Execute(optimizations);
|
||||
}
|
||||
|
||||
private List<Pass2SsaOptimization> getPass2Optimizations() {
|
||||
List<Pass2SsaOptimization> optimizations = new ArrayList<>();
|
||||
optimizations.add(new Pass2FixInlineConstructorsNew(program));
|
||||
@ -271,6 +266,11 @@ public class Compiler {
|
||||
return optimizations;
|
||||
}
|
||||
|
||||
private void pass2Optimize() {
|
||||
List<Pass2SsaOptimization> optimizations = getPass2Optimizations();
|
||||
pass2Execute(optimizations);
|
||||
}
|
||||
|
||||
private void pass2UnrollLoops() {
|
||||
List<Pass2SsaOptimization> loopUnrolling = new ArrayList<>();
|
||||
loopUnrolling.add(new PassNStatementIndices(program));
|
||||
@ -299,7 +299,6 @@ public class Compiler {
|
||||
|
||||
private void pass2InlineConstants() {
|
||||
// Constant inlining optimizations - as the last step to ensure that constant identification has been completed
|
||||
|
||||
List<Pass2SsaOptimization> constantOptimizations = new ArrayList<>();
|
||||
constantOptimizations.add(new PassNStatementIndices(program));
|
||||
constantOptimizations.add(new PassNVariableReferenceInfos(program));
|
||||
|
20
src/main/kc/stdlib/stdlib.kc
Normal file
20
src/main/kc/stdlib/stdlib.kc
Normal file
@ -0,0 +1,20 @@
|
||||
// Implementation of functions found int C stdlib.h / stdlib.c
|
||||
|
||||
// Start of the heap used by malloc()
|
||||
unsigned char* HEAP_START = 0xc000;
|
||||
|
||||
// Head of the heap. Moved forward for each malloc()
|
||||
unsigned char* heap_head = HEAP_START;
|
||||
|
||||
// Allocates a block of size bytes of memory, returning a pointer to the beginning of the block.
|
||||
// The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.
|
||||
unsigned char* malloc(unsigned int size) {
|
||||
unsigned char* mem = heap_head;
|
||||
heap_head+= size;
|
||||
return mem;
|
||||
}
|
||||
|
||||
// A block of memory previously allocated by a call to malloc is deallocated, making it available again for further allocations.
|
||||
// If ptr is a null pointer, the function does nothing.
|
||||
void free(unsigned char* ptr) {
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
// Experiments with malloc()
|
||||
|
||||
import "stdlib"
|
||||
|
||||
void main() {
|
||||
unsigned char* buf1 = (unsigned char*) malloc(100);
|
||||
unsigned char* buf2 = (unsigned char*) malloc(100);
|
||||
@ -13,22 +15,3 @@ void main() {
|
||||
screen[0] = *buf1;
|
||||
screen[1] = *buf2;
|
||||
}
|
||||
|
||||
// Start of the heap used by malloc()
|
||||
unsigned char* HEAP_START = 0xc000;
|
||||
|
||||
// Head of the heap. Moved forward for each malloc()
|
||||
unsigned char* heap_head = HEAP_START;
|
||||
|
||||
// Allocates a block of size bytes of memory, returning a pointer to the beginning of the block.
|
||||
// The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.
|
||||
unsigned char* malloc(unsigned int size) {
|
||||
unsigned char* mem = heap_head;
|
||||
heap_head+= size;
|
||||
return mem;
|
||||
}
|
||||
|
||||
// A block of memory previously allocated by a call to malloc is deallocated, making it available again for further allocations.
|
||||
// If ptr is a null pointer, the function does nothing.
|
||||
void free(unsigned char* ptr) {
|
||||
}
|
@ -14,10 +14,10 @@ main: {
|
||||
lda #>HEAP_START
|
||||
sta heap_head+1
|
||||
jsr malloc
|
||||
lda malloc.return_2
|
||||
sta malloc.return
|
||||
lda malloc.return_2+1
|
||||
sta malloc.return+1
|
||||
lda malloc.return
|
||||
sta malloc.return_2
|
||||
lda malloc.return+1
|
||||
sta malloc.return_2+1
|
||||
jsr malloc
|
||||
ldy #0
|
||||
b1:
|
||||
@ -48,13 +48,12 @@ free: {
|
||||
// Allocates a block of size bytes of memory, returning a pointer to the beginning of the block.
|
||||
// The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.
|
||||
malloc: {
|
||||
.label return = 4
|
||||
.label return_1 = 6
|
||||
.label return_2 = 6
|
||||
.label return = 6
|
||||
.label return_2 = 4
|
||||
lda heap_head
|
||||
sta return_2
|
||||
sta return
|
||||
lda heap_head+1
|
||||
sta return_2+1
|
||||
sta return+1
|
||||
lda #$64
|
||||
clc
|
||||
adc heap_head
|
||||
|
Loading…
Reference in New Issue
Block a user