Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

modeler returns "maximum code size exceeded" or "4712 expected between -4096 and 4095" if code size is increased #303

Open
mhatzl opened this issue Oct 26, 2021 · 7 comments

Comments

@mhatzl
Copy link

mhatzl commented Oct 26, 2021

Some changes introduced after commit b4df450b02c1bef1cf03af46be8505aae2791dfc can not handle if selfie.c reaches a certain code size and increasing MAX_CODE_SIZE leads to "maximum data size exceeded" and after increasing MAX_DATA_SIZE, modeler returns with 4712 expected between -4096 and 4095 where 4172 can change depending on the number of statements inside an if.

The first probblems with code/data size can be fixed by increasing the constants, but I am having trouble fixing this expected between error.

I have tracked down the problem to fixup_relative_BFormat where code_size - from_address is the number that is out of range. With this information I was able to reproduce all 3 errors by adding some print("mhatzl"); and if-statements inside the main method.

Note: My code was compiling and succeeded everything (except make os, but that got solved) executed with make all with the latest merged commit being b4df450b02c1bef1cf03af46be8505aae2791dfc.

After merging 0d4e30fca8315363e2c8627c80de83cd17e7238c, I can run everything of make all except make mod which returns the above mentioned errors. (Note: All compiler assignments are still passing)

With the below mentioned lines added to main() after `exit_code = selfie(0), I was able to reproduce all 3 errors with the current base selfie.c. So the error is not part of my code.

Output for code size exceeded:

sed 's/main(/selfie_main(/' selfie.c > selfie.h
cc -Wall -Wextra -O3 -m64 -D'uint64_t=unsigned long' --include selfie.h tools/modeler.c -o modeler
./modeler
synopsis: ./modeler { -c { source } | -o binary | ( -s | -S ) assembly | -l binary } - exit-code [ --check-block-access ] ...
./selfie -c selfie.h tools/modeler.c -m 1
./selfie: this is the selfie system from selfie.cs.uni-salzburg.at with
./selfie: 64-bit unsigned integers and 64-bit pointers hosted on Linux
./selfie: selfie compiling selfie.h with starc
./selfie: 378814 characters read in 13174 lines and 1653 comments
./selfie: with 225547(59.54%) characters in 54615 actual symbols
./selfie: 467 global variables, 615 procedures, 1933 string literals
./selfie: 4300 calls, 1341 assignments, 92 while, 886 if, 572 return
./selfie: selfie compiling tools/modeler.c with starc
./selfie: syntax error in tools/modeler.c in line 2099: maximum code size exceeded
make: *** [Makefile:194: mod] Error 18

Setting MAX_CODE_SIZE = 524288;

sed 's/main(/selfie_main(/' selfie.c > selfie.h
cc -Wall -Wextra -O3 -m64 -D'uint64_t=unsigned long' --include selfie.h tools/modeler.c -o modeler
./modeler
synopsis: ./modeler { -c { source } | -o binary | ( -s | -S ) assembly | -l binary } - exit-code [ --check-block-access ] ...
./selfie -c selfie.h tools/modeler.c -m 1
./selfie: this is the selfie system from selfie.cs.uni-salzburg.at with
./selfie: 64-bit unsigned integers and 64-bit pointers hosted on Linux
./selfie: selfie compiling selfie.h with starc
./selfie: 378823 characters read in 13174 lines and 1653 comments
./selfie: with 225547(59.54%) characters in 54615 actual symbols
./selfie: 467 global variables, 615 procedures, 1933 string literals
./selfie: 4300 calls, 1341 assignments, 92 while, 886 if, 572 return
./selfie: selfie compiling tools/modeler.c with starc
./selfie: 101462 characters read in 2347 lines and 861 comments
./selfie: with 45534(44.87%) characters in 9080 actual symbols
./selfie: 500 global variables, 647 procedures, 2260 string literals
./selfie: 500 calls, 332 assignments, 12 while, 94 if, 21 return
./selfie: syntax error in tools/modeler.c in line 2347: maximum data size exceeded
make: *** [Makefile:194: mod] Error 18

Setting MAX_DATA_SIZE = 65536; AND uncommenting the commented print("mhatzl"); of the lines below

sed 's/main(/selfie_main(/' selfie.c > selfie.h
cc -Wall -Wextra -O3 -m64 -D'uint64_t=unsigned long' --include selfie.h tools/modeler.c -o modeler
./modeler
synopsis: ./modeler { -c { source } | -o binary | ( -s | -S ) assembly | -l binary } - exit-code [ --check-block-access ] ...
./selfie -c selfie.h tools/modeler.c -m 1
./selfie: this is the selfie system from selfie.cs.uni-salzburg.at with
./selfie: 64-bit unsigned integers and 64-bit pointers hosted on Linux
./selfie: selfie compiling selfie.h with starc
./selfie: encoding error in selfie.h in line 13161: 4712 expected between -4096 and 4095
make: *** [Makefile:194: mod] Error 18

Lines below to reproduce the behavior.

Note: Uncomment the commented prints() for the last error.

// mhatzl

  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
    print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");
  print("mhatzl");

  if (exit_code == 0) {
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
      print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
      print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
      print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
    // print("mhatzl");
  }
  else if (exit_code == 1) {
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
    print("mhatzl");
  }

  // mhatzl

@mstarzinger
Copy link
Contributor

I briefly looked into the third error you described in your issue (i.e. expected between -4096 and 4095). This is most likely some if-statement with a very large body in modeler.c exceeding the hard limit of 2^12 - 1 for the immediate of a beq instruction.

Quickly adding some statistics I saw that an unmodified version of selfie hits a maximum (positive) immediate of 3856 when compiling modeler.c. This is already pretty close to the limit and doesn't give much wiggle room for someone with local modifications to the compiler that increases the size of code within the body of that if-statement. I assume you have such modification in your version of selfie? For comparison, self-compiling selfie.c with selfie only reaches a maximum (positive) immediate of 2524 at the moment.

I can try to look through modeler.c and see if some large if-statement can somehow be rewritten to increase this wiggle room. But in general this hard limit on beq is something one can always run into, or provoke/trigger on purpose.

Just as a side-note: What production compilers usually do is to rewrite a simple beq in some way when they detect such an overflow occurs (or might occur). This however increases complexity of code generation, and is especially troublesome for single-pass compilers like selfie. So it is presumably not suited for being added into selfie. The following is one example for such a rewrite:

Rewrite this (beq has an immediate limit of 2^12 - 1):

beq t0,zero,#offset

Into the following form (jal has an immediate limit of 2^20 - 1):

bne t0,zero,2
jal zero,#offset

@mhatzl
Copy link
Author

mhatzl commented Oct 27, 2021

@mstarzinger Thanks for looking into it.
You are right, I modified my selfie implementation to support all compiler assignments.

I went through my selfie.c and the biggest if-statement is the one of get_symbol with around 400 lines of code inside the outmost if. Others where around 200 lines or less. I went ahead and moved some inner code into methods, reducing the if-statement to about 200 lines.
However, I still get the same error and even the number of 4492 expected between -4096 and 4095 remains the same.

I looked at the assembler code of selfie with -s and the biggest offset of a beq instruction was at 1000 (which was get_symbol()) and after refactoring, I got it down to some beq having an offset of about 600.

I am not familiar with modeler, but is it possible to better debug at which beq it fails?

Also: How does the offset scale? I thought the biggest offset is the one from the first if to the end of else. Which means that else if between increases the offset, but method calls do not (or not that much).

Thanks for your help!

@mhatzl
Copy link
Author

mhatzl commented Oct 27, 2021

After refactoring get_symbol() with no change to the error message, I went and stepped through all fixup_relative_BFormat calls and found that the problem is not from an if-statement but from a while-loop.
(The fixup call at the end of compile_while throws the error)

So I went through all while-loops searching for the largest one (looking in selfie.c and modeler.c).
I found the biggest one in modeler.c starting at line 2000 for 139 lines (The output is even mentioning line 2140 for the error I get with my modified selfie.c).

After moving two parts of around 30 lines each out of the loop, make mod runs without errors.
selfie still self-compiles and the implemented assignments pass.

Note: I copied everything outside the loop passing needed parameters, so the logic remains the same.

Which leaves me with the question: Why is modeler.c failing for me, but not in the original selfie with the larger while?

@mstarzinger
Copy link
Contributor

@mhatzl Nice, thanks for digging further into this. Good to know which while-loop is the culprit (and the fact that it is a while-loop instead of an if-statement).

Regarding your last question: Some of the changes in your version of selfie are likely increasing the amount of code (i.e. number of RISC-V instructions) that are emitted for certain expressions/statements that appear within this loop's body. This increases the distance that beq has to cover when jumping over (and skipping) the loop. So even though the number of source lines within the loop in modeler.c is the same in the original and in your version, the size of the emitted code for these lines increases. At least that is my working theory.

@mhatzl
Copy link
Author

mhatzl commented Oct 28, 2021

@mstarzinger Thanks for your explanation.

Do you want to dig further into this issue to find out what expression/statement is the problem? (I can not make my repository public, but I think I am allowed to give you access if you want to)

Otherwise, I will keep my adaptation of modeler.c. I do not know what the code is doing in modeler.c, so my naming for the created functions is quite terrible, but if you want, I can create a pull request or post the modified loop here.

@mstarzinger
Copy link
Contributor

mstarzinger commented Oct 28, 2021

@mhatzl I have in the meantime also refactored the while-loop in question in modeler.c a bit. I checked that it reduces the maximum (positive) beq distance down to 2524 (same as in just selfie.h without modeler.c). It would be great if you could verify that this indeed fixes the problem on your end as well. If so, then I'll make a PR out of it.

My proposed change is here: https://github.com/mstarzinger/selfie/tree/refactor-modeler-control-flow

@mhatzl
Copy link
Author

mhatzl commented Oct 28, 2021

@mstarzinger I have tested your implementation and make mod runs without error.

Thanks again.

mstarzinger added a commit to mstarzinger/selfie that referenced this issue Nov 3, 2021
This just refactors the handling of in-edges in modelers control flow
chaining into separate methods. It is intended to make the while-loop
iterating over all program locations smaller, because its size exceeded
one of the limits built into selfie under certain circumstances. No
functional changes intended. See issue cksystemsteaching#303 for more details.

Kudos to @mhatzl for spotting and debugging this.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants