1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-08 17:54:40 +00:00

Added error when exhausting zeropage space for variables. Closes #233

This commit is contained in:
jespergravgaard 2019-07-25 17:26:43 +02:00
parent e8a0694f34
commit a9e0c7805f
6 changed files with 56 additions and 6 deletions

View File

@ -521,7 +521,7 @@ public class Compiler {
new Pass4ZeroPageCoalesce(program).coalesce();
}
new Pass4RegistersFinalize(program).allocate(true);
new Pass4AssertZeropageAllocation(program).check();
}
private void pass5GenerateAndOptimizeAsm() {

View File

@ -0,0 +1,35 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.Registers;
import dk.camelot64.kickc.model.symbols.Variable;
import java.util.Collection;
/*** Ensures that the variables fit on zeropage. */
public class Pass4AssertZeropageAllocation extends Pass2Base {
public Pass4AssertZeropageAllocation(Program program) {
super(program);
}
/**
* Check that all variables fit onto zeropage
*/
public void check() {
Collection<Variable> allVariables = getSymbols().getAllVariables(true);
for(Variable variable : allVariables) {
Registers.Register allocation = variable.getAllocation();
if(allocation!=null && allocation.isZp()) {
int zp = ((Registers.RegisterZp) allocation).getZp();
int sizeBytes = variable.getType().getSizeBytes();
if(zp+sizeBytes>0x100) {
// Allocation is outside ZP!
throw new CompileError("Error! Variables used in program do not fit on zeropage. Maybe try compiling with -Ocoalesce to optimize ZP usage.");
}
}
}
}
}

View File

@ -35,12 +35,16 @@ public class TestPrograms {
public TestPrograms() {
}
@Test
public void testZeropageExhausted() throws IOException, URISyntaxException {
assertError("zeropage-exhausted", "Variables used in program do not fit on zeropage", false);
}
@Test
public void testPlatformAsm6502() throws IOException, URISyntaxException {
compileAndCompare("platform-asm6502");
}
@Test
public void testEuclid2() throws IOException, URISyntaxException {
compileAndCompare("euclid-3");

View File

@ -0,0 +1,11 @@
// Tests warning when running out of zeropage-addresses for variables
// Start by reserving most of zeropage (254 bytes)
#reserve(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254)
// And then allocate a 2-byte-variable
void main() {
const int* SCREEN = 0x0400;
for(int i=0;i<10;i++)
SCREEN[(char)i] = i;
}

View File

@ -1,5 +1,5 @@
/*
* Find least common denominator using subtraction-based Euclidian algorithm
* Find greatest common denominator using subtraction-based Euclidian algorithm
* See https://en.wikipedia.org/wiki/Euclidean_algorithm
* Based on facebook post from
*/

View File

@ -1230,7 +1230,7 @@ INITIAL ASM
Target platform is c64basic
// File Comments
/*
* Find least common denominator using subtraction-based Euclidian algorithm
* Find greatest common denominator using subtraction-based Euclidian algorithm
* See https://en.wikipedia.org/wiki/Euclidean_algorithm
* Based on facebook post from
*/
@ -1782,7 +1782,7 @@ Allocated (was zp ZP_WORD:12) zp ZP_WORD:8 [ memset::dst#2 memset::dst#1 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
/*
* Find least common denominator using subtraction-based Euclidian algorithm
* Find greatest common denominator using subtraction-based Euclidian algorithm
* See https://en.wikipedia.org/wiki/Euclidean_algorithm
* Based on facebook post from
*/
@ -2443,7 +2443,7 @@ Score: 1577
// File Comments
/*
* Find least common denominator using subtraction-based Euclidian algorithm
* Find greatest common denominator using subtraction-based Euclidian algorithm
* See https://en.wikipedia.org/wiki/Euclidean_algorithm
* Based on facebook post from
*/