1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-08-02 09:29:35 +00:00

Added aseetion stopping compilation at pass 3 if any value list has survived.

This commit is contained in:
jespergravgaard 2017-12-27 22:22:53 +01:00
parent 347fc03f47
commit 4bcf51732b
5 changed files with 43 additions and 2 deletions

View File

@ -206,7 +206,6 @@ public class Compiler {
ssaOptimized = true;
getLog().append("CONTROL FLOW GRAPH");
getLog().append(program.getGraph().toString(program));
//pass2AssertSSA(program);
}
}
}
@ -215,6 +214,8 @@ public class Compiler {
private void pass3Analysis() {
new Pass3AssertNoValueLists(program).check();
new Pass3BlockSequencePlanner(program).plan();
// Phi lifting ensures that all variables in phi-blocks are in different live range equivalence classes

View File

@ -0,0 +1,31 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.RValue;
import dk.camelot64.kickc.model.ValueList;
/**
* Assert that no value lists still exist inside the code.
*/
public class Pass3AssertNoValueLists extends Pass2SsaAssertion {
public Pass3AssertNoValueLists(Program program) {
super(program);
}
@Override
public void check() throws AssertionFailed {
ValueReplacer.executeAll(getGraph(), (replaceable, currentStmt, stmtIt, currentBlock) -> {
RValue value = replaceable.get();
if(value instanceof ValueList) {
throw new CompileError(
"Error! Value list not resolved to word constructor or array initializer" +
"\n value list: " + value.toString(getProgram()) +
"\n statement: " + currentStmt.toString(getProgram(), false)
);
}
});
}
}

View File

@ -323,7 +323,7 @@ public class PassNVariableReferenceInfos extends Pass2Base {
} else if (rValue instanceof ValueList) {
LinkedHashSet<SymbolRef> used = new LinkedHashSet<>();
for (RValue value : ((ValueList) rValue).getList()) {
used.addAll(getReferencedVars(value));
used.addAll(getReferenced(value));
}
return used;
} else {

View File

@ -339,6 +339,10 @@ public class TestPrograms extends TestCase {
assertError("invalid-consttype", "Constant variable has a non-matching type");
}
public void testValueListError() throws IOException, URISyntaxException {
assertError("valuelist-error", "Value list not resolved to word constructor");
}
private void assertError(String kcFile, String expectError) throws IOException, URISyntaxException {
try {
compileAndCompare(kcFile);

View File

@ -0,0 +1,5 @@
void main() {
word w = { -1, -1};
byte* screen = $400;
*screen = <w;
}