# IDO compilation flowchart
```graphviz
digraph{
c [label="C code .c", shape=parallelogram]
p [label="Pascal code .p", shape=parallelogram]
s [label="Assembly .s", shape=parallelogram]
ucode [label="UCode", shape=parallelogram]
cc[shape=square]
c -> cc
p -> cc
s -> cc
cfe[shape=square]
upas[shape=square]
as0[shape=square]
cc -> as0 [label="Assembly"]
cc -> cfe [label="C"]
cc -> upas [label="Pascal"]
cfe,upas -> ucode
uopt[shape=square]
ugen[shape=square]
ujoin[shape=square]
uld[shape=square]
usplit[shape=square]
umerge[shape=square]
as1[shape=square]
ld[shape=square]
ucode -> ugen [label = "-O0/-O1"]
ucode -> uopt [label = "-O2"]
ucode -> ujoin [label = "-O3"]
ujoin -> uld
uld -> u -> usplit -> umerge
umerge -> uopt
uopt -> ugen
ugen -> as1
as1 -> ld
u [label = "Ucode .u", shape=parallelogram]
sout [label = "Compiled .s", shape=parallelogram]
o [label = "Assembled .o", shape=parallelogram]
aout [label = "Compiled a.out", shape=parallelogram]
ugen -> sout [label = "-S"]
as1 -> o [label = "-c"]
as0 -> as1 [label = "?"]
ld -> aout
{rank=same; ugen, sout}
{rank=same; as1, o}
{rank=same; ld, aout}
// {rank=same; s,c,p}
// {rank=same; as0, ugen}
ujoin[shape=square]
usplit[shape=square]
}
```
## Intermediate files
| tempstr | temp pref | written | kept suf | read by | name |
| ------- | --------- | --------- | -------- | --------------------------- | ----------------------------------- |
| 0 | ctmst | cfe | .T | cfe, uopt, ugen, as1 | symtab |
| 1 | ctmu | utob | .B | | [utob passout] |
| 2 | ctmp | cpp, cfe | .B/.i | | [cfe/cpp passout?] |
| 3 | ctmf | cc(?),cfe | .B | ujoin(O3),uopt(O1),ugen(O2) | ? [cfe passout] |
| - | - | ujoin | .u | uld | ufile [ujoin passout] |
| 4 | ctmlu | uld | u.out.u | usplit | uoutfile [uld passout] |
| 5 | ctms | usplit | u.out.S | umerge | [usplit passout] |
| 6 | ctmm | umerge | u.out.M | uopt(O3) | [umerge passout] |
| 7 | ctmo | uopt | .O | as1 | ? [uopt passout] |
| 8 | ctmos | uopt? | - | | optstr |
| 9 | ctmcb | ugen | .G | | binasm (for -S only) |
| 10 | ctmc | ugen | .G | ugen, as1 | ? [ugen passout] (except -S) |
| - | - | ugen | .s | | |
| 11 | ctma | as0 | .G | as1 | [as0 passout] |
| 12 | ctmb | as1 | | | temp_uldobj [as1 passout] (unused?) |
| 13 | ctml | | | | unused |
| 14 | ctmm4 | m4 | .p | | [m4 passout] |
| 15 | ctmgt | ugen | - | | gentmp |
| 33 | ctmcmd | cc(?) | - | cfe | commandfile [related to -g] |
## Compilation procedure
cc calls appropriate programs
cfe: .c -> .T (symtab), .B (binasm? ucode?)
### -O1
| Program | In | Out |
| ------- | ------ | --- |
| ugen | .T, .B | .G |
| as1 | .T, .G | .o |
### -O2
| Program | In | Out |
| ------- | ------ | --- |
| uopt | .T, .B | .O |
| ugen | .T, .O | .G |
| as1 | .T, .G | .o |
### -O3
| Program | In | Out |
| ------- | ---------------- | ---------------- |
| ujoin | .T, .B | .u |
| uld | .u | u.out.u |
| usplit | u.out.u | u.out.S, u.out.T |
| umerge | u.out.T, u.out.S | u.out.M |
| uopt | u.out.T, u.out.M | u.out.O |
| ugen | u.out.T, u.out.O | u.out.G |
| as1 | u.out.T, u.out.G | .o |