From dbcaebdefff26658debc29cae284ad4aa0da4c65 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Thu, 22 Oct 2026 10:45:43 -0700 Subject: Split out incomplete type analysis --- Makefile | 2 +- README.ja.md | 1 + README.md | 1 + chapter-incomplete-types/Makefile | 186 ++ chapter-incomplete-types/README.ja.md | 17 + chapter-incomplete-types/README.md | 149 ++ chapter-incomplete-types/docs/24-grammar.ja.md | 168 ++ chapter-incomplete-types/docs/24-grammar.md | 168 ++ chapter-incomplete-types/docs/Makefile | 12 + .../docs/examples/A_helloWorld.smp | 3 + .../docs/examples/BubbleSort.smp | 37 + .../docs/font-awesome-4.7.0.zip | Bin 0 -> 669808 bytes chapter-incomplete-types/docs/ifg_trim.pdf | Bin 0 -> 155190 bytes chapter-incomplete-types/docs/lattice.gv | 203 ++ chapter-incomplete-types/docs/lattice.svg | 691 ++++++ chapter-incomplete-types/docs/lattice2.gv | 85 + chapter-incomplete-types/docs/lattice2.svg | 260 +++ chapter-incomplete-types/docs/pardoe.docx | Bin 0 -> 22583 bytes chapter-incomplete-types/docs/webtcp.min.js | 65 + chapter-incomplete-types/pom.xml | 46 + chapter-incomplete-types/simple.bat | 2 + chapter-incomplete-types/simple.sh | 2 + .../main/java/com/seaofnodes/simple/IterPeeps.java | 230 ++ .../main/java/com/seaofnodes/simple/Parser.java | 2206 ++++++++++++++++++++ .../src/main/java/com/seaofnodes/simple/Var.java | 56 + .../com/seaofnodes/simple/codegen/BuildLRG.java | 95 + .../com/seaofnodes/simple/codegen/Coalesce.java | 105 + .../com/seaofnodes/simple/codegen/CodeGen.java | 408 ++++ .../com/seaofnodes/simple/codegen/ElfExpr.java | 87 + .../com/seaofnodes/simple/codegen/ElfFile.java | 382 ++++ .../com/seaofnodes/simple/codegen/Encoding.java | 543 +++++ .../com/seaofnodes/simple/codegen/FinalizeIR.java | 76 + .../simple/codegen/GlobalCodeMotion.java | 311 +++ .../java/com/seaofnodes/simple/codegen/IFG.java | 539 +++++ .../com/seaofnodes/simple/codegen/InstSelect.java | 111 + .../java/com/seaofnodes/simple/codegen/LRG.java | 235 +++ .../com/seaofnodes/simple/codegen/LinkMem.java | 23 + .../seaofnodes/simple/codegen/ListScheduler.java | 261 +++ .../com/seaofnodes/simple/codegen/Machine.java | 109 + .../java/com/seaofnodes/simple/codegen/Opto.java | 244 +++ .../com/seaofnodes/simple/codegen/RIPRelSize.java | 14 + .../com/seaofnodes/simple/codegen/RegAlloc.java | 704 +++++++ .../com/seaofnodes/simple/codegen/RegMask.java | 122 ++ .../com/seaofnodes/simple/codegen/RegMaskRW.java | 36 + .../com/seaofnodes/simple/codegen/TypeCheck.java | 39 + .../java/com/seaofnodes/simple/node/AddFNode.java | 32 + .../java/com/seaofnodes/simple/node/AddNode.java | 178 ++ .../java/com/seaofnodes/simple/node/AndNode.java | 48 + .../com/seaofnodes/simple/node/ArithFNode.java | 31 + .../java/com/seaofnodes/simple/node/ArithNode.java | 206 ++ .../java/com/seaofnodes/simple/node/BoolNode.java | 202 ++ .../com/seaofnodes/simple/node/BulkMemPhiNode.java | 241 +++ .../java/com/seaofnodes/simple/node/CFGNode.java | 222 ++ .../java/com/seaofnodes/simple/node/CProjNode.java | 69 + .../com/seaofnodes/simple/node/CallEndMach.java | 36 + .../com/seaofnodes/simple/node/CallEndNode.java | 232 ++ .../java/com/seaofnodes/simple/node/CallNode.java | 175 ++ .../com/seaofnodes/simple/node/CalleeSaveNode.java | 23 + .../java/com/seaofnodes/simple/node/CastMach.java | 19 + .../java/com/seaofnodes/simple/node/CastNode.java | 79 + .../com/seaofnodes/simple/node/ConFldOffNode.java | 41 + .../com/seaofnodes/simple/node/ConstantNode.java | 67 + .../com/seaofnodes/simple/node/ConvertNode.java | 103 + .../java/com/seaofnodes/simple/node/CtrlNode.java | 16 + .../java/com/seaofnodes/simple/node/DivFNode.java | 27 + .../java/com/seaofnodes/simple/node/DivNode.java | 39 + .../com/seaofnodes/simple/node/ExternNode.java | 25 + .../java/com/seaofnodes/simple/node/FRefNode.java | 35 + .../com/seaofnodes/simple/node/FldOffNode.java | 24 + .../java/com/seaofnodes/simple/node/FunNode.java | 265 +++ .../com/seaofnodes/simple/node/FunPtrNode.java | 12 + .../java/com/seaofnodes/simple/node/GuardMach.java | 17 + .../java/com/seaofnodes/simple/node/GuardNode.java | 66 + .../java/com/seaofnodes/simple/node/IfNode.java | 105 + .../java/com/seaofnodes/simple/node/LoadNode.java | 275 +++ .../java/com/seaofnodes/simple/node/LoopNode.java | 104 + .../seaofnodes/simple/node/MachConcreteNode.java | 27 + .../java/com/seaofnodes/simple/node/MachNode.java | 60 + .../com/seaofnodes/simple/node/MemMergeNode.java | 102 + .../java/com/seaofnodes/simple/node/MemOpNode.java | 154 ++ .../com/seaofnodes/simple/node/MemPhiNode.java | 50 + .../com/seaofnodes/simple/node/MinusFNode.java | 32 + .../java/com/seaofnodes/simple/node/MinusNode.java | 77 + .../java/com/seaofnodes/simple/node/ModeNode.java | 12 + .../java/com/seaofnodes/simple/node/MulFNode.java | 37 + .../java/com/seaofnodes/simple/node/MulNode.java | 64 + .../java/com/seaofnodes/simple/node/MultiNode.java | 29 + .../java/com/seaofnodes/simple/node/NeverNode.java | 23 + .../java/com/seaofnodes/simple/node/NewNode.java | 111 + .../main/java/com/seaofnodes/simple/node/Node.java | 705 +++++++ .../java/com/seaofnodes/simple/node/NotNode.java | 26 + .../java/com/seaofnodes/simple/node/OrNode.java | 43 + .../java/com/seaofnodes/simple/node/ParmNode.java | 85 + .../java/com/seaofnodes/simple/node/PhiNode.java | 306 +++ .../java/com/seaofnodes/simple/node/ProjNode.java | 54 + .../com/seaofnodes/simple/node/PtrToIntMach.java | 17 + .../com/seaofnodes/simple/node/PtrToIntNode.java | 35 + .../com/seaofnodes/simple/node/ReadOnlyMach.java | 19 + .../com/seaofnodes/simple/node/ReadOnlyNode.java | 27 + .../com/seaofnodes/simple/node/RegionNode.java | 174 ++ .../com/seaofnodes/simple/node/ReturnNode.java | 182 ++ .../com/seaofnodes/simple/node/RoundF32Node.java | 34 + .../java/com/seaofnodes/simple/node/SarNode.java | 36 + .../java/com/seaofnodes/simple/node/ScopeNode.java | 521 +++++ .../java/com/seaofnodes/simple/node/ShlNode.java | 48 + .../java/com/seaofnodes/simple/node/ShrNode.java | 31 + .../java/com/seaofnodes/simple/node/SplitNode.java | 28 + .../java/com/seaofnodes/simple/node/StartNode.java | 49 + .../java/com/seaofnodes/simple/node/StopNode.java | 76 + .../java/com/seaofnodes/simple/node/StoreNode.java | 194 ++ .../com/seaofnodes/simple/node/StructNode.java | 56 + .../java/com/seaofnodes/simple/node/SubFNode.java | 28 + .../java/com/seaofnodes/simple/node/SubNode.java | 55 + .../com/seaofnodes/simple/node/ToFloatNode.java | 27 + .../com/seaofnodes/simple/node/ToIntegerNode.java | 23 + .../java/com/seaofnodes/simple/node/XCtrlNode.java | 16 + .../java/com/seaofnodes/simple/node/XorNode.java | 42 + .../seaofnodes/simple/node/cpus/arm/AddARM.java | 21 + .../seaofnodes/simple/node/cpus/arm/AddFARM.java | 23 + .../seaofnodes/simple/node/cpus/arm/AddIARM.java | 28 + .../seaofnodes/simple/node/cpus/arm/AndARM.java | 22 + .../seaofnodes/simple/node/cpus/arm/AndIARM.java | 25 + .../seaofnodes/simple/node/cpus/arm/AsrARM.java | 19 + .../seaofnodes/simple/node/cpus/arm/AsrIARM.java | 32 + .../seaofnodes/simple/node/cpus/arm/BranchARM.java | 78 + .../seaofnodes/simple/node/cpus/arm/CallARM.java | 51 + .../seaofnodes/simple/node/cpus/arm/CallRRARM.java | 33 + .../seaofnodes/simple/node/cpus/arm/CmpARM.java | 23 + .../seaofnodes/simple/node/cpus/arm/CmpFARM.java | 22 + .../seaofnodes/simple/node/cpus/arm/CmpIARM.java | 41 + .../seaofnodes/simple/node/cpus/arm/DivARM.java | 20 + .../seaofnodes/simple/node/cpus/arm/DivFARM.java | 20 + .../seaofnodes/simple/node/cpus/arm/ExtendARM.java | 31 + .../seaofnodes/simple/node/cpus/arm/F8ToIARM.java | 21 + .../seaofnodes/simple/node/cpus/arm/FloatARM.java | 44 + .../seaofnodes/simple/node/cpus/arm/FunARM.java | 22 + .../seaofnodes/simple/node/cpus/arm/I2F8ARM.java | 26 + .../seaofnodes/simple/node/cpus/arm/IntARM.java | 36 + .../seaofnodes/simple/node/cpus/arm/LoadARM.java | 34 + .../seaofnodes/simple/node/cpus/arm/LslARM.java | 20 + .../seaofnodes/simple/node/cpus/arm/LslIARM.java | 34 + .../seaofnodes/simple/node/cpus/arm/LsrARM.java | 20 + .../seaofnodes/simple/node/cpus/arm/LsrIARM.java | 29 + .../seaofnodes/simple/node/cpus/arm/MemOpARM.java | 79 + .../seaofnodes/simple/node/cpus/arm/MulARM.java | 20 + .../seaofnodes/simple/node/cpus/arm/MulFARM.java | 19 + .../seaofnodes/simple/node/cpus/arm/NegARM.java | 25 + .../seaofnodes/simple/node/cpus/arm/NewARM.java | 38 + .../seaofnodes/simple/node/cpus/arm/NotARM.java | 28 + .../com/seaofnodes/simple/node/cpus/arm/OrARM.java | 21 + .../seaofnodes/simple/node/cpus/arm/OrIARM.java | 25 + .../seaofnodes/simple/node/cpus/arm/ParmARM.java | 17 + .../seaofnodes/simple/node/cpus/arm/ProjARM.java | 15 + .../seaofnodes/simple/node/cpus/arm/RetARM.java | 16 + .../seaofnodes/simple/node/cpus/arm/SetARM.java | 34 + .../seaofnodes/simple/node/cpus/arm/SplitARM.java | 66 + .../simple/node/cpus/arm/SplitFlagsARM.java | 21 + .../simple/node/cpus/arm/SplitGPRARM.java | 11 + .../seaofnodes/simple/node/cpus/arm/StoreARM.java | 38 + .../seaofnodes/simple/node/cpus/arm/SubARM.java | 20 + .../seaofnodes/simple/node/cpus/arm/SubFARM.java | 19 + .../seaofnodes/simple/node/cpus/arm/SubIARM.java | 29 + .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 58 + .../seaofnodes/simple/node/cpus/arm/TMPARM.java | 55 + .../seaofnodes/simple/node/cpus/arm/UJmpARM.java | 48 + .../seaofnodes/simple/node/cpus/arm/XorARM.java | 20 + .../seaofnodes/simple/node/cpus/arm/XorIARM.java | 27 + .../com/seaofnodes/simple/node/cpus/arm/arm.java | 466 +++++ .../seaofnodes/simple/node/cpus/riscv/AUIPC.java | 43 + .../simple/node/cpus/riscv/AddFRISC.java | 18 + .../simple/node/cpus/riscv/AddIRISC.java | 22 + .../seaofnodes/simple/node/cpus/riscv/AddRISC.java | 21 + .../simple/node/cpus/riscv/AndIRISC.java | 13 + .../seaofnodes/simple/node/cpus/riscv/AndRISC.java | 16 + .../simple/node/cpus/riscv/BranchRISC.java | 95 + .../simple/node/cpus/riscv/CallRISC.java | 63 + .../simple/node/cpus/riscv/CallRRISC.java | 32 + .../simple/node/cpus/riscv/DivFRISC.java | 20 + .../seaofnodes/simple/node/cpus/riscv/DivRISC.java | 17 + .../simple/node/cpus/riscv/ExtendRISC.java | 32 + .../simple/node/cpus/riscv/F8ToIRISC.java | 19 + .../seaofnodes/simple/node/cpus/riscv/FltRISC.java | 47 + .../seaofnodes/simple/node/cpus/riscv/FunRISC.java | 23 + .../simple/node/cpus/riscv/I2F8RISC.java | 24 + .../seaofnodes/simple/node/cpus/riscv/ImmRISC.java | 55 + .../simple/node/cpus/riscv/Int8RISC.java | 47 + .../seaofnodes/simple/node/cpus/riscv/IntRISC.java | 31 + .../com/seaofnodes/simple/node/cpus/riscv/LUI.java | 33 + .../simple/node/cpus/riscv/LoadRISC.java | 30 + .../simple/node/cpus/riscv/MemOpRISC.java | 80 + .../simple/node/cpus/riscv/MulFRISC.java | 18 + .../seaofnodes/simple/node/cpus/riscv/MulRISC.java | 17 + .../seaofnodes/simple/node/cpus/riscv/NegRISC.java | 21 + .../seaofnodes/simple/node/cpus/riscv/NewRISC.java | 48 + .../seaofnodes/simple/node/cpus/riscv/NotRISC.java | 22 + .../seaofnodes/simple/node/cpus/riscv/OrIRISC.java | 13 + .../seaofnodes/simple/node/cpus/riscv/OrRISC.java | 16 + .../simple/node/cpus/riscv/ParmRISC.java | 17 + .../simple/node/cpus/riscv/ProjRISC.java | 15 + .../seaofnodes/simple/node/cpus/riscv/RetRISC.java | 22 + .../simple/node/cpus/riscv/SetFRISC.java | 34 + .../simple/node/cpus/riscv/SetIRISC.java | 21 + .../seaofnodes/simple/node/cpus/riscv/SetRISC.java | 20 + .../simple/node/cpus/riscv/SllIRISC.java | 13 + .../seaofnodes/simple/node/cpus/riscv/SllRISC.java | 17 + .../simple/node/cpus/riscv/SplitRISC.java | 67 + .../simple/node/cpus/riscv/SraIRISC.java | 15 + .../seaofnodes/simple/node/cpus/riscv/SraRISC.java | 17 + .../simple/node/cpus/riscv/SrlIRISC.java | 13 + .../seaofnodes/simple/node/cpus/riscv/SrlRISC.java | 17 + .../simple/node/cpus/riscv/StoreRISC.java | 50 + .../simple/node/cpus/riscv/SubFRISC.java | 18 + .../seaofnodes/simple/node/cpus/riscv/SubRISC.java | 16 + .../seaofnodes/simple/node/cpus/riscv/TFPRISC.java | 49 + .../seaofnodes/simple/node/cpus/riscv/TMPRISC.java | 42 + .../simple/node/cpus/riscv/UJmpRISC.java | 49 + .../simple/node/cpus/riscv/XorIRISC.java | 14 + .../seaofnodes/simple/node/cpus/riscv/XorRISC.java | 16 + .../seaofnodes/simple/node/cpus/riscv/riscv.java | 428 ++++ .../simple/node/cpus/x86_64_v2/AddFMemX86.java | 33 + .../simple/node/cpus/x86_64_v2/AddFX86.java | 24 + .../simple/node/cpus/x86_64_v2/AddIX86.java | 23 + .../simple/node/cpus/x86_64_v2/AddMemX86.java | 24 + .../simple/node/cpus/x86_64_v2/AddX86.java | 11 + .../simple/node/cpus/x86_64_v2/AndIX86.java | 11 + .../simple/node/cpus/x86_64_v2/AndX86.java | 11 + .../simple/node/cpus/x86_64_v2/CallRX86.java | 30 + .../simple/node/cpus/x86_64_v2/CallX86.java | 49 + .../simple/node/cpus/x86_64_v2/CmpFX86.java | 24 + .../simple/node/cpus/x86_64_v2/CmpIX86.java | 38 + .../simple/node/cpus/x86_64_v2/CmpMemX86.java | 44 + .../simple/node/cpus/x86_64_v2/CmpX86.java | 28 + .../simple/node/cpus/x86_64_v2/DivFX86.java | 24 + .../simple/node/cpus/x86_64_v2/DivX86.java | 25 + .../simple/node/cpus/x86_64_v2/ExtendX86.java | 29 + .../simple/node/cpus/x86_64_v2/F8ToIX86.java | 22 + .../simple/node/cpus/x86_64_v2/FltX86.java | 36 + .../simple/node/cpus/x86_64_v2/FunX86.java | 31 + .../simple/node/cpus/x86_64_v2/I2f8X86.java | 21 + .../simple/node/cpus/x86_64_v2/ImmX86.java | 32 + .../simple/node/cpus/x86_64_v2/IntX86.java | 40 + .../simple/node/cpus/x86_64_v2/JmpX86.java | 65 + .../simple/node/cpus/x86_64_v2/LeaX86.java | 38 + .../simple/node/cpus/x86_64_v2/LoadX86.java | 44 + .../simple/node/cpus/x86_64_v2/MemAddX86.java | 28 + .../simple/node/cpus/x86_64_v2/MemOpX86.java | 89 + .../simple/node/cpus/x86_64_v2/MulFX86.java | 24 + .../simple/node/cpus/x86_64_v2/MulIX86.java | 27 + .../simple/node/cpus/x86_64_v2/MulX86.java | 24 + .../simple/node/cpus/x86_64_v2/NegX86.java | 20 + .../simple/node/cpus/x86_64_v2/NewX86.java | 23 + .../simple/node/cpus/x86_64_v2/NotX86.java | 21 + .../simple/node/cpus/x86_64_v2/OrIX86.java | 11 + .../simple/node/cpus/x86_64_v2/OrX86.java | 11 + .../simple/node/cpus/x86_64_v2/ParmX86.java | 17 + .../simple/node/cpus/x86_64_v2/ProjX86.java | 15 + .../simple/node/cpus/x86_64_v2/RegX86.java | 22 + .../simple/node/cpus/x86_64_v2/RetX86.java | 15 + .../simple/node/cpus/x86_64_v2/SarIX86.java | 32 + .../simple/node/cpus/x86_64_v2/SarX86.java | 21 + .../simple/node/cpus/x86_64_v2/SetX86.java | 44 + .../simple/node/cpus/x86_64_v2/ShlIX86.java | 32 + .../simple/node/cpus/x86_64_v2/ShlX86.java | 21 + .../simple/node/cpus/x86_64_v2/ShrIX86.java | 27 + .../simple/node/cpus/x86_64_v2/ShrX86.java | 21 + .../simple/node/cpus/x86_64_v2/SplitFlagsX86.java | 25 + .../simple/node/cpus/x86_64_v2/SplitX86.java | 52 + .../simple/node/cpus/x86_64_v2/StoreX86.java | 48 + .../simple/node/cpus/x86_64_v2/SubFX86.java | 23 + .../simple/node/cpus/x86_64_v2/SubX86.java | 10 + .../simple/node/cpus/x86_64_v2/TFPX86.java | 53 + .../simple/node/cpus/x86_64_v2/TMPX86.java | 40 + .../simple/node/cpus/x86_64_v2/UJmpX86.java | 41 + .../simple/node/cpus/x86_64_v2/XorIX86.java | 11 + .../simple/node/cpus/x86_64_v2/XorX86.java | 11 + .../simple/node/cpus/x86_64_v2/x86_64_v2.java | 564 +++++ .../com/seaofnodes/simple/print/ASMPrinter.java | 85 + .../com/seaofnodes/simple/print/IRPrinter.java | 61 + .../simple/print/SimpleGraphAdapter.java | 57 + .../simple/print/SimpleGraphObserver.java | 35 + .../src/main/java/com/seaofnodes/simple/sys.java | 25 + .../java/com/seaofnodes/simple/type/Field.java | 136 ++ .../main/java/com/seaofnodes/simple/type/Type.java | 543 +++++ .../com/seaofnodes/simple/type/TypeConAry.java | 79 + .../com/seaofnodes/simple/type/TypeConAryB.java | 20 + .../com/seaofnodes/simple/type/TypeConAryI.java | 16 + .../java/com/seaofnodes/simple/type/TypeFloat.java | 110 + .../com/seaofnodes/simple/type/TypeFunPtr.java | 280 +++ .../com/seaofnodes/simple/type/TypeInteger.java | 183 ++ .../java/com/seaofnodes/simple/type/TypeMem.java | 117 ++ .../com/seaofnodes/simple/type/TypeMemPtr.java | 181 ++ .../java/com/seaofnodes/simple/type/TypeNil.java | 62 + .../java/com/seaofnodes/simple/type/TypePtr.java | 55 + .../java/com/seaofnodes/simple/type/TypeRPC.java | 111 + .../com/seaofnodes/simple/type/TypeScalar.java | 31 + .../com/seaofnodes/simple/type/TypeStruct.java | 514 +++++ .../java/com/seaofnodes/simple/type/TypeTuple.java | 134 ++ .../main/java/com/seaofnodes/simple/util/Ary.java | 229 ++ .../java/com/seaofnodes/simple/util/AryInt.java | 192 ++ .../main/java/com/seaofnodes/simple/util/SB.java | 99 + .../java/com/seaofnodes/simple/util/Utils.java | 53 + chapter-incomplete-types/src/main/smp/sys.smp | 199 ++ .../java/com/seaofnodes/simple/BrainFuckTest.java | 89 + .../java/com/seaofnodes/simple/Chapter01Test.java | 95 + .../java/com/seaofnodes/simple/Chapter02Test.java | 61 + .../java/com/seaofnodes/simple/Chapter03Test.java | 66 + .../java/com/seaofnodes/simple/Chapter04Test.java | 159 ++ .../java/com/seaofnodes/simple/Chapter05Test.java | 201 ++ .../java/com/seaofnodes/simple/Chapter06Test.java | 305 +++ .../java/com/seaofnodes/simple/Chapter07Test.java | 222 ++ .../java/com/seaofnodes/simple/Chapter08Test.java | 208 ++ .../java/com/seaofnodes/simple/Chapter09Test.java | 299 +++ .../java/com/seaofnodes/simple/Chapter10Test.java | 609 ++++++ .../java/com/seaofnodes/simple/Chapter11Test.java | 61 + .../java/com/seaofnodes/simple/Chapter12Test.java | 289 +++ .../java/com/seaofnodes/simple/Chapter13Test.java | 266 +++ .../com/seaofnodes/simple/Chapter14FloatTest.java | 103 + .../java/com/seaofnodes/simple/Chapter14Test.java | 228 ++ .../java/com/seaofnodes/simple/Chapter15Test.java | 417 ++++ .../java/com/seaofnodes/simple/Chapter16Test.java | 172 ++ .../java/com/seaofnodes/simple/Chapter17aTest.java | 106 + .../java/com/seaofnodes/simple/Chapter17bTest.java | 583 ++++++ .../java/com/seaofnodes/simple/Chapter18Test.java | 544 +++++ .../java/com/seaofnodes/simple/Chapter19Test.java | 507 +++++ .../java/com/seaofnodes/simple/Chapter20Test.java | 430 ++++ .../com/seaofnodes/simple/Chapter21AllocTest.java | 55 + .../java/com/seaofnodes/simple/Chapter21Test.java | 735 +++++++ .../java/com/seaofnodes/simple/Chapter22Test.java | 432 ++++ .../com/seaofnodes/simple/Chapter23AllocTest.java | 37 + .../java/com/seaofnodes/simple/Chapter23Test.java | 422 ++++ .../com/seaofnodes/simple/Chapter24AllocTest.java | 170 ++ .../java/com/seaofnodes/simple/Chapter24Test.java | 735 +++++++ .../test/java/com/seaofnodes/simple/Compile.java | 65 + .../seaofnodes/simple/CompoundAssignmentTest.java | 94 + .../src/test/java/com/seaofnodes/simple/Eval2.java | 490 +++++ .../java/com/seaofnodes/simple/FuzzerWrap.java | 58 + .../com/seaofnodes/simple/IncompleteTypesTest.java | 35 + .../java/com/seaofnodes/simple/LiteralTest.java | 65 + .../src/test/java/com/seaofnodes/simple/Main.java | 18 + .../com/seaofnodes/simple/MemoryEncodingTest.java | 181 ++ .../java/com/seaofnodes/simple/MergeSortTest.java | 85 + .../java/com/seaofnodes/simple/MutabilityTest.java | 73 + .../com/seaofnodes/simple/NativeAddressTest.java | 54 + .../test/java/com/seaofnodes/simple/PhaseTest.java | 56 + .../test/java/com/seaofnodes/simple/SccpTest.java | 27 + .../java/com/seaofnodes/simple/SchedulerTest.java | 94 + .../test/java/com/seaofnodes/simple/Simple.java | 217 ++ .../java/com/seaofnodes/simple/SpillStats.java | 73 + .../test/java/com/seaofnodes/simple/TestArm64.java | 51 + .../src/test/java/com/seaofnodes/simple/TestC.java | 137 ++ .../test/java/com/seaofnodes/simple/TestRisc5.java | 57 + .../test/java/com/seaofnodes/simple/TypeTest.java | 235 +++ .../simple/codegen/FlagSpillTestSupport.java | 145 ++ .../simple/codegen/PrintRegTestSupport.java | 26 + .../simple/codegen/RegAllocTestSupport.java | 346 +++ .../seaofnodes/simple/codegen/X86EncodingTest.java | 123 ++ .../com/seaofnodes/simple/evaluator/Evaluator.java | 380 ++++ .../com/seaofnodes/simple/evaluator/Scheduler.java | 605 ++++++ .../java/com/seaofnodes/simple/fuzzer/Fuzzer.java | 188 ++ .../com/seaofnodes/simple/fuzzer/FuzzerUtils.java | 111 + .../java/com/seaofnodes/simple/fuzzer/Reducer.java | 177 ++ .../seaofnodes/simple/fuzzer/ScriptGenerator.java | 940 +++++++++ .../java/com/seaofnodes/simple/progs/arg_count.c | 10 + .../java/com/seaofnodes/simple/progs/arg_count.smp | 6 + .../java/com/seaofnodes/simple/progs/array1.smp | 9 + .../java/com/seaofnodes/simple/progs/brain_fuck.c | 18 + .../java/com/seaofnodes/simple/progs/c_returns.c | 28 + .../test/java/com/seaofnodes/simple/progs/fib.c | 16 + .../test/java/com/seaofnodes/simple/progs/funptr.c | 15 + .../test/java/com/seaofnodes/simple/progs/jig.smp | 16 + .../test/java/com/seaofnodes/simple/progs/loop2.c | 7 + .../java/com/seaofnodes/simple/progs/newtonFloat.c | 16 + .../com/seaofnodes/simple/progs/newtonFloat.smp | 12 + .../seaofnodes/simple/progs/no_stack_arg_count.smp | 6 + .../test/java/com/seaofnodes/simple/progs/person.c | 34 + .../java/com/seaofnodes/simple/progs/person21.c | 34 + .../java/com/seaofnodes/simple/progs/person21.smp | 9 + .../test/java/com/seaofnodes/simple/progs/sieve.c | 19 + .../test/java/com/seaofnodes/simple/progs/sort.c | 28 + .../com/seaofnodes/simple/progs/stacked_r_10x.c | 13 + .../com/seaofnodes/simple/progs/stacked_r_11x.c | 13 + .../com/seaofnodes/simple/progs/stacked_r_12x.c | 13 + .../com/seaofnodes/simple/progs/stacked_r_13x.c | 13 + .../com/seaofnodes/simple/progs/stacked_r_9x.c | 13 + .../java/com/seaofnodes/simple/progs/stringHash.c | 30 + .../com/seaofnodes/simple/progs/stringHash.smp | 30 + .../com/seaofnodes/simple/progs/stringHash21.smp | 31 + chapter-interprocedural-sccp/README.ja.md | 1 + chapter-interprocedural-sccp/README.md | 55 +- .../com/seaofnodes/simple/codegen/CodeGen.java | 6 + .../com/seaofnodes/simple/codegen/Encoding.java | 4 + .../com/seaofnodes/simple/node/ExternNode.java | 6 +- .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 5 +- .../com/seaofnodes/simple/NativeAddressTest.java | 54 + chapter-sccp/#README.md# | 338 --- chapter-sccp/.#README.md | 1 - chapter-sccp/README.md | 7 +- .../com/seaofnodes/simple/codegen/CodeGen.java | 6 + .../com/seaofnodes/simple/codegen/Encoding.java | 4 + .../com/seaofnodes/simple/node/ExternNode.java | 6 +- .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 5 +- .../com/seaofnodes/simple/NativeAddressTest.java | 54 + .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 5 +- .../com/seaofnodes/simple/codegen/CodeGen.java | 6 + .../com/seaofnodes/simple/codegen/Encoding.java | 4 + .../com/seaofnodes/simple/node/ExternNode.java | 6 +- .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 5 +- .../com/seaofnodes/simple/NativeAddressTest.java | 54 + .../com/seaofnodes/simple/codegen/CodeGen.java | 6 + .../com/seaofnodes/simple/codegen/Encoding.java | 4 + .../com/seaofnodes/simple/node/ExternNode.java | 6 +- .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 5 +- .../com/seaofnodes/simple/NativeAddressTest.java | 54 + .../com/seaofnodes/simple/codegen/CodeGen.java | 6 + .../com/seaofnodes/simple/codegen/Encoding.java | 4 + .../com/seaofnodes/simple/node/ExternNode.java | 6 +- .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 5 +- .../com/seaofnodes/simple/NativeAddressTest.java | 54 + docs/chapter-backports.md | 13 +- docs/chapter-split.md | 5 +- pom.xml | 1 + skills/chapter25-codex-notes.md | 15 +- 422 files changed, 40120 insertions(+), 393 deletions(-) create mode 100644 chapter-incomplete-types/Makefile create mode 100644 chapter-incomplete-types/README.ja.md create mode 100644 chapter-incomplete-types/README.md create mode 100644 chapter-incomplete-types/docs/24-grammar.ja.md create mode 100644 chapter-incomplete-types/docs/24-grammar.md create mode 100644 chapter-incomplete-types/docs/Makefile create mode 100644 chapter-incomplete-types/docs/examples/A_helloWorld.smp create mode 100644 chapter-incomplete-types/docs/examples/BubbleSort.smp create mode 100644 chapter-incomplete-types/docs/font-awesome-4.7.0.zip create mode 100644 chapter-incomplete-types/docs/ifg_trim.pdf create mode 100644 chapter-incomplete-types/docs/lattice.gv create mode 100644 chapter-incomplete-types/docs/lattice.svg create mode 100644 chapter-incomplete-types/docs/lattice2.gv create mode 100644 chapter-incomplete-types/docs/lattice2.svg create mode 100644 chapter-incomplete-types/docs/pardoe.docx create mode 100644 chapter-incomplete-types/docs/webtcp.min.js create mode 100644 chapter-incomplete-types/pom.xml create mode 100644 chapter-incomplete-types/simple.bat create mode 100644 chapter-incomplete-types/simple.sh create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/IterPeeps.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/Parser.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/Var.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/BuildLRG.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/Coalesce.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/ElfExpr.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/ElfFile.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/Encoding.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/FinalizeIR.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/IFG.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/InstSelect.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/LRG.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/LinkMem.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/ListScheduler.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/Machine.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/Opto.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/RIPRelSize.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/RegAlloc.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/RegMask.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/RegMaskRW.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/AddFNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/AddNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/AndNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ArithFNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ArithNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/BoolNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/BulkMemPhiNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CFGNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CProjNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CallEndMach.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CallEndNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CallNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CalleeSaveNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CastMach.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CastNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ConFldOffNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ConstantNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ConvertNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/CtrlNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/DivFNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/DivNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ExternNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/FRefNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/FldOffNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/FunNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/FunPtrNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/GuardMach.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/GuardNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/IfNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/LoadNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/LoopNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MachConcreteNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MachNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MemOpNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MemPhiNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MinusFNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MinusNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ModeNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MulFNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MulNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/MultiNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/NeverNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/NewNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/Node.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/NotNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/OrNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ParmNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/PhiNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ProjNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/PtrToIntMach.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/PtrToIntNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ReadOnlyMach.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ReadOnlyNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/RegionNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ReturnNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/RoundF32Node.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/SarNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ScopeNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ShlNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ShrNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/SplitNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/StartNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/StopNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/StoreNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/StructNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/SubFNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/SubNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ToFloatNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/ToIntegerNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/XCtrlNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/XorNode.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/AddARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/AddFARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/AddIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/AndARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/AndIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/AsrARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/AsrIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/BranchARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/CallRRARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/CmpARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/CmpFARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/CmpIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/DivARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/DivFARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/ExtendARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/F8ToIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/FloatARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/FunARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/I2F8ARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/IntARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/LoadARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/LslARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/LslIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/LsrARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/LsrIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/MemOpARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/MulARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/MulFARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/NegARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/NewARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/NotARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/OrIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/ParmARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/ProjARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/RetARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/SetARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/SplitARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/SplitFlagsARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/SplitGPRARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/StoreARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/SubARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/SubFARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/SubIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/TMPARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/UJmpARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/XorARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/XorIARM.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/arm/arm.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AUIPC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddFRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AddRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/AndRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/BranchRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/CallRRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivFRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/DivRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ExtendRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/F8ToIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/FltRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/FunRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/I2F8RISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ImmRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/Int8RISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/IntRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/LUI.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/LoadRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MemOpRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulFRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/MulRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NegRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NewRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/NotRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/OrRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ParmRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/ProjRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/RetRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetFRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SetRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SllRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SplitRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SraRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SrlRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/StoreRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubFRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/SubRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/TFPRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/TMPRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/UJmpRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorIRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/XorRISC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/riscv/riscv.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFMemX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddFX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddMemX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AddX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/AndX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallRX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CallX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpFX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpMemX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/CmpX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivFX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/DivX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ExtendX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/F8ToIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FltX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/FunX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/I2f8X86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ImmX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/IntX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/JmpX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LeaX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/LoadX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemAddX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MemOpX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulFX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/MulX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NegX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NewX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/NotX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/OrX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ParmX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ProjX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RegX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/RetX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SarX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SetX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShlX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/ShrX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitFlagsX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SplitX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/StoreX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubFX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/SubX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/TFPX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/TMPX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/UJmpX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/XorIX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/XorX86.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/node/cpus/x86_64_v2/x86_64_v2.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/print/IRPrinter.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/sys.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/Field.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/Type.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeConAry.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeConAryB.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeConAryI.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeFloat.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeInteger.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeMem.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeNil.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypePtr.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeRPC.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeScalar.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeStruct.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/type/TypeTuple.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/util/Ary.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/util/AryInt.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/util/SB.java create mode 100644 chapter-incomplete-types/src/main/java/com/seaofnodes/simple/util/Utils.java create mode 100644 chapter-incomplete-types/src/main/smp/sys.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/BrainFuckTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter01Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter02Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter03Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter04Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter05Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter06Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter07Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter08Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter09Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter10Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter11Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter12Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter13Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter14FloatTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter14Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter15Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter16Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter17aTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter17bTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter18Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter19Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter20Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter21AllocTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter21Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter22Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter23AllocTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter23Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter24AllocTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Chapter24Test.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Compile.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/CompoundAssignmentTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Eval2.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/FuzzerWrap.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/IncompleteTypesTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/LiteralTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Main.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/MemoryEncodingTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/MergeSortTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/MutabilityTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/NativeAddressTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/PhaseTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/SccpTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/SchedulerTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/Simple.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/SpillStats.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/TestArm64.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/TestC.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/TestRisc5.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/TypeTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/codegen/FlagSpillTestSupport.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/codegen/PrintRegTestSupport.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/codegen/RegAllocTestSupport.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/codegen/X86EncodingTest.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/evaluator/Scheduler.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/fuzzer/FuzzerUtils.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/fuzzer/Reducer.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/arg_count.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/arg_count.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/array1.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/brain_fuck.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/c_returns.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/fib.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/funptr.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/jig.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/loop2.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/newtonFloat.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/newtonFloat.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/no_stack_arg_count.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/person.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/person21.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/person21.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/sieve.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/sort.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stacked_r_10x.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stacked_r_11x.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stacked_r_12x.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stacked_r_13x.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stacked_r_9x.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stringHash.c create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stringHash.smp create mode 100644 chapter-incomplete-types/src/test/java/com/seaofnodes/simple/progs/stringHash21.smp create mode 100644 chapter-interprocedural-sccp/src/test/java/com/seaofnodes/simple/NativeAddressTest.java delete mode 100644 chapter-sccp/#README.md# delete mode 100644 chapter-sccp/.#README.md create mode 100644 chapter-sccp/src/test/java/com/seaofnodes/simple/NativeAddressTest.java create mode 100644 chapter22/src/test/java/com/seaofnodes/simple/NativeAddressTest.java create mode 100644 chapter23/src/test/java/com/seaofnodes/simple/NativeAddressTest.java create mode 100644 chapter24/src/test/java/com/seaofnodes/simple/NativeAddressTest.java diff --git a/Makefile b/Makefile index 23732dd4..4656b243 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ .DEFAULT_GOAL := tests # Named snapshots follow teaching order, not alphabetical order. Numbered # chapters remain comparison baselines while the split is being extracted. -NAMED_CHAPTERS := chapter-sccp chapter-interprocedural-sccp +NAMED_CHAPTERS := chapter-sccp chapter-interprocedural-sccp chapter-incomplete-types CHAPTERS ?= $(sort $(patsubst %/pom.xml,%,$(wildcard chapter[0-9][0-9]/pom.xml chapter[0-9][0-9][a-z]/pom.xml))) $(NAMED_CHAPTERS) ACTIONS := tests tags release lib CHAPTER_TARGETS := $(foreach action,$(ACTIONS),$(addsuffix /$(action),$(CHAPTERS))) diff --git a/README.ja.md b/README.ja.md index b450d769..06bf857c 100644 --- a/README.ja.md +++ b/README.ja.md @@ -69,6 +69,7 @@ Simple 言語のスタイルは、C または Java のサブセットに倣っ * [関数内の SCCP](chapter-sccp/README.ja.md) * [関数間の SCCP](chapter-interprocedural-sccp/README.ja.md) +* [型が確定する前の SSA 構築](chapter-incomplete-types/README.ja.md) ## 章をまたぐビルド diff --git a/README.md b/README.md index 4a218895..aafe3aca 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ baselines during extraction. The first named snapshots are: * [SCCP Within a Function](chapter-sccp/README.md) * [SCCP Across Functions](chapter-interprocedural-sccp/README.md) +* [SSA Before Types Are Known](chapter-incomplete-types/README.md) ## Building across chapters diff --git a/chapter-incomplete-types/Makefile b/chapter-incomplete-types/Makefile new file mode 100644 index 00000000..e02c8096 --- /dev/null +++ b/chapter-incomplete-types/Makefile @@ -0,0 +1,186 @@ +# +# Makefile expects to run at the project root, and not nested inside anywhere +# +# cd $DESK/Simple/chapterXX; make +# +# +# first time only - this is the only thing that hits the Interwebs +# +# make lib +# +# any time you want to nuke everything from space: +# +# make clean tags +# +# run the tests +# +# make tests + +####################################################### +# +# Boilerplate because make syntax isn't the best +# + +# Use bash for recipes +SHELL := /bin/bash + +# Remove target on error (no broken leftover files) +.DELETE_ON_ERROR: + +# Keep partial builds but not partial recipes; keeping them speeds up the next `make` +.NOTINTERMEDIATE: + +# for printing variable values +# usage: make print-VARIABLE +# > VARIABLE = value_of_variable +print-% : ; @echo $* = $($*) + +# literal space +space := $() $() + +# Decide OS-specific questions +# jar-file seperator +ifeq ($(OS),Windows_NT) + SEP = ; +else + SEP = : +endif +# Find a reasonable ctags. +CTAGS = $(shell which ctags) +# Hack for MacOS: /usr/bin/ctags is unfriendly, so look for ctags from brew +ifeq ($(UNAME),Darwin) + CTAGS = $(shell brew list ctags 2> /dev/null | grep bin/ctags) +endif + +# Fun Args to javac. Mostly limit to java8 source definitions, and fairly +# aggressive lint warnings. +JAVAC_ARGS = -g + +# Source code +SIMPLE := com/seaofnodes/simple +SRC := src/main/java +TST := src/test/java +CLZDIR:= build/classes +main_javas := $(wildcard $(SRC)/$(SIMPLE)/*java $(SRC)/$(SIMPLE)/*/*java $(SRC)/$(SIMPLE)/node/cpus/*/*java) +test_javas := $(wildcard $(TST)/$(SIMPLE)/*java $(TST)/$(SIMPLE)/*/*java) +main_classes := $(patsubst $(SRC)/%java,$(CLZDIR)/main/%class,$(main_javas)) +include $(firstword $(wildcard ../graph/graph.mk graph/graph.mk)) +include $(firstword $(wildcard ../print/print.mk print/print.mk)) +include $(firstword $(wildcard ../isa/isa.mk isa/isa.mk)) +test_classes := $(patsubst $(TST)/%java,$(CLZDIR)/test/%class,$(test_javas)) +test_cp := $(patsubst $(TST)/$(SIMPLE)/%.java,com.seaofnodes.simple.%,$(wildcard $(TST)/$(SIMPLE)/*Test.java)) com.seaofnodes.simple.codegen.X86EncodingTest +classes = $(main_classes) $(test_classes) +# All the libraries +libs = $(wildcard lib/*jar) +jars = $(subst $(space),$(SEP),$(libs)) + + +default_targets := $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag +# Optionally add ctags to the default target if a reasonable one was found. +ifneq ($(CTAGS),) +default_targets += tags +endif + +default: $(default_targets) + +####################################################### +# Compile the chapter and shared viewer sources together + +$(CLZDIR)/main/.mtag: $(main_javas) Makefile + @[ -d $(CLZDIR)/main ] || mkdir -p $(CLZDIR)/main + @# This crap is really just "javac", but with a beautiful error message. + @# The very very long list of java files is suppressed and counted. + @# The required output "Note: blah blah deprecated blah" is suppressed. + $(file >.argsM.txt,$(main_javas)) + @if [ ! -z "$(main_javas)" ] ; then \ + echo "compiling main because " $< " and " `wc -w < .argsM.txt` " more files" ; \ + if ! javac $(JAVAC_ARGS) -cp "$(CLZDIR)/main$(SEP)$(jars)" -sourcepath $(SRC) -d $(CLZDIR)/main $(main_javas) >& .out.txt ; then \ + cat .out.txt ; \ + exit 1; \ + fi ; \ + rm -rf .out.txt ; \ + fi + @touch $(CLZDIR)/main/.mtag + @rm -f .argsM.txt + +$(main_classes): $(CLZDIR)/main/.mtag + + + +####################################################### + +OODT := $(isa_test_javas) +$(CLZDIR)/test/.ttag: $(test_classes) $(test_javas) $(isa_test_javas) $(CLZDIR)/main/.mtag + @[ -d $(CLZDIR)/test ] || mkdir -p $(CLZDIR)/test + $(file >.argsT.txt,$(OODT)) + @if [ ! -z "$(OODT)" ] ; then \ + echo "compiling test because " $< " and " `wc -w < .argsT.txt` " more files" ; \ + if ! javac $(JAVAC_ARGS) -cp "$(CLZDIR)/test$(SEP)$(CLZDIR)/main$(SEP)$(jars)" -sourcepath $(TST) -d $(CLZDIR)/test $(OODT) >& .out.txt ; then \ + cat .out.txt ; \ + exit 1; \ + fi ; \ + rm -rf .out.txt ; \ + fi + @touch $(CLZDIR)/test/.ttag + @rm -f .argsT.txt + +# Collect just the out-of-date files +$(test_classes): $(CLZDIR)/test/%class: $(TST)/%java + $(eval OODT += $$<) + +####################################################### +# Base launch line for JVM tests +JVM=nice java -ea -cp "$(CLZDIR)/main${SEP}${jars}${SEP}$(CLZDIR)/test" + + +tests: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag + @echo "testing " $(test_cp) + @[ -d build/objs ] || mkdir -p build/objs + @$(JVM) org.junit.runner.JUnitCore $(test_cp) + @$(JVM) org.junit.runner.JUnitCore com.seaofnodes.simple.FuzzerWrap + +fuzzer: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag + @echo "fuzzing " $(test_cp) + @$(JVM) org.junit.runner.JUnitCore com.seaofnodes.simple.FuzzerWrap + +# Build a Simple jar +release: build/release/simple.jar + +# Build a Simple jar +build/release/simple.jar: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag + @echo "jarring " $@ " because " $? + @[ -d $(dir $@) ] || mkdir -p $(dir $@) + @jar cf build/release/simple.jar -C $(CLZDIR)/main . -C $(CLZDIR)/test . -C $(SRC)/$(SIMPLE) . -C $(TST)/$(SIMPLE) . + + +.PHONY: clean +clean: + rm -rf build + rm -f TAGS + (find . -name "*~" -exec rm {} \; 2>/dev/null; exit 0) + +# Download libs from maven +lib: lib/junit-4.12.jar lib/hamcrest-core-1.3.jar + +# Jars +lib/junit-4.12.jar: + @[ -d lib ] || mkdir -p lib + @(cd lib; wget https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar) + +lib/hamcrest-core-1.3.jar: + @[ -d lib ] || mkdir -p lib + @(cd lib; wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar) + +# Build emacs tags (part of a tasty emacs ide experience) +tags: $(main_javas) $(test_javas) + @rm -f TAGS + @$(CTAGS) -e --recurse=yes --extra=+q --fields=+fksaiS $(SRC) $(TST) + +spill-stats: $(CLZDIR)/main/.mtag $(CLZDIR)/test/.ttag + @[ -d build/objs ] || mkdir -p build/objs + @$(JVM) com.seaofnodes.simple.SpillStats + +.PHONY: spill-stats + +.PHONY: build +build: $(CLZDIR)/main/.mtag diff --git a/chapter-incomplete-types/README.ja.md b/chapter-incomplete-types/README.ja.md new file mode 100644 index 00000000..e6d6a559 --- /dev/null +++ b/chapter-incomplete-types/README.ja.md @@ -0,0 +1,17 @@ +# 型が確定する前の SSA 構築 + +[English](README.md) | 日本語 + +[前章: 関数間の SCCP](../chapter-interprocedural-sccp/README.ja.md) | +[章分割の計画](../docs/chapter-split.md) + +この章では、前方参照やループのために型がまだ分からない場合でも、演算と +フィールド参照をグラフに記録します。数値演算のモード、Convert、Guard、 +シンボルによるフィールド位置を使い、型と配置が確定した後に解決します。 +値の Phi と Load は、パーサが与える仮の型の下限を使いません。 + +コンストラクタは前章の方式を維持します。初期化用の呼び出し、非公開の +メモリ、オブジェクトの公開は次の章で扱います。詳しい説明と例は +[英語版](README.md)を参照してください。 + +このディレクトリで `make lib tests CTAGS=` を実行できます。 diff --git a/chapter-incomplete-types/README.md b/chapter-incomplete-types/README.md new file mode 100644 index 00000000..e68e8f3e --- /dev/null +++ b/chapter-incomplete-types/README.md @@ -0,0 +1,149 @@ +# SSA Before Types Are Known + +English | [日本語](README.ja.md) + +[Previous: SCCP Across Functions](../chapter-interprocedural-sccp/README.md) | + +The previous compiler solved for recursive types and calls, but its parser +still needs types to choose e.g. float-vs-integer arithmetic instructions or +field tyoes. Forward references, or external references or even simple loop +structures can hide whats needed. + +This chapter records the operations first and resolves their type-dependent +parts later. Scalar types, numeric modes, conversions, guards, symbolic +fields, and unbounded value Phis and Loads have to get typed *together*, as +they all have mutually interlocking type dependencies. + + +## A definition can follow its use + +```simple +val add = { Later p -> return p.x + 1; }; +struct Later { flt x; }; +return add(new Later { x = 2.5; }); +``` + +When parsing `p.x + 1`, the compiler knows the receiver's name (type `Later`), +but not its fields! It makes a Load with a symbolic field offset `FldOff` and +an `Add` whose numeric mode is still unset: might be an integer add or a +floatint point add. Later we parse `Later` which supplies the field and its +storage type. Type propagation then selects floating-point addition and +converts the integer `1` operand. The result is some floating point math +`2,5 + (flt)1` which folds to `3.5`. + +Forward writes work the same way. Until a field is known, its Store carries +whole memory - it aliases everything until we know what it aliases. Once +resolved, the Store converts its value to the declared field type and updates +that field's alias, which generally will result in a cascade of peepholes +sharpening the memory edges. The Store always keeps its control. Update +operators, e.g. ` x += y` work as syntax sugar over `x = x + y` (which might +need e.g. narrowing integer results when storing into a narrow `u8` field, or +not if storing into a `flt64` field). + +`FldOff` deserves more mention: it represents a named field reference (Load or +Store) to an unknown `TypeStruct`. In the above example, thats `p.x` : field +`x` from an unknown value of type `A{var x, ...}`. Since struct `A` can pick +up any more fields, and the field type itself is the unknown `var` type, +`FldOff` really knows very little about what's going on. Its more of a *shape* +placeholder, and awaits stronger types to peephole into a "real" field +reference. + + +## Values need their own bounds + +The parser always knows when it has *values* vs memory or control, but maybe +not whether something is an int or a flt until much later. Instead it uses +`TypeScalar` for such this. `TypeScalar` contains integers, floats, object +pointers, and function pointers. These are classic *values* in the sense that +they represent small concrete things that typically fit in a machine register. +Values exclude control and memory. Scalar bottom says that a value's family is +not known; its top represents an unreachable scalar result. A scalar union can +still be tested for truth, even when its alternatives use different families; +integers, floats, and pointers all carry a notion of zero. + +A scalar Phi now meets its live inputs, it no longer carries a parser-supplied +lower bound. An unfinished loop Phi starts at scalar bottom because its +backedge is missing. Parameters retain their declared interface types, and +memory Phis retain their memory role. Loop, parameter, and recursive-return +still do widening. + + +## Record conversions and branch facts + +The parser ends up inserting `Convert` nodes where it used to directly convert +values. This includes widening integers to match float operators, narrowing +when storing into narrow integer fields, or widening when loading from them. +A bad load or store still produces bottom. Type checking errors at conversions +simply "pass the buck" to their broken input. + +`Convert` records an known type destination, such as a local declaration or +function parameter. It waits for its input type to sharpen, and then peepholes +into a widening, truncation, permission check, or no operation. + +`Guard` records a branch fact: zero/null or nonzero/non-null. Its value family +comes from its input when known. The control edge keeps the fact on the path +where it was proved. A guard output is the same runtime value as its input; it +emits no instruction, just the sharpened type result. Guards are typically +used track not-null pointer tests across large areas. + +Arithmetic nodes carry a `mode`: a 3-state enum tracking an unset, integer, or +floating-point mode. Known inputs can settle it during peepholes. SCCP +resolves remaining recursive numeric components, then propagates the result +again. Once the mode is known, the machine instruction selection sections will +pick the correct machine ops. + + +## Complete declarations, then update the graph + +```simple +val foo = { A a -> a.b; }; +struct A { B b; }; +``` + +In this code, when parsing `foo` we do not know what `a` nor `a.b` will be, +other than there is a `b` field load on `a`, so `a` is a `TypeStruct` of `A`. +Forward shapes (`A`) remain *open* until their declaration, as in prior +chapters. When parsing `struct A` we find `B`, but `B` here is never declared... and +does not need to be. + +After parsing, the compiler *closes* all declarations as a group, including +types cycles (such as a `struct LinkedList` having a `next` field typed as a +`LinkedList`), and through function signatures. It then replaces old types +shapes in cached node types and stored declarations, (preserving pointer +permissions and nullability). This gives us a simple, clean *complete* version +of all mentioned types, no partially-made types from early in the parse remain. + +We do not know if the program will type-check yet, but at least we know what +the types *are*. + +At this point `FldOff` can being to peephole into a `ConFldOff` - moving +from a purely symbol field reference of an unknown type to a concrete +field of a known type. Later, after structures get a *layout*, `ConFldOff` +will become a concrete field offset, a number like `4` or `8`. + + +## The construction boundary + +This snapshot keeps the preceding chapter's constructor model: collect field +values in the constructor scope, check completion, then allocate and initialize. +An unknown expression type is no longer evidence of an unwritten field, so the +completion check follows explicit missing-initialization values through merges. + +Allocation helpers, hidden initializer calls, private self-memory, and explicit +publication belong to the next chapter. Escape discovery, source modules, lazy +class initialization, and serialized ideal IR follow later. These changes use +the existing conservative policy for functions exposed to unknown callers. +Method binding retains the preceding parser's requirement that the owner's +field declaration be known. Forward data fields are resolved here; moving +method and initializer bodies out of that parser scope is construction work. + +## Building and checking + +Run `make lib tests CTAGS=` here, or from the repository root run +`make tests CHAPTERS=chapter-incomplete-types CTAGS=`. + +`IncompleteTypesTest` exercises a forward field with deferred numeric mode and +a forward store whose byte width must be resolved. The inherited suite covers +recursive objects, null guards, initialization errors, loops, all three code +generators, and native calls. Earlier parse-only graph expectations now show +conversions that disappear after type propagation. diff --git a/chapter-incomplete-types/docs/24-grammar.ja.md b/chapter-incomplete-types/docs/24-grammar.ja.md new file mode 100644 index 00000000..fd3fa232 --- /dev/null +++ b/chapter-incomplete-types/docs/24-grammar.ja.md @@ -0,0 +1,168 @@ +# 第24章の文法 + +[English](24-grammar.md) | 日本語 + +```antlrv4 +grammar SimpleLanguage; + +// Name lookup, assignable operands, type compatibility, and access permissions +// are checked by the compiler in addition to these syntax rules. +program : statement* EOF ; + +block : '{' statement* '}' ; + +statement + : block + | returnStatement + | ifStatement + | whileStatement + | forStatement + | breakStatement + | continueStatement + | structDeclaration + | declaration ';' + | assignment ';' + | ';' + ; + +returnStatement : 'return' assignment ';' ; +ifStatement : 'if' '(' assignment ')' statement ('else' statement)? ; +whileStatement : 'while' '(' assignment ')' statement ; +breakStatement : 'break' ';' ; +continueStatement : 'continue' ';' ; + +forStatement + : 'for' '(' (declaration | assignment)? ';' assignment? ';' assignment? ')' statement + ; + +structDeclaration : 'struct' IDENTIFIER '{' structMember* '}' ';' ; +structMember : methodDeclaration | statement ; + +// A method is an ordinary fixed function binding in a struct definition. +// The compiler supplies self; it is not written in parameterList. +// The general declaration rule also admits explicitly typed function fields. +methodDeclaration : 'val' bindingModifier? IDENTIFIER '=' functionExpression ';' ; + +declaration : declarationType binding (',' binding)* ; +declarationType : type | 'var' | 'val' ; +binding : bindingModifier? IDENTIFIER ('=' initializer)? ; +bindingModifier : '!' | '~' ; +// A declaration initializer consisting of the string "C" declares an extern +// symbol. Ordinary strings elsewhere are array-valued expressions. +initializer : assignment ; + +// The prefix qualifies the named struct reference, not an enclosing array. +// Each [] / [~] suffix qualifies its own array layer. ? requires a reference. +type + : functionType + | primitiveType typeSuffix* + | accessModifier? typeName typeSuffix* + ; +accessModifier : '!' | '~' ; +typeSuffix : '?' | '[]' | '[~]' ; +typeName : IDENTIFIER ('.' IDENTIFIER)* ; + +primitiveType + : 'int' | 'i8' | 'i16' | 'i32' | 'i64' + | 'u1' | 'u8' | 'u16' | 'u32' | 'byte' | 'bool' + | 'flt' | 'f32' | 'f64' + ; + +assignment : expression (assignmentOperator assignment)? ; +assignmentOperator + : '=' | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '^=' + | '<<=' | '>>=' | '>>>=' + ; + +expression : logicalExpression ('?' assignment (':' assignment)?)? ; + +// Both logical operators short-circuit and associate to the right here. +logicalExpression : bitwiseExpression (('&&' | '||') logicalExpression)? ; + +bitwiseExpression + : equalityExpression (('&' | '|' | '^') equalityExpression)* + ; + +equalityExpression : comparisonExpression (('==' | '!=') comparisonExpression)* ; + +// Chained comparisons test adjacent operands and short-circuit. A chain must +// keep its direction; equality has lower precedence and does not join a chain. +comparisonExpression + : shiftExpression + ( (('<' | '<=') shiftExpression)+ | (('>' | '>=') shiftExpression)+ )? + ; + +shiftExpression + : additiveExpression (('<<' | '>>' | '>>>') additiveExpression)* + ; + +additiveExpression + : multiplicativeExpression (('+' | '-') multiplicativeExpression)* + ; + +multiplicativeExpression + : unaryExpression (('*' | '/') unaryExpression)* + ; + +unaryExpression + : ('-' | '!') unaryExpression + | updateOperator IDENTIFIER + | postfixExpression + ; + +// Prefix updates require a local name; postfix updates also allow fields +// and array elements. All updates require an assignable operand. +updateOperator : '++' | '--' ; +postfixExpression : primaryExpression postfixSuffix* updateOperator? ; +postfixSuffix : '.' IDENTIFIER | '[' assignment ']' | '#' | callSuffix | methodCallSuffix ; + +// For a fixed function-valued member, object.name(args) passes object as self. +// This overlaps ordinary field selection followed by a call syntactically; +// name/type resolution determines which call form applies. +methodCallSuffix : '.' IDENTIFIER callSuffix ; + +primaryExpression + : INTEGER_LITERAL + | FLOAT_LITERAL + | STRING_LITERAL + | CHARACTER_LITERAL + | 'true' + | 'false' + | 'null' + | IDENTIFIER + | '(' assignment ')' + | newExpression + | functionExpression + ; + +// A function is an expression bound with an ordinary declaration. +// Its last statement supplies the implicit result; return can exit earlier. +functionExpression : '{' parameterList? '->' statement* '}' ; +parameterList : (parameter ','?)+ ; +parameter : type bindingModifier? IDENTIFIER ; + +// Function types have unnamed, space-separated argument types. +// {int} is the zero-argument type; its function expression still uses ->. +functionType + : '{' type+ '->' type '}' '?'? + | '{' type '}' '?'? + ; + +callSuffix : '(' argumentList? ')' ; +argumentList : assignment (',' assignment)* ','? ; + +// Struct initialization uses a block; array allocation supplies a length. +newExpression : 'new' type ('[' assignment ']' | block)? ; + +INTEGER_LITERAL : '0' | [1-9] DIGIT* ; +FLOAT_LITERAL : DIGIT+ ('.' DIGIT* ('e' DIGIT+)? | 'e' '-'? DIGIT+) ; +STRING_LITERAL : '"' (ESCAPE | ~["\\])* '"' ; +CHARACTER_LITERAL : '\'' (ESCAPE | ~['\\]) '\'' ; +fragment ESCAPE : '\\' [0ntr\\'"] ; +IDENTIFIER : NON_DIGIT (NON_DIGIT | DIGIT)* ; +fragment NON_DIGIT : [a-zA-Z_] ; +fragment DIGIT : [0-9] ; +WHITESPACE : [ \t\r\n]+ -> skip ; +LINE_COMMENT : '//' ~[\r\n]* -> skip ; +BLOCK_COMMENT : '/*' .*? '*/' -> skip ; +``` diff --git a/chapter-incomplete-types/docs/24-grammar.md b/chapter-incomplete-types/docs/24-grammar.md new file mode 100644 index 00000000..22867355 --- /dev/null +++ b/chapter-incomplete-types/docs/24-grammar.md @@ -0,0 +1,168 @@ +# Grammar for Chapter 24 + +English | [日本語](24-grammar.ja.md) + +```antlrv4 +grammar SimpleLanguage; + +// Name lookup, assignable operands, type compatibility, and access permissions +// are checked by the compiler in addition to these syntax rules. +program : statement* EOF ; + +block : '{' statement* '}' ; + +statement + : block + | returnStatement + | ifStatement + | whileStatement + | forStatement + | breakStatement + | continueStatement + | structDeclaration + | declaration ';' + | assignment ';' + | ';' + ; + +returnStatement : 'return' assignment ';' ; +ifStatement : 'if' '(' assignment ')' statement ('else' statement)? ; +whileStatement : 'while' '(' assignment ')' statement ; +breakStatement : 'break' ';' ; +continueStatement : 'continue' ';' ; + +forStatement + : 'for' '(' (declaration | assignment)? ';' assignment? ';' assignment? ')' statement + ; + +structDeclaration : 'struct' IDENTIFIER '{' structMember* '}' ';' ; +structMember : methodDeclaration | statement ; + +// A method is an ordinary fixed function binding in a struct definition. +// The compiler supplies self; it is not written in parameterList. +// The general declaration rule also admits explicitly typed function fields. +methodDeclaration : 'val' bindingModifier? IDENTIFIER '=' functionExpression ';' ; + +declaration : declarationType binding (',' binding)* ; +declarationType : type | 'var' | 'val' ; +binding : bindingModifier? IDENTIFIER ('=' initializer)? ; +bindingModifier : '!' | '~' ; +// A declaration initializer consisting of the string "C" declares an extern +// symbol. Ordinary strings elsewhere are array-valued expressions. +initializer : assignment ; + +// The prefix qualifies the named struct reference, not an enclosing array. +// Each [] / [~] suffix qualifies its own array layer. ? requires a reference. +type + : functionType + | primitiveType typeSuffix* + | accessModifier? typeName typeSuffix* + ; +accessModifier : '!' | '~' ; +typeSuffix : '?' | '[]' | '[~]' ; +typeName : IDENTIFIER ('.' IDENTIFIER)* ; + +primitiveType + : 'int' | 'i8' | 'i16' | 'i32' | 'i64' + | 'u1' | 'u8' | 'u16' | 'u32' | 'byte' | 'bool' + | 'flt' | 'f32' | 'f64' + ; + +assignment : expression (assignmentOperator assignment)? ; +assignmentOperator + : '=' | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '^=' + | '<<=' | '>>=' | '>>>=' + ; + +expression : logicalExpression ('?' assignment (':' assignment)?)? ; + +// Both logical operators short-circuit and associate to the right here. +logicalExpression : bitwiseExpression (('&&' | '||') logicalExpression)? ; + +bitwiseExpression + : equalityExpression (('&' | '|' | '^') equalityExpression)* + ; + +equalityExpression : comparisonExpression (('==' | '!=') comparisonExpression)* ; + +// Chained comparisons test adjacent operands and short-circuit. A chain must +// keep its direction; equality has lower precedence and does not join a chain. +comparisonExpression + : shiftExpression + ( (('<' | '<=') shiftExpression)+ | (('>' | '>=') shiftExpression)+ )? + ; + +shiftExpression + : additiveExpression (('<<' | '>>' | '>>>') additiveExpression)* + ; + +additiveExpression + : multiplicativeExpression (('+' | '-') multiplicativeExpression)* + ; + +multiplicativeExpression + : unaryExpression (('*' | '/') unaryExpression)* + ; + +unaryExpression + : ('-' | '!') unaryExpression + | updateOperator IDENTIFIER + | postfixExpression + ; + +// Prefix updates require a local name; postfix updates also allow fields +// and array elements. All updates require an assignable operand. +updateOperator : '++' | '--' ; +postfixExpression : primaryExpression postfixSuffix* updateOperator? ; +postfixSuffix : '.' IDENTIFIER | '[' assignment ']' | '#' | callSuffix | methodCallSuffix ; + +// For a fixed function-valued member, object.name(args) passes object as self. +// This overlaps ordinary field selection followed by a call syntactically; +// name/type resolution determines which call form applies. +methodCallSuffix : '.' IDENTIFIER callSuffix ; + +primaryExpression + : INTEGER_LITERAL + | FLOAT_LITERAL + | STRING_LITERAL + | CHARACTER_LITERAL + | 'true' + | 'false' + | 'null' + | IDENTIFIER + | '(' assignment ')' + | newExpression + | functionExpression + ; + +// A function is an expression bound with an ordinary declaration. +// Its last statement supplies the implicit result; return can exit earlier. +functionExpression : '{' parameterList? '->' statement* '}' ; +parameterList : (parameter ','?)+ ; +parameter : type bindingModifier? IDENTIFIER ; + +// Function types have unnamed, space-separated argument types. +// {int} is the zero-argument type; its function expression still uses ->. +functionType + : '{' type+ '->' type '}' '?'? + | '{' type '}' '?'? + ; + +callSuffix : '(' argumentList? ')' ; +argumentList : assignment (',' assignment)* ','? ; + +// Struct initialization uses a block; array allocation supplies a length. +newExpression : 'new' type ('[' assignment ']' | block)? ; + +INTEGER_LITERAL : '0' | [1-9] DIGIT* ; +FLOAT_LITERAL : DIGIT+ ('.' DIGIT* ('e' DIGIT+)? | 'e' '-'? DIGIT+) ; +STRING_LITERAL : '"' (ESCAPE | ~["\\])* '"' ; +CHARACTER_LITERAL : '\'' (ESCAPE | ~['\\]) '\'' ; +fragment ESCAPE : '\\' [0ntr\\'"] ; +IDENTIFIER : NON_DIGIT (NON_DIGIT | DIGIT)* ; +fragment NON_DIGIT : [a-zA-Z_] ; +fragment DIGIT : [0-9] ; +WHITESPACE : [ \t\r\n]+ -> skip ; +LINE_COMMENT : '//' ~[\r\n]* -> skip ; +BLOCK_COMMENT : '/*' .*? '*/' -> skip ; +``` diff --git a/chapter-incomplete-types/docs/Makefile b/chapter-incomplete-types/docs/Makefile new file mode 100644 index 00000000..12659b8f --- /dev/null +++ b/chapter-incomplete-types/docs/Makefile @@ -0,0 +1,12 @@ +GV := $(wildcard *.gv) +SVG := $(patsubst %.gv,%.svg,$(GV)) + +.PHONY: all +all: $(SVG) + +%.svg: %.gv + dot -Tsvg $< > $@ + +.PHONY: clean +clean: + @rm -f $(SVG) diff --git a/chapter-incomplete-types/docs/examples/A_helloWorld.smp b/chapter-incomplete-types/docs/examples/A_helloWorld.smp new file mode 100644 index 00000000..07ff935f --- /dev/null +++ b/chapter-incomplete-types/docs/examples/A_helloWorld.smp @@ -0,0 +1,3 @@ +// -*- mode: java; -*- +sys.io.p("Hello, World!"); +return 0; diff --git a/chapter-incomplete-types/docs/examples/BubbleSort.smp b/chapter-incomplete-types/docs/examples/BubbleSort.smp new file mode 100644 index 00000000..938e3181 --- /dev/null +++ b/chapter-incomplete-types/docs/examples/BubbleSort.smp @@ -0,0 +1,37 @@ +// -*- mode: java; -*- + +// An implementation of +// https://sampleprograms.io/projects/bubble-sort/ +// +// Bubble sort, with reading (parsing) and writing (formatting) the data. + +val sort = { !sys.aryi64 nums -> + var done = false; + while( !done ) { + done = true; + for( var i = 0; i < nums.len-1; i++ ) + if( nums.buf[i] > nums.buf[i+1] ) { + int tmp = nums.buf[i]; + nums.buf[i] = nums.buf[i+1]; + nums.buf[i+1] = tmp; // Swap + done = false; + } + } +}; + +// Read from stdin a line of the form "[ 4, 3, 2, 1]" and print it sorted. +val main = { -> + // Parse array of numbers from stdin + var nums = sys.parseAryI64( sys.io.stdin() ); + if( !nums ) { + sys.io.p("stdin must look like [4, 3, 2, 1]"); + return 1; + } + + // Bubble sort array of integers + sort(nums); + + // Print a list of numbers to stdout + nums.str().write(1); + return 0; +}; diff --git a/chapter-incomplete-types/docs/font-awesome-4.7.0.zip b/chapter-incomplete-types/docs/font-awesome-4.7.0.zip new file mode 100644 index 00000000..b6bdb4bd Binary files /dev/null and b/chapter-incomplete-types/docs/font-awesome-4.7.0.zip differ diff --git a/chapter-incomplete-types/docs/ifg_trim.pdf b/chapter-incomplete-types/docs/ifg_trim.pdf new file mode 100644 index 00000000..d952fd4f Binary files /dev/null and b/chapter-incomplete-types/docs/ifg_trim.pdf differ diff --git a/chapter-incomplete-types/docs/lattice.gv b/chapter-incomplete-types/docs/lattice.gv new file mode 100644 index 00000000..8661082d --- /dev/null +++ b/chapter-incomplete-types/docs/lattice.gv @@ -0,0 +1,203 @@ +digraph Lattice { + compound = true; + // Define nodes + splines=false; + node [shape=circle, style=filled]; + nodesep=0.2; + ranksep=0.2; + + TOP [label=<⊤>, fillcolor=black, fontcolor=white]; + BOT [label=<⊥>, fillcolor=black, fontcolor=white]; + + // ---------------------- + // Control + XCTRL [label=<⊤:ctrl>, fillcolor=yellow, shape=oval]; + CTRL [label=<⊥:ctrl>, fillcolor=yellow, shape=oval]; + + TOP -> XCTRL; + XCTRL -> CTRL; + CTRL -> BOT; + + // ---------------------- + // Integers + INT_TOP [label=<⊤:int>, fillcolor=lightblue, shape=oval]; + INT_BOT [label=<⊥:int>, fillcolor=lightblue, shape=oval]; + + INT_HI [label="[min>max]" , fillcolor=lightblue, shape=oval]; + INT_XBOOL [label="[1...0]", fillcolor=lightblue, shape=oval]; + INT_CON [label="constants", fillcolor=lightblue, shape=oval]; + INT_CON0 [label="0", fillcolor=lightblue]; + INT_CON1 [label="1", fillcolor=lightblue]; + INT_BOOL [label="[0...1]", fillcolor=lightblue,shape=oval]; + INT_LO [label="[min INT_TOP; + INT_TOP -> INT_HI; + INT_HI -> INT_XBOOL; + INT_XBOOL -> INT_CON0; + INT_XBOOL -> INT_CON1; + INT_HI -> INT_CON; + INT_CON0 -> INT_BOOL; + INT_CON1 -> INT_BOOL; + INT_BOOL -> INT_LO; + INT_CON -> INT_LO; + INT_LO -> INT_BOT; + INT_BOT -> BOT; + + INT_CON0 -> INT_CON1 -> INT_CON [style=invis]; + + // ---------------------- + // Floats + FLT_TOP [label=<⊤:flt>, fillcolor=aqua, shape=oval]; + FLT_BOT [label=<⊥:flt>, fillcolor=aqua, shape=oval]; + + FLT_CON64 [label="64b consts\n[excludes\n32b consts]" , fillcolor=aqua, shape=oval]; + FLT_CON32 [label="32b consts", fillcolor=aqua, shape=oval]; + FLT_CONPI [label="3.14159...", fillcolor=aqua, shape=oval]; + FLT_X32 [label="~f32", fillcolor=aqua]; + FLT_CON0 [label="0." , fillcolor=aqua]; + FLT_32 [label="f32" , fillcolor=aqua]; + + TOP -> FLT_TOP; + FLT_TOP -> FLT_CON64 + FLT_TOP -> FLT_CONPI + FLT_CON64 -> FLT_BOT + FLT_CONPI -> FLT_BOT + + FLT_TOP -> FLT_X32; + FLT_X32 -> FLT_CON0; + FLT_X32 -> FLT_CON32; + FLT_CON0 -> FLT_32; + FLT_CON32 -> FLT_32; + FLT_32 -> FLT_BOT + + FLT_BOT -> BOT; + + FLT_CON0 -> FLT_CON32 -> FLT_CONPI -> FLT_CON64 [style=invis]; + + + // ---------------------- + // Pointers, just a boolean nil/not and a struct + PTR [shape=none, fillcolor=none, label=< + + + +
*ptr
struct
+ >]; + PTR0 [shape=none, fillcolor=none, label=< + + + +
*ptr?
struct
+ >]; + + TOP -> PTR; + PTR -> PTR0; + PTR0 -> BOT; + + // ---------------------- + // Structs + STRUCT_TOP [label=<⊤:struct>, fillcolor=lightgreen, shape=oval]; + STRUCT_BOT [label=<⊥:struct>, fillcolor=lightgreen, shape=oval]; + + STRUCT_S1 [shape=none, fillcolor=none, label=< + + +
fieldint/ptr
+ >]; + STRUCT_S2 [shape=none, fillcolor=none, label=< + + + +
fieldint/ptr
fieldint/ptr
+ >]; + STRUCT_SN [shape=none, fillcolor=none, label=< + + + + +
fieldint/ptr
... int/ptr
fieldint/ptr
+ >]; + + + TOP -> STRUCT_TOP; + STRUCT_TOP -> STRUCT_S1; + STRUCT_TOP -> STRUCT_S2; + STRUCT_TOP -> STRUCT_SN; + STRUCT_S1 -> STRUCT_BOT; + STRUCT_S2 -> STRUCT_BOT; + STRUCT_SN -> STRUCT_BOT; + STRUCT_BOT -> BOT; + + STRUCT_S1 -> STRUCT_S2 -> STRUCT_SN [style=invis]; + + // ---------------------- + // Memory + MEM_TOP [label=<⊤:mem>, fillcolor=blue, fontcolor=white, shape=oval]; + MEM_BOT [label=<⊥:mem>, fillcolor=blue, fontcolor=white, shape=oval]; + MEM_ALIAS1 [label="#1" , fillcolor=blue, fontcolor=white]; + MEM_ALIASDOTS [label="..." , fillcolor=blue, fontcolor=white, shape=oval]; + MEM_ALIASN [label="#n" , fillcolor=blue, fontcolor=white]; + + TOP -> MEM_TOP; + MEM_TOP -> MEM_ALIAS1; + MEM_TOP -> MEM_ALIASDOTS; + MEM_TOP -> MEM_ALIASN; + MEM_ALIAS1 -> MEM_BOT; + MEM_ALIASDOTS -> MEM_BOT; + MEM_ALIASN -> MEM_BOT; + MEM_BOT -> BOT; + + MEM_ALIAS1 -> MEM_ALIASDOTS -> MEM_ALIASN [style=invis]; + + // ---------------------- + // Tuples + + TUPLE_TOP [label=<⊤:tuple>, fillcolor=pink, shape=oval]; + TUPLE_BOT [label=<⊥:tuple>, fillcolor=pink, shape=oval]; + + TUPLE1 [shape=none, fillcolor=none, label=< + + + +
Tuple
type
+ >]; + TUPLE2 [shape=none, fillcolor=none, label=< + + + + +
Tuple
type
type
+ >]; + TUPLEN [shape=none, fillcolor=none, label=< + + + + + +
Tuple
type
...
type
+ >]; + + + TOP -> TUPLE_TOP; + TUPLE_TOP -> TUPLE1; + TUPLE_TOP -> TUPLE2; + TUPLE_TOP -> TUPLEN; + TUPLE1 -> TUPLE_BOT; + TUPLE2 -> TUPLE_BOT; + TUPLEN -> TUPLE_BOT; + TUPLE_BOT -> BOT; + + // ---------------------- + // Additional customization + {rank=same; TOP;} + {rank=same; INT_TOP; FLT_TOP; XCTRL; PTR; STRUCT_TOP; MEM_TOP; TUPLE_TOP} + {rank=same; INT_CON; INT_CON0; INT_CON1; + FLT_CON32; FLT_CON64; FLT_CON0; FLT_CONPI; + STRUCT_S1; STRUCT_S2; STRUCT_SN; + MEM_ALIAS1; MEM_ALIASDOTS; MEM_ALIASN; + TUPLE1; TUPLE2; TUPLEN; + } + {rank=same; INT_BOT; FLT_BOT; CTRL; PTR0; STRUCT_BOT; MEM_BOT; TUPLE_BOT} + {rank=same; BOT;} +} diff --git a/chapter-incomplete-types/docs/lattice.svg b/chapter-incomplete-types/docs/lattice.svg new file mode 100644 index 00000000..e72b473b --- /dev/null +++ b/chapter-incomplete-types/docs/lattice.svg @@ -0,0 +1,691 @@ + + + + + + +Lattice + + + +TOP + +⊤ + + + +XCTRL + +⊤ +:ctrl + + + +TOP->XCTRL + + + + + +INT_TOP + +⊤ +:int + + + +TOP->INT_TOP + + + + + +FLT_TOP + +⊤ +:flt + + + +TOP->FLT_TOP + + + + + +PTR + + + +*ptr + + +struct + + + +TOP->PTR + + + + + +STRUCT_TOP + +⊤ +:struct + + + +TOP->STRUCT_TOP + + + + + +MEM_TOP + +⊤ +:mem + + + +TOP->MEM_TOP + + + + + +TUPLE_TOP + +⊤ +:tuple + + + +TOP->TUPLE_TOP + + + + + +BOT + +⊥ + + + +CTRL + +⊥ +:ctrl + + + +XCTRL->CTRL + + + + + +CTRL->BOT + + + + + +INT_HI + +[min>max] + + + +INT_TOP->INT_HI + + + + + +INT_BOT + +⊥ +:int + + + +INT_BOT->BOT + + + + + +INT_XBOOL + +[1...0] + + + +INT_HI->INT_XBOOL + + + + + +INT_CON + +constants + + + +INT_HI->INT_CON + + + + + +INT_CON0 + +0 + + + +INT_XBOOL->INT_CON0 + + + + + +INT_CON1 + +1 + + + +INT_XBOOL->INT_CON1 + + + + + +INT_LO + +[min<max] + + + +INT_CON->INT_LO + + + + + + +INT_BOOL + +[0...1] + + + +INT_CON0->INT_BOOL + + + + + + +INT_CON1->INT_BOOL + + + + + +INT_BOOL->INT_LO + + + + + +INT_LO->INT_BOT + + + + + +FLT_CON64 + +64b consts +[excludes +32b consts] + + + +FLT_TOP->FLT_CON64 + + + + + +FLT_CONPI + +3.14159... + + + +FLT_TOP->FLT_CONPI + + + + + +FLT_X32 + +~f32 + + + +FLT_TOP->FLT_X32 + + + + + +FLT_BOT + +⊥ +:flt + + + +FLT_BOT->BOT + + + + + +FLT_CON64->FLT_BOT + + + + + +FLT_CON32 + +32b consts + + + + +FLT_32 + +f32 + + + +FLT_CON32->FLT_32 + + + + + +FLT_CONPI->FLT_BOT + + + + + + +FLT_X32->FLT_CON32 + + + + + +FLT_CON0 + +0. + + + +FLT_X32->FLT_CON0 + + + + + + +FLT_CON0->FLT_32 + + + + + +FLT_32->FLT_BOT + + + + + +PTR0 + + + +*ptr? + + +struct + + + +PTR->PTR0 + + + + + +PTR0->BOT + + + + + +STRUCT_S1 + + + +field + + + + + + + + +int/ptr + + + +STRUCT_TOP->STRUCT_S1 + + + + + +STRUCT_S2 + + + +field + + + + + + + + +int/ptr + + +field + + + + + + + + +int/ptr + + + +STRUCT_TOP->STRUCT_S2 + + + + + +STRUCT_SN + + + +field + + + + + + + + +int/ptr + + +...   + + + + + + + + +int/ptr + + +field + + + + + + + + +int/ptr + + + +STRUCT_TOP->STRUCT_SN + + + + + +STRUCT_BOT + +⊥ +:struct + + + +STRUCT_BOT->BOT + + + + + +STRUCT_S1->STRUCT_BOT + + + + + + +STRUCT_S2->STRUCT_BOT + + + + + + +STRUCT_SN->STRUCT_BOT + + + + + +MEM_ALIAS1 + +#1 + + + +MEM_TOP->MEM_ALIAS1 + + + + + +MEM_ALIASDOTS + +... + + + +MEM_TOP->MEM_ALIASDOTS + + + + + +MEM_ALIASN + +#n + + + +MEM_TOP->MEM_ALIASN + + + + + +MEM_BOT + +⊥ +:mem + + + +MEM_BOT->BOT + + + + + +MEM_ALIAS1->MEM_BOT + + + + + + +MEM_ALIASDOTS->MEM_BOT + + + + + + +MEM_ALIASN->MEM_BOT + + + + + +TUPLE1 + + + +Tuple + + +type + + + +TUPLE_TOP->TUPLE1 + + + + + +TUPLE2 + + + +Tuple + + +type + + +type + + + +TUPLE_TOP->TUPLE2 + + + + + +TUPLEN + + + +Tuple + + +type + + +... + + +type + + + +TUPLE_TOP->TUPLEN + + + + + +TUPLE_BOT + +⊥ +:tuple + + + +TUPLE_BOT->BOT + + + + + +TUPLE1->TUPLE_BOT + + + + + +TUPLE2->TUPLE_BOT + + + + + +TUPLEN->TUPLE_BOT + + + + + diff --git a/chapter-incomplete-types/docs/lattice2.gv b/chapter-incomplete-types/docs/lattice2.gv new file mode 100644 index 00000000..6aa37fa0 --- /dev/null +++ b/chapter-incomplete-types/docs/lattice2.gv @@ -0,0 +1,85 @@ +digraph Lattice { + compound = true; + // Define nodes + splines=false; + node [shape=oval, style=filled]; + nodesep=0.2; + ranksep=0.4; + + TOP [label="~scalar\n+int+tmp+0", fillcolor=black, fontcolor=white, group=center]; + + // ------------------------ + PTRHQ [label="~tmp\n+tmp+0", fillcolor=green, fontcolor=white, group=left]; + TOP -> PTRHQ + + VALH_ [label="~nscalar\n+int+tmp", fillcolor=white, group=center]; + TOP -> VALH_ + + INTHQ [label="~int\n+int+0", fillcolor=lightblue, group=right]; + TOP -> INTHQ + + LEFTHI [label="junk", style=invis, group=junkleft] + + + PTRHQ -> LEFTHI-> VALH_ -> INTHQ [style=invis]; + { rank=same; PTRHQ; LEFTHI; VALH_; INTHQ } + + // ------------------------ + PTRH_ [label="~ntmp\n+tmp", fillcolor=green, fontcolor=white, group=left]; + VALH_ -> PTRH_ + PTRHQ -> PTRH_ + + INTH_ [label="~nint\n+int", fillcolor=lightblue, group=right]; + VALH_ -> INTH_ + INTHQ -> INTH_ + { rank=same; PTRH_; INTH_ } + + // ------------------------ + NILX_ [label="~nil\n[int,tmp]+0", fillcolor=aqua, group=junkleft]; + INTHQ -> NILX_ + PTRHQ -> NILX_ + + NIL__ [label="nil\n[+int+tmp],0", fillcolor=pink]; + VALH_ -> NIL__; + + NILX_ -> NIL__ [style=invis]; + { rank=same; NIL__; NILX_ } + + // ------------------------ + PTRL_ [label="ntmp\ntmp", fillcolor=green, fontcolor=white, group=left]; + PTRH_ -> PTRL_ + + INTL_ [label="nint\nint", fillcolor=lightblue, group=right]; + INTH_ -> INTL_ + { rank=same; PTRL_; INTL_ } + + // ------------------------ + PTRL0 [label="tmp\ntmp,0", fillcolor=green, fontcolor=white, group=left]; + PTRL_ -> PTRL0 + NIL__ -> PTRL0 + + VALL_ [label="nscalar\nint,tmp", fillcolor=white, group=center]; + PTRL_ -> VALL_ + INTL_ -> VALL_ + NILX_ -> VALL_ + + INTL0 [label="int\nint,0", fillcolor=lightblue, group=right]; + INTL_ -> INTL0 + NIL__ -> INTL0 + + PTRL0 -> VALL_ -> INTL0 [style=invis]; + { rank=same; PTRL0; VALL_; INTL0 } + + // ------------------------ + BOT [label="scalar\nint,tmp,0", fillcolor=black, fontcolor=white, group=center]; + PTRL0 -> BOT + INTL0 -> BOT + VALL_ -> BOT + + // ------------------------ + // Verticle alignment + TOP -> VALH_ -> VALL_ -> BOT [style=invis]; + PTRHQ -> PTRH_ -> PTRL_ -> PTRL0 [style=invis]; + INTHQ -> INTH_ -> INTL_ -> INTL0 [style=invis]; + LEFTHI -> NILX_ [style=invis] +} diff --git a/chapter-incomplete-types/docs/lattice2.svg b/chapter-incomplete-types/docs/lattice2.svg new file mode 100644 index 00000000..8b682aa7 --- /dev/null +++ b/chapter-incomplete-types/docs/lattice2.svg @@ -0,0 +1,260 @@ + + + + + + +Lattice + + + +TOP + +~scalar ++int+tmp+0 + + + +PTRHQ + +~tmp ++tmp+0 + + + +TOP->PTRHQ + + + + + +VALH_ + +~nscalar ++int+tmp + + + +TOP->VALH_ + + + + + + +INTHQ + +~int ++int+0 + + + +TOP->INTHQ + + + + + + + +PTRH_ + +~ntmp ++tmp + + + +PTRHQ->PTRH_ + + + + + + +NILX_ + +~nil +[int,tmp]+0 + + + +PTRHQ->NILX_ + + + + + + +VALH_->PTRH_ + + + + + +INTH_ + +~nint ++int + + + +VALH_->INTH_ + + + + + +NIL__ + +nil +[+int+tmp],0 + + + +VALH_->NIL__ + + + + + +VALL_ + +nscalar +int,tmp + + + + +INTHQ->INTH_ + + + + + + +INTHQ->NILX_ + + + + + + + +PTRL_ + +ntmp +tmp + + + +PTRH_->PTRL_ + + + + + + +INTL_ + +nint +int + + + +INTH_->INTL_ + + + + + + + +NILX_->VALL_ + + + + + +PTRL0 + +tmp +tmp,0 + + + +NIL__->PTRL0 + + + + + +INTL0 + +int +int,0 + + + +NIL__->INTL0 + + + + + +PTRL_->PTRL0 + + + + + + +PTRL_->VALL_ + + + + + +INTL_->VALL_ + + + + + +INTL_->INTL0 + + + + + + + +BOT + +scalar +int,tmp,0 + + + +PTRL0->BOT + + + + + + +VALL_->BOT + + + + + + +INTL0->BOT + + + + + diff --git a/chapter-incomplete-types/docs/pardoe.docx b/chapter-incomplete-types/docs/pardoe.docx new file mode 100644 index 00000000..24fde921 Binary files /dev/null and b/chapter-incomplete-types/docs/pardoe.docx differ diff --git a/chapter-incomplete-types/docs/webtcp.min.js b/chapter-incomplete-types/docs/webtcp.min.js new file mode 100644 index 00000000..bf23ee5a --- /dev/null +++ b/chapter-incomplete-types/docs/webtcp.min.js @@ -0,0 +1,65 @@ +function Http(j){this.cID=Math.random().toString(36).substr(2);this.webtcp=j;this.webtcp.httpClients[this.cID]=this;this.createPacket=function(){return{cID:this.cID,type:"http",host:this.remoteAddress,port:this.remotePort,method:null,data:null}};this.ondata=function(){};this.get=function(g,c){this.on("data",c);this.rpc("httpGet",[g])};this.post=function(g,c,j){this.on("data",j);this.rpc("httpPost",[g,c])}}Http.prototype=new WebTCPIO;function Socket(j,g,c,p){this.sID=Math.random().toString(36).substr(2);this.webtcp=j;this.closed=this.ready=!1;this.options=p;this.sockOpts={_updating:!1};this.remoteAddress=g;this.remotePort=c;this.webtcp.sockets[this.sID]=this;this.createPacket=function(){return{id:Math.random().toString(36).substr(2),sID:this.sID,type:"tcp",options:this.options,host:this.remoteAddress,port:this.remotePort,data:null}};this.onconnect=function(){this.webtcp.sockets[sID].ready=!0;this.webtcp.sockets[sID].closed=!1}; +this.ondata=function(){};this.onend=function(){};this.ontimeout=function(){};this.ondrain=function(){};this.onclose=function(){this.webtcp.sockets[sID].ready=!1;this.webtcp.sockets[sID].closed=!0};this.getSockOpts=function(){this.sockOpts._updating=!0;this.rpc("getSockOpts")};this.onSockOptsRcv=function(c){this.sockOpts=c;this.sockOpts._updating=!1}}Socket.prototype=new WebTCPIO;var JSON;JSON||(JSON={}); +(function(){function j(c,p){var q,t,n,x,i=k,e,l=p[c];l&&"object"==typeof l&&"function"==typeof l.toJSON&&(l=l.toJSON(c));"function"==typeof r&&(l=r.call(p,c,l));switch(typeof l){case "string":return g(l);case "number":return isFinite(l)?String(l):"null";case "boolean":case "null":return String(l);case "object":if(!l)return"null";k+=v;e=[];if("[object Array]"===Object.prototype.toString.apply(l)){x=l.length;for(q=0;qc?"0"+c:c}"use strict";"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+c(this.getUTCMonth()+1)+"-"+c(this.getUTCDate())+"T"+c(this.getUTCHours())+":"+c(this.getUTCMinutes())+":"+c(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var p=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, +n=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,k,v,D={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},r;"function"!=typeof JSON.stringify&&(JSON.stringify=function(c,g,p){var n;v=k="";if("number"==typeof p)for(n=0;n=a};c.countRTO=function(a){var b;return 100b;b++)d.push(String.fromCharCode(b));B=(r.lastIndex=0,d.join("").replace(r,function(a){return c[a]="\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4),""}),r.lastIndex=0,c)}a=a.replace(r,function(a){return B[a]})}return a};var q="websocket xdr-streaming xhr-streaming iframe-eventsource iframe-htmlfile xdr-polling xhr-polling iframe-xhr-polling jsonp-polling".split(" "); +c.probeProtocols=function(){for(var a={},b=0;b