From 524d789805dc5ec910292764c58f5474923c3547 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 5 Apr 2020 18:28:32 +0200 Subject: [PATCH] Added test for #defines inside imported file. #169 --- .../dk/camelot64/kickc/test/TestPrograms.java | 7 +- src/test/kc/preprocessor-3.kc | 10 + src/test/kc/preprocessor-3b.kc | 5 + src/test/ref/preprocessor-2.asm | 17 ++ src/test/ref/preprocessor-2.cfg | 18 ++ src/test/ref/preprocessor-2.log | 246 ++++++++++++++++++ src/test/ref/preprocessor-2.sym | 8 + src/test/ref/preprocessor-3.asm | 15 ++ src/test/ref/preprocessor-3.cfg | 17 ++ src/test/ref/preprocessor-3.log | 228 ++++++++++++++++ src/test/ref/preprocessor-3.sym | 7 + 11 files changed, 577 insertions(+), 1 deletion(-) create mode 100644 src/test/kc/preprocessor-3.kc create mode 100644 src/test/kc/preprocessor-3b.kc create mode 100644 src/test/ref/preprocessor-2.asm create mode 100644 src/test/ref/preprocessor-2.cfg create mode 100644 src/test/ref/preprocessor-2.log create mode 100644 src/test/ref/preprocessor-2.sym create mode 100644 src/test/ref/preprocessor-3.asm create mode 100644 src/test/ref/preprocessor-3.cfg create mode 100644 src/test/ref/preprocessor-3.log create mode 100644 src/test/ref/preprocessor-3.sym diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index d3d4345b6..8e326e8a5 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -38,9 +38,14 @@ public class TestPrograms { } + @Test + public void testPreprocessor3() throws IOException, URISyntaxException { + compileAndCompare("preprocessor-3"); + } + @Test public void testPreprocessor2() throws IOException, URISyntaxException { - compileAndCompare("preprocessor-2", log()); + compileAndCompare("preprocessor-2"); } @Test diff --git a/src/test/kc/preprocessor-3.kc b/src/test/kc/preprocessor-3.kc new file mode 100644 index 000000000..1720f8d7b --- /dev/null +++ b/src/test/kc/preprocessor-3.kc @@ -0,0 +1,10 @@ +// Test the preprocessor +// #define inside an imported file + +import "preprocessor-3b" + +char * SCREEN = 0x0400; + +void main() { + SCREEN[0] = STAR; +} \ No newline at end of file diff --git a/src/test/kc/preprocessor-3b.kc b/src/test/kc/preprocessor-3b.kc new file mode 100644 index 000000000..8242528c5 --- /dev/null +++ b/src/test/kc/preprocessor-3b.kc @@ -0,0 +1,5 @@ +// Test the preprocessor +// #define inside an imported file + +#define STAR '*' + diff --git a/src/test/ref/preprocessor-2.asm b/src/test/ref/preprocessor-2.asm new file mode 100644 index 000000000..968da6937 --- /dev/null +++ b/src/test/ref/preprocessor-2.asm @@ -0,0 +1,17 @@ +// Test the preprocessor +// #define and #undef - expected output on screen is xa +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + .label SCREEN = $400 +main: { + .const a = 'a' + // SCREEN[0] = a + lda #'x' + sta SCREEN + // SCREEN[1] = a + lda #a + sta SCREEN+1 + // } + rts +} diff --git a/src/test/ref/preprocessor-2.cfg b/src/test/ref/preprocessor-2.cfg new file mode 100644 index 000000000..105aa53ca --- /dev/null +++ b/src/test/ref/preprocessor-2.cfg @@ -0,0 +1,18 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() + +(void()) main() +main: scope:[main] from @1 + [4] *((const byte*) SCREEN) ← (byte) 'x' + [5] *((const byte*) SCREEN+(byte) 1) ← (const byte) main::a + to:main::@return +main::@return: scope:[main] from main + [6] return + to:@return diff --git a/src/test/ref/preprocessor-2.log b/src/test/ref/preprocessor-2.log new file mode 100644 index 000000000..64f5ec4f3 --- /dev/null +++ b/src/test/ref/preprocessor-2.log @@ -0,0 +1,246 @@ +Identified constant variable (byte*) SCREEN +Identified constant variable (byte) main::a + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + to:@1 + +(void()) main() +main: scope:[main] from @1 + *((const byte*) SCREEN + (number) 0) ← (byte) 'x' + *((const byte*) SCREEN + (number) 1) ← (const byte) main::a + to:main::@return +main::@return: scope:[main] from main + return + to:@return +@1: scope:[] from @begin + call main + to:@2 +@2: scope:[] from @1 + to:@end +@end: scope:[] from @2 + +SYMBOL TABLE SSA +(label) @1 +(label) @2 +(label) @begin +(label) @end +(const byte*) SCREEN = (byte*)(number) $400 +(void()) main() +(label) main::@return +(const byte) main::a = (byte) 'a' + +Adding number conversion cast (unumber) 0 in *((const byte*) SCREEN + (number) 0) ← (byte) 'x' +Adding number conversion cast (unumber) 1 in *((const byte*) SCREEN + (number) 1) ← (const byte) main::a +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant pointer cast (byte*) 1024 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Simplifying expression containing zero SCREEN in [0] *((const byte*) SCREEN + (byte) 0) ← (byte) 'x' +Successful SSA optimization PassNSimplifyExpressionWithZero +Consolidated array index constant in *(SCREEN+1) +Successful SSA optimization Pass2ConstantAdditionElimination +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @2 +Adding NOP phi() at start of @end +CALL GRAPH +Calls in [] to main:2 + +Created 0 initial phi equivalence classes +Coalesced down to 0 phi equivalence classes +Culled Empty Block (label) @2 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() + +(void()) main() +main: scope:[main] from @1 + [4] *((const byte*) SCREEN) ← (byte) 'x' + [5] *((const byte*) SCREEN+(byte) 1) ← (const byte) main::a + to:main::@return +main::@return: scope:[main] from main + [6] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(void()) main() + +Initial phi equivalence classes +Complete equivalence classes + +INITIAL ASM +Target platform is c64basic / MOS6502X + // File Comments +// Test the preprocessor +// #define and #undef - expected output on screen is xa + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + .label SCREEN = $400 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + .const a = 'a' + // [4] *((const byte*) SCREEN) ← (byte) 'x' -- _deref_pbuc1=vbuc2 + lda #'x' + sta SCREEN + // [5] *((const byte*) SCREEN+(byte) 1) ← (const byte) main::a -- _deref_pbuc1=vbuc2 + lda #a + sta SCREEN+1 + jmp __breturn + // main::@return + __breturn: + // [6] return + rts +} + // File Data + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [4] *((const byte*) SCREEN) ← (byte) 'x' [ ] ( main:2 [ ] { } ) always clobbers reg byte a +Statement [5] *((const byte*) SCREEN+(byte) 1) ← (const byte) main::a [ ] ( main:2 [ ] { } ) always clobbers reg byte a + +REGISTER UPLIFT SCOPES +Uplift Scope [main] +Uplift Scope [] + +Uplifting [main] best 33 combination +Uplifting [] best 33 combination + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments +// Test the preprocessor +// #define and #undef - expected output on screen is xa + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + .label SCREEN = $400 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + .const a = 'a' + // [4] *((const byte*) SCREEN) ← (byte) 'x' -- _deref_pbuc1=vbuc2 + lda #'x' + sta SCREEN + // [5] *((const byte*) SCREEN+(byte) 1) ← (const byte) main::a -- _deref_pbuc1=vbuc2 + lda #a + sta SCREEN+1 + jmp __breturn + // main::@return + __breturn: + // [6] return + rts +} + // File Data + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __b1 +Removing instruction jmp __bend +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction __b1_from___bbegin: +Removing instruction __b1: +Removing instruction __bend_from___b1: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __bend: +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Removing instruction __bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(const byte*) SCREEN = (byte*) 1024 +(void()) main() +(label) main::@return +(const byte) main::a = (byte) 'a' + + + +FINAL ASSEMBLER +Score: 18 + + // File Comments +// Test the preprocessor +// #define and #undef - expected output on screen is xa + // Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + // Global Constants & labels + .label SCREEN = $400 + // @begin + // [1] phi from @begin to @1 [phi:@begin->@1] + // @1 + // [2] call main + // [3] phi from @1 to @end [phi:@1->@end] + // @end + // main +main: { + .const a = 'a' + // SCREEN[0] = a + // [4] *((const byte*) SCREEN) ← (byte) 'x' -- _deref_pbuc1=vbuc2 + lda #'x' + sta SCREEN + // SCREEN[1] = a + // [5] *((const byte*) SCREEN+(byte) 1) ← (const byte) main::a -- _deref_pbuc1=vbuc2 + lda #a + sta SCREEN+1 + // main::@return + // } + // [6] return + rts +} + // File Data + diff --git a/src/test/ref/preprocessor-2.sym b/src/test/ref/preprocessor-2.sym new file mode 100644 index 000000000..a0c617d2f --- /dev/null +++ b/src/test/ref/preprocessor-2.sym @@ -0,0 +1,8 @@ +(label) @1 +(label) @begin +(label) @end +(const byte*) SCREEN = (byte*) 1024 +(void()) main() +(label) main::@return +(const byte) main::a = (byte) 'a' + diff --git a/src/test/ref/preprocessor-3.asm b/src/test/ref/preprocessor-3.asm new file mode 100644 index 000000000..5f5b76511 --- /dev/null +++ b/src/test/ref/preprocessor-3.asm @@ -0,0 +1,15 @@ +// Test the preprocessor +// #define inside an imported file +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + // Test the preprocessor + // #define inside an imported file + .label SCREEN = $400 +main: { + // SCREEN[0] = STAR + lda #'*' + sta SCREEN + // } + rts +} diff --git a/src/test/ref/preprocessor-3.cfg b/src/test/ref/preprocessor-3.cfg new file mode 100644 index 000000000..6713a3ca1 --- /dev/null +++ b/src/test/ref/preprocessor-3.cfg @@ -0,0 +1,17 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() + +(void()) main() +main: scope:[main] from @1 + [4] *((const byte*) SCREEN) ← (byte) '*' + to:main::@return +main::@return: scope:[main] from main + [5] return + to:@return diff --git a/src/test/ref/preprocessor-3.log b/src/test/ref/preprocessor-3.log new file mode 100644 index 000000000..e70bda9a7 --- /dev/null +++ b/src/test/ref/preprocessor-3.log @@ -0,0 +1,228 @@ +Identified constant variable (byte*) SCREEN + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + to:@1 + +(void()) main() +main: scope:[main] from @1 + *((const byte*) SCREEN + (number) 0) ← (byte) '*' + to:main::@return +main::@return: scope:[main] from main + return + to:@return +@1: scope:[] from @begin + call main + to:@2 +@2: scope:[] from @1 + to:@end +@end: scope:[] from @2 + +SYMBOL TABLE SSA +(label) @1 +(label) @2 +(label) @begin +(label) @end +(const byte*) SCREEN = (byte*)(number) $400 +(void()) main() +(label) main::@return + +Adding number conversion cast (unumber) 0 in *((const byte*) SCREEN + (number) 0) ← (byte) '*' +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant pointer cast (byte*) 1024 +Simplifying constant integer cast 0 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 0 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Simplifying expression containing zero SCREEN in [0] *((const byte*) SCREEN + (byte) 0) ← (byte) '*' +Successful SSA optimization PassNSimplifyExpressionWithZero +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @2 +Adding NOP phi() at start of @end +CALL GRAPH +Calls in [] to main:2 + +Created 0 initial phi equivalence classes +Coalesced down to 0 phi equivalence classes +Culled Empty Block (label) @2 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() + +(void()) main() +main: scope:[main] from @1 + [4] *((const byte*) SCREEN) ← (byte) '*' + to:main::@return +main::@return: scope:[main] from main + [5] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(void()) main() + +Initial phi equivalence classes +Complete equivalence classes + +INITIAL ASM +Target platform is c64basic / MOS6502X + // File Comments +// Test the preprocessor +// #define inside an imported file + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + // Test the preprocessor + // #define inside an imported file + .label SCREEN = $400 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + // [4] *((const byte*) SCREEN) ← (byte) '*' -- _deref_pbuc1=vbuc2 + lda #'*' + sta SCREEN + jmp __breturn + // main::@return + __breturn: + // [5] return + rts +} + // File Data + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [4] *((const byte*) SCREEN) ← (byte) '*' [ ] ( main:2 [ ] { } ) always clobbers reg byte a + +REGISTER UPLIFT SCOPES +Uplift Scope [main] +Uplift Scope [] + +Uplifting [main] best 27 combination +Uplifting [] best 27 combination + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments +// Test the preprocessor +// #define inside an imported file + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + // Test the preprocessor + // #define inside an imported file + .label SCREEN = $400 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + // [4] *((const byte*) SCREEN) ← (byte) '*' -- _deref_pbuc1=vbuc2 + lda #'*' + sta SCREEN + jmp __breturn + // main::@return + __breturn: + // [5] return + rts +} + // File Data + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __b1 +Removing instruction jmp __bend +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction __b1_from___bbegin: +Removing instruction __b1: +Removing instruction __bend_from___b1: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __bend: +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Removing instruction __bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(const byte*) SCREEN = (byte*) 1024 +(void()) main() +(label) main::@return + + + +FINAL ASSEMBLER +Score: 12 + + // File Comments +// Test the preprocessor +// #define inside an imported file + // Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + // Global Constants & labels + // Test the preprocessor + // #define inside an imported file + .label SCREEN = $400 + // @begin + // [1] phi from @begin to @1 [phi:@begin->@1] + // @1 + // [2] call main + // [3] phi from @1 to @end [phi:@1->@end] + // @end + // main +main: { + // SCREEN[0] = STAR + // [4] *((const byte*) SCREEN) ← (byte) '*' -- _deref_pbuc1=vbuc2 + lda #'*' + sta SCREEN + // main::@return + // } + // [5] return + rts +} + // File Data + diff --git a/src/test/ref/preprocessor-3.sym b/src/test/ref/preprocessor-3.sym new file mode 100644 index 000000000..4c7cc2c06 --- /dev/null +++ b/src/test/ref/preprocessor-3.sym @@ -0,0 +1,7 @@ +(label) @1 +(label) @begin +(label) @end +(const byte*) SCREEN = (byte*) 1024 +(void()) main() +(label) main::@return +