CS153/hw6
jmug 0c04936ccf Updated hw6 to a newer version
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 21:23:08 -08:00
..
bin Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
doc Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
hw4programs Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
hw5programs Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
lib Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
llprograms Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
test Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
.gitignore Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
.ocamlinit Add all the assignment code. 2025-01-24 18:59:28 -08:00
a.out Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
dune-project Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
hw6.opam Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
Makefile Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
README.md Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00
submit_zip_contents.txt Updated hw6 to a newer version 2025-01-24 21:23:08 -08:00

HW6: Dataflow Analysis and Optimization

The instructions for this homework are in the doc directory.

Quick Start:

  1. open the folder in VSCode
  2. start an OCaml sandbox terminal
  3. run make test from the command line
  4. open bin/solver.ml

Using oatc

oatc acts like the clang compiler. Given several .oat, .ll, .c, and .o files, it will compile the .oat and .ll files to .s files (using the CS153 frontend and backend) and then combine the results with the .c and .o files to produce an executable named a.out. You can also compile the .ll files using clang instead of the CS153 backend, which can be useful for testing purposes.

  • To run the automated test harness do:

      ./oatc --test
    
  • To compile oat files using the CS153 backend:

      ./oatc path/to/foo.oat
    
    • creates output/foo.ll frontend ll code
    • creates output/foo.s backend assembly code
    • creates output/foo.o assembled object file
    • creates a.out linked executable

NOTE: by default the .s and .o files are created in a directory called output, and the filenames are chosen so that multiple runs of the compiler will not overwrite previous outputs. foo.ll will be compiled first to foo.s then foo_1.s, foo_2.s, etc.

  • To compile oat files using the clang backend:

      ./oatc --clang path/to/foo.oat
    
  • Useful flags:

    Flag Description
    --regalloc {none,greedy,better} use the specified register allocator
    --liveness {trivial,dataflow} use the specified liveness analysis
    --print-regs prints the register usage statistics for x86 code
    --print-oat pretty prints the Oat abstract syntax to the terminal
    --print-ll echoes the ll program to the terminal
    --print-x86 echoes the resulting .s file to the terminal
    --interpret-ll runs the ll file through the reference interpreter and outputs the results to the console
    --execute-x86 runs the resulting a.out file natively (applies to either the 153 backend or clang-compiled code)
    --clang compiles to assembly using clang, not the CS153 backend
    -v generates verbose output, showing which commands are used for linking, etc.
    -op <dirname> change the output path [DEFAULT=output]
    -o change the generated executable's name [DEFAULT=a.out]
    -S stop after generating .s files
    -c stop after generating .o files
    -h or --help display the list of options
  • Example uses:

    Run the test case hw4programs/fact.oat using the CS153 backend:

        ./oatc --execute-x86 hw4programs/fact.oat bin/runtime.c 
        120--------------------------------------------------------------- Executing: a.out
        * a.out returned 0