op=ARGU4 at foo.c:5 is corrupt. getrule: Assertion `0' failed.
chlordk opened this issue · 3 comments
Hi
I have tried the test examples in /tst/
and most of them gives all the getrule: Assertion '0' failed
error.
Only tst/incr.c
and tst/init.c
will compile.
I then made a simple example to pin point one kind of error:
$ cat -n foo.c
1 void main(void) {
2 unsigned int i = 3;
3 unsigned int a = sizeof(i);
4 while (i++ < 5) {
5 a = a + bar(a);
6 }
7 }
8 bar(x)
9 unsigned int x;
10 {
11 return 7+x;
12 }
The full command line output:
ff@ubuntu22lts:~/lcc$ ulpcc foo.c
<command-line>: warning: "__STDC__" redefined
<built-in>: note: this is the location of the previous definition
(414b4c0->op=ARGU4 at foo.c:5 is corrupt.)
rcc: src/gen.c:181: getrule: Assertion `0' failed.
/home/ff/lcc/build/lcc: fatal error in /home/ff/lcc/build/rcc
Another strange thing is that when it does compile, the function bar()
without argument a
it does not get called in the foo.S
file.
In line 12 move r2,r0
it is supposed to load the output from bar()
into i
but register r0
never gets loaded with a value (or I missed it).
1 void main(void) {
2 unsigned int i = 3;
3 unsigned int a = sizeof(i);
4 while (i++ < 5) {
5 a = a + bar(); // arg from bar() removed should give error
6 }
7 }
8 bar(x)
9 unsigned int x;
10 {
11 return 7 /*+x*/;
12 }
The foo.S:
1 .global main
2 .text
3 .bss
4 main.a:
5 .space 4
6 .text
7 .bss
8 main.i:
9 .space 4
10 .text
11 main:
12 move r2,3
13 move r3,main.i
14 st r2,r3,0
15 move r2,4
16 move r3,main.a
17 st r2,r3,0
18 jump L.3
19 L.2:
20 move r1,main.a
21 ld r1,r1,0
22 move r2,r0
23 add r2,r1,r2
24 move r3,main.a
25 st r2,r3,0
26 L.3:
27 move r2,main.i
28 ld r2,r2,0
29 add r1,r2,1
30 move r3,main.i
31 st r1,r3,0
32 move r1,5
33 sub r2,r2,r1 #{ if r2 < r1 goto L.2
34 add r2,r2,r1
35 jump L.2, ov #}
36 L.1:
37
38 .global bar
39 bar:
40 move r0,7
41 L.5:
42
43 halt
I'm running on Ubuntu VERSION="22.04.2 LTS (Jammy Jellyfish)"
.
After reading all the assembler output I kind of learned it but I would prefer to use ulpcc instead. It is a great and promising tool.
As stated in https://github.com/jasonful/lcc/blob/master/ulpcc/doc/README.md , function calls are not supported, because the chip has no stack pointer.
(The examples in ulpcc/examples will compile, but the examples in lcc/tst (the ones for the original C compiler) probably will not.)
function calls are not supported, because the chip has no stack pointer.
Ohh sorry, I missed that one.
I guess one could use a while loop with a switch/case to simulate a function call.
while (not_exit) {
switch (state) {
case main:
if (0 == --count)
state = subf;
... and so on