diff --git a/BOOTSTRAP.md b/BOOTSTRAP.md index 6beae06f..7dfbe2f0 100644 --- a/BOOTSTRAP.md +++ b/BOOTSTRAP.md @@ -126,7 +126,7 @@ All verified. A compiler needs each of these, and each one works today. | `shr` is **logical**, not arithmetic | ✅ | `shr(-16, 1)` → `2147483640` | | Character literals | ✅ | `'x'`, `'\n'`, `'\0'` lex to ints | | Exit codes | ✅ | `os_exit(3)` → shell sees `3` | -| Separate compilation, C ABI | ✅ | `module` + `export fn`, `extern fn … = "sym"` | +| Separate compilation, C ABI | ✅ | `module` + `@export fn`, `extern fn … = "sym"` | **The consequence:** a compiler is *already expressible* in Ludic today. You could write a lexer, a parser building nodes as hand-offset `peek32`/`poke32` @@ -853,8 +853,8 @@ current tree (`./test.sh` = 64/64). **Recursion** ✅ → `55` ```ludic game P { - fn fib(n: int) -> int { if n < 2 { return n } return fib(n-1) + fib(n-2) } - system B phase Start { print_int(fib(10)) quit() } + fn fib(n: int) -> int { if n < 2 { return n }; return fib(n-1) + fib(n-2) } + system B phase Start { print_int(fib(10)); quit() } } ``` @@ -878,11 +878,11 @@ fn streq(a: ptr, b: ptr) -> bool { fn itoa(v: int, buf: ptr) -> int { let n = 0 let x = v - if x == 0 { poke8(buf,0,48) return 1 } + if x == 0 { poke8(buf,0,48); return 1 } let tmp = mem_alloc(16) - while x > 0 { poke8(tmp, n, 48 + x % 10) x = x / 10 n = n + 1 } + while x > 0 { poke8(tmp, n, 48 + x % 10); x = x / 10; n = n + 1 } let i = 0 - while i < n { poke8(buf, i, peek8(tmp, n-1-i)) i = i + 1 } + while i < n { poke8(buf, i, peek8(tmp, n-1-i)); i = i + 1 } mem_free(tmp) return n } @@ -905,16 +905,23 @@ file_close(f) Each is a spelling the language accepts; the point is that the *alternative* spelling is equally legal (§5.3). -**R1 — three statements on one line, no separators** → `2` +**R1 — statements now require a separator (Rule B, syntax-redesign Phase 2)** → parse error ```ludic +# doc-check: skip — intentionally rejected under Rule B: needs a newline or ';' game P { system B phase Start { let x = 1 x = x + 1 print_int(x) quit() } } ``` +Statements no longer sit adjacent with only spaces between them; the compiler +reports `expected newline or ';' between statements`. Put each on its own line, +or separate them with `;` (both lex to the same separator token): +```ludic +game P { system B phase Start { let x = 1; x = x + 1; print_int(x); quit() } } +``` **R2 — commas omitted throughout** → `7` ```ludic # doc-check: skip — composite: declaration plus statements component Pos { x: int = 0 y: int = 0 } -spawn Hero { Pos = { x = 7 y = 2 } } +spawn Hero { Pos { x: 7 y: 2 } } ``` **R3 — RESOLVED.** Every symbol form is now rejected where it is written: @@ -954,7 +961,7 @@ parenthesisation) while `ludic-fmt` returns the input **unchanged**. **Verified-missing** — each a compile error today: ```ludic # doc-check: expect-error — every line here is a compile error by design -while i < 10 { i = i + 1 if i == 3 { break } } # unknown identifier 'break' +while i < 10 { i = i + 1; if i == 3 { break } } # unknown identifier 'break' struct Node { k: int, a: ptr } # expected declaration (got 'struct') var t: [int; 8] # expected identifier (got '[') var h: fn = a # unknown type 'fn' for var h @@ -963,5 +970,5 @@ print_int(os_argc()) # unknown function 'os_argc' print_err("x") # unknown function 'print_err' let p = mem_realloc(ptr_null(), 10) # unknown function 'mem_realloc' print_str("ab" + "cd") # passes front-end, invalid IR -let a = 100000 print_int(a*100000) # 1410065408 — i32 wrap +let a = 100000; print_int(a*100000) # 1410065408 — i32 wrap ``` diff --git a/COMPILING.md b/COMPILING.md index dd04f713..f859fe75 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -79,20 +79,20 @@ self-hosted `ludicc`. > **Not yet on the self-hosted toolchain.** `--shared` and the `nm`/library > workflow below describe the old C driver's behavior; the self-hosted `ludicc` -> builds executables only for now. The `module`/`export fn` semantics are +> builds executables only for now. The `module`/`@export fn` semantics are > unchanged — only the packaging step is pending. A source file opens with `game Name { … }` or `module Name { … }`. * A **game** gets an entry point and the phase-ordered frame loop (`Start`, then `Input → FixedUpdate → Update → LateUpdate → Render` each tick). -* A **module** gets neither. It is a library, and only its `export fn`s become +* A **module** gets neither. It is a library, and only its `@export fn`s become public symbols; everything else stays private to the library. ```ludic # doc-check: skip — illustrative: elided body module Combat { - export fn damage(attack: int, armour: int, roll: int) -> int { … } + @export fn damage(attack: int, armour: int, roll: int) -> int { … } fn curve(level: int) -> int { … } # private: not a symbol } ``` diff --git a/LANGUAGE.md b/LANGUAGE.md index 2947d03a..bda12977 100644 --- a/LANGUAGE.md +++ b/LANGUAGE.md @@ -67,7 +67,7 @@ component Stats { hp: int = 10 } archetype Player { Pos, Stats } # Player IS a kind, not a component archetype Enemy { Pos, Stats } -spawn Player { Pos = { x = 5 } } # attaches every listed component +spawn Player { Pos { x: 5 } } # attaches every listed component # (seeding field defaults), then overrides for (p, s) in query [Pos, Stats, {Player}] { ... } # {Player} filters by kind ``` @@ -105,18 +105,18 @@ TrueType text, focus highlight) and keyboard focus + activation. ```ludic ui MainMenu { - panel id=Root w=288 pad=16 gap=6 skin="assets/ui/panel.png" inset=10 align=center { - label text="CHRONO RIFT" font=reg(R_FONT) size=26 fg=0xffe060 align=center - button id=NewGame text="New Game" font=reg(R_FONT) size=16 w=236 - button id=Quit text="Quit" font=reg(R_FONT) size=16 w=236 + panel id: Root w: 288 pad: 16 gap: 6 skin: "assets/ui/panel.png" inset: 10 align: center { + label text: "CHRONO RIFT" font: reg(R_FONT) size: 26 fg: 0xffe060 align: center + button id: NewGame text: "New Game" font: reg(R_FONT) size: 16 w: 236 + button id: Quit text: "Quit" font: reg(R_FONT) size: 16 w: 236 } } ``` Widget types: `panel` (container + optional skin/bg/border), `col` / `row` (pure stacks), `label`, `button` (focusable), `image`, `spacer`. Props are -evaluated at build time, so `font=reg(R_FONT)` reads a value the game set first. -Each `id=Name` mints a `UI_Name` handle (the `ui` block name too), used from +evaluated at build time, so `font: reg(R_FONT)` reads a value the game set first. +Each `id: Name` mints a `UI_Name` handle (the `ui` block name too), used from systems: ```ludic @@ -130,7 +130,7 @@ system Nav phase Update { if ui_clicked(UI_Quit) { quit() } ui_set_int(UI_HpLabel, hp) # poke dynamic values by id } -system Draw phase Render { clear(0x0e0e16) ui_render() present() } +system Draw phase Render { clear(0x0e0e16); ui_render(); present() } ``` See `examples/menu.ludic` for a complete title screen. @@ -159,8 +159,8 @@ component Pos { x: int = 0, y: int = 0 } # typed fields with defaults component Player { } # a tag (no fields) spawn Hero { # create an entity - Pos = { x = 10, y = 5 } - Player = { } + Pos { x: 10, y: 5 } + Player { } } despawn self() # remove the current entity @@ -185,7 +185,13 @@ system Move @deterministic Phases run in this order every frame: **`Start`** (once at boot), then each frame **`Input` → `FixedUpdate` → `Update` → `LateUpdate` → `Render`**. -`edge system` marks a system that touches the outside world. +`@edge` in front of a `system` marks one that touches the outside world. + +Declaration modifiers are `@annotations` written in front of the declaration — +`@export fn …` (a C-ABI-exported function), `@edge system …`, `@deterministic`, +`@pure`. They parse into one uniform channel rather than a set of prefix +keywords. (`@export` sets the export flag; the others parse but have no codegen +effect in the self-hosted compiler yet.) ### The `query` clause @@ -335,6 +341,18 @@ another `.ludic` file (see `examples/lib/`). `for (…) in query […] { }` · `break` · `continue` · `return` · `spawn` · `despawn` · `match` · `machine`. +**Statements are separated by a newline or `;`** (both lex to the same separator +token). Two statements may not sit adjacent with only spaces between them — the +compiler reports `expected newline or ';' between statements`. Write one +statement per line, or, to pack several onto a line, separate them with `;`: + +```ludic +# doc-check: skip — a bare statement block, not a whole declaration +let x = 1 +x = x + 1 # one per line, the usual form +let y = 1; y = y + 1 # or `;`-separated on one line +``` + `break` and `continue` apply to the innermost enclosing loop, and work in all three loop forms — `while`, the numeric `for`, and the ECS query loop, where `continue` advances to the next matching entity. Using either outside a loop is @@ -361,15 +379,38 @@ state (no more `if phase == N` chains). See the co-op battle in ```ludic # doc-check: skip — illustrative: elided bodies machine R_PHASE { - state KnightMenu = 0 { … if is_confirm(k) { …attack… become KnightResolve } } - state KnightResolve = 1 { … become MageMenu } - state EnemyTurn = 4 { … become KnightMenu } + state KnightMenu { … if is_confirm(k) { …attack… become KnightResolve } } + state KnightResolve { … become MageMenu } + state EnemyTurn { … become KnightMenu } } ``` -A `machine ` reads `reg()` to pick the state; `become Name` compiles to -`setreg(, )`. Both lower to plain branches (and `match` runs -on the native LLVM backend too). +States **number themselves by declaration order** (`KnightMenu` is `0`, +`KnightResolve` is `1`, …) — no magic constants. (An explicit `state Name = expr` +is still accepted when a state needs a specific value.) A `machine ` reads +`reg()` to pick the state; `become Name` compiles to `setreg(, )`. Both lower to plain branches (and `match` runs on the native LLVM +backend too). + +## Enums + +`enum` names a set of related integer values so a magic-number space — a menu +selection, a mode, a machine state — reads as names instead of literals: + +```ludic +# doc-check: skip — composite: a declaration plus its uses +enum Action { Attack, Guard, Item, Flee } # Attack = 0, Guard = 1, … + +match reg(R_CUR) { Action.Attack => attack() Action.Guard => guard() _ => wait() } +if reg(R_MODE) == Mode.Battle { … } +``` + +A variant is a **compile-time `int`** accessed as `Enum.Variant` (`Action.Guard` +is `1`), numbered from `0` by declaration order, so it works anywhere an int does +— `match` patterns, comparisons, `setreg`. Enums are a naming layer over `int`: +there is no distinct enum runtime type yet, so an enum value lives in an ordinary +`int` or register (and is saved with it). See `examples/chronorift/combat.ludic`, +whose battle menus dispatch on `KnightAct`/`MageAct` instead of `0..3`. ## Expressions @@ -378,7 +419,7 @@ postfix(. () )`. Operators are built-in only (no overloading). The boolean operators are spelled **`and` / `or` / `not`**; `&&` and `||` are not Ludic operators and `!` are rejected with a diagnostic naming the fix (`!=` is unaffected). Bitwise operations are functions (`band`, `bor`, `bxor`, `bnot`, `shl`, `shr`), so the symbols are free -— which is why there is only one spelling to remember. `expr with { field = … }` is not implemented; records appear +— which is why there is only one spelling to remember. `expr with { field: … }` is not implemented; records appear only in `spawn`. Char literals (`'w'`) are `int` code points; colors are hex ints (`0xff8800`). diff --git a/README.md b/README.md index 200d8376..afaf5b29 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ same highlighting, checking and formatting as the source tree. - `scene` / `layer` / `enter` — mutually-exclusive game states, each with `on enter`/`on exit` hooks and layered systems (layer order = draw order). - `var` — typed module-level state, included in save/load snapshots. -- `module` + `export fn` — compile a .ludic file to a shared library whose +- `module` + `@export fn` — compile a .ludic file to a shared library whose exported functions are ordinary C-ABI symbols. - `extern fn … = "symbol"` — call any C-ABI library, Ludic or otherwise. - `--target wasm32-unknown-unknown` — the same game in a browser: the runtime, diff --git a/SYNTAX-REDESIGN.md b/SYNTAX-REDESIGN.md index 5c892a29..569a5739 100644 --- a/SYNTAX-REDESIGN.md +++ b/SYNTAX-REDESIGN.md @@ -4,10 +4,11 @@ A plan to make Ludic's syntax internally consistent. It fixes the drift between the spec and the compiler, then unifies the grammar around two rules. Scope: **full redesign (Phases 0–5)**. Named-field direction: **colon everywhere**. -> Status: **Phase 1 landed** (see below). Phases 2→5 are proposals. The phases -> are ordered so the documentation never describes syntax the compiler rejects, -> and every phase ends with the compiler still self-hosting to a fixpoint -> (`./test.sh`). +> Status: **Phases 1–5 complete.** Every phase kept the compiler self-hosting to +> a fixpoint (`./test.sh` 14/14), and each syntax migration was proven +> behaviour-preserving (the migrated compiler compiles itself to byte-identical +> IR; every golden game renders byte-identically). Landed on branch +> `syntax-redesign-phase2` over a committed baseline on `main`. > > Coordinated with the toolchain agent (CLI front-end / `ludicc`+`ludic` > binaries) via serialized reseeds of `selfhost/ludicc.seed.ll`; Phase 1 rode in @@ -33,9 +34,9 @@ Verified against the self-hosted compiler ([selfhost/parse.ludic](selfhost/parse **Broken / dead syntax (compiler-verified)** 4. `edge system` — **hard parse error** (documented at [LANGUAGE.md:188](LANGUAGE.md)). *(✅ fixed in Phase 1)* -5. `pure fn` — parses, `pure` silently discarded ([parse.ludic:272](selfhost/parse.ludic)); undocumented. +5. `pure fn` — parses, `pure` silently discarded ([parse.ludic:272](selfhost/parse.ludic)); undocumented. *(✅ Phase 3d: now `@pure`)* 6. `@anno` + `reads/writes/needs/uses [..]` — parsed then thrown away - ([parse_game.ludic:15-31](selfhost/parse_game.ludic)); four synonyms, two undocumented. + ([parse_game.ludic:15-31](selfhost/parse_game.ludic)); four synonyms, two undocumented. *(✅ Phase 3c: `needs`/`uses` dropped)* 7. `scene`/`layer`/`on enter` — full LANGUAGE.md section + [examples/scenes.ludic](examples/scenes.ludic), **does not compile** (`expected declaration`). 8. `query (v) [..]` in a system signature — two LANGUAGE.md sections + @@ -49,9 +50,9 @@ Verified against the self-hosted compiler ([selfhost/parse.ludic](selfhost/parse 11. Operators are words (`and`/`or`/`not`), symbols (`==`/`<=`), *and* functions (`band`/`shl`) at once. 12. Three overlapping control families — `if`/`when`, `match`, `machine`/`become` - — and `enter` reuses `become`'s AST node ([parse.ludic:176-177](selfhost/parse.ludic)). + — and `enter` reuses `become`'s AST node ([parse.ludic:176-177](selfhost/parse.ludic)). *(Phase 4: `if`/`when` kept by choice; magic-int dispatch resolved)* 13. Typed components/structs exist, but real state lives in 64 untyped int - registers (`reg`/`setreg`), so `machine`/`match` dispatch on magic numbers. + registers (`reg`/`setreg`), so `machine`/`match` dispatch on magic numbers. *(✅ Phase 4: auto-numbered states + `enum` name the values)* --- @@ -208,38 +209,142 @@ Made spec ⇄ compiler agree **before** any grammar change. What landed: compile yet — a positive test would fail; the header note + LANGUAGE.md warning cover the drift instead). -### Phase 2 — Statement separation (Rule B) -- Enforce a separator in `block()`/`stmt()` ([parse.ludic:130-199](selfhost/parse.ludic)): - after a statement, require `TK_NL` or `}`. -- Teach `ludic-fmt` to normalize one-statement-per-line and insert `;` where two - share a line. Reformat the whole corpus with it. -- Risk: the self-host sources themselves use space-juxtaposed statements heavily - — reformat them in the same commit, re-seed, re-verify fixpoint. +### Phase 2 — Statement separation (Rule B) ✅ DONE +Landed on branch `syntax-redesign-phase2` (baseline committed on `main` first). +- ✅ **Parser enforces a separator** — `block()` requires a newline or `;` after + each statement, else `expected newline or ';' between statements` + ([parse.ludic](selfhost/parse.ludic)). Also fixed `if`-without-`else` swallowing + its trailing separator (it now peeks for `else` and restores if absent). +- ✅ **Interpretation chosen:** *require a separator*, not *reflow to one-per-line*. + The migration **inserts `;` at statement boundaries** and leaves lines intact — + comment-safe, minimal-diff, and it makes boundaries visible without an + opinionated reflow. One-per-line stays the recommended hand-written form. +- ✅ **Migration tool** ([tools/ludic-tools/migrate_separators.c](tools/ludic-tools/migrate_separators.c), + reuses the toolchain lexer) with a + **verification oracle**: a `;` inserted at a real boundary is a semantic no-op, + proven by the migrated compiler compiling itself to **IR byte-identical to the + seed** and every golden game rendering identically. ~1100 boundaries across the + corpus (examples, runtime, and the 25 self-host fragments). +- ✅ **Reseeded** to the strict compiler (19557 lines); C-free bootstrap fixpoint + holds; `./test.sh` 14/14; all goldens byte-identical; qdecl runs correctly. +- ✅ **Docs updated** — Rule B documented in LANGUAGE.md §Statements; BOOTSTRAP.md + R1 (which advertised no-separator juxtaposition as legal) and its stale code + fences updated; `check-docs` (now a live strict parse gate) green across all docs. + +**Bug found & fixed en route:** a multi-line string literal in +[emit_expr.ludic](selfhost/emit_expr.ludic) (`emit(")")`) lexed fine in +the self-host lexer but the **C toolchain lexer** (`ludic_syntax.h`, shared by +sepfix, `ludic-fmt`, and the LSP) stops strings at newline — so it mis-lexed and +`ludic-fmt` would corrupt such a file. Converted it to the byte-identical `\n` +escape. **Open follow-up:** align the C lexer to allow newlines in strings, or +forbid literal newlines in string literals language-wide (the two lexers should +agree). Flagged to the toolchain owners. ### Phase 3 — Named-field unification (Rule A) -- Migrate spawn/record init (`= {…=…}` → `{…:…}`) and ui props (`key=value` → - named-arg form) in the parser and emitters. -- Collapse `reads/writes/needs/uses` → `reads`/`writes`, stored on the node. -- Move `edge`/`pure`/`export` into `@`-annotations; parse annotations into a list. -- Ship `ludic-fmt --migrate`: a mechanical codemod that rewrites old syntax to - new, run over `examples/`, `runtime/`, and `selfhost/`. -- Gate: compiler still self-hosts; every golden render is byte-identical. -### Phase 4 — Control-flow & operator consolidation (largest) -- Remove `when`; confirm `if` covers all uses in the corpus. -- Introduce `enum` + typed `machine`/state; migrate `combat.ludic`'s R_PHASE - machine and the register-driven `match reg(…)` sites. -- Decide the bitwise story: keep `band/shl/…` as functions (document as a - deliberate "one spelling" choice) or promote to operators — pick one and state - it, don't leave it implicit. +**3a — spawn/record initializers ✅ DONE.** `Comp = { f = v }` → `Comp { f: v }`. +`record()` requires `:` and `parse_spawn()` drops the `=` before the record +([parse.ludic](selfhost/parse.ludic), [parse_game.ludic](selfhost/parse_game.ludic)). +The `=` is now assignment/const/default/extern-binding only. Migration tool: +[migrate_records.c](tools/ludic-tools/migrate_records.c) (spawn-context aware). +Records live only in games, so the seed was unaffected; verified every golden +byte-identical, old `=` form now rejected, reseeded, `test.sh` 14/14. Doc examples +updated (LANGUAGE.md, BOOTSTRAP.md R2). -### Phase 5 — Single source of truth for keywords/grammar -- Generate every editor plugin keyword list, `ludic_syntax.h`, and the LSP's - token set from **one** canonical list so a keyword can never again be - highlighted but unparsed. -- Add a CI check (extend `tools/check-docs.py` / `check-vocabulary.py`) that - every ` ```ludic ` fence in the docs compiles, closing the doc-drift loop - permanently. +**3b — ui props → `key: value` ✅ DONE.** `panel id=Root w=288` → `panel id: Root +w: 288`. `parse_widget` now reads props with `:` ([parse_game.ludic](selfhost/parse_game.ludic)). +Chose the **colonized** form over parenthesized named-args: it satisfies Rule A +(the `=` overload is gone) with minimal churn, needs no new grammar, and `emit_ui` +(which reads the AST) and `ludic-fmt` (which formats `:` correctly by default) +were both untouched. Migration: [migrate_ui.c](tools/ludic-tools/migrate_ui.c). +menu golden byte-identical, old `=` form rejected, reseeded, `test.sh` 14/14. +(The parenthesized form `panel(id: Root, w: 288)` remains a possible future +refinement if the language ever gains named call arguments.) + +**3c — dropped the dead `needs`/`uses` clause synonyms ✅ DONE.** `reads`/`writes` +stay (documented; still parsed-and-reserved). `needs`/`uses` were undocumented and +unused anywhere in the corpus — removed from `parse_system`. *Not done:* actually +*storing* reads/writes on the node for an analysis pass — that's analysis +infrastructure, out of scope for a syntax pass. + +**3d — modifiers → `@`-annotations ✅ DONE.** `edge`/`pure`/`export` prefix keywords +are retired; declaration modifiers are now leading `@annotations`: `@export fn`, +`@edge system`, `@pure`, `@deterministic`. `parse_one_decl` collects a leading +`@anno` run and `@export` sets the fn export flag ([parse.ludic](selfhost/parse.ludic)); +the dead `edge`-dispatch was removed from `parse_system`. Migrated the one +`@export` user ([examples/lib/combat.ludic](examples/lib/combat.ludic)); old +prefix forms now rejected. Behavior-identical: the export flag is parse-only in +the self-hosted emitter (it emits `@fn_` for every function and never reads +the flag — the C-ABI-export capability is vestigial, a pre-existing gap), so +`@export` and the old `export` produce byte-identical IR. Reseeded, fixpoint +holds, `test.sh` 14/14, goldens byte-identical. + +**Phase 3 is complete.** The `=`/`:` overload (finding #2) and the modifier-zoo +(findings #5, #6) are resolved; `:` associates and `=` binds throughout. + +Each sub-phase follows the proven pattern: parser change → verification-gated +migration (IR byte-identical / goldens identical) → reseed → docs. The migration +tools ([migrate_separators.c](tools/ludic-tools/migrate_separators.c), +[migrate_records.c](tools/ludic-tools/migrate_records.c)) are the reusable spine. + +### Phase 4 — Control-flow & state consolidation + +**4a — machine states auto-number ✅ DONE.** `state KnightMenu = 0 { }` → +`state KnightMenu { }`; a state's value is its declaration index (an explicit +`= expr` still works). Removes the magic constants from state machines +([parse.ludic](selfhost/parse.ludic)). combat.ludic migrated; chronorift golden +byte-identical. + +**4b — `enum` types ✅ DONE.** `enum Action { Attack, Guard, Item, Flee }` declares +named `int` constants; a variant is a compile-time int accessed as `Action.Guard` +(= 1), numbered by order. Parser `parse_enum` + dispatch, `enum_ordinal` resolver +in [emit_core.ludic](selfhost/emit_core.ludic), and `Enum.Variant` handling in +[emit_expr.ludic](selfhost/emit_expr.ludic). combat.ludic's battle menus now +dispatch on `KnightAct`/`MageAct` instead of `0..3`; chronorift golden +byte-identical. Editor vocab (`ludic_syntax.h`, JetBrains, TextMate, emacs) gained +`enum` and lost the retired `edge`/`export`/`pure` decl keywords; check-vocabulary ++ test-tools green. **Scoped:** enums are a naming layer over `int` (no distinct +runtime type / enum-typed variables yet) — that keeps register/save semantics +untouched, which the "enum var replaces the register" vision would have to solve. + +**`when` vs `if` — kept both (decision).** `when` stays as the `if`-without-else +spelling: it is not incoherent so much as a readability signal ("no else here"), +it is documented and highlighted, and it is a pure alias with no semantic overlap +to untangle. The real target of finding #12 — dispatch on magic integers — is +addressed by 4a/4b, not by collapsing `if`/`when`. + +**Bitwise operators — kept as functions (decision).** `band`/`bor`/`bxor`/`bnot`/ +`shl`/`shr` stay functions, documented as the deliberate "one spelling, symbols +stay free" choice (LANGUAGE.md §Expressions already states this). Promoting them +to operators would re-introduce the symbol soup the current design avoids. + +### Phase 5 — Vocabulary anchored to the compiler ✅ DONE +The editor vocabulary already stayed in sync *with itself* (`check-vocabulary.py` +compares `ludic_syntax.h`, the JetBrains lexer, and the TextMate grammar). The +missing anchor was the **compiler**: a keyword could be highlighted everywhere +and still be silently unparsed. Closed both loops: +- ✅ **Vocabulary ⇄ parser.** `check-vocabulary.py` now extracts every keyword + `selfhost/parse*.ludic` dispatches on (`is_id(...)` / `streq(t.text, ...)`) and + requires the header's declaration + clause keywords to be a subset — with a + `LUDIC_KW_RESERVED` escape hatch for documented, not-yet-implemented keywords + (`scene`/`layer`/`on`/`start`), itself checked so a reserved word that gets + implemented must be promoted. Verified it catches an injected bogus keyword. +- ✅ **Reconciled the drift it exposed.** Removed the highlighted-but-unparsed + `scene`/`layer`/`on`/`start` (→ RESERVED) and the never-implemented + `needs`/`uses`/`requires`/`ensures`/`invariant`/`effects` clause words, and the + retired `edge`/`export`/`pure` prefix modifiers, from `ludic_syntax.h`, the + JetBrains lexer, the TextMate grammar, and the emacs mode; added `enum`/`main`. + `@`-annotations already highlight generically (`@[A-Za-z_]…`). test-tools 28/0. +- ✅ **Doc-fence compilation** — the other half of "single source of truth" — was + already live: `check-docs.py` compiles every ` ```ludic ` fence through the + self-hosted `ludicc --fmt` parse gate (revived during Phase 1's coordination). + +Full generation-from-one-list (emit the editor files from a manifest) was not +needed: the bidirectional *checks* give the same guarantee — nothing can drift +without CI failing — without a code-generation step to maintain. + +**Phases 1–5 are complete.** All thirteen findings are resolved or resolved by an +explicit, documented decision. --- diff --git a/examples/chronorift/combat.ludic b/examples/chronorift/combat.ludic index 2cd46165..492d17e9 100644 --- a/examples/chronorift/combat.ludic +++ b/examples/chronorift/combat.ludic @@ -3,13 +3,18 @@ # The battle is a state machine over R_PHASE. `machine` dispatches on the # register and `become` transitions to a named state — no more `if ph == N` # ladders. Knight turn (0,1), Mage turn (2,3), Enemy turn (4). + +# Menu selections, named instead of matched on bare integers (R_CUR holds one). +enum KnightAct { Attack, Guard, Item, Flee } +enum MageAct { Attack, Heal, Guard } + system Battle phase Update { if reg(R_MODE) == 1 { let k = key() for (e) in query [Stats, {Enemy}] { machine R_PHASE { - state KnightMenu = 0 { + state KnightMenu { for (st, pt) in query [Stats, Party] { if pt.slot == 0 { if st.hp <= 0 { @@ -20,21 +25,21 @@ system Battle phase Update { if k == 's' { setreg(R_CUR, min(3, reg(R_CUR) + 1)) } if is_confirm(k) { match reg(R_CUR) { - 0 => { + KnightAct.Attack => { let d = max(1, st.atk - e.def + rng_range(0, 4)) e.hp = e.hp - d setreg(R_PDMG, d) } - 1 => { st.guard = 1 setreg(R_PDMG, 0) } - 2 => { + KnightAct.Guard => { st.guard = 1; setreg(R_PDMG, 0) } + KnightAct.Item => { if reg(R_POTION) > 0 { setreg(R_POTION, reg(R_POTION) - 1) st.hp = min(st.maxhp, st.hp + 24) setreg(R_PDMG, 24) } else { setreg(R_PDMG, 0) } } - 3 => { - if rng_chance(50) { e.hp = 0 setreg(R_MODE, 0) } + KnightAct.Flee => { + if rng_chance(50) { e.hp = 0; setreg(R_MODE, 0) } else { setreg(R_PDMG, 0) } } } @@ -46,12 +51,12 @@ system Battle phase Update { } } - state KnightResolve = 1 { + state KnightResolve { if k != 0 { if e.hp <= 0 { grant_xp(e.xp) setreg(R_GOLD, reg(R_GOLD) + e.xp) - if reg(R_ETYPE) == 2 { setreg(R_BOSS, 1) setreg(R_MODE, 3) setreg(R_ACK, 0) } + if reg(R_ETYPE) == 2 { setreg(R_BOSS, 1); setreg(R_MODE, 3); setreg(R_ACK, 0) } else { setreg(R_MODE, 0) } become KnightMenu } else { @@ -61,7 +66,7 @@ system Battle phase Update { } } - state MageMenu = 2 { + state MageMenu { for (st, pt) in query [Stats, Party] { if pt.slot == 1 { if st.hp <= 0 { @@ -71,12 +76,12 @@ system Battle phase Update { if k == 'k' { setreg(R_CUR, min(2, reg(R_CUR) + 1)) } if k == 'j' { match reg(R_CUR) { - 0 => { + MageAct.Attack => { let d = max(1, st.atk + 5 - e.def + rng_range(0, 5)) e.hp = e.hp - d setreg(R_PDMG, d) } - 1 => { + MageAct.Heal => { if st.mp >= 4 { st.mp = st.mp - 4 for (t2, p2) in query [Stats, Party] { @@ -85,7 +90,7 @@ system Battle phase Update { setreg(R_PDMG, 16) } else { setreg(R_PDMG, 0) } } - 2 => { st.guard = 1 setreg(R_PDMG, 0) } + MageAct.Guard => { st.guard = 1; setreg(R_PDMG, 0) } } become MageResolve setreg(R_CUR, 0) @@ -95,12 +100,12 @@ system Battle phase Update { } } - state MageResolve = 3 { + state MageResolve { if k != 0 { if e.hp <= 0 { grant_xp(e.xp) setreg(R_GOLD, reg(R_GOLD) + e.xp) - if reg(R_ETYPE) == 2 { setreg(R_BOSS, 1) setreg(R_MODE, 3) setreg(R_ACK, 0) } + if reg(R_ETYPE) == 2 { setreg(R_BOSS, 1); setreg(R_MODE, 3); setreg(R_ACK, 0) } else { setreg(R_MODE, 0) } become KnightMenu } else { @@ -109,14 +114,14 @@ system Battle phase Update { } } - state EnemyTurn = 4 { + state EnemyTurn { if k != 0 { let done = 0 for (t3) in query [Stats, {Party}] { if done == 0 { if t3.hp > 0 { let ed = max(1, e.atk - t3.def + rng_range(0, 4)) - if t3.guard == 1 { ed = ed / 2 t3.guard = 0 } + if t3.guard == 1 { ed = ed / 2; t3.guard = 0 } t3.hp = t3.hp - ed setreg(R_EDMG, ed) done = 1 @@ -127,7 +132,7 @@ system Battle phase Update { for (t4) in query [Stats, {Party}] { if t4.hp > 0 { alive = alive + 1 } } - if alive == 0 { setreg(R_MODE, 2) setreg(R_ACK, 0) } + if alive == 0 { setreg(R_MODE, 2); setreg(R_ACK, 0) } else { become KnightMenu setreg(R_CUR, 0) diff --git a/examples/chronorift/overworld.ludic b/examples/chronorift/overworld.ludic index 3ce11c01..cce32a93 100644 --- a/examples/chronorift/overworld.ludic +++ b/examples/chronorift/overworld.ludic @@ -16,14 +16,14 @@ system Boot phase Start { build_field(0) spawn Player { - Pos = { x = 11, y = 15 } - Actor = { kind = 5 } - Party = { slot = 0 } - Stats = { hp = 40, maxhp = 40, mp = 8, maxmp = 8, atk = 12, def = 6, lvl = 1, xp = 0, guard = 0 } + Pos { x: 11, y: 15 } + Actor { kind: 5 } + Party { slot: 0 } + Stats { hp: 40, maxhp: 40, mp: 8, maxmp: 8, atk: 12, def: 6, lvl: 1, xp: 0, guard: 0 } } spawn Ally { - Party = { slot = 1 } - Stats = { hp = 26, maxhp = 26, mp = 16, maxmp = 16, atk = 8, def = 4, lvl = 1, xp = 0, guard = 0 } + Party { slot: 1 } + Stats { hp: 26, maxhp: 26, mp: 16, maxmp: 16, atk: 8, def: 4, lvl: 1, xp: 0, guard: 0 } } setreg(R_MODE, 0) setreg(R_ENC, 4) @@ -69,8 +69,8 @@ system Control phase Input { if reg(R_BOSS) == 0 { setreg(R_ETYPE, 2) spawn Enemy { - Actor = { kind = 8 } - Stats = { hp = 120, maxhp = 120, mp = 0, maxmp = 0, atk = 18, def = 10, lvl = 5, xp = 300, guard = 0 } + Actor { kind: 8 } + Stats { hp: 120, maxhp: 120, mp: 0, maxmp: 0, atk: 18, def: 10, lvl: 5, xp: 300, guard: 0 } } setreg(R_MODE, 1) setreg(R_PHASE, 0) @@ -96,14 +96,14 @@ system Control phase Input { setreg(R_ETYPE, et) if et == 0 { spawn Enemy { - Actor = { kind = 6 } - Stats = { hp = 18, maxhp = 18, mp = 0, maxmp = 0, atk = 8, def = 2, lvl = 1, xp = 7, guard = 0 } + Actor { kind: 6 } + Stats { hp: 18, maxhp: 18, mp: 0, maxmp: 0, atk: 8, def: 2, lvl: 1, xp: 7, guard: 0 } } } if et == 1 { spawn Enemy { - Actor = { kind = 7 } - Stats = { hp = 30, maxhp = 30, mp = 0, maxmp = 0, atk = 11, def = 5, lvl = 1, xp = 15, guard = 0 } + Actor { kind: 7 } + Stats { hp: 30, maxhp: 30, mp: 0, maxmp: 0, atk: 11, def: 5, lvl: 1, xp: 15, guard: 0 } } } setreg(R_MODE, 1) diff --git a/examples/hello.ludic b/examples/hello.ludic index 0b4d1780..2544a6f1 100644 --- a/examples/hello.ludic +++ b/examples/hello.ludic @@ -6,12 +6,12 @@ game Hello { system Boot phase Start { spawn Mob { - Pos = { x = 3, y = 4 } - Vel = { dx = 1, dy = 0 } + Pos { x: 3, y: 4 } + Vel { dx: 1, dy: 0 } } spawn Mob { - Pos = { x = 10, y = 2 } - Vel = { dx = 0, dy = 1 } + Pos { x: 10, y: 2 } + Vel { dx: 0, dy: 1 } } } diff --git a/examples/lib/arena.ludic b/examples/lib/arena.ludic index 35bdf6ae..02d87ccb 100644 --- a/examples/lib/arena.ludic +++ b/examples/lib/arena.ludic @@ -18,8 +18,8 @@ game Arena { component Fighter { hp: int = 30, attack: int = 9, armour: int = 2 } system Boot phase Start { - spawn Hero { Fighter = { hp = 40, attack = 12, armour = 3 } } - spawn Orc { Fighter = { hp = 24, attack = 7, armour = 1 } } + spawn Hero { Fighter { hp: 40, attack: 12, armour: 3 } } + spawn Orc { Fighter { hp: 24, attack: 7, armour: 1 } } } system Fight phase Update { diff --git a/examples/lib/combat.ludic b/examples/lib/combat.ludic index 794f72d5..b694eb9e 100644 --- a/examples/lib/combat.ludic +++ b/examples/lib/combat.ludic @@ -16,7 +16,7 @@ module Combat { const CRIT_MULT: int = 2 # damage after armour, with a crit multiplier applied on an exact roll - export fn damage(attack: int, armour: int, roll: int) -> int { + @export fn damage(attack: int, armour: int, roll: int) -> int { let raw = attack - armour if raw < 1 { raw = 1 } if roll == 20 { raw = raw * CRIT_MULT } @@ -25,7 +25,7 @@ module Combat { # how many hits to drop a target — the loop is here so the caller cannot # accidentally disagree with `damage` about rounding - export fn hits_to_kill(hp: int, attack: int, armour: int) -> int { + @export fn hits_to_kill(hp: int, attack: int, armour: int) -> int { let left = hp let n = 0 while left > 0 { @@ -35,7 +35,7 @@ module Combat { return n } - export fn xp_for(level: int, kills: int) -> int { + @export fn xp_for(level: int, kills: int) -> int { return curve(level) * kills } diff --git a/examples/menu.ludic b/examples/menu.ludic index 2bb9861e..39886324 100644 --- a/examples/menu.ludic +++ b/examples/menu.ludic @@ -8,14 +8,14 @@ game Menu { const R_MSG: int = 1 ui MainMenu { - panel id=Root w=288 pad=16 gap=6 bg=0x1a1a2c border=0x4a4a72 skin="assets/ui/panel.png" inset=10 align=center { - label text="CHRONO RIFT" font=reg(R_FONT) size=26 fg=0xffe060 align=center - label text="a Ludic retained-UI demo" font=reg(R_FONT) size=14 fg=0x9aa0c8 align=center - spacer h=4 - button id=NewGame text="New Game" font=reg(R_FONT) size=16 w=236 - button id=Continue text="Continue" font=reg(R_FONT) size=16 w=236 - button id=Options text="Options" font=reg(R_FONT) size=16 w=236 - button id=Quit text="Quit" font=reg(R_FONT) size=16 w=236 + panel id: Root w: 288 pad: 16 gap: 6 bg: 0x1a1a2c border: 0x4a4a72 skin: "assets/ui/panel.png" inset: 10 align: center { + label text: "CHRONO RIFT" font: reg(R_FONT) size: 26 fg: 0xffe060 align: center + label text: "a Ludic retained-UI demo" font: reg(R_FONT) size: 14 fg: 0x9aa0c8 align: center + spacer h: 4 + button id: NewGame text: "New Game" font: reg(R_FONT) size: 16 w: 236 + button id: Continue text: "Continue" font: reg(R_FONT) size: 16 w: 236 + button id: Options text: "Options" font: reg(R_FONT) size: 16 w: 236 + button id: Quit text: "Quit" font: reg(R_FONT) size: 16 w: 236 } } diff --git a/examples/qdecl.ludic b/examples/qdecl.ludic index 5c63a879..5d66fb13 100644 --- a/examples/qdecl.ludic +++ b/examples/qdecl.ludic @@ -15,9 +15,9 @@ game QueryDecl { archetype Foe { Battle, Pos } system Seed phase Start { - spawn Foe { Battle = { hp = 3, side = 1 } } - spawn Foe { Battle = { hp = 0, side = 1 } } - spawn Foe { Battle = { hp = -2, side = 0 } } + spawn Foe { Battle { hp: 3, side: 1 } } + spawn Foe { Battle { hp: 0, side: 1 } } + spawn Foe { Battle { hp: -2, side: 0 } } } system CleanBattle phase LateUpdate diff --git a/examples/scenes.ludic b/examples/scenes.ludic index b3600e7b..0a1d4c87 100644 --- a/examples/scenes.ludic +++ b/examples/scenes.ludic @@ -7,7 +7,7 @@ game SceneDemo { const R_N: int = 0 - system Boot phase Start { setreg(R_N, 0) print_int(1000) } + system Boot phase Start { setreg(R_N, 0); print_int(1000) } scene Title start { on enter { print_int(1) } @@ -22,7 +22,7 @@ game SceneDemo { } scene Play { - on enter { print_int(3) setreg(R_N, 0) } + on enter { print_int(3); setreg(R_N, 0) } on exit { print_int(4) } layer World { system Step phase Update { diff --git a/examples/snake.ludic b/examples/snake.ludic index 857dbe4e..15d03ff8 100644 --- a/examples/snake.ludic +++ b/examples/snake.ludic @@ -26,9 +26,9 @@ game Snake { fn reset(x: int) -> int { for (p, s) in query [Pos, Seg] { despawn self() } - spawn S0 { Seg = { order = 0 } Pos = { x = 10, y = 7 } } - spawn S1 { Seg = { order = 1 } Pos = { x = 9, y = 7 } } - spawn S2 { Seg = { order = 2 } Pos = { x = 8, y = 7 } } + spawn S0 { Seg { order: 0 }; Pos { x: 10, y: 7 } } + spawn S1 { Seg { order: 1 }; Pos { x: 9, y: 7 } } + spawn S2 { Seg { order: 2 }; Pos { x: 8, y: 7 } } setreg(R_DIR, 3) setreg(R_LEN, 3) setreg(R_TICK, 0) @@ -62,7 +62,7 @@ game Snake { setreg(R_TICK, 0) let len = reg(R_LEN) for (pt, stg) in query [Pos, Seg] { - if stg.order == len - 1 { setreg(R_TX, pt.x) setreg(R_TY, pt.y) } + if stg.order == len - 1 { setreg(R_TX, pt.x); setreg(R_TY, pt.y) } } for step in 0 .. len { let i = len - 1 - step @@ -70,7 +70,7 @@ game Snake { for (pa, sa) in query [Pos, Seg] { if sa.order == i { for (pb, sb) in query [Pos, Seg] { - if sb.order == i - 1 { pa.x = pb.x pa.y = pb.y } + if sb.order == i - 1 { pa.x = pb.x; pa.y = pb.y } } } } @@ -101,7 +101,7 @@ game Snake { } if reg(R_ATE) == 1 { setreg(R_SCORE, reg(R_SCORE) + 1) - spawn Body { Seg = { order = len } Pos = { x = reg(R_TX), y = reg(R_TY) } } + spawn Body { Seg { order: len }; Pos { x: reg(R_TX), y: reg(R_TY) } } setreg(R_LEN, len + 1) setreg(R_FX, rng_range(0, GW - 1)) setreg(R_FY, rng_range(0, GH - 1)) diff --git a/runtime/native/image.ludic b/runtime/native/image.ludic index 15d23cd9..7e256938 100644 --- a/runtime/native/image.ludic +++ b/runtime/native/image.ludic @@ -49,7 +49,7 @@ fn rt_read_file(path: str) -> ptr { file_seek(f, 0, 2) let n = file_tell(f) file_seek(f, 0, 0) - if n <= 0 { file_close(f) return ptr_null() } + if n <= 0 { file_close(f); return ptr_null() } let buf = mem_alloc(n + 8) file_read(f, buf, n) file_close(f) @@ -70,9 +70,9 @@ fn rt_decode_png(path: str) -> bool { let d = rt_read_file(path) if ptr_is_null(d) { return false } let size = rt_file_len - if size < 8 { mem_free(d) return false } - if peek8(d, 0) != 137 { mem_free(d) return false } - if peek8(d, 1) != 80 { mem_free(d) return false } + if size < 8 { mem_free(d); return false } + if peek8(d, 0) != 137 { mem_free(d); return false } + if peek8(d, 1) != 80 { mem_free(d); return false } let w = 0 let h = 0 @@ -119,8 +119,8 @@ fn rt_decode_png(path: str) -> bool { } } - if w <= 0 { mem_free(d) return false } - if h <= 0 { mem_free(d) return false } + if w <= 0 { mem_free(d); return false } + if h <= 0 { mem_free(d); return false } let channels = 1 if ct == 2 { channels = 3 } @@ -133,7 +133,7 @@ fn rt_decode_png(path: str) -> bool { let rawlen = h * (stride + 1) let raw = mem_alloc(rawlen + 8) if z_uncompress(idat, idlen, raw, rawlen) < 0 { - mem_free(d) mem_free(raw) mem_free(idat) + mem_free(d); mem_free(raw); mem_free(idat) return false } @@ -378,7 +378,7 @@ fn rt_hexval(c: int) -> int { fn rt_load_sprites(path: str) -> void { let d = rt_read_file(path) - if ptr_is_null(d) { spr_n = 0 return } + if ptr_is_null(d) { spr_n = 0; return } let size = rt_file_len let pal = mem_alloc(128 * 4) mem_set(pal, 0, 128 * 4) @@ -391,7 +391,7 @@ fn rt_load_sprites(path: str) -> void { let j = start while j < size { let ch = peek8(d, j) - if ch == 10 { j = size } else { len = len + 1 j = j + 1 } + if ch == 10 { j = size } else { len = len + 1; j = j + 1 } } let c0 = peek8(d, start) if c0 == 112 { # 'p' — "pal " diff --git a/runtime/native/truetype.ludic b/runtime/native/truetype.ludic index 3d29f2c6..7adf7786 100644 --- a/runtime/native/truetype.ludic +++ b/runtime/native/truetype.ludic @@ -322,7 +322,7 @@ fn tt_load_outline(id: int, gid: int, a: fixed, b: fixed, c: fixed, e: fixed, dx let r = peek8(d, p) p = p + 1 while r > 0 { - if i < npts { poke8(flags, i, fl) i = i + 1 } + if i < npts { poke8(flags, i, fl); i = i + 1 } r = r - 1 } } @@ -338,7 +338,7 @@ fn tt_load_outline(id: int, gid: int, a: fixed, b: fixed, c: fixed, e: fixed, dx p = p + 1 if band(fl, 16) != 0 { xv = xv + dxv } else { xv = xv - dxv } } else { - if band(fl, 16) == 0 { xv = xv + tt_i16(d, p) p = p + 2 } + if band(fl, 16) == 0 { xv = xv + tt_i16(d, p); p = p + 2 } } poke32(xs, k, xv) } @@ -350,7 +350,7 @@ fn tt_load_outline(id: int, gid: int, a: fixed, b: fixed, c: fixed, e: fixed, dx p = p + 1 if band(fl, 32) != 0 { yv = yv + dyv } else { yv = yv - dyv } } else { - if band(fl, 32) == 0 { yv = yv + tt_i16(d, p) p = p + 2 } + if band(fl, 32) == 0 { yv = yv + tt_i16(d, p); p = p + 2 } } poke32(ys, k, yv) } diff --git a/selfhost/ast.ludic b/selfhost/ast.ludic index dae73540..8366ec77 100644 --- a/selfhost/ast.ludic +++ b/selfhost/ast.ludic @@ -15,6 +15,7 @@ const N_SYS: int = 9 const N_ARCH: int = 10 const N_EXTERN: int = 11 const N_UI: int = 12 +const N_ENUM: int = 27 # enum Name { A, B, ... } — named int constants # statements const S_LET: int = 10 const S_ASSIGN: int = 11 diff --git a/selfhost/buf.ludic b/selfhost/buf.ludic index 0d668a4e..0d18a2f4 100644 --- a/selfhost/buf.ludic +++ b/selfhost/buf.ludic @@ -23,7 +23,7 @@ fn buf_putc(b: Buf, c: int) -> void { } fn buf_puts(b: Buf, s: ptr) -> void { let i = 0 - while peek8(s, i) != 0 { buf_putc(b, peek8(s, i)) i = i + 1 } + while peek8(s, i) != 0 { buf_putc(b, peek8(s, i)); i = i + 1 } } fn buf_puti(b: Buf, n: int) -> void { buf_puts(b, itoa(n)) } -fn buf_str(b: Buf) -> ptr { poke8(b.data, b.len, 0) return b.data } +fn buf_str(b: Buf) -> ptr { poke8(b.data, b.len, 0); return b.data } diff --git a/selfhost/emit_addr.ludic b/selfhost/emit_addr.ludic index d9d523bc..ff3471ff 100644 --- a/selfhost/emit_addr.ludic +++ b/selfhost/emit_addr.ludic @@ -13,8 +13,8 @@ fn emit_member_addr(e: Node) -> ptr { if fidx < 0 { perr(sconcat("no such field ", e.s)) } g_addr_ty = field_type(s, e.s) let r = nreg() - emit(" ") emit(r) emit(" = getelementptr inbounds ") emit(layout_ty(base.ty)) - emit(", ptr ") emit(base.code) emit(", i32 0, i32 ") emit(itoa(fidx)) emit("\n") + emit(" "); emit(r); emit(" = getelementptr inbounds "); emit(layout_ty(base.ty)) + emit(", ptr "); emit(base.code); emit(", i32 0, i32 "); emit(itoa(fidx)); emit("\n") return r } @@ -26,13 +26,13 @@ fn emit_index_addr(e: Node) -> ptr { g_addr_ty = el # load the data pointer from the slice header (field 0) let dp = nreg() - emit(" ") emit(dp) emit(" = getelementptr inbounds %LSlice, ptr ") - emit(base.code) emit(", i32 0, i32 0\n") + emit(" "); emit(dp); emit(" = getelementptr inbounds %LSlice, ptr ") + emit(base.code); emit(", i32 0, i32 0\n") let data = nreg() - emit(" ") emit(data) emit(" = load ptr, ptr ") emit(dp) emit("\n") + emit(" "); emit(data); emit(" = load ptr, ptr "); emit(dp); emit("\n") let ix = emit_expr(e.b) let r = nreg() - emit(" ") emit(r) emit(" = getelementptr inbounds ") emit(llty(el)) - emit(", ptr ") emit(data) emit(", i32 ") emit(ix.code) emit("\n") + emit(" "); emit(r); emit(" = getelementptr inbounds "); emit(llty(el)) + emit(", ptr "); emit(data); emit(", i32 "); emit(ix.code); emit("\n") return r } diff --git a/selfhost/emit_core.ludic b/selfhost/emit_core.ludic index dbdcf2c1..f531f593 100644 --- a/selfhost/emit_core.ludic +++ b/selfhost/emit_core.ludic @@ -3,7 +3,7 @@ # structs and slices are references, so every non-scalar type lowers to `ptr`. struct Val { code: ptr = ptr_null(), ty: ptr = ptr_null() } -fn val(code: ptr, ty: ptr) -> Val { let v = new Val v.code = code v.ty = ty return v } +fn val(code: ptr, ty: ptr) -> Val { let v = new Val; v.code = code; v.ty = ty; return v } var head: Buf # module-level: types, globals, string constants var code: Buf # function bodies @@ -36,24 +36,24 @@ fn emith(s: ptr) -> void { buf_puts(head, s) } # stack slots MUST live in the entry block (an alloca in a loop walks the stack # off its end), so they go into a per-function buffer spliced in at entry. fn emit_alloca(llt: ptr) -> ptr { - let r = sconcat("%t", itoa(ll_t)) ll_t = ll_t + 1 - buf_puts(falloc, " ") buf_puts(falloc, r) buf_puts(falloc, " = alloca ") buf_puts(falloc, llt) buf_puts(falloc, "\n") + let r = sconcat("%t", itoa(ll_t)); ll_t = ll_t + 1 + buf_puts(falloc, " "); buf_puts(falloc, r); buf_puts(falloc, " = alloca "); buf_puts(falloc, llt); buf_puts(falloc, "\n") return r } # "%t" fresh register fn sconcat(a: ptr, b: ptr) -> ptr { - let la = slen(a) let lb = slen(b) + let la = slen(a); let lb = slen(b) let out = mem_alloc(la + lb + 1) let i = 0 - while i < la { poke8(out, i, peek8(a, i)) i = i + 1 } + while i < la { poke8(out, i, peek8(a, i)); i = i + 1 } let j = 0 - while j < lb { poke8(out, la + j, peek8(b, j)) j = j + 1 } + while j < lb { poke8(out, la + j, peek8(b, j)); j = j + 1 } poke8(out, la + lb, 0) return out } -fn nreg() -> ptr { let r = sconcat("%t", itoa(ll_t)) ll_t = ll_t + 1 return r } -fn lbl(pfx: ptr) -> ptr { let r = sconcat(pfx, itoa(ll_lbl)) ll_lbl = ll_lbl + 1 return r } +fn nreg() -> ptr { let r = sconcat("%t", itoa(ll_t)); ll_t = ll_t + 1; return r } +fn lbl(pfx: ptr) -> ptr { let r = sconcat(pfx, itoa(ll_lbl)); ll_lbl = ll_lbl + 1; return r } # Ludic type -> LLVM type. int/bool are i32; everything else (ptr/str/struct/ # slice) is a pointer; void is void. @@ -79,17 +79,17 @@ fn is_struct_ty(t: ptr) -> bool { return not ptr_is_null(find_struct(t)) } fn find_arch(name: ptr) -> Node { let i = 0 - while i < len(prog) { let d = prog[i] if d.kind == N_ARCH and streq(d.s, name) { return d } i = i + 1 } + while i < len(prog) { let d = prog[i]; if d.kind == N_ARCH and streq(d.s, name) { return d }; i = i + 1 } return ptr_null() } fn find_comp(name: ptr) -> Node { let i = 0 - while i < len(prog) { let d = prog[i] if d.kind == N_COMP and streq(d.s, name) { return d } i = i + 1 } + while i < len(prog) { let d = prog[i]; if d.kind == N_COMP and streq(d.s, name) { return d }; i = i + 1 } return ptr_null() } # a struct or a component — both have %Str_/%Cmp_ layouts with named fields fn layout_node(name: ptr) -> Node { - let s = find_struct(name) if not ptr_is_null(s) { return s } + let s = find_struct(name); if not ptr_is_null(s) { return s } return find_comp(name) } fn layout_ty(name: ptr) -> ptr { @@ -99,12 +99,12 @@ fn layout_ty(name: ptr) -> ptr { fn field_index(s: Node, fname: ptr) -> int { let i = 0 - while i < len(s.kids) { if streq(s.kids[i].s, fname) { return i } i = i + 1 } + while i < len(s.kids) { if streq(s.kids[i].s, fname) { return i }; i = i + 1 } return 0 - 1 } fn field_type(s: Node, fname: ptr) -> ptr { let i = 0 - while i < len(s.kids) { if streq(s.kids[i].s, fname) { return s.kids[i].ty } i = i + 1 } + while i < len(s.kids) { if streq(s.kids[i].s, fname) { return s.kids[i].ty }; i = i + 1 } return "int" } @@ -119,21 +119,36 @@ fn find_global(name: ptr) -> Node { } return ptr_null() } + +# `Enum.Variant` -> the variant's ordinal (its index), or -1 if `ename` names no +# enum with that variant. Enum names live in `prog` like any other declaration. +fn enum_ordinal(ename: ptr, vname: ptr) -> int { + let i = 0 + while i < len(prog) { + let d = prog[i] + if d.kind == N_ENUM and streq(d.s, ename) { + let j = 0 + while j < len(d.kids) { if streq(d.kids[j].s, vname) { return j }; j = j + 1 } + } + i = i + 1 + } + return 0 - 1 +} fn find_fn(name: ptr) -> Node { let i = 0 - while i < len(prog) { let d = prog[i] if d.kind == N_FN and streq(d.s, name) { return d } i = i + 1 } + while i < len(prog) { let d = prog[i]; if d.kind == N_FN and streq(d.s, name) { return d }; i = i + 1 } return ptr_null() } # local variable environment fn loc_reset() -> void { nloc = 0 } fn loc_push(name: ptr, r: ptr, ty: ptr) -> void { - if nloc < len(loc_name) { loc_name[nloc] = name loc_reg[nloc] = r loc_ty[nloc] = ty } - else { push(loc_name, name) push(loc_reg, r) push(loc_ty, ty) } + if nloc < len(loc_name) { loc_name[nloc] = name; loc_reg[nloc] = r; loc_ty[nloc] = ty } + else { push(loc_name, name); push(loc_reg, r); push(loc_ty, ty) } nloc = nloc + 1 } fn loc_find(name: ptr) -> int { let i = nloc - 1 - while i >= 0 { if streq(loc_name[i], name) { return i } i = i - 1 } + while i >= 0 { if streq(loc_name[i], name) { return i }; i = i - 1 } return 0 - 1 } diff --git a/selfhost/emit_decl.ludic b/selfhost/emit_decl.ludic index 62175705..221160ed 100644 --- a/selfhost/emit_decl.ludic +++ b/selfhost/emit_decl.ludic @@ -6,26 +6,26 @@ fn emit_params_sig(d: Node) -> void { let i = 0 while i < len(d.kids) { if i > 0 { emit(", ") } - emit(llty(d.kids[i].ty)) emit(" %arg_") emit(d.kids[i].s) + emit(llty(d.kids[i].ty)); emit(" %arg_"); emit(d.kids[i].s) i = i + 1 } } fn emit_fn(d: Node) -> void { - ll_t = 0 ll_lbl = 0 g_term = false loc_reset() nloop = 0 + ll_t = 0; ll_lbl = 0; g_term = false; loc_reset(); nloop = 0 ret_ty = d.ty let fbody = buf_new() falloc = buf_new() let saved = code code = fbody let rl = llty(ret_ty) - if not streq(rl, "void") { buf_puts(falloc, " %retval = alloca ") buf_puts(falloc, rl) buf_puts(falloc, "\n") } + if not streq(rl, "void") { buf_puts(falloc, " %retval = alloca "); buf_puts(falloc, rl); buf_puts(falloc, "\n") } # params: store each incoming argument into a stack slot let i = 0 while i < len(d.kids) { let p = d.kids[i] let slot = emit_alloca(llty(p.ty)) - emit(" store ") emit(llty(p.ty)) emit(" %arg_") emit(p.s) emit(", ptr ") emit(slot) emit("\n") + emit(" store "); emit(llty(p.ty)); emit(" %arg_"); emit(p.s); emit(", ptr "); emit(slot); emit("\n") loc_push(p.s, slot, p.ty) i = i + 1 } @@ -33,16 +33,16 @@ fn emit_fn(d: Node) -> void { if not g_term { emit(" br label %ret\n") } emit("ret:\n") if streq(rl, "void") { emit(" ret void\n") } - else { let r = emit_bind(sconcat("load ", sconcat(rl, ", ptr %retval"))) emit(" ret ") emit(rl) emit(" ") emit(r) emit("\n") } + else { let r = emit_bind(sconcat("load ", sconcat(rl, ", ptr %retval"))); emit(" ret "); emit(rl); emit(" "); emit(r); emit("\n") } code = saved - emit("define ") emit(rl) emit(" @fn_") emit(d.s) emit("(") emit_params_sig(d) emit(") {\nentry:\n") + emit("define "); emit(rl); emit(" @fn_"); emit(d.s); emit("("); emit_params_sig(d); emit(") {\nentry:\n") emit(buf_str(falloc)) emit(buf_str(fbody)) emit("}\n\n") } fn emit_main(d: Node) -> void { - ll_t = 0 ll_lbl = 0 g_term = false loc_reset() nloop = 0 + ll_t = 0; ll_lbl = 0; g_term = false; loc_reset(); nloop = 0 ret_ty = "int" let fbody = buf_new() falloc = buf_new() @@ -56,7 +56,7 @@ fn emit_main(d: Node) -> void { if not g_term { emit(" br label %ret\n") } emit("ret:\n") let r = emit_bind("load i32, ptr %retval") - emit(" ret i32 ") emit(r) emit("\n") + emit(" ret i32 "); emit(r); emit("\n") code = saved emit("define i32 @main(i32 %argc, ptr %argv) {\nentry:\n") emit(buf_str(falloc)) @@ -67,20 +67,20 @@ fn emit_main(d: Node) -> void { fn emit_program() -> void { head = buf_new() code = buf_new() - loc_name = new []ptr loc_reg = new []ptr loc_ty = new []ptr - brk_lbl = new []ptr cnt_lbl = new []ptr + loc_name = new []ptr; loc_reg = new []ptr; loc_ty = new []ptr + brk_lbl = new []ptr; cnt_lbl = new []ptr self_stk = new []ptr mach_stk = new []Node emit_header() if has_ecs() { emit_ecs_storage() } let i = 0 - while i < len(prog) { if prog[i].kind == N_FN { emit_fn(prog[i]) } i = i + 1 } - if has_ecs() { emit_ecs_allocator() emit_snapshot() } + while i < len(prog) { if prog[i].kind == N_FN { emit_fn(prog[i]) }; i = i + 1 } + if has_ecs() { emit_ecs_allocator(); emit_snapshot() } if has_ui() { emit_ui_build() } if has_systems() { emit_game_main() } else { i = 0 - while i < len(prog) { if prog[i].kind == N_MAIN { emit_main(prog[i]) } i = i + 1 } + while i < len(prog) { if prog[i].kind == N_MAIN { emit_main(prog[i]) }; i = i + 1 } } } diff --git a/selfhost/emit_ecs.ludic b/selfhost/emit_ecs.ludic index 720ab12d..ff01e6c5 100644 --- a/selfhost/emit_ecs.ludic +++ b/selfhost/emit_ecs.ludic @@ -7,12 +7,12 @@ const MAX_ENT: int = 1024 fn has_ecs() -> bool { let i = 0 - while i < len(prog) { let k = prog[i].kind if k == N_COMP or k == N_SYS { return true } i = i + 1 } + while i < len(prog) { let k = prog[i].kind; if k == N_COMP or k == N_SYS { return true }; i = i + 1 } return false } fn has_systems() -> bool { let i = 0 - while i < len(prog) { if prog[i].kind == N_SYS { return true } i = i + 1 } + while i < len(prog) { if prog[i].kind == N_SYS { return true }; i = i + 1 } return false } @@ -32,7 +32,7 @@ fn emit_ecs_storage() -> void { emith(sconcat("%Cmp_", sconcat(c.s, " = type { "))) if len(c.kids) == 0 { emith("i32") } let f = 0 - while f < len(c.kids) { if f > 0 { emith(", ") } emith(llty(c.kids[f].ty)) f = f + 1 } + while f < len(c.kids) { if f > 0 { emith(", ") }; emith(llty(c.kids[f].ty)); f = f + 1 } emith(" }\n") emith(sconcat("@S_", sconcat(c.s, sconcat(" = internal global [", sconcat(me, sconcat(" x %Cmp_", sconcat(c.s, "] zeroinitializer\n"))))))) emith(sconcat("@H_", sconcat(c.s, sconcat(" = internal global [", sconcat(me, " x i8] zeroinitializer\n"))))) @@ -49,12 +49,12 @@ fn emit_ecs_allocator() -> void { while i < len(prog) { if prog[i].kind == N_COMP { let hn = sconcat("%h", itoa(i)) - emit(" ") emit(hn) emit(" = getelementptr inbounds [") emit(me) emit(" x i8], ptr @H_") emit(prog[i].s) emit(", i32 0, i32 %e\n") - emit(" store i8 0, ptr ") emit(hn) emit("\n") + emit(" "); emit(hn); emit(" = getelementptr inbounds ["); emit(me); emit(" x i8], ptr @H_"); emit(prog[i].s); emit(", i32 0, i32 %e\n") + emit(" store i8 0, ptr "); emit(hn); emit("\n") } i = i + 1 } - emit(" %k = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_kind, i32 0, i32 %e\n") + emit(" %k = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_kind, i32 0, i32 %e\n") emit(" store i32 0, ptr %k\n ret void\n}\n\n") emit("define i32 @L_alloc() {\nentry:\n") @@ -64,7 +64,7 @@ fn emit_ecs_allocator() -> void { emit("reuse:\n") emit(" %fn1 = sub i32 %fn, 1\n") emit(" store i32 %fn1, ptr @L_freen\n") - emit(" %fp = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_freelist, i32 0, i32 %fn1\n") + emit(" %fp = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_freelist, i32 0, i32 %fn1\n") emit(" %re = load i32, ptr %fp\n") emit(" br label %done\n") emit("fresh:\n") @@ -75,16 +75,16 @@ fn emit_ecs_allocator() -> void { emit("done:\n") emit(" %e = phi i32 [ %re, %reuse ], [ %ec, %fresh ]\n") emit(" call void @L_reset(i32 %e)\n") - emit(" %ap = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_alive, i32 0, i32 %e\n") + emit(" %ap = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_alive, i32 0, i32 %e\n") emit(" store i32 1, ptr %ap\n") emit(" ret i32 %e\n}\n\n") emit("define void @L_free_entity(i32 %e) {\nentry:\n") - emit(" %ap = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_alive, i32 0, i32 %e\n") + emit(" %ap = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_alive, i32 0, i32 %e\n") emit(" store i32 0, ptr %ap\n") emit(" call void @L_reset(i32 %e)\n") emit(" %fn = load i32, ptr @L_freen\n") - emit(" %fp = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_freelist, i32 0, i32 %fn\n") + emit(" %fp = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_freelist, i32 0, i32 %fn\n") emit(" store i32 %e, ptr %fp\n") emit(" %fn1 = add i32 %fn, 1\n") emit(" store i32 %fn1, ptr @L_freen\n") diff --git a/selfhost/emit_expr.ludic b/selfhost/emit_expr.ludic index 331abc86..5c483291 100644 --- a/selfhost/emit_expr.ludic +++ b/selfhost/emit_expr.ludic @@ -12,17 +12,17 @@ fn emit_logic(e: Node) -> Val { let la = emit_expr(e.a) let lc = emit_bind(sconcat("icmp ne i32 ", sconcat(la.code, ", 0"))) let lz = emit_bind(sconcat("zext i1 ", sconcat(lc, " to i32"))) - emit(" store i32 ") emit(lz) emit(", ptr ") emit(slot) emit("\n") - let ev = lbl("sc") let done = lbl("scend") - if streq(e.s, "and") { emit(" br i1 ") emit(lc) emit(", label %") emit(ev) emit(", label %") emit(done) emit("\n") } - else { emit(" br i1 ") emit(lc) emit(", label %") emit(done) emit(", label %") emit(ev) emit("\n") } - emit(ev) emit(":\n") + emit(" store i32 "); emit(lz); emit(", ptr "); emit(slot); emit("\n") + let ev = lbl("sc"); let done = lbl("scend") + if streq(e.s, "and") { emit(" br i1 "); emit(lc); emit(", label %"); emit(ev); emit(", label %"); emit(done); emit("\n") } + else { emit(" br i1 "); emit(lc); emit(", label %"); emit(done); emit(", label %"); emit(ev); emit("\n") } + emit(ev); emit(":\n") let rb = emit_expr(e.b) let rc = emit_bind(sconcat("icmp ne i32 ", sconcat(rb.code, ", 0"))) let rz = emit_bind(sconcat("zext i1 ", sconcat(rc, " to i32"))) - emit(" store i32 ") emit(rz) emit(", ptr ") emit(slot) emit("\n") - emit(" br label %") emit(done) emit("\n") - emit(done) emit(":\n") + emit(" store i32 "); emit(rz); emit(", ptr "); emit(slot); emit("\n") + emit(" br label %"); emit(done); emit("\n") + emit(done); emit(":\n") return val(emit_bind(sconcat("load i32, ptr ", slot)), "bool") } @@ -57,13 +57,13 @@ fn emit_bin(e: Node) -> Val { let b = emit_expr(e.b) let fx = streq(a.ty, "fixed") or streq(b.ty, "fixed") if is_cmp(e.s) { - let ac = a.code let bc = b.code - if fx { ac = to_fixed(a) bc = to_fixed(b) } + let ac = a.code; let bc = b.code + if fx { ac = to_fixed(a); bc = to_fixed(b) } let c = emit_bind(sconcat("icmp ", sconcat(cmp_code(e.s), sconcat(" i32 ", sconcat(ac, sconcat(", ", bc)))))) return val(emit_bind(sconcat("zext i1 ", sconcat(c, " to i32"))), "bool") } if fx { - let af = to_fixed(a) let bf = to_fixed(b) + let af = to_fixed(a); let bf = to_fixed(b) if streq(e.s, "*") { let a64 = emit_bind(sconcat("sext i32 ", sconcat(af, " to i64"))) let b64 = emit_bind(sconcat("sext i32 ", sconcat(bf, " to i64"))) @@ -87,16 +87,16 @@ fn emit_bin(e: Node) -> Val { fn emit_call(e: Node) -> Val { let name = e.a.s - if streq(name, "self") { if nself == 0 { return val("0", "entity") } return val(emit_bind(sconcat("load i32, ptr ", self_stk[nself - 1])), "entity") } + if streq(name, "self") { if nself == 0 { return val("0", "entity") }; return val(emit_bind(sconcat("load i32, ptr ", self_stk[nself - 1])), "entity") } if streq(name, "key") { return val(emit_bind("load i32, ptr @L_key"), "int") } - if streq(name, "save") { emit(" call void @L_save()\n") return val("0", "void") } - if streq(name, "ui_build") { emit(" call void @ui_build()\n") return val("0", "void") } + if streq(name, "save") { emit(" call void @L_save()\n"); return val("0", "void") } + if streq(name, "ui_build") { emit(" call void @ui_build()\n"); return val("0", "void") } if streq(name, "load") { return val(emit_bind("call i32 @L_load()"), "bool") } - if streq(name, "quit") { emit(" store i32 0, ptr @L_running\n") return val("0", "void") } + if streq(name, "quit") { emit(" store i32 0, ptr @L_running\n"); return val("0", "void") } if streq(name, "len") { return emit_len(e) } if streq(name, "push") { return emit_push(e) } - if streq(name, "fx") { let a = emit_expr(e.kids[0]) return val(emit_bind(sconcat("shl i32 ", sconcat(a.code, ", 16"))), "fixed") } - if streq(name, "flr") { let a = emit_expr(e.kids[0]) return val(emit_bind(sconcat("ashr i32 ", sconcat(a.code, ", 16"))), "int") } + if streq(name, "fx") { let a = emit_expr(e.kids[0]); return val(emit_bind(sconcat("shl i32 ", sconcat(a.code, ", 16"))), "fixed") } + if streq(name, "flr") { let a = emit_expr(e.kids[0]); return val(emit_bind(sconcat("ashr i32 ", sconcat(a.code, ", 16"))), "int") } if is_intrinsic(name) { return emit_intrinsic(name, e) } if is_intrinsic2(name) { return emit_intrinsic2(name, e) } if is_math_builtin(name) { return emit_math_builtin(name, e) } @@ -113,20 +113,19 @@ fn emit_call(e: Node) -> Val { let args = new []ptr let atys = new []ptr let i = 0 - while i < len(e.kids) { let v = emit_expr(e.kids[i]) push(args, v.code) push(atys, v.ty) i = i + 1 } + while i < len(e.kids) { let v = emit_expr(e.kids[i]); push(args, v.code); push(atys, v.ty); i = i + 1 } let rl = llty(fn2.ty) emit(" ") let rreg = "0" - if not streq(rl, "void") { rreg = nreg() emit(rreg) emit(" = ") } - emit("call ") emit(rl) emit(" @fn_") emit(cname) emit("(") + if not streq(rl, "void") { rreg = nreg(); emit(rreg); emit(" = ") } + emit("call "); emit(rl); emit(" @fn_"); emit(cname); emit("(") i = 0 while i < len(args) { if i > 0 { emit(", ") } - emit(llty(atys[i])) emit(" ") emit(args[i]) + emit(llty(atys[i])); emit(" "); emit(args[i]) i = i + 1 } - emit(") -") + emit(")\n") return val(rreg, fn2.ty) } @@ -153,8 +152,14 @@ fn emit_expr(e: Node) -> Val { if is_ui_ident(e.s) { return val(itoa(ui_index_of(e.s)), "int") } perr(sconcat("unknown identifier ", e.s)) } - if e.kind == E_MEMBER { let a = emit_member_addr(e) return emit_load_at(a, g_addr_ty) } - if e.kind == E_INDEX { let a = emit_index_addr(e) return emit_load_at(a, g_addr_ty) } + if e.kind == E_MEMBER { + if e.a.kind == E_ID { # `Enum.Variant` -> its ordinal, a compile-time int + let ord = enum_ordinal(e.a.s, e.s) + if ord >= 0 { return val(itoa(ord), "int") } + } + let a = emit_member_addr(e); return emit_load_at(a, g_addr_ty) + } + if e.kind == E_INDEX { let a = emit_index_addr(e); return emit_load_at(a, g_addr_ty) } if e.kind == E_CALL { return emit_call(e) } if e.kind == E_BIN { return emit_bin(e) } if e.kind == E_UN { diff --git a/selfhost/emit_game.ludic b/selfhost/emit_game.ludic index 15fed507..e9a43f62 100644 --- a/selfhost/emit_game.ludic +++ b/selfhost/emit_game.ludic @@ -4,7 +4,7 @@ # called only when the runtime defines them. fn emit_system_fn(sys: Node) -> void { - ll_t = 0 ll_lbl = 0 g_term = false loc_reset() nloop = 0 nself = 0 + ll_t = 0; ll_lbl = 0; g_term = false; loc_reset(); nloop = 0; nself = 0 ret_ty = "void" let fbody = buf_new() falloc = buf_new() @@ -14,7 +14,7 @@ fn emit_system_fn(sys: Node) -> void { if not g_term { emit(" br label %ret\n") } emit("ret:\n ret void\n") code = saved - emit("define void @sys_") emit(sys.s) emit("() {\nentry:\n") + emit("define void @sys_"); emit(sys.s); emit("() {\nentry:\n") emit(buf_str(falloc)) emit(buf_str(fbody)) emit("}\n\n") @@ -24,7 +24,7 @@ fn emit_calls_for_phase(phase: ptr) -> void { let i = 0 while i < len(prog) { let d = prog[i] - if d.kind == N_SYS and streq(d.ty, phase) { emit(" call void @sys_") emit(d.s) emit("()\n") } + if d.kind == N_SYS and streq(d.ty, phase) { emit(" call void @sys_"); emit(d.s); emit("()\n") } i = i + 1 } } @@ -32,7 +32,7 @@ fn emit_calls_for_phase(phase: ptr) -> void { fn emit_game_main() -> void { # every system becomes a function first let i = 0 - while i < len(prog) { if prog[i].kind == N_SYS { emit_system_fn(prog[i]) } i = i + 1 } + while i < len(prog) { if prog[i].kind == N_SYS { emit_system_fn(prog[i]) }; i = i + 1 } emit("define i32 @main(i32 %argc, ptr %argv) {\nentry:\n") emit(" store i32 %argc, ptr @L_argc\n") @@ -47,14 +47,14 @@ fn emit_game_main() -> void { let pr = emit_bind("call i32 @fn_rt_running()") let pc = emit_bind(sconcat("icmp ne i32 ", sconcat(pr, ", 0"))) let go = emit_bind(sconcat("and i1 ", sconcat(rc, sconcat(", ", pc)))) - emit(" br i1 ") emit(go) emit(", label %body, label %done\n") + emit(" br i1 "); emit(go); emit(", label %body, label %done\n") } else { - emit(" br i1 ") emit(rc) emit(", label %body, label %done\n") + emit(" br i1 "); emit(rc); emit(", label %body, label %done\n") } emit("body:\n") if not ptr_is_null(find_fn("rt_poll")) { let k = emit_bind("call i32 @fn_rt_poll()") - emit(" store i32 ") emit(k) emit(", ptr @L_key\n") + emit(" store i32 "); emit(k); emit(", ptr @L_key\n") } emit_calls_for_phase("Input") emit_calls_for_phase("FixedUpdate") diff --git a/selfhost/emit_head.ludic b/selfhost/emit_head.ludic index 0d33c28d..b122af03 100644 --- a/selfhost/emit_head.ludic +++ b/selfhost/emit_head.ludic @@ -1,15 +1,15 @@ # emit_head.ludic — string constants and the module header (libc declarations, # the slice header type, struct layouts, globals, argv, format strings). -fn hexdig(n: int) -> int { if n < 10 { return 48 + n } return 55 + n } # 0-9 A-F +fn hexdig(n: int) -> int { if n < 10 { return 48 + n }; return 55 + n } # 0-9 A-F # emit `@.strN = ... c"escaped\00"` and return its name; % and non-print -> \XX fn emit_str_const(s: ptr) -> ptr { let name = sconcat("@.str", itoa(ll_str)) ll_str = ll_str + 1 let n = slen(s) - emith(name) emith(" = private unnamed_addr constant [") - emith(itoa(n + 1)) emith(" x i8] c\"") + emith(name); emith(" = private unnamed_addr constant [") + emith(itoa(n + 1)); emith(" x i8] c\"") let i = 0 while i < n { let c = peek8(s, i) @@ -27,14 +27,14 @@ fn emit_str_const(s: ptr) -> ptr { # a fresh SSA register bound to a `getelementptr`, returned as its name fn emit_gep_i8(base: ptr, idx: ptr) -> ptr { let r = nreg() - emit(" ") emit(r) emit(" = getelementptr inbounds i8, ptr ") - emit(base) emit(", i32 ") emit(idx) emit("\n") + emit(" "); emit(r); emit(" = getelementptr inbounds i8, ptr ") + emit(base); emit(", i32 "); emit(idx); emit("\n") return r } # the constant initializer for a global var: a literal, or 0/null fn global_init(d: Node) -> ptr { - if ptr_is_null(d.a) { if streq(llty(d.ty), "ptr") { return "null" } return "0" } + if ptr_is_null(d.a) { if streq(llty(d.ty), "ptr") { return "null" }; return "0" } let e = d.a if e.kind == E_INT or e.kind == E_FLOAT or e.kind == E_BOOL { return itoa(e.ival) } if e.kind == E_UN and streq(e.s, "-") and e.a.kind == E_INT { return sconcat("-", itoa(e.a.ival)) } @@ -74,14 +74,14 @@ fn emit_header() -> void { emith("@L_argc = internal global i32 0\n") emith("@L_argv = internal global ptr null\n") emith("@.gametitle = private unnamed_addr constant [") - emith(itoa(slen(g_game_name) + 1)) emith(" x i8] c\"") emith(g_game_name) emith("\\00\"\n") + emith(itoa(slen(g_game_name) + 1)); emith(" x i8] c\""); emith(g_game_name); emith("\\00\"\n") emith("%LSlice = type { ptr, i32, i32 }\n") # struct layouts let i = 0 while i < len(prog) { let d = prog[i] if d.kind == N_STRUCT { - emith("%Str_") emith(d.s) emith(" = type { ") + emith("%Str_"); emith(d.s); emith(" = type { ") if len(d.kids) == 0 { emith("i32") } let f = 0 while f < len(d.kids) { @@ -98,8 +98,8 @@ fn emit_header() -> void { while i < len(prog) { let d = prog[i] if d.kind == N_VAR { - emith("@g_") emith(d.s) emith(" = internal global ") - emith(llty(d.ty)) emith(" ") + emith("@g_"); emith(d.s); emith(" = internal global ") + emith(llty(d.ty)); emith(" ") emith(global_init(d)) emith("\n") } diff --git a/selfhost/emit_intrin.ludic b/selfhost/emit_intrin.ludic index 13e530eb..fc7ca4cb 100644 --- a/selfhost/emit_intrin.ludic +++ b/selfhost/emit_intrin.ludic @@ -19,9 +19,9 @@ fn is_intrinsic(name: ptr) -> bool { return false } # emit " = \n" and return r -fn emit_bind(rest: ptr) -> ptr { let r = nreg() emit(" ") emit(r) emit(" = ") emit(rest) emit("\n") return r } +fn emit_bind(rest: ptr) -> ptr { let r = nreg(); emit(" "); emit(r); emit(" = "); emit(rest); emit("\n"); return r } -fn arg_code(e: Node, i: int) -> ptr { let v = emit_expr(e.kids[i]) return v.code } +fn arg_code(e: Node, i: int) -> ptr { let v = emit_expr(e.kids[i]); return v.code } fn emit_intrinsic(name: ptr, e: Node) -> Val { g_intrin_ok = true @@ -32,21 +32,21 @@ fn emit_intrinsic(name: ptr, e: Node) -> Val { return val(emit_bind(sconcat("call ptr @malloc(i64 ", sconcat(w, ")"))), "ptr") } if streq(name, "mem_realloc") { - let p = arg_code(e, 0) let n = arg_code(e, 1) + let p = arg_code(e, 0); let n = arg_code(e, 1) let w = emit_bind(sconcat("zext i32 ", sconcat(n, " to i64"))) return val(emit_bind(sconcat("call ptr @realloc(ptr ", sconcat(p, sconcat(", i64 ", sconcat(w, ")"))))), "ptr") } if streq(name, "peek8") { - let p = arg_code(e, 0) let i = arg_code(e, 1) + let p = arg_code(e, 0); let i = arg_code(e, 1) let a = emit_gep_i8(p, i) let b = emit_bind(sconcat("load i8, ptr ", a)) return val(emit_bind(sconcat("zext i8 ", sconcat(b, " to i32"))), "int") } if streq(name, "poke8") { - let p = arg_code(e, 0) let i = arg_code(e, 1) let v = arg_code(e, 2) + let p = arg_code(e, 0); let i = arg_code(e, 1); let v = arg_code(e, 2) let a = emit_gep_i8(p, i) let t = emit_bind(sconcat("trunc i32 ", sconcat(v, " to i8"))) - emit(" store i8 ") emit(t) emit(", ptr ") emit(a) emit("\n") + emit(" store i8 "); emit(t); emit(", ptr "); emit(a); emit("\n") return val("0", "void") } if streq(name, "ptr_is_null") { @@ -55,11 +55,11 @@ fn emit_intrinsic(name: ptr, e: Node) -> Val { return val(emit_bind(sconcat("zext i1 ", sconcat(c, " to i32"))), "bool") } if streq(name, "file_open") { - let p = arg_code(e, 0) let m = arg_code(e, 1) + let p = arg_code(e, 0); let m = arg_code(e, 1) return val(emit_bind(sconcat("call ptr @fopen(ptr ", sconcat(p, sconcat(", ptr ", sconcat(m, ")"))))), "ptr") } if streq(name, "file_read") or streq(name, "file_write") { - let f = arg_code(e, 0) let b = arg_code(e, 1) let n = arg_code(e, 2) + let f = arg_code(e, 0); let b = arg_code(e, 1); let n = arg_code(e, 2) let w = emit_bind(sconcat("zext i32 ", sconcat(n, " to i64"))) let fn2 = "@fread" if streq(name, "file_write") { fn2 = "@fwrite" } @@ -67,7 +67,7 @@ fn emit_intrinsic(name: ptr, e: Node) -> Val { return val(emit_bind(sconcat("trunc i64 ", sconcat(r, " to i32"))), "int") } if streq(name, "file_seek") { - let f = arg_code(e, 0) let off = arg_code(e, 1) let wh = arg_code(e, 2) + let f = arg_code(e, 0); let off = arg_code(e, 1); let wh = arg_code(e, 2) let o = emit_bind(sconcat("sext i32 ", sconcat(off, " to i64"))) return val(emit_bind(sconcat("call i32 @fseek(ptr ", sconcat(f, sconcat(", i64 ", sconcat(o, sconcat(", i32 ", sconcat(wh, ")"))))))), "int") } @@ -78,17 +78,17 @@ fn emit_intrinsic(name: ptr, e: Node) -> Val { } if streq(name, "file_close") { let f = arg_code(e, 0) - emit(" call i32 @fclose(ptr ") emit(f) emit(")\n") + emit(" call i32 @fclose(ptr "); emit(f); emit(")\n") return val("0", "void") } if streq(name, "print_str") { let s = arg_code(e, 0) - emit(" call i32 (ptr, ...) @printf(ptr @.fmt_str, ptr ") emit(s) emit(")\n") + emit(" call i32 (ptr, ...) @printf(ptr @.fmt_str, ptr "); emit(s); emit(")\n") return val("0", "void") } if streq(name, "print_int") { let n = arg_code(e, 0) - emit(" call i32 (ptr, ...) @printf(ptr @.fmt_int, i32 ") emit(n) emit(")\n") + emit(" call i32 (ptr, ...) @printf(ptr @.fmt_int, i32 "); emit(n); emit(")\n") return val("0", "void") } if streq(name, "os_argc") { return val(emit_bind("load i32, ptr @L_argc"), "int") } @@ -100,7 +100,7 @@ fn emit_intrinsic(name: ptr, e: Node) -> Val { } if streq(name, "os_exit") { let n = arg_code(e, 0) - emit(" call void @exit(i32 ") emit(n) emit(")\n") + emit(" call void @exit(i32 "); emit(n); emit(")\n") emit(" unreachable\n") g_term = true return val("0", "void") @@ -114,9 +114,9 @@ fn emit_intrinsic(name: ptr, e: Node) -> Val { let n = arg_code(e, 0) return val(emit_bind(sconcat("call ptr @getenv(ptr ", sconcat(n, ")"))), "str") } - if streq(name, "bnot") { let a = arg_code(e, 0) return val(emit_bind(sconcat("xor i32 ", sconcat(a, ", -1"))), "int") } + if streq(name, "bnot") { let a = arg_code(e, 0); return val(emit_bind(sconcat("xor i32 ", sconcat(a, ", -1"))), "int") } if streq(name,"shl") or streq(name,"shr") or streq(name,"band") or streq(name,"bor") or streq(name,"bxor") { - let a = arg_code(e, 0) let b = arg_code(e, 1) + let a = arg_code(e, 0); let b = arg_code(e, 1) let opc = "shl" if streq(name,"shr") { opc = "lshr" } if streq(name,"band") { opc = "and" } @@ -125,16 +125,16 @@ fn emit_intrinsic(name: ptr, e: Node) -> Val { return val(emit_bind(sconcat(opc, sconcat(" i32 ", sconcat(a, sconcat(", ", b))))), "int") } if streq(name, "peek32") { - let p = arg_code(e, 0) let i = arg_code(e, 1) + let p = arg_code(e, 0); let i = arg_code(e, 1) let g = nreg() - emit(" ") emit(g) emit(" = getelementptr inbounds i32, ptr ") emit(p) emit(", i32 ") emit(i) emit("\n") + emit(" "); emit(g); emit(" = getelementptr inbounds i32, ptr "); emit(p); emit(", i32 "); emit(i); emit("\n") return val(emit_bind(sconcat("load i32, ptr ", g)), "int") } if streq(name, "poke32") { - let p = arg_code(e, 0) let i = arg_code(e, 1) let v = arg_code(e, 2) + let p = arg_code(e, 0); let i = arg_code(e, 1); let v = arg_code(e, 2) let g = nreg() - emit(" ") emit(g) emit(" = getelementptr inbounds i32, ptr ") emit(p) emit(", i32 ") emit(i) emit("\n") - emit(" store i32 ") emit(v) emit(", ptr ") emit(g) emit("\n") + emit(" "); emit(g); emit(" = getelementptr inbounds i32, ptr "); emit(p); emit(", i32 "); emit(i); emit("\n") + emit(" store i32 "); emit(v); emit(", ptr "); emit(g); emit("\n") return val("0", "void") } g_intrin_ok = false diff --git a/selfhost/emit_intrin2.ludic b/selfhost/emit_intrin2.ludic index f1d6a636..ddfa0e2c 100644 --- a/selfhost/emit_intrin2.ludic +++ b/selfhost/emit_intrin2.ludic @@ -18,29 +18,29 @@ fn is_intrinsic2(name: ptr) -> bool { fn emit_intrinsic2(name: ptr, e: Node) -> Val { if streq(name, "mem_free") { - let p = arg_code(e, 0) emit(" call void @free(ptr ") emit(p) emit(")\n") return val("0", "void") + let p = arg_code(e, 0); emit(" call void @free(ptr "); emit(p); emit(")\n"); return val("0", "void") } if streq(name, "mem_copy") { - let d = arg_code(e, 0) let s = arg_code(e, 1) let n = arg_code(e, 2) + let d = arg_code(e, 0); let s = arg_code(e, 1); let n = arg_code(e, 2) let w = emit_bind(sconcat("zext i32 ", sconcat(n, " to i64"))) - emit(" call ptr @memcpy(ptr ") emit(d) emit(", ptr ") emit(s) emit(", i64 ") emit(w) emit(")\n") + emit(" call ptr @memcpy(ptr "); emit(d); emit(", ptr "); emit(s); emit(", i64 "); emit(w); emit(")\n") return val("0", "void") } if streq(name, "mem_set") { - let p = arg_code(e, 0) let v = arg_code(e, 1) let n = arg_code(e, 2) + let p = arg_code(e, 0); let v = arg_code(e, 1); let n = arg_code(e, 2) let w = emit_bind(sconcat("zext i32 ", sconcat(n, " to i64"))) - emit(" call ptr @memset(ptr ") emit(p) emit(", i32 ") emit(v) emit(", i64 ") emit(w) emit(")\n") + emit(" call ptr @memset(ptr "); emit(p); emit(", i32 "); emit(v); emit(", i64 "); emit(w); emit(")\n") return val("0", "void") } if streq(name, "ptr_add") { - let p = arg_code(e, 0) let n = arg_code(e, 1) + let p = arg_code(e, 0); let n = arg_code(e, 1) let g = nreg() - emit(" ") emit(g) emit(" = getelementptr inbounds i8, ptr ") emit(p) emit(", i32 ") emit(n) emit("\n") + emit(" "); emit(g); emit(" = getelementptr inbounds i8, ptr "); emit(p); emit(", i32 "); emit(n); emit("\n") return val(g, "ptr") } if streq(name, "read_byte") { return val(emit_bind("call i32 @getchar()"), "int") } if streq(name, "write_byte") { - let v = arg_code(e, 0) emit(" call i32 @putchar(i32 ") emit(v) emit(")\n") return val("0", "void") + let v = arg_code(e, 0); emit(" call i32 @putchar(i32 "); emit(v); emit(")\n"); return val("0", "void") } if streq(name, "str_len") { let s = arg_code(e, 0) @@ -52,44 +52,44 @@ fn emit_intrinsic2(name: ptr, e: Node) -> Val { return val(emit_bind(sconcat("trunc i64 ", sconcat(r, " to i32"))), "int") } if streq(name, "peekf") { - let p = arg_code(e, 0) let i = arg_code(e, 1) - let g = nreg() emit(" ") emit(g) emit(" = getelementptr inbounds i32, ptr ") emit(p) emit(", i32 ") emit(i) emit("\n") + let p = arg_code(e, 0); let i = arg_code(e, 1) + let g = nreg(); emit(" "); emit(g); emit(" = getelementptr inbounds i32, ptr "); emit(p); emit(", i32 "); emit(i); emit("\n") return val(emit_bind(sconcat("load i32, ptr ", g)), "fixed") } if streq(name, "pokef") { - let p = arg_code(e, 0) let i = arg_code(e, 1) let v = arg_code(e, 2) - let g = nreg() emit(" ") emit(g) emit(" = getelementptr inbounds i32, ptr ") emit(p) emit(", i32 ") emit(i) emit("\n") - emit(" store i32 ") emit(v) emit(", ptr ") emit(g) emit("\n") + let p = arg_code(e, 0); let i = arg_code(e, 1); let v = arg_code(e, 2) + let g = nreg(); emit(" "); emit(g); emit(" = getelementptr inbounds i32, ptr "); emit(p); emit(", i32 "); emit(i); emit("\n") + emit(" store i32 "); emit(v); emit(", ptr "); emit(g); emit("\n") return val("0", "void") } if streq(name, "peekp") { - let p = arg_code(e, 0) let i = arg_code(e, 1) - let g = nreg() emit(" ") emit(g) emit(" = getelementptr inbounds ptr, ptr ") emit(p) emit(", i32 ") emit(i) emit("\n") + let p = arg_code(e, 0); let i = arg_code(e, 1) + let g = nreg(); emit(" "); emit(g); emit(" = getelementptr inbounds ptr, ptr "); emit(p); emit(", i32 "); emit(i); emit("\n") return val(emit_bind(sconcat("load ptr, ptr ", g)), "ptr") } if streq(name, "pokep") { - let p = arg_code(e, 0) let i = arg_code(e, 1) let v = arg_code(e, 2) - let g = nreg() emit(" ") emit(g) emit(" = getelementptr inbounds ptr, ptr ") emit(p) emit(", i32 ") emit(i) emit("\n") - emit(" store ptr ") emit(v) emit(", ptr ") emit(g) emit("\n") + let p = arg_code(e, 0); let i = arg_code(e, 1); let v = arg_code(e, 2) + let g = nreg(); emit(" "); emit(g); emit(" = getelementptr inbounds ptr, ptr "); emit(p); emit(", i32 "); emit(i); emit("\n") + emit(" store ptr "); emit(v); emit(", ptr "); emit(g); emit("\n") return val("0", "void") } - if streq(name, "as_fixed") { let a = emit_expr(e.kids[0]) return val(a.code, "fixed") } - if streq(name, "as_int") { let a = emit_expr(e.kids[0]) return val(a.code, "int") } - if streq(name, "is_windowed") { if g_windowed { return val("1", "bool") } return val("0", "bool") } + if streq(name, "as_fixed") { let a = emit_expr(e.kids[0]); return val(a.code, "fixed") } + if streq(name, "as_int") { let a = emit_expr(e.kids[0]); return val(a.code, "int") } + if streq(name, "is_windowed") { if g_windowed { return val("1", "bool") }; return val("0", "bool") } if streq(name, "game_title") { return val("@.gametitle", "str") } # windowing hooks — declared external; only reached on the is_windowed() branch if streq(name, "win_poll") { return val(emit_bind("call i32 @win_poll()"), "int") } if streq(name, "win_running") { return val(emit_bind("call i32 @win_running()"), "bool") } if streq(name, "win_open") { - let a = arg_code(e, 0) let b = arg_code(e, 1) let c = arg_code(e, 2) let d = arg_code(e, 3) - emit(" call void @win_open(i32 ") emit(a) emit(", i32 ") emit(b) emit(", i32 ") emit(c) emit(", ptr ") emit(d) emit(")\n") + let a = arg_code(e, 0); let b = arg_code(e, 1); let c = arg_code(e, 2); let d = arg_code(e, 3) + emit(" call void @win_open(i32 "); emit(a); emit(", i32 "); emit(b); emit(", i32 "); emit(c); emit(", ptr "); emit(d); emit(")\n") return val("0", "void") } if streq(name, "win_present") { - let a = arg_code(e, 0) let b = arg_code(e, 1) let c = arg_code(e, 2) - emit(" call void @win_present(ptr ") emit(a) emit(", i32 ") emit(b) emit(", i32 ") emit(c) emit(")\n") + let a = arg_code(e, 0); let b = arg_code(e, 1); let c = arg_code(e, 2) + emit(" call void @win_present(ptr "); emit(a); emit(", i32 "); emit(b); emit(", i32 "); emit(c); emit(")\n") return val("0", "void") } - if streq(name, "win_close") { emit(" call void @win_close()\n") return val("0", "void") } + if streq(name, "win_close") { emit(" call void @win_close()\n"); return val("0", "void") } return val("0", "void") } diff --git a/selfhost/emit_machine.ludic b/selfhost/emit_machine.ludic index 85ab1e33..17aee361 100644 --- a/selfhost/emit_machine.ludic +++ b/selfhost/emit_machine.ludic @@ -13,16 +13,16 @@ fn emit_machine(st: Node) -> void { let state = st.kids[i] let v = emit_expr(state.b) let c = emit_bind(sconcat("icmp eq i32 ", sconcat(s, sconcat(", ", v.code)))) - let body = lbl("sbody") let nxt = lbl("sarm") - emit(" br i1 ") emit(c) emit(", label %") emit(body) emit(", label %") emit(nxt) emit("\n") - emit(body) emit(":\n") g_term = false + let body = lbl("sbody"); let nxt = lbl("sarm") + emit(" br i1 "); emit(c); emit(", label %"); emit(body); emit(", label %"); emit(nxt); emit("\n") + emit(body); emit(":\n"); g_term = false emit_block(state.a) - if not g_term { emit(" br label %") emit(endl) emit("\n") } - emit(nxt) emit(":\n") g_term = false + if not g_term { emit(" br label %"); emit(endl); emit("\n") } + emit(nxt); emit(":\n"); g_term = false i = i + 1 } - if not g_term { emit(" br label %") emit(endl) emit("\n") } - emit(endl) emit(":\n") g_term = false + if not g_term { emit(" br label %"); emit(endl); emit("\n") } + emit(endl); emit(":\n"); g_term = false nmach = nmach - 1 } @@ -31,9 +31,9 @@ fn emit_become(st: Node) -> void { let m = mach_stk[nmach - 1] let target: Node = ptr_null() let i = 0 - while i < len(m.kids) { if streq(m.kids[i].s, st.s) { target = m.kids[i] } i = i + 1 } + while i < len(m.kids) { if streq(m.kids[i].s, st.s) { target = m.kids[i] }; i = i + 1 } if ptr_is_null(target) { perr(sconcat("become: no state ", st.s)) } let regv = emit_expr(m.a) let sv = emit_expr(target.b) - emit(" call void @fn_rt_setreg(i32 ") emit(regv.code) emit(", i32 ") emit(sv.code) emit(")\n") + emit(" call void @fn_rt_setreg(i32 "); emit(regv.code); emit(", i32 "); emit(sv.code); emit(")\n") } diff --git a/selfhost/emit_math.ludic b/selfhost/emit_math.ludic index 00462c0a..bab998f4 100644 --- a/selfhost/emit_math.ludic +++ b/selfhost/emit_math.ludic @@ -14,14 +14,14 @@ fn emit_math_builtin(name: ptr, e: Node) -> Val { return val(emit_bind(sconcat("select i1 ", sconcat(c, sconcat(", i32 ", sconcat(n, sconcat(", i32 ", a.code)))))), "int") } if streq(name, "min") or streq(name, "max") { - let a = emit_expr(e.kids[0]) let b = emit_expr(e.kids[1]) + let a = emit_expr(e.kids[0]); let b = emit_expr(e.kids[1]) let op = "slt" if streq(name, "max") { op = "sgt" } let c = emit_bind(sconcat("icmp ", sconcat(op, sconcat(" i32 ", sconcat(a.code, sconcat(", ", b.code)))))) return val(emit_bind(sconcat("select i1 ", sconcat(c, sconcat(", i32 ", sconcat(a.code, sconcat(", i32 ", b.code)))))), "int") } # clamp(v, lo, hi) = max(lo, min(v, hi)) - let v = emit_expr(e.kids[0]) let lo = emit_expr(e.kids[1]) let hi = emit_expr(e.kids[2]) + let v = emit_expr(e.kids[0]); let lo = emit_expr(e.kids[1]); let hi = emit_expr(e.kids[2]) let c1 = emit_bind(sconcat("icmp slt i32 ", sconcat(v.code, sconcat(", ", hi.code)))) let t = emit_bind(sconcat("select i1 ", sconcat(c1, sconcat(", i32 ", sconcat(v.code, sconcat(", i32 ", hi.code)))))) let c2 = emit_bind(sconcat("icmp sgt i32 ", sconcat(lo.code, sconcat(", ", t)))) diff --git a/selfhost/emit_new.ludic b/selfhost/emit_new.ludic index 7f139f19..14ef7842 100644 --- a/selfhost/emit_new.ludic +++ b/selfhost/emit_new.ludic @@ -16,13 +16,13 @@ fn emit_new_struct(name: ptr) -> Val { while f < len(s.kids) { let fd = s.kids[f] let addr = nreg() - emit(" ") emit(addr) emit(" = getelementptr inbounds %Str_") emit(name) - emit(", ptr ") emit(obj) emit(", i32 0, i32 ") emit(itoa(f)) emit("\n") + emit(" "); emit(addr); emit(" = getelementptr inbounds %Str_"); emit(name) + emit(", ptr "); emit(obj); emit(", i32 0, i32 "); emit(itoa(f)); emit("\n") let lt = llty(fd.ty) let v = "0" if streq(lt, "ptr") { v = "null" } - if not ptr_is_null(fd.a) { let dv = emit_expr(fd.a) v = dv.code } - emit(" store ") emit(lt) emit(" ") emit(v) emit(", ptr ") emit(addr) emit("\n") + if not ptr_is_null(fd.a) { let dv = emit_expr(fd.a); v = dv.code } + emit(" store "); emit(lt); emit(" "); emit(v); emit(", ptr "); emit(addr); emit("\n") f = f + 1 } return val(obj, name) @@ -31,19 +31,19 @@ fn emit_new_struct(name: ptr) -> Val { fn emit_new_slice(ty: ptr) -> Val { let sz = emit_sizeof("%LSlice") let h = emit_bind(sconcat("call ptr @malloc(i64 ", sconcat(sz, ")"))) - let d0 = nreg() emit(" ") emit(d0) emit(" = getelementptr inbounds %LSlice, ptr ") emit(h) emit(", i32 0, i32 0\n") - emit(" store ptr null, ptr ") emit(d0) emit("\n") - let d1 = nreg() emit(" ") emit(d1) emit(" = getelementptr inbounds %LSlice, ptr ") emit(h) emit(", i32 0, i32 1\n") - emit(" store i32 0, ptr ") emit(d1) emit("\n") - let d2 = nreg() emit(" ") emit(d2) emit(" = getelementptr inbounds %LSlice, ptr ") emit(h) emit(", i32 0, i32 2\n") - emit(" store i32 0, ptr ") emit(d2) emit("\n") + let d0 = nreg(); emit(" "); emit(d0); emit(" = getelementptr inbounds %LSlice, ptr "); emit(h); emit(", i32 0, i32 0\n") + emit(" store ptr null, ptr "); emit(d0); emit("\n") + let d1 = nreg(); emit(" "); emit(d1); emit(" = getelementptr inbounds %LSlice, ptr "); emit(h); emit(", i32 0, i32 1\n") + emit(" store i32 0, ptr "); emit(d1); emit("\n") + let d2 = nreg(); emit(" "); emit(d2); emit(" = getelementptr inbounds %LSlice, ptr "); emit(h); emit(", i32 0, i32 2\n") + emit(" store i32 0, ptr "); emit(d2); emit("\n") return val(h, ty) } fn slice_field(h: ptr, i: int) -> ptr { let r = nreg() - emit(" ") emit(r) emit(" = getelementptr inbounds %LSlice, ptr ") emit(h) - emit(", i32 0, i32 ") emit(itoa(i)) emit("\n") + emit(" "); emit(r); emit(" = getelementptr inbounds %LSlice, ptr "); emit(h) + emit(", i32 0, i32 "); emit(itoa(i)); emit("\n") return r } @@ -58,13 +58,13 @@ fn emit_push(e: Node) -> Val { let el = slice_elem(s.ty) let elt = llty(el) let h = s.code - let lp = slice_field(h, 1) let cp = slice_field(h, 2) let dp = slice_field(h, 0) + let lp = slice_field(h, 1); let cp = slice_field(h, 2); let dp = slice_field(h, 0) let l = emit_bind(sconcat("load i32, ptr ", lp)) let c = emit_bind(sconcat("load i32, ptr ", cp)) let full = emit_bind(sconcat("icmp sge i32 ", sconcat(l, sconcat(", ", c)))) - let grow = lbl("grow") let put = lbl("put") - emit(" br i1 ") emit(full) emit(", label %") emit(grow) emit(", label %") emit(put) emit("\n") - emit(grow) emit(":\n") + let grow = lbl("grow"); let put = lbl("put") + emit(" br i1 "); emit(full); emit(", label %"); emit(grow); emit(", label %"); emit(put); emit("\n") + emit(grow); emit(":\n") let dbl = emit_bind(sconcat("mul i32 ", sconcat(c, ", 2"))) let isz = emit_bind(sconcat("icmp eq i32 ", sconcat(c, ", 0"))) let nc = emit_bind(sconcat("select i1 ", sconcat(isz, sconcat(", i32 8, i32 ", dbl)))) @@ -73,16 +73,16 @@ fn emit_push(e: Node) -> Val { let bytes = emit_bind(sconcat("mul i64 ", sconcat(ncw, sconcat(", ", esz)))) let old = emit_bind(sconcat("load ptr, ptr ", dp)) let nd = emit_bind(sconcat("call ptr @realloc(ptr ", sconcat(old, sconcat(", i64 ", sconcat(bytes, ")"))))) - emit(" store ptr ") emit(nd) emit(", ptr ") emit(dp) emit("\n") - emit(" store i32 ") emit(nc) emit(", ptr ") emit(cp) emit("\n") - emit(" br label %") emit(put) emit("\n") - emit(put) emit(":\n") + emit(" store ptr "); emit(nd); emit(", ptr "); emit(dp); emit("\n") + emit(" store i32 "); emit(nc); emit(", ptr "); emit(cp); emit("\n") + emit(" br label %"); emit(put); emit("\n") + emit(put); emit(":\n") let v = emit_expr(e.kids[1]) let data = emit_bind(sconcat("load ptr, ptr ", dp)) let slot = nreg() - emit(" ") emit(slot) emit(" = getelementptr inbounds ") emit(elt) emit(", ptr ") emit(data) emit(", i32 ") emit(l) emit("\n") - emit(" store ") emit(elt) emit(" ") emit(v.code) emit(", ptr ") emit(slot) emit("\n") + emit(" "); emit(slot); emit(" = getelementptr inbounds "); emit(elt); emit(", ptr "); emit(data); emit(", i32 "); emit(l); emit("\n") + emit(" store "); emit(elt); emit(" "); emit(v.code); emit(", ptr "); emit(slot); emit("\n") let l1 = emit_bind(sconcat("add i32 ", sconcat(l, ", 1"))) - emit(" store i32 ") emit(l1) emit(", ptr ") emit(lp) emit("\n") + emit(" store i32 "); emit(l1); emit(", ptr "); emit(lp); emit("\n") return val("0", "void") } diff --git a/selfhost/emit_query.ludic b/selfhost/emit_query.ludic index 8a5931ff..6686f49c 100644 --- a/selfhost/emit_query.ludic +++ b/selfhost/emit_query.ludic @@ -3,8 +3,8 @@ # the body once per match. Mirrors ll_query in compiler/back/ir_ecs.c. fn find_arch_id(name: ptr) -> int { - let i = 0 let n = 1 - while i < len(prog) { if prog[i].kind == N_ARCH { if streq(prog[i].s, name) { return n } n = n + 1 } i = i + 1 } + let i = 0; let n = 1 + while i < len(prog) { if prog[i].kind == N_ARCH { if streq(prog[i].s, name) { return n }; n = n + 1 }; i = i + 1 } return 0 } @@ -15,22 +15,22 @@ fn emit_query(st: Node) -> void { if nself < len(self_stk) { self_stk[nself] = ip } else { push(self_stk, ip) } nself = nself + 1 - let cond = lbl("qcond") let body = lbl("qbody") let nxt = lbl("qnext") let endl = lbl("qend") - emit(" br label %") emit(cond) emit("\n") - emit(cond) emit(":\n") + let cond = lbl("qcond"); let body = lbl("qbody"); let nxt = lbl("qnext"); let endl = lbl("qend") + emit(" br label %"); emit(cond); emit("\n") + emit(cond); emit(":\n") let i0 = emit_bind(sconcat("load i32, ptr ", ip)) let ec = emit_bind("load i32, ptr @L_entc") let lt = emit_bind(sconcat("icmp slt i32 ", sconcat(i0, sconcat(", ", ec)))) - emit(" br i1 ") emit(lt) emit(", label %") emit(body) emit(", label %") emit(endl) emit("\n") - emit(body) emit(":\n") g_term = false + emit(" br i1 "); emit(lt); emit(", label %"); emit(body); emit(", label %"); emit(endl); emit("\n") + emit(body); emit(":\n"); g_term = false let i1 = emit_bind(sconcat("load i32, ptr ", ip)) # alive? - let ap = nreg() emit(" ") emit(ap) emit(" = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_alive, i32 0, i32 ") emit(i1) emit("\n") + let ap = nreg(); emit(" "); emit(ap); emit(" = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_alive, i32 0, i32 "); emit(i1); emit("\n") let al = emit_bind(sconcat("load i32, ptr ", ap)) let alc = emit_bind(sconcat("icmp ne i32 ", sconcat(al, ", 0"))) let ka = lbl("qa") - emit(" br i1 ") emit(alc) emit(", label %") emit(ka) emit(", label %") emit(nxt) emit("\n") - emit(ka) emit(":\n") + emit(" br i1 "); emit(alc); emit(", label %"); emit(ka); emit(", label %"); emit(nxt); emit("\n") + emit(ka); emit(":\n") let terms = st.c # component / archetype filters @@ -40,17 +40,17 @@ fn emit_query(st: Node) -> void { let ak = find_arch_id(tm.s) let ok = "0" if ak > 0 { - let kp = nreg() emit(" ") emit(kp) emit(" = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_kind, i32 0, i32 ") emit(i1) emit("\n") + let kp = nreg(); emit(" "); emit(kp); emit(" = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_kind, i32 0, i32 "); emit(i1); emit("\n") let kv = emit_bind(sconcat("load i32, ptr ", kp)) ok = emit_bind(sconcat("icmp eq i32 ", sconcat(kv, sconcat(", ", itoa(ak))))) } else { - let hp = nreg() emit(" ") emit(hp) emit(" = getelementptr inbounds [") emit(me) emit(" x i8], ptr @H_") emit(tm.s) emit(", i32 0, i32 ") emit(i1) emit("\n") + let hp = nreg(); emit(" "); emit(hp); emit(" = getelementptr inbounds ["); emit(me); emit(" x i8], ptr @H_"); emit(tm.s); emit(", i32 0, i32 "); emit(i1); emit("\n") let hv = emit_bind(sconcat("load i8, ptr ", hp)) ok = emit_bind(sconcat("icmp ne i8 ", sconcat(hv, ", 0"))) } let keep = lbl("qt") - emit(" br i1 ") emit(ok) emit(", label %") emit(keep) emit(", label %") emit(nxt) emit("\n") - emit(keep) emit(":\n") + emit(" br i1 "); emit(ok); emit(", label %"); emit(keep); emit(", label %"); emit(nxt); emit("\n") + emit(keep); emit(":\n") t = t + 1 } @@ -63,9 +63,9 @@ fn emit_query(st: Node) -> void { if tm.ival == 0 and find_arch_id(tm.s) == 0 { if vi < len(st.kids) { let slot = nreg() - emit(" ") emit(slot) emit(" = getelementptr inbounds [") emit(me) emit(" x %Cmp_") emit(tm.s) emit("], ptr @S_") emit(tm.s) emit(", i32 0, i32 ") emit(i1) emit("\n") + emit(" "); emit(slot); emit(" = getelementptr inbounds ["); emit(me); emit(" x %Cmp_"); emit(tm.s); emit("], ptr @S_"); emit(tm.s); emit(", i32 0, i32 "); emit(i1); emit("\n") let vslot = emit_alloca("ptr") - emit(" store ptr ") emit(slot) emit(", ptr ") emit(vslot) emit("\n") + emit(" store ptr "); emit(slot); emit(", ptr "); emit(vslot); emit("\n") loc_push(st.kids[vi].s, vslot, tm.s) vi = vi + 1 } @@ -78,21 +78,21 @@ fn emit_query(st: Node) -> void { let w = emit_expr(st.b) let wc = emit_bind(sconcat("icmp ne i32 ", sconcat(w.code, ", 0"))) let kw = lbl("qw") - emit(" br i1 ") emit(wc) emit(", label %") emit(kw) emit(", label %") emit(nxt) emit("\n") - emit(kw) emit(":\n") + emit(" br i1 "); emit(wc); emit(", label %"); emit(kw); emit(", label %"); emit(nxt); emit("\n") + emit(kw); emit(":\n") } loop_push(nxt, endl) emit_block(st.a) loop_pop() nloc = save - if not g_term { emit(" br label %") emit(nxt) emit("\n") } + if not g_term { emit(" br label %"); emit(nxt); emit("\n") } - emit(nxt) emit(":\n") + emit(nxt); emit(":\n") let i2 = emit_bind(sconcat("load i32, ptr ", ip)) let i3 = emit_bind(sconcat("add i32 ", sconcat(i2, ", 1"))) store_at("i32", i3, ip) - emit(" br label %") emit(cond) emit("\n") - emit(endl) emit(":\n") g_term = false + emit(" br label %"); emit(cond); emit("\n") + emit(endl); emit(":\n"); g_term = false nself = nself - 1 } diff --git a/selfhost/emit_save.ludic b/selfhost/emit_save.ludic index 7a170f85..1ffcde04 100644 --- a/selfhost/emit_save.ludic +++ b/selfhost/emit_save.ludic @@ -6,8 +6,8 @@ var g_iok: int = 0 fn emit_io(fn2: ptr, p: ptr, bytes: ptr) -> void { - let r = sconcat("%io", itoa(g_iok)) g_iok = g_iok + 1 - emit(" ") emit(r) emit(" = call i64 @") emit(fn2) emit("(ptr ") emit(p) emit(", i64 1, i64 ") emit(bytes) emit(", ptr %f)\n") + let r = sconcat("%io", itoa(g_iok)); g_iok = g_iok + 1 + emit(" "); emit(r); emit(" = call i64 @"); emit(fn2); emit("(ptr "); emit(p); emit(", i64 1, i64 "); emit(bytes); emit(", ptr %f)\n") } fn emit_snapshot_blocks(fn2: ptr) -> void { @@ -15,19 +15,19 @@ fn emit_snapshot_blocks(fn2: ptr) -> void { let me = itoa(MAX_ENT) emit_io(fn2, "@L_entc", "4") emit_io(fn2, "@L_freen", "4") - emit(" %nalive = mul i64 ") emit(me) emit(", 4\n") + emit(" %nalive = mul i64 "); emit(me); emit(", 4\n") emit_io(fn2, "@L_alive", "%nalive") emit_io(fn2, "@L_freelist", "%nalive") emit_io(fn2, "@L_kind", "%nalive") let i = 0 - while i < len(prog) { if prog[i].kind == N_VAR { emit_io(fn2, sconcat("@g_", prog[i].s), "4") } i = i + 1 } + while i < len(prog) { if prog[i].kind == N_VAR { emit_io(fn2, sconcat("@g_", prog[i].s), "4") }; i = i + 1 } let ci = 0 i = 0 while i < len(prog) { if prog[i].kind == N_COMP { let c = prog[i].s let csz = sconcat("%csz", itoa(ci)) - emit(" ") emit(csz) emit(" = ptrtoint ptr getelementptr (%Cmp_") emit(c) emit(", ptr null, i32 ") emit(me) emit(") to i64\n") + emit(" "); emit(csz); emit(" = ptrtoint ptr getelementptr (%Cmp_"); emit(c); emit(", ptr null, i32 "); emit(me); emit(") to i64\n") emit_io(fn2, sconcat("@S_", c), csz) emit_io(fn2, sconcat("@H_", c), me) ci = ci + 1 diff --git a/selfhost/emit_spawn.ludic b/selfhost/emit_spawn.ludic index a418bcba..c6ceddff 100644 --- a/selfhost/emit_spawn.ludic +++ b/selfhost/emit_spawn.ludic @@ -5,21 +5,21 @@ fn emit_init_component(e: ptr, comp: ptr, rec: Node) -> void { let me = itoa(MAX_ENT) let c = find_comp(comp) if ptr_is_null(c) { perr(sconcat("spawn: unknown component ", comp)) } - let hp = nreg() emit(" ") emit(hp) emit(" = getelementptr inbounds [") emit(me) emit(" x i8], ptr @H_") emit(comp) emit(", i32 0, i32 ") emit(e) emit("\n") - emit(" store i8 1, ptr ") emit(hp) emit("\n") + let hp = nreg(); emit(" "); emit(hp); emit(" = getelementptr inbounds ["); emit(me); emit(" x i8], ptr @H_"); emit(comp); emit(", i32 0, i32 "); emit(e); emit("\n") + emit(" store i8 1, ptr "); emit(hp); emit("\n") let slot = nreg() - emit(" ") emit(slot) emit(" = getelementptr inbounds [") emit(me) emit(" x %Cmp_") emit(comp) emit("], ptr @S_") emit(comp) emit(", i32 0, i32 ") emit(e) emit("\n") + emit(" "); emit(slot); emit(" = getelementptr inbounds ["); emit(me); emit(" x %Cmp_"); emit(comp); emit("], ptr @S_"); emit(comp); emit(", i32 0, i32 "); emit(e); emit("\n") # defaults let f = 0 while f < len(c.kids) { let fd = c.kids[f] let addr = nreg() - emit(" ") emit(addr) emit(" = getelementptr inbounds %Cmp_") emit(comp) emit(", ptr ") emit(slot) emit(", i32 0, i32 ") emit(itoa(f)) emit("\n") + emit(" "); emit(addr); emit(" = getelementptr inbounds %Cmp_"); emit(comp); emit(", ptr "); emit(slot); emit(", i32 0, i32 "); emit(itoa(f)); emit("\n") let lt = llty(fd.ty) let v = "0" if streq(lt, "ptr") { v = "null" } - if not ptr_is_null(fd.a) { let dv = emit_expr(fd.a) v = dv.code } - emit(" store ") emit(lt) emit(" ") emit(v) emit(", ptr ") emit(addr) emit("\n") + if not ptr_is_null(fd.a) { let dv = emit_expr(fd.a); v = dv.code } + emit(" store "); emit(lt); emit(" "); emit(v); emit(", ptr "); emit(addr); emit("\n") f = f + 1 } # per-spawn overrides @@ -30,9 +30,9 @@ fn emit_init_component(e: ptr, comp: ptr, rec: Node) -> void { let fidx = field_index(c, fi.s) if fidx >= 0 { let addr = nreg() - emit(" ") emit(addr) emit(" = getelementptr inbounds %Cmp_") emit(comp) emit(", ptr ") emit(slot) emit(", i32 0, i32 ") emit(itoa(fidx)) emit("\n") + emit(" "); emit(addr); emit(" = getelementptr inbounds %Cmp_"); emit(comp); emit(", ptr "); emit(slot); emit(", i32 0, i32 "); emit(itoa(fidx)); emit("\n") let dv = emit_expr(fi.a) - emit(" store ") emit(llty(field_type(c, fi.s))) emit(" ") emit(dv.code) emit(", ptr ") emit(addr) emit("\n") + emit(" store "); emit(llty(field_type(c, fi.s))); emit(" "); emit(dv.code); emit(", ptr "); emit(addr); emit("\n") } j = j + 1 } @@ -44,25 +44,25 @@ fn emit_spawn(st: Node) -> void { let ak = find_arch_id(st.s) if ak > 0 { let me = itoa(MAX_ENT) - let kp = nreg() emit(" ") emit(kp) emit(" = getelementptr inbounds [") emit(me) emit(" x i32], ptr @L_kind, i32 0, i32 ") emit(e) emit("\n") - emit(" store i32 ") emit(itoa(ak)) emit(", ptr ") emit(kp) emit("\n") + let kp = nreg(); emit(" "); emit(kp); emit(" = getelementptr inbounds ["); emit(me); emit(" x i32], ptr @L_kind, i32 0, i32 "); emit(e); emit("\n") + emit(" store i32 "); emit(itoa(ak)); emit(", ptr "); emit(kp); emit("\n") let arch = find_arch(st.s) let c = 0 while c < len(arch.kids) { let cn = arch.kids[c].s let rec = ptr_null() let i = 0 - while i < len(st.kids) { if streq(st.kids[i].s, cn) { rec = st.kids[i].a } i = i + 1 } + while i < len(st.kids) { if streq(st.kids[i].s, cn) { rec = st.kids[i].a }; i = i + 1 } emit_init_component(e, cn, rec) c = c + 1 } } else { let i = 0 - while i < len(st.kids) { emit_init_component(e, st.kids[i].s, st.kids[i].a) i = i + 1 } + while i < len(st.kids) { emit_init_component(e, st.kids[i].s, st.kids[i].a); i = i + 1 } } } fn emit_despawn(st: Node) -> void { let v = emit_expr(st.a) - emit(" call void @L_free_entity(i32 ") emit(v.code) emit(")\n") + emit(" call void @L_free_entity(i32 "); emit(v.code); emit(")\n") } diff --git a/selfhost/emit_stmt.ludic b/selfhost/emit_stmt.ludic index 4643e01b..aec579a3 100644 --- a/selfhost/emit_stmt.ludic +++ b/selfhost/emit_stmt.ludic @@ -12,7 +12,7 @@ fn emit_block(b: Node) -> void { # store `val` (llvm type `lt`) into address `addr` fn store_at(lt: ptr, v: ptr, addr: ptr) -> void { - emit(" store ") emit(lt) emit(" ") emit(v) emit(", ptr ") emit(addr) emit("\n") + emit(" store "); emit(lt); emit(" "); emit(v); emit(", ptr "); emit(addr); emit("\n") } fn emit_assign(st: Node) -> void { @@ -22,15 +22,15 @@ fn emit_assign(st: Node) -> void { let ty = "int" if t.kind == E_ID { let li = loc_find(t.s) - if li >= 0 { addr = loc_reg[li] ty = loc_ty[li] } + if li >= 0 { addr = loc_reg[li]; ty = loc_ty[li] } else { let g = find_global(t.s) if ptr_is_null(g) { perr(sconcat("assign to unknown ", t.s)) } - addr = sconcat("@g_", t.s) ty = g.ty + addr = sconcat("@g_", t.s); ty = g.ty } } else { - if t.kind == E_MEMBER { addr = emit_member_addr(t) ty = g_addr_ty } - else { if t.kind == E_INDEX { addr = emit_index_addr(t) ty = g_addr_ty } + if t.kind == E_MEMBER { addr = emit_member_addr(t); ty = g_addr_ty } + else { if t.kind == E_INDEX { addr = emit_index_addr(t); ty = g_addr_ty } else { perr("bad assignment target") } } } let lt = llty(ty) @@ -51,34 +51,34 @@ fn emit_if(st: Node) -> void { let c = emit_expr(st.a) let cc = emit_bind(sconcat("icmp ne i32 ", sconcat(c.code, ", 0"))) let has_else = not ptr_is_null(st.c) - let tl = lbl("then") let el = lbl("else") let en = lbl("ifend") - if has_else { emit(" br i1 ") emit(cc) emit(", label %") emit(tl) emit(", label %") emit(el) emit("\n") } - else { emit(" br i1 ") emit(cc) emit(", label %") emit(tl) emit(", label %") emit(en) emit("\n") } - emit(tl) emit(":\n") g_term = false + let tl = lbl("then"); let el = lbl("else"); let en = lbl("ifend") + if has_else { emit(" br i1 "); emit(cc); emit(", label %"); emit(tl); emit(", label %"); emit(el); emit("\n") } + else { emit(" br i1 "); emit(cc); emit(", label %"); emit(tl); emit(", label %"); emit(en); emit("\n") } + emit(tl); emit(":\n"); g_term = false emit_block(st.b) - if not g_term { emit(" br label %") emit(en) emit("\n") } + if not g_term { emit(" br label %"); emit(en); emit("\n") } if has_else { - emit(el) emit(":\n") g_term = false + emit(el); emit(":\n"); g_term = false # else is either a block or a nested if-statement if st.c.kind == S_IF { emit_stmt(st.c) } else { emit_block(st.c) } - if not g_term { emit(" br label %") emit(en) emit("\n") } + if not g_term { emit(" br label %"); emit(en); emit("\n") } } - emit(en) emit(":\n") g_term = false + emit(en); emit(":\n"); g_term = false } fn emit_while(st: Node) -> void { - let cl = lbl("wcond") let bl = lbl("wbody") let en = lbl("wend") - emit(" br label %") emit(cl) emit("\n") - emit(cl) emit(":\n") + let cl = lbl("wcond"); let bl = lbl("wbody"); let en = lbl("wend") + emit(" br label %"); emit(cl); emit("\n") + emit(cl); emit(":\n") let c = emit_expr(st.a) let cc = emit_bind(sconcat("icmp ne i32 ", sconcat(c.code, ", 0"))) - emit(" br i1 ") emit(cc) emit(", label %") emit(bl) emit(", label %") emit(en) emit("\n") - emit(bl) emit(":\n") g_term = false + emit(" br i1 "); emit(cc); emit(", label %"); emit(bl); emit(", label %"); emit(en); emit("\n") + emit(bl); emit(":\n"); g_term = false loop_push(cl, en) emit_block(st.b) loop_pop() - if not g_term { emit(" br label %") emit(cl) emit("\n") } - emit(en) emit(":\n") g_term = false + if not g_term { emit(" br label %"); emit(cl); emit("\n") } + emit(en); emit(":\n"); g_term = false } fn emit_for(st: Node) -> void { @@ -86,24 +86,24 @@ fn emit_for(st: Node) -> void { let lo = emit_expr(st.a) store_at("i32", lo.code, slot) loc_push(st.s, slot, "int") - let cl = lbl("fcond") let bl = lbl("fbody") let ct = lbl("fcont") let en = lbl("fend") - emit(" br label %") emit(cl) emit("\n") - emit(cl) emit(":\n") + let cl = lbl("fcond"); let bl = lbl("fbody"); let ct = lbl("fcont"); let en = lbl("fend") + emit(" br label %"); emit(cl); emit("\n") + emit(cl); emit(":\n") let iv = emit_bind(sconcat("load i32, ptr ", slot)) let hi = emit_expr(st.b) let cc = emit_bind(sconcat("icmp slt i32 ", sconcat(iv, sconcat(", ", hi.code)))) - emit(" br i1 ") emit(cc) emit(", label %") emit(bl) emit(", label %") emit(en) emit("\n") - emit(bl) emit(":\n") g_term = false + emit(" br i1 "); emit(cc); emit(", label %"); emit(bl); emit(", label %"); emit(en); emit("\n") + emit(bl); emit(":\n"); g_term = false loop_push(ct, en) emit_block(st.c) loop_pop() - if not g_term { emit(" br label %") emit(ct) emit("\n") } - emit(ct) emit(":\n") + if not g_term { emit(" br label %"); emit(ct); emit("\n") } + emit(ct); emit(":\n") let i2 = emit_bind(sconcat("load i32, ptr ", slot)) let i3 = emit_bind(sconcat("add i32 ", sconcat(i2, ", 1"))) store_at("i32", i3, slot) - emit(" br label %") emit(cl) emit("\n") - emit(en) emit(":\n") g_term = false + emit(" br label %"); emit(cl); emit("\n") + emit(en); emit(":\n"); g_term = false } fn emit_return(st: Node) -> void { @@ -117,7 +117,7 @@ fn emit_return(st: Node) -> void { fn arm_is_default(arm: Node) -> bool { let p = 0 - while p < len(arm.kids) { if arm.kids[p].kind == E_ID and streq(arm.kids[p].s, "_") { return true } p = p + 1 } + while p < len(arm.kids) { if arm.kids[p].kind == E_ID and streq(arm.kids[p].s, "_") { return true }; p = p + 1 } return false } @@ -136,58 +136,58 @@ fn emit_match(st: Node) -> void { while p < len(arm.kids) { let pv = emit_expr(arm.kids[p]) let c = emit_bind(sconcat("icmp eq i32 ", sconcat(sv.code, sconcat(", ", pv.code)))) - if first { acc = c first = false } + if first { acc = c; first = false } else { acc = emit_bind(sconcat("or i1 ", sconcat(acc, sconcat(", ", c)))) } p = p + 1 } - let bodyl = lbl("mbody") let nextl = lbl("marm") - emit(" br i1 ") emit(acc) emit(", label %") emit(bodyl) emit(", label %") emit(nextl) emit("\n") - emit(bodyl) emit(":\n") g_term = false + let bodyl = lbl("mbody"); let nextl = lbl("marm") + emit(" br i1 "); emit(acc); emit(", label %"); emit(bodyl); emit(", label %"); emit(nextl); emit("\n") + emit(bodyl); emit(":\n"); g_term = false emit_block(arm.a) - if not g_term { emit(" br label %") emit(endl) emit("\n") } - emit(nextl) emit(":\n") g_term = false + if not g_term { emit(" br label %"); emit(endl); emit("\n") } + emit(nextl); emit(":\n"); g_term = false } i = i + 1 } if not ptr_is_null(deflt) { emit_block(deflt.a) } - if not g_term { emit(" br label %") emit(endl) emit("\n") } - emit(endl) emit(":\n") g_term = false + if not g_term { emit(" br label %"); emit(endl); emit("\n") } + emit(endl); emit(":\n"); g_term = false } fn emit_stmt(st: Node) -> void { if st.kind == S_LET { let ty = st.ty - if ptr_is_null(ty) { let v0 = emit_expr(st.a) ty = v0.ty - let slot = emit_alloca(llty(ty)) store_at(llty(ty), v0.code, slot) loc_push(st.s, slot, ty) return } + if ptr_is_null(ty) { let v0 = emit_expr(st.a); ty = v0.ty + let slot = emit_alloca(llty(ty)); store_at(llty(ty), v0.code, slot); loc_push(st.s, slot, ty); return } let slot = emit_alloca(llty(ty)) if ptr_is_null(st.a) { let z = "0" if streq(llty(ty), "ptr") { z = "null" } store_at(llty(ty), z, slot) - } else { let v = emit_expr(st.a) store_at(llty(ty), v.code, slot) } + } else { let v = emit_expr(st.a); store_at(llty(ty), v.code, slot) } loc_push(st.s, slot, ty) return } - if st.kind == S_ASSIGN { emit_assign(st) return } - if st.kind == S_IF { emit_if(st) return } - if st.kind == S_WHILE { emit_while(st) return } - if st.kind == S_FOR { emit_for(st) return } - if st.kind == S_RETURN { emit_return(st) return } - if st.kind == S_BREAK { emit(" br label %") emit(brk_lbl[nloop - 1]) emit("\n") g_term = true return } - if st.kind == S_CONTINUE { emit(" br label %") emit(cnt_lbl[nloop - 1]) emit("\n") g_term = true return } - if st.kind == S_MATCH { emit_match(st) return } - if st.kind == S_QUERY { emit_query(st) return } - if st.kind == S_SPAWN { emit_spawn(st) return } - if st.kind == S_DESPAWN { emit_despawn(st) return } - if st.kind == S_MACHINE { emit_machine(st) return } - if st.kind == S_BECOME { emit_become(st) return } - if st.kind == S_EXPR { let v = emit_expr(st.a) return } + if st.kind == S_ASSIGN { emit_assign(st); return } + if st.kind == S_IF { emit_if(st); return } + if st.kind == S_WHILE { emit_while(st); return } + if st.kind == S_FOR { emit_for(st); return } + if st.kind == S_RETURN { emit_return(st); return } + if st.kind == S_BREAK { emit(" br label %"); emit(brk_lbl[nloop - 1]); emit("\n"); g_term = true; return } + if st.kind == S_CONTINUE { emit(" br label %"); emit(cnt_lbl[nloop - 1]); emit("\n"); g_term = true; return } + if st.kind == S_MATCH { emit_match(st); return } + if st.kind == S_QUERY { emit_query(st); return } + if st.kind == S_SPAWN { emit_spawn(st); return } + if st.kind == S_DESPAWN { emit_despawn(st); return } + if st.kind == S_MACHINE { emit_machine(st); return } + if st.kind == S_BECOME { emit_become(st); return } + if st.kind == S_EXPR { let v = emit_expr(st.a); return } perr("cannot emit statement") } fn loop_push(cont: ptr, brk: ptr) -> void { - if nloop < len(cnt_lbl) { cnt_lbl[nloop] = cont brk_lbl[nloop] = brk } - else { push(cnt_lbl, cont) push(brk_lbl, brk) } + if nloop < len(cnt_lbl) { cnt_lbl[nloop] = cont; brk_lbl[nloop] = brk } + else { push(cnt_lbl, cont); push(brk_lbl, brk) } nloop = nloop + 1 } fn loop_pop() -> void { nloop = nloop - 1 } diff --git a/selfhost/emit_ui.ludic b/selfhost/emit_ui.ludic index ef2c5841..d566f050 100644 --- a/selfhost/emit_ui.ludic +++ b/selfhost/emit_ui.ludic @@ -9,43 +9,43 @@ var ui_roots: []int # first-widget index of each ui block fn ui_wtype(w: Node) -> int { let s = w.s - if streq(s, "panel") { return 0 } if streq(s, "col") { return 1 } if streq(s, "row") { return 2 } - if streq(s, "label") { return 3 } if streq(s, "button") { return 4 } - if streq(s, "image") { return 5 } if streq(s, "spacer") { return 6 } + if streq(s, "panel") { return 0 }; if streq(s, "col") { return 1 }; if streq(s, "row") { return 2 } + if streq(s, "label") { return 3 }; if streq(s, "button") { return 4 } + if streq(s, "image") { return 5 }; if streq(s, "spacer") { return 6 } return 0 } fn ui_prop(w: Node, key: ptr) -> Node { let i = 0 - while i < len(w.b.kids) { if streq(w.b.kids[i].s, key) { return w.b.kids[i].a } i = i + 1 } + while i < len(w.b.kids) { if streq(w.b.kids[i].s, key) { return w.b.kids[i].a }; i = i + 1 } return ptr_null() } fn ui_flatten(w: Node, parent: int) -> void { let idx = len(uiw) - push(uiw, w) push(uiw_parent, parent) + push(uiw, w); push(uiw_parent, parent) let i = 0 - while i < len(w.kids) { ui_flatten(w.kids[i], idx) i = i + 1 } + while i < len(w.kids) { ui_flatten(w.kids[i], idx); i = i + 1 } } fn ui_flatten_all() -> void { - uiw = new []Node uiw_parent = new []int ui_roots = new []int + uiw = new []Node; uiw_parent = new []int; ui_roots = new []int let i = 0 while i < len(prog) { - if prog[i].kind == N_UI and prog[i].ival == 1 { push(ui_roots, len(uiw)) ui_flatten(prog[i].a, 0 - 1) } + if prog[i].kind == N_UI and prog[i].ival == 1 { push(ui_roots, len(uiw)); ui_flatten(prog[i].a, 0 - 1) } i = i + 1 } } fn has_ui() -> bool { let i = 0 - while i < len(prog) { if prog[i].kind == N_UI and prog[i].ival == 1 { return true } i = i + 1 } + while i < len(prog) { if prog[i].kind == N_UI and prog[i].ival == 1 { return true }; i = i + 1 } return false } # index of a UI_: a ui block's root, or a widget's id= fn ui_index_of(nm: ptr) -> int { let s = substr(nm, 3, slen(nm) - 3) # strip "UI_" - let u = 0 let bi = 0 + let u = 0; let bi = 0 let i = 0 while i < len(prog) { - if prog[i].kind == N_UI and prog[i].ival == 1 { if streq(prog[i].s, s) { return ui_roots[bi] } bi = bi + 1 } + if prog[i].kind == N_UI and prog[i].ival == 1 { if streq(prog[i].s, s) { return ui_roots[bi] }; bi = bi + 1 } i = i + 1 } i = 0 @@ -61,24 +61,24 @@ fn is_ui_ident(nm: ptr) -> bool { } fn ll_ui_set(idx: int, key: int, val: ptr) -> void { - emit(" call void @fn_rt_ui_set(i32 ") emit(itoa(idx)) emit(", i32 ") emit(itoa(key)) emit(", i32 ") emit(val) emit(")\n") + emit(" call void @fn_rt_ui_set(i32 "); emit(itoa(idx)); emit(", i32 "); emit(itoa(key)); emit(", i32 "); emit(val); emit(")\n") } fn ui_prop_key(k: ptr) -> int { - if streq(k,"w") { return 2 } if streq(k,"h") { return 3 } if streq(k,"x") { return 4 } if streq(k,"y") { return 5 } - if streq(k,"pad") { return 7 } if streq(k,"gap") { return 8 } if streq(k,"bg") { return 9 } if streq(k,"fg") { return 10 } - if streq(k,"border") { return 11 } if streq(k,"grow") { return 13 } if streq(k,"font") { return 14 } if streq(k,"size") { return 15 } - if streq(k,"inset") { return 16 } if streq(k,"focus") { return 17 } + if streq(k,"w") { return 2 }; if streq(k,"h") { return 3 }; if streq(k,"x") { return 4 }; if streq(k,"y") { return 5 } + if streq(k,"pad") { return 7 }; if streq(k,"gap") { return 8 }; if streq(k,"bg") { return 9 }; if streq(k,"fg") { return 10 } + if streq(k,"border") { return 11 }; if streq(k,"grow") { return 13 }; if streq(k,"font") { return 14 }; if streq(k,"size") { return 15 } + if streq(k,"inset") { return 16 }; if streq(k,"focus") { return 17 } return 0 - 1 } fn emit_ui_build() -> void { ui_flatten_all() - ll_t = 0 ll_lbl = 0 g_term = false loc_reset() nloop = 0 + ll_t = 0; ll_lbl = 0; g_term = false; loc_reset(); nloop = 0 let fbody = buf_new() falloc = buf_new() let saved = code code = fbody - emit(" call void @fn_rt_ui_reset(i32 ") emit(itoa(len(uiw))) emit(")\n") + emit(" call void @fn_rt_ui_reset(i32 "); emit(itoa(len(uiw))); emit(")\n") let i = 0 while i < len(uiw) { let w = uiw[i] @@ -91,10 +91,10 @@ fn emit_ui_build() -> void { let pr = w.b.kids[p] let k = pr.s let v = pr.a - if streq(k, "id") { p = p + 1 continue } + if streq(k, "id") { p = p + 1; continue } if streq(k, "text") { let sv = emit_expr(v) - emit(" call void @fn_rt_ui_static_text(i32 ") emit(itoa(i)) emit(", ptr ") emit(sv.code) emit(")\n") + emit(" call void @fn_rt_ui_static_text(i32 "); emit(itoa(i)); emit(", ptr "); emit(sv.code); emit(")\n") } else { if streq(k, "skin") or streq(k, "image") { let sv = emit_expr(v) let r = emit_bind(sconcat("call i32 @fn_rt_image_load(ptr ", sconcat(sv.code, ")"))) @@ -102,9 +102,9 @@ fn emit_ui_build() -> void { } else { if streq(k, "align") { if v.kind == E_ID { let a = 0 - if streq(v.s, "center") { a = 1 } if streq(v.s, "end") { a = 2 } + if streq(v.s, "center") { a = 1 }; if streq(v.s, "end") { a = 2 } ll_ui_set(i, 12, itoa(a)) - } else { let vv = emit_expr(v) ll_ui_set(i, 12, vv.code) } + } else { let vv = emit_expr(v); ll_ui_set(i, 12, vv.code) } } else { let key = ui_prop_key(k) if key >= 0 { diff --git a/selfhost/lex.ludic b/selfhost/lex.ludic index 6e798e55..972e84f9 100644 --- a/selfhost/lex.ludic +++ b/selfhost/lex.ludic @@ -16,7 +16,7 @@ var toks: []Tok fn tok_push(kind: int, text: ptr, ival: int, line: int) -> void { let t = new Tok - t.kind = kind t.text = text t.ival = ival t.line = line + t.kind = kind; t.text = text; t.ival = ival; t.line = line push(toks, t) } @@ -42,8 +42,8 @@ fn lex(src: ptr) -> void { let n = slen(src) while i < n { let c = peek8(src, i) - if c == 10 { tok_push(TK_NL, ptr_null(), 0, line) line = line + 1 i = i + 1 continue } - if c == 32 or c == 9 or c == 13 { i = i + 1 continue } + if c == 10 { tok_push(TK_NL, ptr_null(), 0, line); line = line + 1; i = i + 1; continue } + if c == 32 or c == 9 or c == 13 { i = i + 1; continue } if c == 35 { # '#' comment to end of line while i < n and peek8(src, i) != 10 { i = i + 1 } continue @@ -60,8 +60,8 @@ fn lex(src: ptr) -> void { if e == 110 { r = 10 } if e == 116 { r = 9 } if e == 48 { r = 0 } - poke8(out, j, r) j = j + 1 i = i + 2 - } else { poke8(out, j, peek8(src, i)) j = j + 1 i = i + 1 } + poke8(out, j, r); j = j + 1; i = i + 2 + } else { poke8(out, j, peek8(src, i)); j = j + 1; i = i + 1 } } i = i + 1 poke8(out, j, 0) @@ -77,7 +77,7 @@ fn lex(src: ptr) -> void { if e == 116 { v = 9 } if e == 48 { v = 0 } i = i + 2 - } else { v = peek8(src, i) i = i + 1 } + } else { v = peek8(src, i); i = i + 1 } if peek8(src, i) == 39 { i = i + 1 } tok_push(TK_INT, ptr_null(), v, line) continue @@ -99,12 +99,12 @@ fn lex(src: ptr) -> void { continue } let v = 0 - while i < n and char_is_digit(peek8(src, i)) { v = v * 10 + (peek8(src, i) - 48) i = i + 1 } + while i < n and char_is_digit(peek8(src, i)) { v = v * 10 + (peek8(src, i) - 48); i = i + 1 } # a fractional part makes it a Q16.16 fixed literal if i < n and peek8(src, i) == 46 and char_is_digit(peek8(src, i + 1)) { i = i + 1 - let fnum = 0 let fden = 1 - while i < n and char_is_digit(peek8(src, i)) { fnum = fnum * 10 + (peek8(src, i) - 48) fden = fden * 10 i = i + 1 } + let fnum = 0; let fden = 1 + while i < n and char_is_digit(peek8(src, i)) { fnum = fnum * 10 + (peek8(src, i) - 48); fden = fden * 10; i = i + 1 } let bits = shl(v, 16) + shl(fnum, 16) / fden tok_push(TK_FLOAT, ptr_null(), bits, line) continue @@ -118,20 +118,20 @@ fn lex(src: ptr) -> void { tok_push(TK_ID, substr(src, start, i - start), 0, line) continue } - if c == 59 { tok_push(TK_NL, ptr_null(), 0, line) i = i + 1 continue } # ';' + if c == 59 { tok_push(TK_NL, ptr_null(), 0, line); i = i + 1; continue } # ';' # two-character operators - if two_at(src, i, 45, 62) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # -> - if two_at(src, i, 61, 62) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # => - if two_at(src, i, 61, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # == - if two_at(src, i, 33, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # != - if two_at(src, i, 60, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # <= - if two_at(src, i, 62, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # >= - if two_at(src, i, 43, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # += - if two_at(src, i, 45, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # -= - if two_at(src, i, 42, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # *= - if two_at(src, i, 47, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # /= - if two_at(src, i, 46, 46) { tok_push(TK_OP, substr(src, i, 2), 0, line) i = i + 2 continue } # .. - if is_op1(c) { tok_push(TK_OP, substr(src, i, 1), 0, line) i = i + 1 continue } + if two_at(src, i, 45, 62) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # -> + if two_at(src, i, 61, 62) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # => + if two_at(src, i, 61, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # == + if two_at(src, i, 33, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # != + if two_at(src, i, 60, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # <= + if two_at(src, i, 62, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # >= + if two_at(src, i, 43, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # += + if two_at(src, i, 45, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # -= + if two_at(src, i, 42, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # *= + if two_at(src, i, 47, 61) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # /= + if two_at(src, i, 46, 46) { tok_push(TK_OP, substr(src, i, 2), 0, line); i = i + 2; continue } # .. + if is_op1(c) { tok_push(TK_OP, substr(src, i, 1), 0, line); i = i + 1; continue } i = i + 1 # skip anything unrecognised } tok_push(TK_EOF, ptr_null(), 0, line) diff --git a/selfhost/ludicc.seed.ll b/selfhost/ludicc.seed.ll index b4d759c4..f955917d 100644 --- a/selfhost/ludicc.seed.ll +++ b/selfhost/ludicc.seed.ll @@ -107,1402 +107,1409 @@ declare void @win_close() @.str38 = private unnamed_addr constant [3 x i8] c"or\00" @.str39 = private unnamed_addr constant [2 x i8] c"{\00" @.str40 = private unnamed_addr constant [2 x i8] c"}\00" -@.str41 = private unnamed_addr constant [2 x i8] c"=\00" +@.str41 = private unnamed_addr constant [2 x i8] c":\00" @.str42 = private unnamed_addr constant [2 x i8] c",\00" @.str43 = private unnamed_addr constant [2 x i8] c"}\00" @.str44 = private unnamed_addr constant [2 x i8] c"{\00" @.str45 = private unnamed_addr constant [2 x i8] c"}\00" @.str46 = private unnamed_addr constant [2 x i8] c"}\00" -@.str47 = private unnamed_addr constant [4 x i8] c"let\00" -@.str48 = private unnamed_addr constant [2 x i8] c":\00" -@.str49 = private unnamed_addr constant [2 x i8] c"=\00" -@.str50 = private unnamed_addr constant [7 x i8] c"return\00" -@.str51 = private unnamed_addr constant [2 x i8] c"}\00" -@.str52 = private unnamed_addr constant [3 x i8] c"if\00" -@.str53 = private unnamed_addr constant [5 x i8] c"else\00" -@.str54 = private unnamed_addr constant [3 x i8] c"if\00" -@.str55 = private unnamed_addr constant [5 x i8] c"when\00" -@.str56 = private unnamed_addr constant [6 x i8] c"while\00" -@.str57 = private unnamed_addr constant [4 x i8] c"for\00" -@.str58 = private unnamed_addr constant [2 x i8] c"(\00" -@.str59 = private unnamed_addr constant [3 x i8] c"..\00" -@.str60 = private unnamed_addr constant [6 x i8] c"spawn\00" -@.str61 = private unnamed_addr constant [8 x i8] c"machine\00" -@.str62 = private unnamed_addr constant [2 x i8] c"{\00" -@.str63 = private unnamed_addr constant [2 x i8] c"}\00" -@.str64 = private unnamed_addr constant [2 x i8] c"=\00" -@.str65 = private unnamed_addr constant [2 x i8] c"}\00" -@.str66 = private unnamed_addr constant [7 x i8] c"become\00" -@.str67 = private unnamed_addr constant [6 x i8] c"enter\00" -@.str68 = private unnamed_addr constant [8 x i8] c"despawn\00" -@.str69 = private unnamed_addr constant [6 x i8] c"break\00" -@.str70 = private unnamed_addr constant [9 x i8] c"continue\00" -@.str71 = private unnamed_addr constant [6 x i8] c"match\00" -@.str72 = private unnamed_addr constant [2 x i8] c"{\00" -@.str73 = private unnamed_addr constant [2 x i8] c"}\00" -@.str74 = private unnamed_addr constant [2 x i8] c",\00" -@.str75 = private unnamed_addr constant [3 x i8] c"=>\00" +@.str47 = private unnamed_addr constant [5 x i8] c"cur=\00" +@.str48 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str49 = private unnamed_addr constant [43 x i8] c"expected newline or ';' between statements\00" +@.str50 = private unnamed_addr constant [2 x i8] c"}\00" +@.str51 = private unnamed_addr constant [4 x i8] c"let\00" +@.str52 = private unnamed_addr constant [2 x i8] c":\00" +@.str53 = private unnamed_addr constant [2 x i8] c"=\00" +@.str54 = private unnamed_addr constant [7 x i8] c"return\00" +@.str55 = private unnamed_addr constant [2 x i8] c"}\00" +@.str56 = private unnamed_addr constant [3 x i8] c"if\00" +@.str57 = private unnamed_addr constant [5 x i8] c"else\00" +@.str58 = private unnamed_addr constant [3 x i8] c"if\00" +@.str59 = private unnamed_addr constant [5 x i8] c"when\00" +@.str60 = private unnamed_addr constant [6 x i8] c"while\00" +@.str61 = private unnamed_addr constant [4 x i8] c"for\00" +@.str62 = private unnamed_addr constant [2 x i8] c"(\00" +@.str63 = private unnamed_addr constant [3 x i8] c"..\00" +@.str64 = private unnamed_addr constant [6 x i8] c"spawn\00" +@.str65 = private unnamed_addr constant [8 x i8] c"machine\00" +@.str66 = private unnamed_addr constant [2 x i8] c"{\00" +@.str67 = private unnamed_addr constant [2 x i8] c"}\00" +@.str68 = private unnamed_addr constant [2 x i8] c"=\00" +@.str69 = private unnamed_addr constant [2 x i8] c"}\00" +@.str70 = private unnamed_addr constant [7 x i8] c"become\00" +@.str71 = private unnamed_addr constant [6 x i8] c"enter\00" +@.str72 = private unnamed_addr constant [8 x i8] c"despawn\00" +@.str73 = private unnamed_addr constant [6 x i8] c"break\00" +@.str74 = private unnamed_addr constant [9 x i8] c"continue\00" +@.str75 = private unnamed_addr constant [6 x i8] c"match\00" @.str76 = private unnamed_addr constant [2 x i8] c"{\00" @.str77 = private unnamed_addr constant [2 x i8] c"}\00" -@.str78 = private unnamed_addr constant [2 x i8] c"=\00" -@.str79 = private unnamed_addr constant [3 x i8] c"+=\00" -@.str80 = private unnamed_addr constant [3 x i8] c"-=\00" -@.str81 = private unnamed_addr constant [3 x i8] c"*=\00" -@.str82 = private unnamed_addr constant [3 x i8] c"/=\00" -@.str83 = private unnamed_addr constant [2 x i8] c"{\00" -@.str84 = private unnamed_addr constant [2 x i8] c"}\00" -@.str85 = private unnamed_addr constant [2 x i8] c":\00" -@.str86 = private unnamed_addr constant [2 x i8] c"=\00" -@.str87 = private unnamed_addr constant [2 x i8] c",\00" +@.str78 = private unnamed_addr constant [2 x i8] c",\00" +@.str79 = private unnamed_addr constant [3 x i8] c"=>\00" +@.str80 = private unnamed_addr constant [2 x i8] c"{\00" +@.str81 = private unnamed_addr constant [2 x i8] c"}\00" +@.str82 = private unnamed_addr constant [2 x i8] c"=\00" +@.str83 = private unnamed_addr constant [3 x i8] c"+=\00" +@.str84 = private unnamed_addr constant [3 x i8] c"-=\00" +@.str85 = private unnamed_addr constant [3 x i8] c"*=\00" +@.str86 = private unnamed_addr constant [3 x i8] c"/=\00" +@.str87 = private unnamed_addr constant [2 x i8] c"{\00" @.str88 = private unnamed_addr constant [2 x i8] c"}\00" @.str89 = private unnamed_addr constant [2 x i8] c":\00" @.str90 = private unnamed_addr constant [2 x i8] c"=\00" -@.str91 = private unnamed_addr constant [2 x i8] c":\00" -@.str92 = private unnamed_addr constant [2 x i8] c"=\00" -@.str93 = private unnamed_addr constant [2 x i8] c"(\00" -@.str94 = private unnamed_addr constant [2 x i8] c")\00" +@.str91 = private unnamed_addr constant [2 x i8] c",\00" +@.str92 = private unnamed_addr constant [2 x i8] c"}\00" +@.str93 = private unnamed_addr constant [2 x i8] c":\00" +@.str94 = private unnamed_addr constant [2 x i8] c"=\00" @.str95 = private unnamed_addr constant [2 x i8] c":\00" -@.str96 = private unnamed_addr constant [2 x i8] c",\00" -@.str97 = private unnamed_addr constant [2 x i8] c")\00" -@.str98 = private unnamed_addr constant [5 x i8] c"void\00" -@.str99 = private unnamed_addr constant [3 x i8] c"->\00" -@.str100 = private unnamed_addr constant [1 x i8] c"\00" -@.str101 = private unnamed_addr constant [7 x i8] c"import\00" -@.str102 = private unnamed_addr constant [29 x i8] c"expected \22path\22 after import\00" -@.str103 = private unnamed_addr constant [7 x i8] c"struct\00" -@.str104 = private unnamed_addr constant [10 x i8] c"component\00" -@.str105 = private unnamed_addr constant [10 x i8] c"archetype\00" -@.str106 = private unnamed_addr constant [7 x i8] c"system\00" -@.str107 = private unnamed_addr constant [5 x i8] c"edge\00" -@.str108 = private unnamed_addr constant [3 x i8] c"ui\00" -@.str109 = private unnamed_addr constant [4 x i8] c"var\00" -@.str110 = private unnamed_addr constant [6 x i8] c"const\00" -@.str111 = private unnamed_addr constant [7 x i8] c"export\00" -@.str112 = private unnamed_addr constant [3 x i8] c"fn\00" -@.str113 = private unnamed_addr constant [5 x i8] c"pure\00" -@.str114 = private unnamed_addr constant [5 x i8] c"pure\00" -@.str115 = private unnamed_addr constant [7 x i8] c"extern\00" -@.str116 = private unnamed_addr constant [5 x i8] c"main\00" -@.str117 = private unnamed_addr constant [21 x i8] c"expected declaration\00" -@.str118 = private unnamed_addr constant [20 x i8] c"cannot open import \00" -@.str119 = private unnamed_addr constant [1 x i8] c"\00" -@.str120 = private unnamed_addr constant [26 x i8] c"runtime/native/core.ludic\00" -@.str121 = private unnamed_addr constant [6 x i8] c"Ludic\00" -@.str122 = private unnamed_addr constant [7 x i8] c"import\00" -@.str123 = private unnamed_addr constant [5 x i8] c"game\00" -@.str124 = private unnamed_addr constant [7 x i8] c"module\00" -@.str125 = private unnamed_addr constant [2 x i8] c"{\00" -@.str126 = private unnamed_addr constant [2 x i8] c"}\00" -@.str127 = private unnamed_addr constant [2 x i8] c"{\00" -@.str128 = private unnamed_addr constant [2 x i8] c"}\00" -@.str129 = private unnamed_addr constant [2 x i8] c":\00" -@.str130 = private unnamed_addr constant [2 x i8] c"=\00" -@.str131 = private unnamed_addr constant [2 x i8] c",\00" +@.str96 = private unnamed_addr constant [2 x i8] c"=\00" +@.str97 = private unnamed_addr constant [2 x i8] c"(\00" +@.str98 = private unnamed_addr constant [2 x i8] c")\00" +@.str99 = private unnamed_addr constant [2 x i8] c":\00" +@.str100 = private unnamed_addr constant [2 x i8] c",\00" +@.str101 = private unnamed_addr constant [2 x i8] c")\00" +@.str102 = private unnamed_addr constant [5 x i8] c"void\00" +@.str103 = private unnamed_addr constant [3 x i8] c"->\00" +@.str104 = private unnamed_addr constant [1 x i8] c"\00" +@.str105 = private unnamed_addr constant [2 x i8] c"@\00" +@.str106 = private unnamed_addr constant [7 x i8] c"export\00" +@.str107 = private unnamed_addr constant [2 x i8] c"(\00" +@.str108 = private unnamed_addr constant [2 x i8] c"(\00" +@.str109 = private unnamed_addr constant [2 x i8] c")\00" +@.str110 = private unnamed_addr constant [7 x i8] c"import\00" +@.str111 = private unnamed_addr constant [29 x i8] c"expected \22path\22 after import\00" +@.str112 = private unnamed_addr constant [7 x i8] c"struct\00" +@.str113 = private unnamed_addr constant [5 x i8] c"enum\00" +@.str114 = private unnamed_addr constant [10 x i8] c"component\00" +@.str115 = private unnamed_addr constant [10 x i8] c"archetype\00" +@.str116 = private unnamed_addr constant [7 x i8] c"system\00" +@.str117 = private unnamed_addr constant [3 x i8] c"ui\00" +@.str118 = private unnamed_addr constant [4 x i8] c"var\00" +@.str119 = private unnamed_addr constant [6 x i8] c"const\00" +@.str120 = private unnamed_addr constant [3 x i8] c"fn\00" +@.str121 = private unnamed_addr constant [7 x i8] c"extern\00" +@.str122 = private unnamed_addr constant [5 x i8] c"main\00" +@.str123 = private unnamed_addr constant [21 x i8] c"expected declaration\00" +@.str124 = private unnamed_addr constant [20 x i8] c"cannot open import \00" +@.str125 = private unnamed_addr constant [1 x i8] c"\00" +@.str126 = private unnamed_addr constant [26 x i8] c"runtime/native/core.ludic\00" +@.str127 = private unnamed_addr constant [6 x i8] c"Ludic\00" +@.str128 = private unnamed_addr constant [7 x i8] c"import\00" +@.str129 = private unnamed_addr constant [5 x i8] c"game\00" +@.str130 = private unnamed_addr constant [7 x i8] c"module\00" +@.str131 = private unnamed_addr constant [2 x i8] c"{\00" @.str132 = private unnamed_addr constant [2 x i8] c"}\00" -@.str133 = private unnamed_addr constant [2 x i8] c"[\00" -@.str134 = private unnamed_addr constant [2 x i8] c"[\00" -@.str135 = private unnamed_addr constant [2 x i8] c"]\00" -@.str136 = private unnamed_addr constant [5 x i8] c"edge\00" -@.str137 = private unnamed_addr constant [7 x i8] c"Update\00" -@.str138 = private unnamed_addr constant [2 x i8] c"@\00" -@.str139 = private unnamed_addr constant [2 x i8] c"(\00" -@.str140 = private unnamed_addr constant [2 x i8] c"(\00" -@.str141 = private unnamed_addr constant [2 x i8] c")\00" -@.str142 = private unnamed_addr constant [6 x i8] c"phase\00" -@.str143 = private unnamed_addr constant [6 x i8] c"reads\00" -@.str144 = private unnamed_addr constant [7 x i8] c"writes\00" -@.str145 = private unnamed_addr constant [6 x i8] c"needs\00" -@.str146 = private unnamed_addr constant [5 x i8] c"uses\00" -@.str147 = private unnamed_addr constant [6 x i8] c"query\00" -@.str148 = private unnamed_addr constant [2 x i8] c"(\00" -@.str149 = private unnamed_addr constant [2 x i8] c"(\00" -@.str150 = private unnamed_addr constant [2 x i8] c")\00" -@.str151 = private unnamed_addr constant [2 x i8] c",\00" -@.str152 = private unnamed_addr constant [2 x i8] c")\00" -@.str153 = private unnamed_addr constant [2 x i8] c"[\00" -@.str154 = private unnamed_addr constant [2 x i8] c"]\00" -@.str155 = private unnamed_addr constant [2 x i8] c"{\00" -@.str156 = private unnamed_addr constant [2 x i8] c"}\00" -@.str157 = private unnamed_addr constant [2 x i8] c",\00" -@.str158 = private unnamed_addr constant [2 x i8] c"]\00" -@.str159 = private unnamed_addr constant [6 x i8] c"where\00" -@.str160 = private unnamed_addr constant [2 x i8] c"(\00" -@.str161 = private unnamed_addr constant [2 x i8] c")\00" -@.str162 = private unnamed_addr constant [2 x i8] c",\00" -@.str163 = private unnamed_addr constant [2 x i8] c")\00" -@.str164 = private unnamed_addr constant [2 x i8] c"{\00" -@.str165 = private unnamed_addr constant [2 x i8] c"}\00" -@.str166 = private unnamed_addr constant [2 x i8] c"=\00" -@.str167 = private unnamed_addr constant [2 x i8] c",\00" +@.str133 = private unnamed_addr constant [2 x i8] c"{\00" +@.str134 = private unnamed_addr constant [2 x i8] c"}\00" +@.str135 = private unnamed_addr constant [2 x i8] c":\00" +@.str136 = private unnamed_addr constant [2 x i8] c"=\00" +@.str137 = private unnamed_addr constant [2 x i8] c",\00" +@.str138 = private unnamed_addr constant [2 x i8] c"}\00" +@.str139 = private unnamed_addr constant [2 x i8] c"[\00" +@.str140 = private unnamed_addr constant [2 x i8] c"[\00" +@.str141 = private unnamed_addr constant [2 x i8] c"]\00" +@.str142 = private unnamed_addr constant [7 x i8] c"Update\00" +@.str143 = private unnamed_addr constant [2 x i8] c"@\00" +@.str144 = private unnamed_addr constant [2 x i8] c"(\00" +@.str145 = private unnamed_addr constant [2 x i8] c"(\00" +@.str146 = private unnamed_addr constant [2 x i8] c")\00" +@.str147 = private unnamed_addr constant [6 x i8] c"phase\00" +@.str148 = private unnamed_addr constant [6 x i8] c"reads\00" +@.str149 = private unnamed_addr constant [7 x i8] c"writes\00" +@.str150 = private unnamed_addr constant [6 x i8] c"query\00" +@.str151 = private unnamed_addr constant [2 x i8] c"(\00" +@.str152 = private unnamed_addr constant [2 x i8] c"(\00" +@.str153 = private unnamed_addr constant [2 x i8] c")\00" +@.str154 = private unnamed_addr constant [2 x i8] c",\00" +@.str155 = private unnamed_addr constant [2 x i8] c")\00" +@.str156 = private unnamed_addr constant [2 x i8] c"[\00" +@.str157 = private unnamed_addr constant [2 x i8] c"]\00" +@.str158 = private unnamed_addr constant [2 x i8] c"{\00" +@.str159 = private unnamed_addr constant [2 x i8] c"}\00" +@.str160 = private unnamed_addr constant [2 x i8] c",\00" +@.str161 = private unnamed_addr constant [2 x i8] c"]\00" +@.str162 = private unnamed_addr constant [6 x i8] c"where\00" +@.str163 = private unnamed_addr constant [2 x i8] c"(\00" +@.str164 = private unnamed_addr constant [2 x i8] c")\00" +@.str165 = private unnamed_addr constant [2 x i8] c",\00" +@.str166 = private unnamed_addr constant [2 x i8] c")\00" +@.str167 = private unnamed_addr constant [2 x i8] c"{\00" @.str168 = private unnamed_addr constant [2 x i8] c"}\00" -@.str169 = private unnamed_addr constant [2 x i8] c"{\00" +@.str169 = private unnamed_addr constant [2 x i8] c",\00" @.str170 = private unnamed_addr constant [2 x i8] c"}\00" -@.str171 = private unnamed_addr constant [2 x i8] c",\00" +@.str171 = private unnamed_addr constant [2 x i8] c"{\00" @.str172 = private unnamed_addr constant [2 x i8] c"}\00" -@.str173 = private unnamed_addr constant [2 x i8] c"(\00" -@.str174 = private unnamed_addr constant [2 x i8] c")\00" -@.str175 = private unnamed_addr constant [2 x i8] c":\00" -@.str176 = private unnamed_addr constant [2 x i8] c",\00" -@.str177 = private unnamed_addr constant [2 x i8] c")\00" -@.str178 = private unnamed_addr constant [5 x i8] c"void\00" -@.str179 = private unnamed_addr constant [3 x i8] c"->\00" -@.str180 = private unnamed_addr constant [2 x i8] c"=\00" -@.str181 = private unnamed_addr constant [2 x i8] c"=\00" -@.str182 = private unnamed_addr constant [2 x i8] c"=\00" -@.str183 = private unnamed_addr constant [2 x i8] c"{\00" -@.str184 = private unnamed_addr constant [2 x i8] c"}\00" -@.str185 = private unnamed_addr constant [2 x i8] c"}\00" -@.str186 = private unnamed_addr constant [2 x i8] c"{\00" -@.str187 = private unnamed_addr constant [2 x i8] c"}\00" -@.str188 = private unnamed_addr constant [3 x i8] c"%t\00" -@.str189 = private unnamed_addr constant [3 x i8] c" \00" -@.str190 = private unnamed_addr constant [11 x i8] c" = alloca \00" -@.str191 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str192 = private unnamed_addr constant [3 x i8] c"%t\00" -@.str193 = private unnamed_addr constant [4 x i8] c"int\00" -@.str194 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str195 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str196 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str197 = private unnamed_addr constant [5 x i8] c"void\00" -@.str198 = private unnamed_addr constant [5 x i8] c"void\00" -@.str199 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str200 = private unnamed_addr constant [6 x i8] c"%Str_\00" -@.str201 = private unnamed_addr constant [6 x i8] c"%Cmp_\00" -@.str202 = private unnamed_addr constant [4 x i8] c"int\00" -@.str203 = private unnamed_addr constant [6 x i8] c"@.str\00" -@.str204 = private unnamed_addr constant [35 x i8] c" = private unnamed_addr constant [\00" -@.str205 = private unnamed_addr constant [10 x i8] c" x i8] c\22\00" -@.str206 = private unnamed_addr constant [6 x i8] c"\5C00\22\0A\00" -@.str207 = private unnamed_addr constant [3 x i8] c" \00" -@.str208 = private unnamed_addr constant [35 x i8] c" = getelementptr inbounds i8, ptr \00" -@.str209 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str210 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str211 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str212 = private unnamed_addr constant [5 x i8] c"null\00" -@.str213 = private unnamed_addr constant [2 x i8] c"0\00" -@.str214 = private unnamed_addr constant [2 x i8] c"-\00" -@.str215 = private unnamed_addr constant [2 x i8] c"-\00" -@.str216 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str217 = private unnamed_addr constant [5 x i8] c"null\00" -@.str218 = private unnamed_addr constant [2 x i8] c"0\00" -@.str219 = private unnamed_addr constant [34 x i8] c"; Ludic (self-hosted) -> LLVM IR\0A\00" -@.str220 = private unnamed_addr constant [31 x i8] c"declare i32 @printf(ptr, ...)\0A\00" -@.str221 = private unnamed_addr constant [26 x i8] c"declare ptr @malloc(i64)\0A\00" -@.str222 = private unnamed_addr constant [32 x i8] c"declare ptr @realloc(ptr, i64)\0A\00" -@.str223 = private unnamed_addr constant [25 x i8] c"declare void @free(ptr)\0A\00" -@.str224 = private unnamed_addr constant [30 x i8] c"declare ptr @fopen(ptr, ptr)\0A\00" -@.str225 = private unnamed_addr constant [40 x i8] c"declare i64 @fread(ptr, i64, i64, ptr)\0A\00" -@.str226 = private unnamed_addr constant [41 x i8] c"declare i64 @fwrite(ptr, i64, i64, ptr)\0A\00" -@.str227 = private unnamed_addr constant [35 x i8] c"declare i32 @fseek(ptr, i64, i32)\0A\00" -@.str228 = private unnamed_addr constant [25 x i8] c"declare i64 @ftell(ptr)\0A\00" -@.str229 = private unnamed_addr constant [26 x i8] c"declare i32 @fclose(ptr)\0A\00" -@.str230 = private unnamed_addr constant [25 x i8] c"declare void @exit(i32)\0A\00" -@.str231 = private unnamed_addr constant [26 x i8] c"declare i32 @system(ptr)\0A\00" -@.str232 = private unnamed_addr constant [26 x i8] c"declare ptr @getenv(ptr)\0A\00" -@.str233 = private unnamed_addr constant [36 x i8] c"declare ptr @memcpy(ptr, ptr, i64)\0A\00" -@.str234 = private unnamed_addr constant [36 x i8] c"declare ptr @memset(ptr, i32, i64)\0A\00" -@.str235 = private unnamed_addr constant [26 x i8] c"declare i64 @strlen(ptr)\0A\00" -@.str236 = private unnamed_addr constant [24 x i8] c"declare i32 @getchar()\0A\00" -@.str237 = private unnamed_addr constant [27 x i8] c"declare i32 @putchar(i32)\0A\00" -@.str238 = private unnamed_addr constant [24 x i8] c"declare i64 @time(ptr)\0A\00" -@.str239 = private unnamed_addr constant [44 x i8] c"declare void @win_open(i32, i32, i32, ptr)\0A\00" -@.str240 = private unnamed_addr constant [25 x i8] c"declare i32 @win_poll()\0A\00" -@.str241 = private unnamed_addr constant [42 x i8] c"declare void @win_present(ptr, i32, i32)\0A\00" -@.str242 = private unnamed_addr constant [28 x i8] c"declare i32 @win_running()\0A\00" -@.str243 = private unnamed_addr constant [27 x i8] c"declare void @win_close()\0A\00" -@.str244 = private unnamed_addr constant [34 x i8] c"@__stderrp = external global ptr\0A\00" -@.str245 = private unnamed_addr constant [61 x i8] c"@.fmt_str = private unnamed_addr constant [3 x i8] c\22%s\5C00\22\0A\00" -@.str246 = private unnamed_addr constant [64 x i8] c"@.fmt_int = private unnamed_addr constant [4 x i8] c\22%d\5C0A\5C00\22\0A\00" -@.str247 = private unnamed_addr constant [33 x i8] c"@L_argc = internal global i32 0\0A\00" -@.str248 = private unnamed_addr constant [36 x i8] c"@L_argv = internal global ptr null\0A\00" -@.str249 = private unnamed_addr constant [46 x i8] c"@.gametitle = private unnamed_addr constant [\00" -@.str250 = private unnamed_addr constant [10 x i8] c" x i8] c\22\00" -@.str251 = private unnamed_addr constant [6 x i8] c"\5C00\22\0A\00" -@.str252 = private unnamed_addr constant [34 x i8] c"%LSlice = type { ptr, i32, i32 }\0A\00" -@.str253 = private unnamed_addr constant [6 x i8] c"%Str_\00" -@.str254 = private unnamed_addr constant [11 x i8] c" = type { \00" -@.str255 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str256 = private unnamed_addr constant [3 x i8] c", \00" -@.str257 = private unnamed_addr constant [4 x i8] c" }\0A\00" -@.str258 = private unnamed_addr constant [4 x i8] c"@g_\00" -@.str259 = private unnamed_addr constant [20 x i8] c" = internal global \00" -@.str260 = private unnamed_addr constant [2 x i8] c" \00" -@.str261 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str262 = private unnamed_addr constant [32 x i8] c"member access on non-aggregate \00" -@.str263 = private unnamed_addr constant [15 x i8] c"no such field \00" -@.str264 = private unnamed_addr constant [3 x i8] c" \00" -@.str265 = private unnamed_addr constant [27 x i8] c" = getelementptr inbounds \00" -@.str266 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str267 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" -@.str268 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str269 = private unnamed_addr constant [21 x i8] c"indexing a non-slice\00" +@.str173 = private unnamed_addr constant [2 x i8] c",\00" +@.str174 = private unnamed_addr constant [2 x i8] c"}\00" +@.str175 = private unnamed_addr constant [2 x i8] c"{\00" +@.str176 = private unnamed_addr constant [2 x i8] c"}\00" +@.str177 = private unnamed_addr constant [2 x i8] c",\00" +@.str178 = private unnamed_addr constant [2 x i8] c"}\00" +@.str179 = private unnamed_addr constant [2 x i8] c"(\00" +@.str180 = private unnamed_addr constant [2 x i8] c")\00" +@.str181 = private unnamed_addr constant [2 x i8] c":\00" +@.str182 = private unnamed_addr constant [2 x i8] c",\00" +@.str183 = private unnamed_addr constant [2 x i8] c")\00" +@.str184 = private unnamed_addr constant [5 x i8] c"void\00" +@.str185 = private unnamed_addr constant [3 x i8] c"->\00" +@.str186 = private unnamed_addr constant [2 x i8] c"=\00" +@.str187 = private unnamed_addr constant [2 x i8] c":\00" +@.str188 = private unnamed_addr constant [2 x i8] c":\00" +@.str189 = private unnamed_addr constant [2 x i8] c"{\00" +@.str190 = private unnamed_addr constant [2 x i8] c"}\00" +@.str191 = private unnamed_addr constant [2 x i8] c"}\00" +@.str192 = private unnamed_addr constant [2 x i8] c"{\00" +@.str193 = private unnamed_addr constant [2 x i8] c"}\00" +@.str194 = private unnamed_addr constant [3 x i8] c"%t\00" +@.str195 = private unnamed_addr constant [3 x i8] c" \00" +@.str196 = private unnamed_addr constant [11 x i8] c" = alloca \00" +@.str197 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str198 = private unnamed_addr constant [3 x i8] c"%t\00" +@.str199 = private unnamed_addr constant [4 x i8] c"int\00" +@.str200 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str201 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str202 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str203 = private unnamed_addr constant [5 x i8] c"void\00" +@.str204 = private unnamed_addr constant [5 x i8] c"void\00" +@.str205 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str206 = private unnamed_addr constant [6 x i8] c"%Str_\00" +@.str207 = private unnamed_addr constant [6 x i8] c"%Cmp_\00" +@.str208 = private unnamed_addr constant [4 x i8] c"int\00" +@.str209 = private unnamed_addr constant [6 x i8] c"@.str\00" +@.str210 = private unnamed_addr constant [35 x i8] c" = private unnamed_addr constant [\00" +@.str211 = private unnamed_addr constant [10 x i8] c" x i8] c\22\00" +@.str212 = private unnamed_addr constant [6 x i8] c"\5C00\22\0A\00" +@.str213 = private unnamed_addr constant [3 x i8] c" \00" +@.str214 = private unnamed_addr constant [35 x i8] c" = getelementptr inbounds i8, ptr \00" +@.str215 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str216 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str217 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str218 = private unnamed_addr constant [5 x i8] c"null\00" +@.str219 = private unnamed_addr constant [2 x i8] c"0\00" +@.str220 = private unnamed_addr constant [2 x i8] c"-\00" +@.str221 = private unnamed_addr constant [2 x i8] c"-\00" +@.str222 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str223 = private unnamed_addr constant [5 x i8] c"null\00" +@.str224 = private unnamed_addr constant [2 x i8] c"0\00" +@.str225 = private unnamed_addr constant [34 x i8] c"; Ludic (self-hosted) -> LLVM IR\0A\00" +@.str226 = private unnamed_addr constant [31 x i8] c"declare i32 @printf(ptr, ...)\0A\00" +@.str227 = private unnamed_addr constant [26 x i8] c"declare ptr @malloc(i64)\0A\00" +@.str228 = private unnamed_addr constant [32 x i8] c"declare ptr @realloc(ptr, i64)\0A\00" +@.str229 = private unnamed_addr constant [25 x i8] c"declare void @free(ptr)\0A\00" +@.str230 = private unnamed_addr constant [30 x i8] c"declare ptr @fopen(ptr, ptr)\0A\00" +@.str231 = private unnamed_addr constant [40 x i8] c"declare i64 @fread(ptr, i64, i64, ptr)\0A\00" +@.str232 = private unnamed_addr constant [41 x i8] c"declare i64 @fwrite(ptr, i64, i64, ptr)\0A\00" +@.str233 = private unnamed_addr constant [35 x i8] c"declare i32 @fseek(ptr, i64, i32)\0A\00" +@.str234 = private unnamed_addr constant [25 x i8] c"declare i64 @ftell(ptr)\0A\00" +@.str235 = private unnamed_addr constant [26 x i8] c"declare i32 @fclose(ptr)\0A\00" +@.str236 = private unnamed_addr constant [25 x i8] c"declare void @exit(i32)\0A\00" +@.str237 = private unnamed_addr constant [26 x i8] c"declare i32 @system(ptr)\0A\00" +@.str238 = private unnamed_addr constant [26 x i8] c"declare ptr @getenv(ptr)\0A\00" +@.str239 = private unnamed_addr constant [36 x i8] c"declare ptr @memcpy(ptr, ptr, i64)\0A\00" +@.str240 = private unnamed_addr constant [36 x i8] c"declare ptr @memset(ptr, i32, i64)\0A\00" +@.str241 = private unnamed_addr constant [26 x i8] c"declare i64 @strlen(ptr)\0A\00" +@.str242 = private unnamed_addr constant [24 x i8] c"declare i32 @getchar()\0A\00" +@.str243 = private unnamed_addr constant [27 x i8] c"declare i32 @putchar(i32)\0A\00" +@.str244 = private unnamed_addr constant [24 x i8] c"declare i64 @time(ptr)\0A\00" +@.str245 = private unnamed_addr constant [44 x i8] c"declare void @win_open(i32, i32, i32, ptr)\0A\00" +@.str246 = private unnamed_addr constant [25 x i8] c"declare i32 @win_poll()\0A\00" +@.str247 = private unnamed_addr constant [42 x i8] c"declare void @win_present(ptr, i32, i32)\0A\00" +@.str248 = private unnamed_addr constant [28 x i8] c"declare i32 @win_running()\0A\00" +@.str249 = private unnamed_addr constant [27 x i8] c"declare void @win_close()\0A\00" +@.str250 = private unnamed_addr constant [34 x i8] c"@__stderrp = external global ptr\0A\00" +@.str251 = private unnamed_addr constant [61 x i8] c"@.fmt_str = private unnamed_addr constant [3 x i8] c\22%s\5C00\22\0A\00" +@.str252 = private unnamed_addr constant [64 x i8] c"@.fmt_int = private unnamed_addr constant [4 x i8] c\22%d\5C0A\5C00\22\0A\00" +@.str253 = private unnamed_addr constant [33 x i8] c"@L_argc = internal global i32 0\0A\00" +@.str254 = private unnamed_addr constant [36 x i8] c"@L_argv = internal global ptr null\0A\00" +@.str255 = private unnamed_addr constant [46 x i8] c"@.gametitle = private unnamed_addr constant [\00" +@.str256 = private unnamed_addr constant [10 x i8] c" x i8] c\22\00" +@.str257 = private unnamed_addr constant [6 x i8] c"\5C00\22\0A\00" +@.str258 = private unnamed_addr constant [34 x i8] c"%LSlice = type { ptr, i32, i32 }\0A\00" +@.str259 = private unnamed_addr constant [6 x i8] c"%Str_\00" +@.str260 = private unnamed_addr constant [11 x i8] c" = type { \00" +@.str261 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str262 = private unnamed_addr constant [3 x i8] c", \00" +@.str263 = private unnamed_addr constant [4 x i8] c" }\0A\00" +@.str264 = private unnamed_addr constant [4 x i8] c"@g_\00" +@.str265 = private unnamed_addr constant [20 x i8] c" = internal global \00" +@.str266 = private unnamed_addr constant [2 x i8] c" \00" +@.str267 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str268 = private unnamed_addr constant [32 x i8] c"member access on non-aggregate \00" +@.str269 = private unnamed_addr constant [15 x i8] c"no such field \00" @.str270 = private unnamed_addr constant [3 x i8] c" \00" -@.str271 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" -@.str272 = private unnamed_addr constant [16 x i8] c", i32 0, i32 0\0A\00" -@.str273 = private unnamed_addr constant [3 x i8] c" \00" -@.str274 = private unnamed_addr constant [18 x i8] c" = load ptr, ptr \00" -@.str275 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str271 = private unnamed_addr constant [27 x i8] c" = getelementptr inbounds \00" +@.str272 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str273 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str274 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str275 = private unnamed_addr constant [21 x i8] c"indexing a non-slice\00" @.str276 = private unnamed_addr constant [3 x i8] c" \00" -@.str277 = private unnamed_addr constant [27 x i8] c" = getelementptr inbounds \00" -@.str278 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str279 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str280 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str281 = private unnamed_addr constant [9 x i8] c"ptr_null\00" -@.str282 = private unnamed_addr constant [10 x i8] c"mem_alloc\00" -@.str283 = private unnamed_addr constant [12 x i8] c"mem_realloc\00" -@.str284 = private unnamed_addr constant [6 x i8] c"peek8\00" -@.str285 = private unnamed_addr constant [6 x i8] c"poke8\00" -@.str286 = private unnamed_addr constant [12 x i8] c"ptr_is_null\00" -@.str287 = private unnamed_addr constant [10 x i8] c"file_open\00" -@.str288 = private unnamed_addr constant [10 x i8] c"file_read\00" -@.str289 = private unnamed_addr constant [11 x i8] c"file_write\00" -@.str290 = private unnamed_addr constant [10 x i8] c"file_seek\00" -@.str291 = private unnamed_addr constant [10 x i8] c"file_tell\00" -@.str292 = private unnamed_addr constant [11 x i8] c"file_close\00" -@.str293 = private unnamed_addr constant [10 x i8] c"print_str\00" -@.str294 = private unnamed_addr constant [10 x i8] c"print_int\00" -@.str295 = private unnamed_addr constant [8 x i8] c"os_argc\00" -@.str296 = private unnamed_addr constant [7 x i8] c"os_arg\00" -@.str297 = private unnamed_addr constant [8 x i8] c"os_exit\00" -@.str298 = private unnamed_addr constant [12 x i8] c"file_stderr\00" -@.str299 = private unnamed_addr constant [10 x i8] c"os_system\00" -@.str300 = private unnamed_addr constant [10 x i8] c"os_getenv\00" -@.str301 = private unnamed_addr constant [4 x i8] c"shl\00" -@.str302 = private unnamed_addr constant [4 x i8] c"shr\00" -@.str303 = private unnamed_addr constant [5 x i8] c"band\00" -@.str304 = private unnamed_addr constant [4 x i8] c"bor\00" -@.str305 = private unnamed_addr constant [5 x i8] c"bxor\00" -@.str306 = private unnamed_addr constant [5 x i8] c"bnot\00" -@.str307 = private unnamed_addr constant [7 x i8] c"peek32\00" -@.str308 = private unnamed_addr constant [7 x i8] c"poke32\00" -@.str309 = private unnamed_addr constant [3 x i8] c" \00" -@.str310 = private unnamed_addr constant [4 x i8] c" = \00" -@.str311 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str312 = private unnamed_addr constant [9 x i8] c"ptr_null\00" -@.str313 = private unnamed_addr constant [5 x i8] c"null\00" -@.str314 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str315 = private unnamed_addr constant [10 x i8] c"mem_alloc\00" -@.str316 = private unnamed_addr constant [10 x i8] c"zext i32 \00" -@.str317 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str318 = private unnamed_addr constant [22 x i8] c"call ptr @malloc(i64 \00" -@.str319 = private unnamed_addr constant [2 x i8] c")\00" +@.str277 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" +@.str278 = private unnamed_addr constant [16 x i8] c", i32 0, i32 0\0A\00" +@.str279 = private unnamed_addr constant [3 x i8] c" \00" +@.str280 = private unnamed_addr constant [18 x i8] c" = load ptr, ptr \00" +@.str281 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str282 = private unnamed_addr constant [3 x i8] c" \00" +@.str283 = private unnamed_addr constant [27 x i8] c" = getelementptr inbounds \00" +@.str284 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str285 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str286 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str287 = private unnamed_addr constant [9 x i8] c"ptr_null\00" +@.str288 = private unnamed_addr constant [10 x i8] c"mem_alloc\00" +@.str289 = private unnamed_addr constant [12 x i8] c"mem_realloc\00" +@.str290 = private unnamed_addr constant [6 x i8] c"peek8\00" +@.str291 = private unnamed_addr constant [6 x i8] c"poke8\00" +@.str292 = private unnamed_addr constant [12 x i8] c"ptr_is_null\00" +@.str293 = private unnamed_addr constant [10 x i8] c"file_open\00" +@.str294 = private unnamed_addr constant [10 x i8] c"file_read\00" +@.str295 = private unnamed_addr constant [11 x i8] c"file_write\00" +@.str296 = private unnamed_addr constant [10 x i8] c"file_seek\00" +@.str297 = private unnamed_addr constant [10 x i8] c"file_tell\00" +@.str298 = private unnamed_addr constant [11 x i8] c"file_close\00" +@.str299 = private unnamed_addr constant [10 x i8] c"print_str\00" +@.str300 = private unnamed_addr constant [10 x i8] c"print_int\00" +@.str301 = private unnamed_addr constant [8 x i8] c"os_argc\00" +@.str302 = private unnamed_addr constant [7 x i8] c"os_arg\00" +@.str303 = private unnamed_addr constant [8 x i8] c"os_exit\00" +@.str304 = private unnamed_addr constant [12 x i8] c"file_stderr\00" +@.str305 = private unnamed_addr constant [10 x i8] c"os_system\00" +@.str306 = private unnamed_addr constant [10 x i8] c"os_getenv\00" +@.str307 = private unnamed_addr constant [4 x i8] c"shl\00" +@.str308 = private unnamed_addr constant [4 x i8] c"shr\00" +@.str309 = private unnamed_addr constant [5 x i8] c"band\00" +@.str310 = private unnamed_addr constant [4 x i8] c"bor\00" +@.str311 = private unnamed_addr constant [5 x i8] c"bxor\00" +@.str312 = private unnamed_addr constant [5 x i8] c"bnot\00" +@.str313 = private unnamed_addr constant [7 x i8] c"peek32\00" +@.str314 = private unnamed_addr constant [7 x i8] c"poke32\00" +@.str315 = private unnamed_addr constant [3 x i8] c" \00" +@.str316 = private unnamed_addr constant [4 x i8] c" = \00" +@.str317 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str318 = private unnamed_addr constant [9 x i8] c"ptr_null\00" +@.str319 = private unnamed_addr constant [5 x i8] c"null\00" @.str320 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str321 = private unnamed_addr constant [12 x i8] c"mem_realloc\00" +@.str321 = private unnamed_addr constant [10 x i8] c"mem_alloc\00" @.str322 = private unnamed_addr constant [10 x i8] c"zext i32 \00" @.str323 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str324 = private unnamed_addr constant [23 x i8] c"call ptr @realloc(ptr \00" -@.str325 = private unnamed_addr constant [7 x i8] c", i64 \00" -@.str326 = private unnamed_addr constant [2 x i8] c")\00" -@.str327 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str328 = private unnamed_addr constant [6 x i8] c"peek8\00" -@.str329 = private unnamed_addr constant [14 x i8] c"load i8, ptr \00" -@.str330 = private unnamed_addr constant [9 x i8] c"zext i8 \00" -@.str331 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str332 = private unnamed_addr constant [4 x i8] c"int\00" -@.str333 = private unnamed_addr constant [6 x i8] c"poke8\00" -@.str334 = private unnamed_addr constant [11 x i8] c"trunc i32 \00" -@.str335 = private unnamed_addr constant [7 x i8] c" to i8\00" -@.str336 = private unnamed_addr constant [12 x i8] c" store i8 \00" -@.str337 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str338 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str339 = private unnamed_addr constant [2 x i8] c"0\00" -@.str340 = private unnamed_addr constant [5 x i8] c"void\00" -@.str341 = private unnamed_addr constant [12 x i8] c"ptr_is_null\00" -@.str342 = private unnamed_addr constant [13 x i8] c"icmp eq ptr \00" -@.str343 = private unnamed_addr constant [7 x i8] c", null\00" -@.str344 = private unnamed_addr constant [9 x i8] c"zext i1 \00" -@.str345 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str346 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str347 = private unnamed_addr constant [10 x i8] c"file_open\00" -@.str348 = private unnamed_addr constant [21 x i8] c"call ptr @fopen(ptr \00" -@.str349 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str350 = private unnamed_addr constant [2 x i8] c")\00" -@.str351 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str352 = private unnamed_addr constant [10 x i8] c"file_read\00" -@.str353 = private unnamed_addr constant [11 x i8] c"file_write\00" -@.str354 = private unnamed_addr constant [10 x i8] c"zext i32 \00" -@.str355 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str356 = private unnamed_addr constant [7 x i8] c"@fread\00" -@.str357 = private unnamed_addr constant [11 x i8] c"file_write\00" -@.str358 = private unnamed_addr constant [8 x i8] c"@fwrite\00" -@.str359 = private unnamed_addr constant [10 x i8] c"call i64 \00" -@.str360 = private unnamed_addr constant [6 x i8] c"(ptr \00" -@.str361 = private unnamed_addr constant [14 x i8] c", i64 1, i64 \00" -@.str362 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str363 = private unnamed_addr constant [2 x i8] c")\00" -@.str364 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" -@.str365 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str366 = private unnamed_addr constant [4 x i8] c"int\00" -@.str367 = private unnamed_addr constant [10 x i8] c"file_seek\00" -@.str368 = private unnamed_addr constant [10 x i8] c"sext i32 \00" -@.str369 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str370 = private unnamed_addr constant [21 x i8] c"call i32 @fseek(ptr \00" -@.str371 = private unnamed_addr constant [7 x i8] c", i64 \00" -@.str372 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str373 = private unnamed_addr constant [2 x i8] c")\00" -@.str374 = private unnamed_addr constant [4 x i8] c"int\00" -@.str375 = private unnamed_addr constant [10 x i8] c"file_tell\00" -@.str376 = private unnamed_addr constant [21 x i8] c"call i64 @ftell(ptr \00" -@.str377 = private unnamed_addr constant [2 x i8] c")\00" -@.str378 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" -@.str379 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str324 = private unnamed_addr constant [22 x i8] c"call ptr @malloc(i64 \00" +@.str325 = private unnamed_addr constant [2 x i8] c")\00" +@.str326 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str327 = private unnamed_addr constant [12 x i8] c"mem_realloc\00" +@.str328 = private unnamed_addr constant [10 x i8] c"zext i32 \00" +@.str329 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str330 = private unnamed_addr constant [23 x i8] c"call ptr @realloc(ptr \00" +@.str331 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str332 = private unnamed_addr constant [2 x i8] c")\00" +@.str333 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str334 = private unnamed_addr constant [6 x i8] c"peek8\00" +@.str335 = private unnamed_addr constant [14 x i8] c"load i8, ptr \00" +@.str336 = private unnamed_addr constant [9 x i8] c"zext i8 \00" +@.str337 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str338 = private unnamed_addr constant [4 x i8] c"int\00" +@.str339 = private unnamed_addr constant [6 x i8] c"poke8\00" +@.str340 = private unnamed_addr constant [11 x i8] c"trunc i32 \00" +@.str341 = private unnamed_addr constant [7 x i8] c" to i8\00" +@.str342 = private unnamed_addr constant [12 x i8] c" store i8 \00" +@.str343 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str344 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str345 = private unnamed_addr constant [2 x i8] c"0\00" +@.str346 = private unnamed_addr constant [5 x i8] c"void\00" +@.str347 = private unnamed_addr constant [12 x i8] c"ptr_is_null\00" +@.str348 = private unnamed_addr constant [13 x i8] c"icmp eq ptr \00" +@.str349 = private unnamed_addr constant [7 x i8] c", null\00" +@.str350 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str351 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str352 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str353 = private unnamed_addr constant [10 x i8] c"file_open\00" +@.str354 = private unnamed_addr constant [21 x i8] c"call ptr @fopen(ptr \00" +@.str355 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str356 = private unnamed_addr constant [2 x i8] c")\00" +@.str357 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str358 = private unnamed_addr constant [10 x i8] c"file_read\00" +@.str359 = private unnamed_addr constant [11 x i8] c"file_write\00" +@.str360 = private unnamed_addr constant [10 x i8] c"zext i32 \00" +@.str361 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str362 = private unnamed_addr constant [7 x i8] c"@fread\00" +@.str363 = private unnamed_addr constant [11 x i8] c"file_write\00" +@.str364 = private unnamed_addr constant [8 x i8] c"@fwrite\00" +@.str365 = private unnamed_addr constant [10 x i8] c"call i64 \00" +@.str366 = private unnamed_addr constant [6 x i8] c"(ptr \00" +@.str367 = private unnamed_addr constant [14 x i8] c", i64 1, i64 \00" +@.str368 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str369 = private unnamed_addr constant [2 x i8] c")\00" +@.str370 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str371 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str372 = private unnamed_addr constant [4 x i8] c"int\00" +@.str373 = private unnamed_addr constant [10 x i8] c"file_seek\00" +@.str374 = private unnamed_addr constant [10 x i8] c"sext i32 \00" +@.str375 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str376 = private unnamed_addr constant [21 x i8] c"call i32 @fseek(ptr \00" +@.str377 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str378 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str379 = private unnamed_addr constant [2 x i8] c")\00" @.str380 = private unnamed_addr constant [4 x i8] c"int\00" -@.str381 = private unnamed_addr constant [11 x i8] c"file_close\00" -@.str382 = private unnamed_addr constant [24 x i8] c" call i32 @fclose(ptr \00" -@.str383 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str384 = private unnamed_addr constant [2 x i8] c"0\00" -@.str385 = private unnamed_addr constant [5 x i8] c"void\00" -@.str386 = private unnamed_addr constant [10 x i8] c"print_str\00" -@.str387 = private unnamed_addr constant [50 x i8] c" call i32 (ptr, ...) @printf(ptr @.fmt_str, ptr \00" -@.str388 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str389 = private unnamed_addr constant [2 x i8] c"0\00" -@.str390 = private unnamed_addr constant [5 x i8] c"void\00" -@.str391 = private unnamed_addr constant [10 x i8] c"print_int\00" -@.str392 = private unnamed_addr constant [50 x i8] c" call i32 (ptr, ...) @printf(ptr @.fmt_int, i32 \00" -@.str393 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str394 = private unnamed_addr constant [2 x i8] c"0\00" -@.str395 = private unnamed_addr constant [5 x i8] c"void\00" -@.str396 = private unnamed_addr constant [8 x i8] c"os_argc\00" -@.str397 = private unnamed_addr constant [22 x i8] c"load i32, ptr @L_argc\00" -@.str398 = private unnamed_addr constant [4 x i8] c"int\00" -@.str399 = private unnamed_addr constant [7 x i8] c"os_arg\00" -@.str400 = private unnamed_addr constant [22 x i8] c"load ptr, ptr @L_argv\00" -@.str401 = private unnamed_addr constant [24 x i8] c"getelementptr ptr, ptr \00" -@.str402 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str403 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" -@.str404 = private unnamed_addr constant [4 x i8] c"str\00" -@.str405 = private unnamed_addr constant [8 x i8] c"os_exit\00" -@.str406 = private unnamed_addr constant [23 x i8] c" call void @exit(i32 \00" -@.str407 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str408 = private unnamed_addr constant [15 x i8] c" unreachable\0A\00" -@.str409 = private unnamed_addr constant [2 x i8] c"0\00" -@.str410 = private unnamed_addr constant [5 x i8] c"void\00" -@.str411 = private unnamed_addr constant [12 x i8] c"file_stderr\00" -@.str412 = private unnamed_addr constant [25 x i8] c"load ptr, ptr @__stderrp\00" -@.str413 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str414 = private unnamed_addr constant [10 x i8] c"os_system\00" -@.str415 = private unnamed_addr constant [22 x i8] c"call i32 @system(ptr \00" -@.str416 = private unnamed_addr constant [2 x i8] c")\00" -@.str417 = private unnamed_addr constant [4 x i8] c"int\00" -@.str418 = private unnamed_addr constant [10 x i8] c"os_getenv\00" -@.str419 = private unnamed_addr constant [22 x i8] c"call ptr @getenv(ptr \00" -@.str420 = private unnamed_addr constant [2 x i8] c")\00" -@.str421 = private unnamed_addr constant [4 x i8] c"str\00" -@.str422 = private unnamed_addr constant [5 x i8] c"bnot\00" -@.str423 = private unnamed_addr constant [9 x i8] c"xor i32 \00" -@.str424 = private unnamed_addr constant [5 x i8] c", -1\00" -@.str425 = private unnamed_addr constant [4 x i8] c"int\00" -@.str426 = private unnamed_addr constant [4 x i8] c"shl\00" -@.str427 = private unnamed_addr constant [4 x i8] c"shr\00" -@.str428 = private unnamed_addr constant [5 x i8] c"band\00" -@.str429 = private unnamed_addr constant [4 x i8] c"bor\00" -@.str430 = private unnamed_addr constant [5 x i8] c"bxor\00" -@.str431 = private unnamed_addr constant [4 x i8] c"shl\00" -@.str432 = private unnamed_addr constant [4 x i8] c"shr\00" -@.str433 = private unnamed_addr constant [5 x i8] c"lshr\00" +@.str381 = private unnamed_addr constant [10 x i8] c"file_tell\00" +@.str382 = private unnamed_addr constant [21 x i8] c"call i64 @ftell(ptr \00" +@.str383 = private unnamed_addr constant [2 x i8] c")\00" +@.str384 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str385 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str386 = private unnamed_addr constant [4 x i8] c"int\00" +@.str387 = private unnamed_addr constant [11 x i8] c"file_close\00" +@.str388 = private unnamed_addr constant [24 x i8] c" call i32 @fclose(ptr \00" +@.str389 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str390 = private unnamed_addr constant [2 x i8] c"0\00" +@.str391 = private unnamed_addr constant [5 x i8] c"void\00" +@.str392 = private unnamed_addr constant [10 x i8] c"print_str\00" +@.str393 = private unnamed_addr constant [50 x i8] c" call i32 (ptr, ...) @printf(ptr @.fmt_str, ptr \00" +@.str394 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str395 = private unnamed_addr constant [2 x i8] c"0\00" +@.str396 = private unnamed_addr constant [5 x i8] c"void\00" +@.str397 = private unnamed_addr constant [10 x i8] c"print_int\00" +@.str398 = private unnamed_addr constant [50 x i8] c" call i32 (ptr, ...) @printf(ptr @.fmt_int, i32 \00" +@.str399 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str400 = private unnamed_addr constant [2 x i8] c"0\00" +@.str401 = private unnamed_addr constant [5 x i8] c"void\00" +@.str402 = private unnamed_addr constant [8 x i8] c"os_argc\00" +@.str403 = private unnamed_addr constant [22 x i8] c"load i32, ptr @L_argc\00" +@.str404 = private unnamed_addr constant [4 x i8] c"int\00" +@.str405 = private unnamed_addr constant [7 x i8] c"os_arg\00" +@.str406 = private unnamed_addr constant [22 x i8] c"load ptr, ptr @L_argv\00" +@.str407 = private unnamed_addr constant [24 x i8] c"getelementptr ptr, ptr \00" +@.str408 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str409 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" +@.str410 = private unnamed_addr constant [4 x i8] c"str\00" +@.str411 = private unnamed_addr constant [8 x i8] c"os_exit\00" +@.str412 = private unnamed_addr constant [23 x i8] c" call void @exit(i32 \00" +@.str413 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str414 = private unnamed_addr constant [15 x i8] c" unreachable\0A\00" +@.str415 = private unnamed_addr constant [2 x i8] c"0\00" +@.str416 = private unnamed_addr constant [5 x i8] c"void\00" +@.str417 = private unnamed_addr constant [12 x i8] c"file_stderr\00" +@.str418 = private unnamed_addr constant [25 x i8] c"load ptr, ptr @__stderrp\00" +@.str419 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str420 = private unnamed_addr constant [10 x i8] c"os_system\00" +@.str421 = private unnamed_addr constant [22 x i8] c"call i32 @system(ptr \00" +@.str422 = private unnamed_addr constant [2 x i8] c")\00" +@.str423 = private unnamed_addr constant [4 x i8] c"int\00" +@.str424 = private unnamed_addr constant [10 x i8] c"os_getenv\00" +@.str425 = private unnamed_addr constant [22 x i8] c"call ptr @getenv(ptr \00" +@.str426 = private unnamed_addr constant [2 x i8] c")\00" +@.str427 = private unnamed_addr constant [4 x i8] c"str\00" +@.str428 = private unnamed_addr constant [5 x i8] c"bnot\00" +@.str429 = private unnamed_addr constant [9 x i8] c"xor i32 \00" +@.str430 = private unnamed_addr constant [5 x i8] c", -1\00" +@.str431 = private unnamed_addr constant [4 x i8] c"int\00" +@.str432 = private unnamed_addr constant [4 x i8] c"shl\00" +@.str433 = private unnamed_addr constant [4 x i8] c"shr\00" @.str434 = private unnamed_addr constant [5 x i8] c"band\00" -@.str435 = private unnamed_addr constant [4 x i8] c"and\00" -@.str436 = private unnamed_addr constant [4 x i8] c"bor\00" -@.str437 = private unnamed_addr constant [3 x i8] c"or\00" -@.str438 = private unnamed_addr constant [5 x i8] c"bxor\00" -@.str439 = private unnamed_addr constant [4 x i8] c"xor\00" -@.str440 = private unnamed_addr constant [6 x i8] c" i32 \00" -@.str441 = private unnamed_addr constant [3 x i8] c", \00" -@.str442 = private unnamed_addr constant [4 x i8] c"int\00" -@.str443 = private unnamed_addr constant [7 x i8] c"peek32\00" -@.str444 = private unnamed_addr constant [3 x i8] c" \00" -@.str445 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" -@.str446 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str447 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str448 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str449 = private unnamed_addr constant [4 x i8] c"int\00" -@.str450 = private unnamed_addr constant [7 x i8] c"poke32\00" -@.str451 = private unnamed_addr constant [3 x i8] c" \00" -@.str452 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" -@.str453 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str454 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str455 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str456 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str457 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str458 = private unnamed_addr constant [2 x i8] c"0\00" -@.str459 = private unnamed_addr constant [5 x i8] c"void\00" -@.str460 = private unnamed_addr constant [2 x i8] c"0\00" -@.str461 = private unnamed_addr constant [5 x i8] c"void\00" -@.str462 = private unnamed_addr constant [9 x i8] c"mem_free\00" -@.str463 = private unnamed_addr constant [9 x i8] c"mem_copy\00" -@.str464 = private unnamed_addr constant [8 x i8] c"mem_set\00" -@.str465 = private unnamed_addr constant [8 x i8] c"ptr_add\00" -@.str466 = private unnamed_addr constant [10 x i8] c"read_byte\00" -@.str467 = private unnamed_addr constant [11 x i8] c"write_byte\00" -@.str468 = private unnamed_addr constant [8 x i8] c"str_len\00" -@.str469 = private unnamed_addr constant [8 x i8] c"os_time\00" -@.str470 = private unnamed_addr constant [6 x i8] c"peekf\00" -@.str471 = private unnamed_addr constant [6 x i8] c"pokef\00" -@.str472 = private unnamed_addr constant [9 x i8] c"as_fixed\00" -@.str473 = private unnamed_addr constant [7 x i8] c"as_int\00" -@.str474 = private unnamed_addr constant [6 x i8] c"peekp\00" -@.str475 = private unnamed_addr constant [6 x i8] c"pokep\00" -@.str476 = private unnamed_addr constant [12 x i8] c"is_windowed\00" -@.str477 = private unnamed_addr constant [11 x i8] c"game_title\00" -@.str478 = private unnamed_addr constant [9 x i8] c"win_open\00" -@.str479 = private unnamed_addr constant [9 x i8] c"win_poll\00" -@.str480 = private unnamed_addr constant [12 x i8] c"win_present\00" -@.str481 = private unnamed_addr constant [12 x i8] c"win_running\00" -@.str482 = private unnamed_addr constant [10 x i8] c"win_close\00" -@.str483 = private unnamed_addr constant [9 x i8] c"mem_free\00" -@.str484 = private unnamed_addr constant [23 x i8] c" call void @free(ptr \00" -@.str485 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str486 = private unnamed_addr constant [2 x i8] c"0\00" -@.str487 = private unnamed_addr constant [5 x i8] c"void\00" -@.str488 = private unnamed_addr constant [9 x i8] c"mem_copy\00" -@.str489 = private unnamed_addr constant [10 x i8] c"zext i32 \00" -@.str490 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str491 = private unnamed_addr constant [24 x i8] c" call ptr @memcpy(ptr \00" -@.str492 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str493 = private unnamed_addr constant [7 x i8] c", i64 \00" -@.str494 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str495 = private unnamed_addr constant [2 x i8] c"0\00" -@.str496 = private unnamed_addr constant [5 x i8] c"void\00" -@.str497 = private unnamed_addr constant [8 x i8] c"mem_set\00" -@.str498 = private unnamed_addr constant [10 x i8] c"zext i32 \00" -@.str499 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str500 = private unnamed_addr constant [24 x i8] c" call ptr @memset(ptr \00" -@.str501 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str502 = private unnamed_addr constant [7 x i8] c", i64 \00" -@.str503 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str504 = private unnamed_addr constant [2 x i8] c"0\00" -@.str505 = private unnamed_addr constant [5 x i8] c"void\00" -@.str506 = private unnamed_addr constant [8 x i8] c"ptr_add\00" -@.str507 = private unnamed_addr constant [3 x i8] c" \00" -@.str508 = private unnamed_addr constant [35 x i8] c" = getelementptr inbounds i8, ptr \00" -@.str509 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str510 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str511 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str512 = private unnamed_addr constant [10 x i8] c"read_byte\00" -@.str513 = private unnamed_addr constant [20 x i8] c"call i32 @getchar()\00" -@.str514 = private unnamed_addr constant [4 x i8] c"int\00" -@.str515 = private unnamed_addr constant [11 x i8] c"write_byte\00" -@.str516 = private unnamed_addr constant [25 x i8] c" call i32 @putchar(i32 \00" -@.str517 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str518 = private unnamed_addr constant [2 x i8] c"0\00" -@.str519 = private unnamed_addr constant [5 x i8] c"void\00" -@.str520 = private unnamed_addr constant [8 x i8] c"str_len\00" -@.str521 = private unnamed_addr constant [22 x i8] c"call i64 @strlen(ptr \00" -@.str522 = private unnamed_addr constant [2 x i8] c")\00" -@.str523 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" -@.str524 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str525 = private unnamed_addr constant [4 x i8] c"int\00" -@.str526 = private unnamed_addr constant [8 x i8] c"os_time\00" -@.str527 = private unnamed_addr constant [25 x i8] c"call i64 @time(ptr null)\00" -@.str528 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" -@.str529 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str530 = private unnamed_addr constant [4 x i8] c"int\00" -@.str531 = private unnamed_addr constant [6 x i8] c"peekf\00" -@.str532 = private unnamed_addr constant [3 x i8] c" \00" -@.str533 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" -@.str534 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str535 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str536 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str537 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str538 = private unnamed_addr constant [6 x i8] c"pokef\00" -@.str539 = private unnamed_addr constant [3 x i8] c" \00" -@.str540 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" -@.str541 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str542 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str543 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str544 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str545 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str546 = private unnamed_addr constant [2 x i8] c"0\00" -@.str547 = private unnamed_addr constant [5 x i8] c"void\00" -@.str548 = private unnamed_addr constant [6 x i8] c"peekp\00" -@.str549 = private unnamed_addr constant [3 x i8] c" \00" -@.str550 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds ptr, ptr \00" -@.str551 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str552 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str553 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" -@.str554 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str555 = private unnamed_addr constant [6 x i8] c"pokep\00" -@.str556 = private unnamed_addr constant [3 x i8] c" \00" -@.str557 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds ptr, ptr \00" -@.str558 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str559 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str560 = private unnamed_addr constant [13 x i8] c" store ptr \00" -@.str561 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str562 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str563 = private unnamed_addr constant [2 x i8] c"0\00" -@.str564 = private unnamed_addr constant [5 x i8] c"void\00" -@.str565 = private unnamed_addr constant [9 x i8] c"as_fixed\00" -@.str566 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str567 = private unnamed_addr constant [7 x i8] c"as_int\00" -@.str568 = private unnamed_addr constant [4 x i8] c"int\00" -@.str569 = private unnamed_addr constant [12 x i8] c"is_windowed\00" -@.str570 = private unnamed_addr constant [2 x i8] c"1\00" -@.str571 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str572 = private unnamed_addr constant [2 x i8] c"0\00" -@.str573 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str574 = private unnamed_addr constant [11 x i8] c"game_title\00" -@.str575 = private unnamed_addr constant [12 x i8] c"@.gametitle\00" -@.str576 = private unnamed_addr constant [4 x i8] c"str\00" -@.str577 = private unnamed_addr constant [9 x i8] c"win_poll\00" -@.str578 = private unnamed_addr constant [21 x i8] c"call i32 @win_poll()\00" -@.str579 = private unnamed_addr constant [4 x i8] c"int\00" -@.str580 = private unnamed_addr constant [12 x i8] c"win_running\00" -@.str581 = private unnamed_addr constant [24 x i8] c"call i32 @win_running()\00" -@.str582 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str583 = private unnamed_addr constant [9 x i8] c"win_open\00" -@.str584 = private unnamed_addr constant [27 x i8] c" call void @win_open(i32 \00" -@.str585 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str586 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str587 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str588 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str589 = private unnamed_addr constant [2 x i8] c"0\00" -@.str590 = private unnamed_addr constant [5 x i8] c"void\00" -@.str591 = private unnamed_addr constant [12 x i8] c"win_present\00" -@.str592 = private unnamed_addr constant [30 x i8] c" call void @win_present(ptr \00" -@.str593 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str594 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str595 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str596 = private unnamed_addr constant [2 x i8] c"0\00" -@.str597 = private unnamed_addr constant [5 x i8] c"void\00" -@.str598 = private unnamed_addr constant [10 x i8] c"win_close\00" -@.str599 = private unnamed_addr constant [26 x i8] c" call void @win_close()\0A\00" -@.str600 = private unnamed_addr constant [2 x i8] c"0\00" -@.str601 = private unnamed_addr constant [5 x i8] c"void\00" +@.str435 = private unnamed_addr constant [4 x i8] c"bor\00" +@.str436 = private unnamed_addr constant [5 x i8] c"bxor\00" +@.str437 = private unnamed_addr constant [4 x i8] c"shl\00" +@.str438 = private unnamed_addr constant [4 x i8] c"shr\00" +@.str439 = private unnamed_addr constant [5 x i8] c"lshr\00" +@.str440 = private unnamed_addr constant [5 x i8] c"band\00" +@.str441 = private unnamed_addr constant [4 x i8] c"and\00" +@.str442 = private unnamed_addr constant [4 x i8] c"bor\00" +@.str443 = private unnamed_addr constant [3 x i8] c"or\00" +@.str444 = private unnamed_addr constant [5 x i8] c"bxor\00" +@.str445 = private unnamed_addr constant [4 x i8] c"xor\00" +@.str446 = private unnamed_addr constant [6 x i8] c" i32 \00" +@.str447 = private unnamed_addr constant [3 x i8] c", \00" +@.str448 = private unnamed_addr constant [4 x i8] c"int\00" +@.str449 = private unnamed_addr constant [7 x i8] c"peek32\00" +@.str450 = private unnamed_addr constant [3 x i8] c" \00" +@.str451 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" +@.str452 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str453 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str454 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str455 = private unnamed_addr constant [4 x i8] c"int\00" +@.str456 = private unnamed_addr constant [7 x i8] c"poke32\00" +@.str457 = private unnamed_addr constant [3 x i8] c" \00" +@.str458 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" +@.str459 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str460 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str461 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str462 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str463 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str464 = private unnamed_addr constant [2 x i8] c"0\00" +@.str465 = private unnamed_addr constant [5 x i8] c"void\00" +@.str466 = private unnamed_addr constant [2 x i8] c"0\00" +@.str467 = private unnamed_addr constant [5 x i8] c"void\00" +@.str468 = private unnamed_addr constant [9 x i8] c"mem_free\00" +@.str469 = private unnamed_addr constant [9 x i8] c"mem_copy\00" +@.str470 = private unnamed_addr constant [8 x i8] c"mem_set\00" +@.str471 = private unnamed_addr constant [8 x i8] c"ptr_add\00" +@.str472 = private unnamed_addr constant [10 x i8] c"read_byte\00" +@.str473 = private unnamed_addr constant [11 x i8] c"write_byte\00" +@.str474 = private unnamed_addr constant [8 x i8] c"str_len\00" +@.str475 = private unnamed_addr constant [8 x i8] c"os_time\00" +@.str476 = private unnamed_addr constant [6 x i8] c"peekf\00" +@.str477 = private unnamed_addr constant [6 x i8] c"pokef\00" +@.str478 = private unnamed_addr constant [9 x i8] c"as_fixed\00" +@.str479 = private unnamed_addr constant [7 x i8] c"as_int\00" +@.str480 = private unnamed_addr constant [6 x i8] c"peekp\00" +@.str481 = private unnamed_addr constant [6 x i8] c"pokep\00" +@.str482 = private unnamed_addr constant [12 x i8] c"is_windowed\00" +@.str483 = private unnamed_addr constant [11 x i8] c"game_title\00" +@.str484 = private unnamed_addr constant [9 x i8] c"win_open\00" +@.str485 = private unnamed_addr constant [9 x i8] c"win_poll\00" +@.str486 = private unnamed_addr constant [12 x i8] c"win_present\00" +@.str487 = private unnamed_addr constant [12 x i8] c"win_running\00" +@.str488 = private unnamed_addr constant [10 x i8] c"win_close\00" +@.str489 = private unnamed_addr constant [9 x i8] c"mem_free\00" +@.str490 = private unnamed_addr constant [23 x i8] c" call void @free(ptr \00" +@.str491 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str492 = private unnamed_addr constant [2 x i8] c"0\00" +@.str493 = private unnamed_addr constant [5 x i8] c"void\00" +@.str494 = private unnamed_addr constant [9 x i8] c"mem_copy\00" +@.str495 = private unnamed_addr constant [10 x i8] c"zext i32 \00" +@.str496 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str497 = private unnamed_addr constant [24 x i8] c" call ptr @memcpy(ptr \00" +@.str498 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str499 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str500 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str501 = private unnamed_addr constant [2 x i8] c"0\00" +@.str502 = private unnamed_addr constant [5 x i8] c"void\00" +@.str503 = private unnamed_addr constant [8 x i8] c"mem_set\00" +@.str504 = private unnamed_addr constant [10 x i8] c"zext i32 \00" +@.str505 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str506 = private unnamed_addr constant [24 x i8] c" call ptr @memset(ptr \00" +@.str507 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str508 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str509 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str510 = private unnamed_addr constant [2 x i8] c"0\00" +@.str511 = private unnamed_addr constant [5 x i8] c"void\00" +@.str512 = private unnamed_addr constant [8 x i8] c"ptr_add\00" +@.str513 = private unnamed_addr constant [3 x i8] c" \00" +@.str514 = private unnamed_addr constant [35 x i8] c" = getelementptr inbounds i8, ptr \00" +@.str515 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str516 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str517 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str518 = private unnamed_addr constant [10 x i8] c"read_byte\00" +@.str519 = private unnamed_addr constant [20 x i8] c"call i32 @getchar()\00" +@.str520 = private unnamed_addr constant [4 x i8] c"int\00" +@.str521 = private unnamed_addr constant [11 x i8] c"write_byte\00" +@.str522 = private unnamed_addr constant [25 x i8] c" call i32 @putchar(i32 \00" +@.str523 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str524 = private unnamed_addr constant [2 x i8] c"0\00" +@.str525 = private unnamed_addr constant [5 x i8] c"void\00" +@.str526 = private unnamed_addr constant [8 x i8] c"str_len\00" +@.str527 = private unnamed_addr constant [22 x i8] c"call i64 @strlen(ptr \00" +@.str528 = private unnamed_addr constant [2 x i8] c")\00" +@.str529 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str530 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str531 = private unnamed_addr constant [4 x i8] c"int\00" +@.str532 = private unnamed_addr constant [8 x i8] c"os_time\00" +@.str533 = private unnamed_addr constant [25 x i8] c"call i64 @time(ptr null)\00" +@.str534 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str535 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str536 = private unnamed_addr constant [4 x i8] c"int\00" +@.str537 = private unnamed_addr constant [6 x i8] c"peekf\00" +@.str538 = private unnamed_addr constant [3 x i8] c" \00" +@.str539 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" +@.str540 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str541 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str542 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str543 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str544 = private unnamed_addr constant [6 x i8] c"pokef\00" +@.str545 = private unnamed_addr constant [3 x i8] c" \00" +@.str546 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds i32, ptr \00" +@.str547 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str548 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str549 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str550 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str551 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str552 = private unnamed_addr constant [2 x i8] c"0\00" +@.str553 = private unnamed_addr constant [5 x i8] c"void\00" +@.str554 = private unnamed_addr constant [6 x i8] c"peekp\00" +@.str555 = private unnamed_addr constant [3 x i8] c" \00" +@.str556 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds ptr, ptr \00" +@.str557 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str558 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str559 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" +@.str560 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str561 = private unnamed_addr constant [6 x i8] c"pokep\00" +@.str562 = private unnamed_addr constant [3 x i8] c" \00" +@.str563 = private unnamed_addr constant [36 x i8] c" = getelementptr inbounds ptr, ptr \00" +@.str564 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str565 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str566 = private unnamed_addr constant [13 x i8] c" store ptr \00" +@.str567 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str568 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str569 = private unnamed_addr constant [2 x i8] c"0\00" +@.str570 = private unnamed_addr constant [5 x i8] c"void\00" +@.str571 = private unnamed_addr constant [9 x i8] c"as_fixed\00" +@.str572 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str573 = private unnamed_addr constant [7 x i8] c"as_int\00" +@.str574 = private unnamed_addr constant [4 x i8] c"int\00" +@.str575 = private unnamed_addr constant [12 x i8] c"is_windowed\00" +@.str576 = private unnamed_addr constant [2 x i8] c"1\00" +@.str577 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str578 = private unnamed_addr constant [2 x i8] c"0\00" +@.str579 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str580 = private unnamed_addr constant [11 x i8] c"game_title\00" +@.str581 = private unnamed_addr constant [12 x i8] c"@.gametitle\00" +@.str582 = private unnamed_addr constant [4 x i8] c"str\00" +@.str583 = private unnamed_addr constant [9 x i8] c"win_poll\00" +@.str584 = private unnamed_addr constant [21 x i8] c"call i32 @win_poll()\00" +@.str585 = private unnamed_addr constant [4 x i8] c"int\00" +@.str586 = private unnamed_addr constant [12 x i8] c"win_running\00" +@.str587 = private unnamed_addr constant [24 x i8] c"call i32 @win_running()\00" +@.str588 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str589 = private unnamed_addr constant [9 x i8] c"win_open\00" +@.str590 = private unnamed_addr constant [27 x i8] c" call void @win_open(i32 \00" +@.str591 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str592 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str593 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str594 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str595 = private unnamed_addr constant [2 x i8] c"0\00" +@.str596 = private unnamed_addr constant [5 x i8] c"void\00" +@.str597 = private unnamed_addr constant [12 x i8] c"win_present\00" +@.str598 = private unnamed_addr constant [30 x i8] c" call void @win_present(ptr \00" +@.str599 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str600 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str601 = private unnamed_addr constant [3 x i8] c")\0A\00" @.str602 = private unnamed_addr constant [2 x i8] c"0\00" @.str603 = private unnamed_addr constant [5 x i8] c"void\00" -@.str604 = private unnamed_addr constant [4 x i8] c"min\00" -@.str605 = private unnamed_addr constant [4 x i8] c"max\00" -@.str606 = private unnamed_addr constant [4 x i8] c"abs\00" -@.str607 = private unnamed_addr constant [6 x i8] c"clamp\00" -@.str608 = private unnamed_addr constant [4 x i8] c"abs\00" -@.str609 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" -@.str610 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str611 = private unnamed_addr constant [12 x i8] c"sub i32 0, \00" -@.str612 = private unnamed_addr constant [11 x i8] c"select i1 \00" -@.str613 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str614 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str615 = private unnamed_addr constant [4 x i8] c"int\00" -@.str616 = private unnamed_addr constant [4 x i8] c"min\00" -@.str617 = private unnamed_addr constant [4 x i8] c"max\00" -@.str618 = private unnamed_addr constant [4 x i8] c"slt\00" -@.str619 = private unnamed_addr constant [4 x i8] c"max\00" -@.str620 = private unnamed_addr constant [4 x i8] c"sgt\00" -@.str621 = private unnamed_addr constant [6 x i8] c"icmp \00" -@.str622 = private unnamed_addr constant [6 x i8] c" i32 \00" -@.str623 = private unnamed_addr constant [3 x i8] c", \00" -@.str624 = private unnamed_addr constant [11 x i8] c"select i1 \00" -@.str625 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str626 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str627 = private unnamed_addr constant [4 x i8] c"int\00" -@.str628 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" +@.str604 = private unnamed_addr constant [10 x i8] c"win_close\00" +@.str605 = private unnamed_addr constant [26 x i8] c" call void @win_close()\0A\00" +@.str606 = private unnamed_addr constant [2 x i8] c"0\00" +@.str607 = private unnamed_addr constant [5 x i8] c"void\00" +@.str608 = private unnamed_addr constant [2 x i8] c"0\00" +@.str609 = private unnamed_addr constant [5 x i8] c"void\00" +@.str610 = private unnamed_addr constant [4 x i8] c"min\00" +@.str611 = private unnamed_addr constant [4 x i8] c"max\00" +@.str612 = private unnamed_addr constant [4 x i8] c"abs\00" +@.str613 = private unnamed_addr constant [6 x i8] c"clamp\00" +@.str614 = private unnamed_addr constant [4 x i8] c"abs\00" +@.str615 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" +@.str616 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str617 = private unnamed_addr constant [12 x i8] c"sub i32 0, \00" +@.str618 = private unnamed_addr constant [11 x i8] c"select i1 \00" +@.str619 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str620 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str621 = private unnamed_addr constant [4 x i8] c"int\00" +@.str622 = private unnamed_addr constant [4 x i8] c"min\00" +@.str623 = private unnamed_addr constant [4 x i8] c"max\00" +@.str624 = private unnamed_addr constant [4 x i8] c"slt\00" +@.str625 = private unnamed_addr constant [4 x i8] c"max\00" +@.str626 = private unnamed_addr constant [4 x i8] c"sgt\00" +@.str627 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str628 = private unnamed_addr constant [6 x i8] c" i32 \00" @.str629 = private unnamed_addr constant [3 x i8] c", \00" @.str630 = private unnamed_addr constant [11 x i8] c"select i1 \00" @.str631 = private unnamed_addr constant [7 x i8] c", i32 \00" @.str632 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str633 = private unnamed_addr constant [14 x i8] c"icmp sgt i32 \00" -@.str634 = private unnamed_addr constant [3 x i8] c", \00" -@.str635 = private unnamed_addr constant [11 x i8] c"select i1 \00" -@.str636 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str633 = private unnamed_addr constant [4 x i8] c"int\00" +@.str634 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" +@.str635 = private unnamed_addr constant [3 x i8] c", \00" +@.str636 = private unnamed_addr constant [11 x i8] c"select i1 \00" @.str637 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str638 = private unnamed_addr constant [4 x i8] c"int\00" -@.str639 = private unnamed_addr constant [15 x i8] c"getelementptr \00" -@.str640 = private unnamed_addr constant [18 x i8] c", ptr null, i32 1\00" -@.str641 = private unnamed_addr constant [14 x i8] c"ptrtoint ptr \00" -@.str642 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str643 = private unnamed_addr constant [22 x i8] c"unknown struct in new\00" -@.str644 = private unnamed_addr constant [6 x i8] c"%Str_\00" -@.str645 = private unnamed_addr constant [22 x i8] c"call ptr @malloc(i64 \00" -@.str646 = private unnamed_addr constant [2 x i8] c")\00" -@.str647 = private unnamed_addr constant [3 x i8] c" \00" -@.str648 = private unnamed_addr constant [32 x i8] c" = getelementptr inbounds %Str_\00" -@.str649 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str650 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" -@.str651 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str652 = private unnamed_addr constant [2 x i8] c"0\00" -@.str653 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str654 = private unnamed_addr constant [5 x i8] c"null\00" -@.str655 = private unnamed_addr constant [9 x i8] c" store \00" -@.str656 = private unnamed_addr constant [2 x i8] c" \00" -@.str657 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str658 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str659 = private unnamed_addr constant [8 x i8] c"%LSlice\00" -@.str660 = private unnamed_addr constant [22 x i8] c"call ptr @malloc(i64 \00" -@.str661 = private unnamed_addr constant [2 x i8] c")\00" -@.str662 = private unnamed_addr constant [3 x i8] c" \00" -@.str663 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" -@.str664 = private unnamed_addr constant [16 x i8] c", i32 0, i32 0\0A\00" -@.str665 = private unnamed_addr constant [23 x i8] c" store ptr null, ptr \00" -@.str666 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str667 = private unnamed_addr constant [3 x i8] c" \00" -@.str668 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" -@.str669 = private unnamed_addr constant [16 x i8] c", i32 0, i32 1\0A\00" -@.str670 = private unnamed_addr constant [20 x i8] c" store i32 0, ptr \00" -@.str671 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str672 = private unnamed_addr constant [3 x i8] c" \00" -@.str673 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" -@.str674 = private unnamed_addr constant [16 x i8] c", i32 0, i32 2\0A\00" -@.str675 = private unnamed_addr constant [20 x i8] c" store i32 0, ptr \00" -@.str676 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str677 = private unnamed_addr constant [3 x i8] c" \00" -@.str678 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" -@.str679 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" -@.str680 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str681 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str682 = private unnamed_addr constant [4 x i8] c"int\00" -@.str683 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str684 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str685 = private unnamed_addr constant [14 x i8] c"icmp sge i32 \00" -@.str686 = private unnamed_addr constant [3 x i8] c", \00" -@.str687 = private unnamed_addr constant [5 x i8] c"grow\00" -@.str688 = private unnamed_addr constant [4 x i8] c"put\00" -@.str689 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str690 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str691 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str692 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str693 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str694 = private unnamed_addr constant [9 x i8] c"mul i32 \00" -@.str695 = private unnamed_addr constant [4 x i8] c", 2\00" -@.str696 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" -@.str697 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str698 = private unnamed_addr constant [11 x i8] c"select i1 \00" -@.str699 = private unnamed_addr constant [14 x i8] c", i32 8, i32 \00" -@.str700 = private unnamed_addr constant [10 x i8] c"zext i32 \00" -@.str701 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str702 = private unnamed_addr constant [9 x i8] c"mul i64 \00" -@.str703 = private unnamed_addr constant [3 x i8] c", \00" -@.str704 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" -@.str705 = private unnamed_addr constant [23 x i8] c"call ptr @realloc(ptr \00" -@.str706 = private unnamed_addr constant [7 x i8] c", i64 \00" -@.str707 = private unnamed_addr constant [2 x i8] c")\00" -@.str708 = private unnamed_addr constant [13 x i8] c" store ptr \00" -@.str709 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str710 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str711 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str712 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str713 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str714 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str715 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str716 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str717 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" -@.str718 = private unnamed_addr constant [3 x i8] c" \00" -@.str719 = private unnamed_addr constant [27 x i8] c" = getelementptr inbounds \00" -@.str720 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str721 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str722 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str723 = private unnamed_addr constant [9 x i8] c" store \00" -@.str724 = private unnamed_addr constant [2 x i8] c" \00" -@.str725 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str726 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str727 = private unnamed_addr constant [9 x i8] c"add i32 \00" -@.str728 = private unnamed_addr constant [4 x i8] c", 1\00" -@.str729 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str730 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str731 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str732 = private unnamed_addr constant [2 x i8] c"0\00" -@.str733 = private unnamed_addr constant [5 x i8] c"void\00" -@.str734 = private unnamed_addr constant [6 x i8] c"load \00" -@.str735 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str736 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str737 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str738 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str739 = private unnamed_addr constant [9 x i8] c"zext i1 \00" -@.str740 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str741 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str742 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str743 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str744 = private unnamed_addr constant [3 x i8] c"sc\00" -@.str745 = private unnamed_addr constant [6 x i8] c"scend\00" -@.str746 = private unnamed_addr constant [4 x i8] c"and\00" -@.str747 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str748 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str749 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str750 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str751 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str752 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str753 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str754 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str755 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str756 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str757 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str758 = private unnamed_addr constant [9 x i8] c"zext i1 \00" -@.str759 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str760 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str761 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str762 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str763 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str764 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str765 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str766 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str767 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str768 = private unnamed_addr constant [2 x i8] c"<\00" -@.str769 = private unnamed_addr constant [4 x i8] c"slt\00" -@.str770 = private unnamed_addr constant [3 x i8] c"<=\00" -@.str771 = private unnamed_addr constant [4 x i8] c"sle\00" -@.str772 = private unnamed_addr constant [2 x i8] c">\00" -@.str773 = private unnamed_addr constant [4 x i8] c"sgt\00" -@.str774 = private unnamed_addr constant [3 x i8] c">=\00" -@.str775 = private unnamed_addr constant [4 x i8] c"sge\00" -@.str776 = private unnamed_addr constant [3 x i8] c"==\00" -@.str777 = private unnamed_addr constant [3 x i8] c"eq\00" -@.str778 = private unnamed_addr constant [3 x i8] c"ne\00" -@.str779 = private unnamed_addr constant [2 x i8] c"<\00" -@.str780 = private unnamed_addr constant [3 x i8] c"<=\00" -@.str781 = private unnamed_addr constant [2 x i8] c">\00" -@.str782 = private unnamed_addr constant [3 x i8] c">=\00" -@.str783 = private unnamed_addr constant [3 x i8] c"==\00" -@.str784 = private unnamed_addr constant [3 x i8] c"!=\00" -@.str785 = private unnamed_addr constant [2 x i8] c"+\00" -@.str786 = private unnamed_addr constant [4 x i8] c"add\00" -@.str787 = private unnamed_addr constant [2 x i8] c"-\00" -@.str788 = private unnamed_addr constant [4 x i8] c"sub\00" -@.str789 = private unnamed_addr constant [2 x i8] c"*\00" -@.str790 = private unnamed_addr constant [4 x i8] c"mul\00" -@.str791 = private unnamed_addr constant [2 x i8] c"/\00" -@.str792 = private unnamed_addr constant [5 x i8] c"sdiv\00" -@.str793 = private unnamed_addr constant [5 x i8] c"srem\00" -@.str794 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str795 = private unnamed_addr constant [9 x i8] c"shl i32 \00" -@.str796 = private unnamed_addr constant [5 x i8] c", 16\00" -@.str797 = private unnamed_addr constant [4 x i8] c"and\00" -@.str798 = private unnamed_addr constant [3 x i8] c"or\00" -@.str799 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str638 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str639 = private unnamed_addr constant [14 x i8] c"icmp sgt i32 \00" +@.str640 = private unnamed_addr constant [3 x i8] c", \00" +@.str641 = private unnamed_addr constant [11 x i8] c"select i1 \00" +@.str642 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str643 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str644 = private unnamed_addr constant [4 x i8] c"int\00" +@.str645 = private unnamed_addr constant [15 x i8] c"getelementptr \00" +@.str646 = private unnamed_addr constant [18 x i8] c", ptr null, i32 1\00" +@.str647 = private unnamed_addr constant [14 x i8] c"ptrtoint ptr \00" +@.str648 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str649 = private unnamed_addr constant [22 x i8] c"unknown struct in new\00" +@.str650 = private unnamed_addr constant [6 x i8] c"%Str_\00" +@.str651 = private unnamed_addr constant [22 x i8] c"call ptr @malloc(i64 \00" +@.str652 = private unnamed_addr constant [2 x i8] c")\00" +@.str653 = private unnamed_addr constant [3 x i8] c" \00" +@.str654 = private unnamed_addr constant [32 x i8] c" = getelementptr inbounds %Str_\00" +@.str655 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str656 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str657 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str658 = private unnamed_addr constant [2 x i8] c"0\00" +@.str659 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str660 = private unnamed_addr constant [5 x i8] c"null\00" +@.str661 = private unnamed_addr constant [9 x i8] c" store \00" +@.str662 = private unnamed_addr constant [2 x i8] c" \00" +@.str663 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str664 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str665 = private unnamed_addr constant [8 x i8] c"%LSlice\00" +@.str666 = private unnamed_addr constant [22 x i8] c"call ptr @malloc(i64 \00" +@.str667 = private unnamed_addr constant [2 x i8] c")\00" +@.str668 = private unnamed_addr constant [3 x i8] c" \00" +@.str669 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" +@.str670 = private unnamed_addr constant [16 x i8] c", i32 0, i32 0\0A\00" +@.str671 = private unnamed_addr constant [23 x i8] c" store ptr null, ptr \00" +@.str672 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str673 = private unnamed_addr constant [3 x i8] c" \00" +@.str674 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" +@.str675 = private unnamed_addr constant [16 x i8] c", i32 0, i32 1\0A\00" +@.str676 = private unnamed_addr constant [20 x i8] c" store i32 0, ptr \00" +@.str677 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str678 = private unnamed_addr constant [3 x i8] c" \00" +@.str679 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" +@.str680 = private unnamed_addr constant [16 x i8] c", i32 0, i32 2\0A\00" +@.str681 = private unnamed_addr constant [20 x i8] c" store i32 0, ptr \00" +@.str682 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str683 = private unnamed_addr constant [3 x i8] c" \00" +@.str684 = private unnamed_addr constant [40 x i8] c" = getelementptr inbounds %LSlice, ptr \00" +@.str685 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str686 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str687 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str688 = private unnamed_addr constant [4 x i8] c"int\00" +@.str689 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str690 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str691 = private unnamed_addr constant [14 x i8] c"icmp sge i32 \00" +@.str692 = private unnamed_addr constant [3 x i8] c", \00" +@.str693 = private unnamed_addr constant [5 x i8] c"grow\00" +@.str694 = private unnamed_addr constant [4 x i8] c"put\00" +@.str695 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str696 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str697 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str698 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str699 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str700 = private unnamed_addr constant [9 x i8] c"mul i32 \00" +@.str701 = private unnamed_addr constant [4 x i8] c", 2\00" +@.str702 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str703 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str704 = private unnamed_addr constant [11 x i8] c"select i1 \00" +@.str705 = private unnamed_addr constant [14 x i8] c", i32 8, i32 \00" +@.str706 = private unnamed_addr constant [10 x i8] c"zext i32 \00" +@.str707 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str708 = private unnamed_addr constant [9 x i8] c"mul i64 \00" +@.str709 = private unnamed_addr constant [3 x i8] c", \00" +@.str710 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" +@.str711 = private unnamed_addr constant [23 x i8] c"call ptr @realloc(ptr \00" +@.str712 = private unnamed_addr constant [7 x i8] c", i64 \00" +@.str713 = private unnamed_addr constant [2 x i8] c")\00" +@.str714 = private unnamed_addr constant [13 x i8] c" store ptr \00" +@.str715 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str716 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str717 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str718 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str719 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str720 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str721 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str722 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str723 = private unnamed_addr constant [15 x i8] c"load ptr, ptr \00" +@.str724 = private unnamed_addr constant [3 x i8] c" \00" +@.str725 = private unnamed_addr constant [27 x i8] c" = getelementptr inbounds \00" +@.str726 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str727 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str728 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str729 = private unnamed_addr constant [9 x i8] c" store \00" +@.str730 = private unnamed_addr constant [2 x i8] c" \00" +@.str731 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str732 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str733 = private unnamed_addr constant [9 x i8] c"add i32 \00" +@.str734 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str735 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str736 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str737 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str738 = private unnamed_addr constant [2 x i8] c"0\00" +@.str739 = private unnamed_addr constant [5 x i8] c"void\00" +@.str740 = private unnamed_addr constant [6 x i8] c"load \00" +@.str741 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str742 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str743 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str744 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str745 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str746 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str747 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str748 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str749 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str750 = private unnamed_addr constant [3 x i8] c"sc\00" +@.str751 = private unnamed_addr constant [6 x i8] c"scend\00" +@.str752 = private unnamed_addr constant [4 x i8] c"and\00" +@.str753 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str754 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str755 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str756 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str757 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str758 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str759 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str760 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str761 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str762 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str763 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str764 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str765 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str766 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str767 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str768 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str769 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str770 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str771 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str772 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str773 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str774 = private unnamed_addr constant [2 x i8] c"<\00" +@.str775 = private unnamed_addr constant [4 x i8] c"slt\00" +@.str776 = private unnamed_addr constant [3 x i8] c"<=\00" +@.str777 = private unnamed_addr constant [4 x i8] c"sle\00" +@.str778 = private unnamed_addr constant [2 x i8] c">\00" +@.str779 = private unnamed_addr constant [4 x i8] c"sgt\00" +@.str780 = private unnamed_addr constant [3 x i8] c">=\00" +@.str781 = private unnamed_addr constant [4 x i8] c"sge\00" +@.str782 = private unnamed_addr constant [3 x i8] c"==\00" +@.str783 = private unnamed_addr constant [3 x i8] c"eq\00" +@.str784 = private unnamed_addr constant [3 x i8] c"ne\00" +@.str785 = private unnamed_addr constant [2 x i8] c"<\00" +@.str786 = private unnamed_addr constant [3 x i8] c"<=\00" +@.str787 = private unnamed_addr constant [2 x i8] c">\00" +@.str788 = private unnamed_addr constant [3 x i8] c">=\00" +@.str789 = private unnamed_addr constant [3 x i8] c"==\00" +@.str790 = private unnamed_addr constant [3 x i8] c"!=\00" +@.str791 = private unnamed_addr constant [2 x i8] c"+\00" +@.str792 = private unnamed_addr constant [4 x i8] c"add\00" +@.str793 = private unnamed_addr constant [2 x i8] c"-\00" +@.str794 = private unnamed_addr constant [4 x i8] c"sub\00" +@.str795 = private unnamed_addr constant [2 x i8] c"*\00" +@.str796 = private unnamed_addr constant [4 x i8] c"mul\00" +@.str797 = private unnamed_addr constant [2 x i8] c"/\00" +@.str798 = private unnamed_addr constant [5 x i8] c"sdiv\00" +@.str799 = private unnamed_addr constant [5 x i8] c"srem\00" @.str800 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str801 = private unnamed_addr constant [6 x i8] c"icmp \00" -@.str802 = private unnamed_addr constant [6 x i8] c" i32 \00" -@.str803 = private unnamed_addr constant [3 x i8] c", \00" -@.str804 = private unnamed_addr constant [9 x i8] c"zext i1 \00" -@.str805 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str806 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str807 = private unnamed_addr constant [2 x i8] c"*\00" -@.str808 = private unnamed_addr constant [10 x i8] c"sext i32 \00" -@.str809 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str810 = private unnamed_addr constant [10 x i8] c"sext i32 \00" -@.str811 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str812 = private unnamed_addr constant [9 x i8] c"mul i64 \00" -@.str813 = private unnamed_addr constant [3 x i8] c", \00" -@.str814 = private unnamed_addr constant [10 x i8] c"ashr i64 \00" -@.str815 = private unnamed_addr constant [5 x i8] c", 16\00" -@.str816 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" -@.str817 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str818 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str819 = private unnamed_addr constant [2 x i8] c"/\00" -@.str820 = private unnamed_addr constant [10 x i8] c"sext i32 \00" -@.str821 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str822 = private unnamed_addr constant [9 x i8] c"shl i64 \00" -@.str823 = private unnamed_addr constant [5 x i8] c", 16\00" -@.str824 = private unnamed_addr constant [10 x i8] c"sext i32 \00" -@.str825 = private unnamed_addr constant [8 x i8] c" to i64\00" -@.str826 = private unnamed_addr constant [10 x i8] c"sdiv i64 \00" -@.str827 = private unnamed_addr constant [3 x i8] c", \00" -@.str828 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" -@.str829 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str830 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str831 = private unnamed_addr constant [6 x i8] c" i32 \00" -@.str832 = private unnamed_addr constant [3 x i8] c", \00" -@.str833 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str834 = private unnamed_addr constant [6 x i8] c" i32 \00" -@.str835 = private unnamed_addr constant [3 x i8] c", \00" -@.str836 = private unnamed_addr constant [4 x i8] c"int\00" -@.str837 = private unnamed_addr constant [5 x i8] c"self\00" -@.str838 = private unnamed_addr constant [2 x i8] c"0\00" -@.str839 = private unnamed_addr constant [7 x i8] c"entity\00" -@.str840 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str841 = private unnamed_addr constant [7 x i8] c"entity\00" -@.str842 = private unnamed_addr constant [4 x i8] c"key\00" -@.str843 = private unnamed_addr constant [21 x i8] c"load i32, ptr @L_key\00" -@.str844 = private unnamed_addr constant [4 x i8] c"int\00" -@.str845 = private unnamed_addr constant [5 x i8] c"save\00" -@.str846 = private unnamed_addr constant [23 x i8] c" call void @L_save()\0A\00" -@.str847 = private unnamed_addr constant [2 x i8] c"0\00" -@.str848 = private unnamed_addr constant [5 x i8] c"void\00" -@.str849 = private unnamed_addr constant [9 x i8] c"ui_build\00" -@.str850 = private unnamed_addr constant [25 x i8] c" call void @ui_build()\0A\00" -@.str851 = private unnamed_addr constant [2 x i8] c"0\00" -@.str852 = private unnamed_addr constant [5 x i8] c"void\00" -@.str853 = private unnamed_addr constant [5 x i8] c"load\00" -@.str854 = private unnamed_addr constant [19 x i8] c"call i32 @L_load()\00" -@.str855 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str856 = private unnamed_addr constant [5 x i8] c"quit\00" -@.str857 = private unnamed_addr constant [31 x i8] c" store i32 0, ptr @L_running\0A\00" -@.str858 = private unnamed_addr constant [2 x i8] c"0\00" -@.str859 = private unnamed_addr constant [5 x i8] c"void\00" -@.str860 = private unnamed_addr constant [4 x i8] c"len\00" -@.str861 = private unnamed_addr constant [5 x i8] c"push\00" -@.str862 = private unnamed_addr constant [3 x i8] c"fx\00" -@.str863 = private unnamed_addr constant [9 x i8] c"shl i32 \00" -@.str864 = private unnamed_addr constant [5 x i8] c", 16\00" -@.str865 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str866 = private unnamed_addr constant [4 x i8] c"flr\00" -@.str867 = private unnamed_addr constant [10 x i8] c"ashr i32 \00" -@.str868 = private unnamed_addr constant [5 x i8] c", 16\00" -@.str869 = private unnamed_addr constant [4 x i8] c"int\00" -@.str870 = private unnamed_addr constant [4 x i8] c"rt_\00" -@.str871 = private unnamed_addr constant [18 x i8] c"unknown function \00" -@.str872 = private unnamed_addr constant [3 x i8] c" \00" -@.str873 = private unnamed_addr constant [2 x i8] c"0\00" -@.str874 = private unnamed_addr constant [5 x i8] c"void\00" -@.str875 = private unnamed_addr constant [4 x i8] c" = \00" -@.str876 = private unnamed_addr constant [6 x i8] c"call \00" -@.str877 = private unnamed_addr constant [6 x i8] c" @fn_\00" -@.str878 = private unnamed_addr constant [2 x i8] c"(\00" -@.str879 = private unnamed_addr constant [3 x i8] c", \00" -@.str880 = private unnamed_addr constant [2 x i8] c" \00" -@.str881 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str882 = private unnamed_addr constant [2 x i8] c"0\00" -@.str883 = private unnamed_addr constant [4 x i8] c"int\00" -@.str884 = private unnamed_addr constant [4 x i8] c"int\00" -@.str885 = private unnamed_addr constant [6 x i8] c"fixed\00" -@.str886 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str887 = private unnamed_addr constant [4 x i8] c"str\00" -@.str888 = private unnamed_addr constant [4 x i8] c"int\00" -@.str889 = private unnamed_addr constant [6 x i8] c"load \00" -@.str890 = private unnamed_addr constant [10 x i8] c", ptr @g_\00" -@.str891 = private unnamed_addr constant [4 x i8] c"int\00" -@.str892 = private unnamed_addr constant [20 x i8] c"unknown identifier \00" -@.str893 = private unnamed_addr constant [2 x i8] c"-\00" -@.str894 = private unnamed_addr constant [12 x i8] c"sub i32 0, \00" -@.str895 = private unnamed_addr constant [4 x i8] c"int\00" -@.str896 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" -@.str897 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str898 = private unnamed_addr constant [9 x i8] c"zext i1 \00" -@.str899 = private unnamed_addr constant [8 x i8] c" to i32\00" -@.str900 = private unnamed_addr constant [5 x i8] c"bool\00" -@.str901 = private unnamed_addr constant [23 x i8] c"cannot emit expression\00" -@.str902 = private unnamed_addr constant [2 x i8] c"0\00" -@.str903 = private unnamed_addr constant [4 x i8] c"int\00" -@.str904 = private unnamed_addr constant [9 x i8] c" store \00" -@.str905 = private unnamed_addr constant [2 x i8] c" \00" -@.str906 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str907 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str908 = private unnamed_addr constant [2 x i8] c"0\00" -@.str909 = private unnamed_addr constant [4 x i8] c"int\00" -@.str910 = private unnamed_addr constant [19 x i8] c"assign to unknown \00" -@.str911 = private unnamed_addr constant [4 x i8] c"@g_\00" -@.str912 = private unnamed_addr constant [22 x i8] c"bad assignment target\00" -@.str913 = private unnamed_addr constant [2 x i8] c"=\00" -@.str914 = private unnamed_addr constant [6 x i8] c"load \00" -@.str915 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str916 = private unnamed_addr constant [4 x i8] c"add\00" -@.str917 = private unnamed_addr constant [3 x i8] c"-=\00" -@.str918 = private unnamed_addr constant [4 x i8] c"sub\00" -@.str919 = private unnamed_addr constant [3 x i8] c"*=\00" -@.str920 = private unnamed_addr constant [4 x i8] c"mul\00" -@.str921 = private unnamed_addr constant [3 x i8] c"/=\00" -@.str922 = private unnamed_addr constant [5 x i8] c"sdiv\00" -@.str923 = private unnamed_addr constant [6 x i8] c" i32 \00" -@.str924 = private unnamed_addr constant [3 x i8] c", \00" -@.str925 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str926 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str927 = private unnamed_addr constant [5 x i8] c"then\00" -@.str928 = private unnamed_addr constant [5 x i8] c"else\00" -@.str929 = private unnamed_addr constant [6 x i8] c"ifend\00" -@.str930 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str931 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str932 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str933 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str934 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str935 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str936 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str937 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str938 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str939 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str801 = private unnamed_addr constant [9 x i8] c"shl i32 \00" +@.str802 = private unnamed_addr constant [5 x i8] c", 16\00" +@.str803 = private unnamed_addr constant [4 x i8] c"and\00" +@.str804 = private unnamed_addr constant [3 x i8] c"or\00" +@.str805 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str806 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str807 = private unnamed_addr constant [6 x i8] c"icmp \00" +@.str808 = private unnamed_addr constant [6 x i8] c" i32 \00" +@.str809 = private unnamed_addr constant [3 x i8] c", \00" +@.str810 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str811 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str812 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str813 = private unnamed_addr constant [2 x i8] c"*\00" +@.str814 = private unnamed_addr constant [10 x i8] c"sext i32 \00" +@.str815 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str816 = private unnamed_addr constant [10 x i8] c"sext i32 \00" +@.str817 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str818 = private unnamed_addr constant [9 x i8] c"mul i64 \00" +@.str819 = private unnamed_addr constant [3 x i8] c", \00" +@.str820 = private unnamed_addr constant [10 x i8] c"ashr i64 \00" +@.str821 = private unnamed_addr constant [5 x i8] c", 16\00" +@.str822 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str823 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str824 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str825 = private unnamed_addr constant [2 x i8] c"/\00" +@.str826 = private unnamed_addr constant [10 x i8] c"sext i32 \00" +@.str827 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str828 = private unnamed_addr constant [9 x i8] c"shl i64 \00" +@.str829 = private unnamed_addr constant [5 x i8] c", 16\00" +@.str830 = private unnamed_addr constant [10 x i8] c"sext i32 \00" +@.str831 = private unnamed_addr constant [8 x i8] c" to i64\00" +@.str832 = private unnamed_addr constant [10 x i8] c"sdiv i64 \00" +@.str833 = private unnamed_addr constant [3 x i8] c", \00" +@.str834 = private unnamed_addr constant [11 x i8] c"trunc i64 \00" +@.str835 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str836 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str837 = private unnamed_addr constant [6 x i8] c" i32 \00" +@.str838 = private unnamed_addr constant [3 x i8] c", \00" +@.str839 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str840 = private unnamed_addr constant [6 x i8] c" i32 \00" +@.str841 = private unnamed_addr constant [3 x i8] c", \00" +@.str842 = private unnamed_addr constant [4 x i8] c"int\00" +@.str843 = private unnamed_addr constant [5 x i8] c"self\00" +@.str844 = private unnamed_addr constant [2 x i8] c"0\00" +@.str845 = private unnamed_addr constant [7 x i8] c"entity\00" +@.str846 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str847 = private unnamed_addr constant [7 x i8] c"entity\00" +@.str848 = private unnamed_addr constant [4 x i8] c"key\00" +@.str849 = private unnamed_addr constant [21 x i8] c"load i32, ptr @L_key\00" +@.str850 = private unnamed_addr constant [4 x i8] c"int\00" +@.str851 = private unnamed_addr constant [5 x i8] c"save\00" +@.str852 = private unnamed_addr constant [23 x i8] c" call void @L_save()\0A\00" +@.str853 = private unnamed_addr constant [2 x i8] c"0\00" +@.str854 = private unnamed_addr constant [5 x i8] c"void\00" +@.str855 = private unnamed_addr constant [9 x i8] c"ui_build\00" +@.str856 = private unnamed_addr constant [25 x i8] c" call void @ui_build()\0A\00" +@.str857 = private unnamed_addr constant [2 x i8] c"0\00" +@.str858 = private unnamed_addr constant [5 x i8] c"void\00" +@.str859 = private unnamed_addr constant [5 x i8] c"load\00" +@.str860 = private unnamed_addr constant [19 x i8] c"call i32 @L_load()\00" +@.str861 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str862 = private unnamed_addr constant [5 x i8] c"quit\00" +@.str863 = private unnamed_addr constant [31 x i8] c" store i32 0, ptr @L_running\0A\00" +@.str864 = private unnamed_addr constant [2 x i8] c"0\00" +@.str865 = private unnamed_addr constant [5 x i8] c"void\00" +@.str866 = private unnamed_addr constant [4 x i8] c"len\00" +@.str867 = private unnamed_addr constant [5 x i8] c"push\00" +@.str868 = private unnamed_addr constant [3 x i8] c"fx\00" +@.str869 = private unnamed_addr constant [9 x i8] c"shl i32 \00" +@.str870 = private unnamed_addr constant [5 x i8] c", 16\00" +@.str871 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str872 = private unnamed_addr constant [4 x i8] c"flr\00" +@.str873 = private unnamed_addr constant [10 x i8] c"ashr i32 \00" +@.str874 = private unnamed_addr constant [5 x i8] c", 16\00" +@.str875 = private unnamed_addr constant [4 x i8] c"int\00" +@.str876 = private unnamed_addr constant [4 x i8] c"rt_\00" +@.str877 = private unnamed_addr constant [18 x i8] c"unknown function \00" +@.str878 = private unnamed_addr constant [3 x i8] c" \00" +@.str879 = private unnamed_addr constant [2 x i8] c"0\00" +@.str880 = private unnamed_addr constant [5 x i8] c"void\00" +@.str881 = private unnamed_addr constant [4 x i8] c" = \00" +@.str882 = private unnamed_addr constant [6 x i8] c"call \00" +@.str883 = private unnamed_addr constant [6 x i8] c" @fn_\00" +@.str884 = private unnamed_addr constant [2 x i8] c"(\00" +@.str885 = private unnamed_addr constant [3 x i8] c", \00" +@.str886 = private unnamed_addr constant [2 x i8] c" \00" +@.str887 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str888 = private unnamed_addr constant [2 x i8] c"0\00" +@.str889 = private unnamed_addr constant [4 x i8] c"int\00" +@.str890 = private unnamed_addr constant [4 x i8] c"int\00" +@.str891 = private unnamed_addr constant [6 x i8] c"fixed\00" +@.str892 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str893 = private unnamed_addr constant [4 x i8] c"str\00" +@.str894 = private unnamed_addr constant [4 x i8] c"int\00" +@.str895 = private unnamed_addr constant [6 x i8] c"load \00" +@.str896 = private unnamed_addr constant [10 x i8] c", ptr @g_\00" +@.str897 = private unnamed_addr constant [4 x i8] c"int\00" +@.str898 = private unnamed_addr constant [20 x i8] c"unknown identifier \00" +@.str899 = private unnamed_addr constant [4 x i8] c"int\00" +@.str900 = private unnamed_addr constant [2 x i8] c"-\00" +@.str901 = private unnamed_addr constant [12 x i8] c"sub i32 0, \00" +@.str902 = private unnamed_addr constant [4 x i8] c"int\00" +@.str903 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str904 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str905 = private unnamed_addr constant [9 x i8] c"zext i1 \00" +@.str906 = private unnamed_addr constant [8 x i8] c" to i32\00" +@.str907 = private unnamed_addr constant [5 x i8] c"bool\00" +@.str908 = private unnamed_addr constant [23 x i8] c"cannot emit expression\00" +@.str909 = private unnamed_addr constant [2 x i8] c"0\00" +@.str910 = private unnamed_addr constant [4 x i8] c"int\00" +@.str911 = private unnamed_addr constant [9 x i8] c" store \00" +@.str912 = private unnamed_addr constant [2 x i8] c" \00" +@.str913 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str914 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str915 = private unnamed_addr constant [2 x i8] c"0\00" +@.str916 = private unnamed_addr constant [4 x i8] c"int\00" +@.str917 = private unnamed_addr constant [19 x i8] c"assign to unknown \00" +@.str918 = private unnamed_addr constant [4 x i8] c"@g_\00" +@.str919 = private unnamed_addr constant [22 x i8] c"bad assignment target\00" +@.str920 = private unnamed_addr constant [2 x i8] c"=\00" +@.str921 = private unnamed_addr constant [6 x i8] c"load \00" +@.str922 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str923 = private unnamed_addr constant [4 x i8] c"add\00" +@.str924 = private unnamed_addr constant [3 x i8] c"-=\00" +@.str925 = private unnamed_addr constant [4 x i8] c"sub\00" +@.str926 = private unnamed_addr constant [3 x i8] c"*=\00" +@.str927 = private unnamed_addr constant [4 x i8] c"mul\00" +@.str928 = private unnamed_addr constant [3 x i8] c"/=\00" +@.str929 = private unnamed_addr constant [5 x i8] c"sdiv\00" +@.str930 = private unnamed_addr constant [6 x i8] c" i32 \00" +@.str931 = private unnamed_addr constant [3 x i8] c", \00" +@.str932 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str933 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str934 = private unnamed_addr constant [5 x i8] c"then\00" +@.str935 = private unnamed_addr constant [5 x i8] c"else\00" +@.str936 = private unnamed_addr constant [6 x i8] c"ifend\00" +@.str937 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str938 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str939 = private unnamed_addr constant [10 x i8] c", label %\00" @.str940 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str941 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str942 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str943 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str944 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str945 = private unnamed_addr constant [6 x i8] c"wcond\00" -@.str946 = private unnamed_addr constant [6 x i8] c"wbody\00" -@.str947 = private unnamed_addr constant [5 x i8] c"wend\00" -@.str948 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str949 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str950 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str951 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str952 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str953 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str954 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str955 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str941 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str942 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str943 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str944 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str945 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str946 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str947 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str948 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str949 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str950 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str951 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str952 = private unnamed_addr constant [6 x i8] c"wcond\00" +@.str953 = private unnamed_addr constant [6 x i8] c"wbody\00" +@.str954 = private unnamed_addr constant [5 x i8] c"wend\00" +@.str955 = private unnamed_addr constant [13 x i8] c" br label %\00" @.str956 = private unnamed_addr constant [2 x i8] c"\0A\00" @.str957 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str958 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str959 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str960 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str961 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str962 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str963 = private unnamed_addr constant [4 x i8] c"int\00" -@.str964 = private unnamed_addr constant [6 x i8] c"fcond\00" -@.str965 = private unnamed_addr constant [6 x i8] c"fbody\00" -@.str966 = private unnamed_addr constant [6 x i8] c"fcont\00" -@.str967 = private unnamed_addr constant [5 x i8] c"fend\00" -@.str968 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str969 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str970 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str971 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str972 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" -@.str973 = private unnamed_addr constant [3 x i8] c", \00" -@.str974 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str975 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str976 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str977 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str978 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str979 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str980 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str981 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str982 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str983 = private unnamed_addr constant [9 x i8] c"add i32 \00" -@.str984 = private unnamed_addr constant [4 x i8] c", 1\00" -@.str985 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str958 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str959 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str960 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str961 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str962 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str963 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str964 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str965 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str966 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str967 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str968 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str969 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str970 = private unnamed_addr constant [4 x i8] c"int\00" +@.str971 = private unnamed_addr constant [6 x i8] c"fcond\00" +@.str972 = private unnamed_addr constant [6 x i8] c"fbody\00" +@.str973 = private unnamed_addr constant [6 x i8] c"fcont\00" +@.str974 = private unnamed_addr constant [5 x i8] c"fend\00" +@.str975 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str976 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str977 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str978 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str979 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" +@.str980 = private unnamed_addr constant [3 x i8] c", \00" +@.str981 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str982 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str983 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str984 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str985 = private unnamed_addr constant [3 x i8] c":\0A\00" @.str986 = private unnamed_addr constant [13 x i8] c" br label %\00" @.str987 = private unnamed_addr constant [2 x i8] c"\0A\00" @.str988 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str989 = private unnamed_addr constant [8 x i8] c"%retval\00" -@.str990 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" -@.str991 = private unnamed_addr constant [2 x i8] c"_\00" -@.str992 = private unnamed_addr constant [5 x i8] c"mend\00" -@.str993 = private unnamed_addr constant [2 x i8] c"0\00" -@.str994 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" -@.str995 = private unnamed_addr constant [3 x i8] c", \00" -@.str996 = private unnamed_addr constant [7 x i8] c"or i1 \00" -@.str997 = private unnamed_addr constant [3 x i8] c", \00" -@.str998 = private unnamed_addr constant [6 x i8] c"mbody\00" -@.str999 = private unnamed_addr constant [5 x i8] c"marm\00" -@.str1000 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1001 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1002 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1003 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1004 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1005 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1006 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1007 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1008 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1009 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1010 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1011 = private unnamed_addr constant [2 x i8] c"0\00" -@.str1012 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str1013 = private unnamed_addr constant [5 x i8] c"null\00" -@.str1014 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1015 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1016 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1017 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1018 = private unnamed_addr constant [22 x i8] c"cannot emit statement\00" -@.str1019 = private unnamed_addr constant [36 x i8] c"@L_running = internal global i32 1\0A\00" -@.str1020 = private unnamed_addr constant [32 x i8] c"@L_key = internal global i32 0\0A\00" -@.str1021 = private unnamed_addr constant [33 x i8] c"@L_entc = internal global i32 0\0A\00" -@.str1022 = private unnamed_addr constant [29 x i8] c"@L_alive = internal global [\00" -@.str1023 = private unnamed_addr constant [25 x i8] c" x i32] zeroinitializer\0A\00" -@.str1024 = private unnamed_addr constant [28 x i8] c"@L_kind = internal global [\00" -@.str1025 = private unnamed_addr constant [25 x i8] c" x i32] zeroinitializer\0A\00" -@.str1026 = private unnamed_addr constant [32 x i8] c"@L_freelist = internal global [\00" -@.str1027 = private unnamed_addr constant [25 x i8] c" x i32] zeroinitializer\0A\00" -@.str1028 = private unnamed_addr constant [34 x i8] c"@L_freen = internal global i32 0\0A\00" -@.str1029 = private unnamed_addr constant [6 x i8] c"%Cmp_\00" -@.str1030 = private unnamed_addr constant [11 x i8] c" = type { \00" -@.str1031 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str1032 = private unnamed_addr constant [3 x i8] c", \00" -@.str1033 = private unnamed_addr constant [4 x i8] c" }\0A\00" -@.str1034 = private unnamed_addr constant [4 x i8] c"@S_\00" -@.str1035 = private unnamed_addr constant [21 x i8] c" = internal global [\00" -@.str1036 = private unnamed_addr constant [9 x i8] c" x %Cmp_\00" -@.str1037 = private unnamed_addr constant [19 x i8] c"] zeroinitializer\0A\00" -@.str1038 = private unnamed_addr constant [4 x i8] c"@H_\00" -@.str1039 = private unnamed_addr constant [21 x i8] c" = internal global [\00" -@.str1040 = private unnamed_addr constant [24 x i8] c" x i8] zeroinitializer\0A\00" -@.str1041 = private unnamed_addr constant [39 x i8] c"define void @L_reset(i32 %e) {\0Aentry:\0A\00" -@.str1042 = private unnamed_addr constant [3 x i8] c"%h\00" -@.str1043 = private unnamed_addr constant [3 x i8] c" \00" -@.str1044 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1045 = private unnamed_addr constant [16 x i8] c" x i8], ptr @H_\00" -@.str1046 = private unnamed_addr constant [17 x i8] c", i32 0, i32 %e\0A\00" -@.str1047 = private unnamed_addr constant [19 x i8] c" store i8 0, ptr \00" -@.str1048 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1049 = private unnamed_addr constant [32 x i8] c" %k = getelementptr inbounds [\00" -@.str1050 = private unnamed_addr constant [37 x i8] c" x i32], ptr @L_kind, i32 0, i32 %e\0A\00" -@.str1051 = private unnamed_addr constant [37 x i8] c" store i32 0, ptr %k\0A ret void\0A}\0A\0A\00" -@.str1052 = private unnamed_addr constant [32 x i8] c"define i32 @L_alloc() {\0Aentry:\0A\00" -@.str1053 = private unnamed_addr constant [32 x i8] c" %fn = load i32, ptr @L_freen\0A\00" -@.str1054 = private unnamed_addr constant [30 x i8] c" %has = icmp sgt i32 %fn, 0\0A\00" -@.str1055 = private unnamed_addr constant [42 x i8] c" br i1 %has, label %reuse, label %fresh\0A\00" -@.str1056 = private unnamed_addr constant [8 x i8] c"reuse:\0A\00" -@.str1057 = private unnamed_addr constant [25 x i8] c" %fn1 = sub i32 %fn, 1\0A\00" -@.str1058 = private unnamed_addr constant [32 x i8] c" store i32 %fn1, ptr @L_freen\0A\00" -@.str1059 = private unnamed_addr constant [33 x i8] c" %fp = getelementptr inbounds [\00" -@.str1060 = private unnamed_addr constant [43 x i8] c" x i32], ptr @L_freelist, i32 0, i32 %fn1\0A\00" -@.str1061 = private unnamed_addr constant [27 x i8] c" %re = load i32, ptr %fp\0A\00" -@.str1062 = private unnamed_addr constant [18 x i8] c" br label %done\0A\00" -@.str1063 = private unnamed_addr constant [8 x i8] c"fresh:\0A\00" -@.str1064 = private unnamed_addr constant [31 x i8] c" %ec = load i32, ptr @L_entc\0A\00" -@.str1065 = private unnamed_addr constant [25 x i8] c" %ec1 = add i32 %ec, 1\0A\00" -@.str1066 = private unnamed_addr constant [31 x i8] c" store i32 %ec1, ptr @L_entc\0A\00" -@.str1067 = private unnamed_addr constant [18 x i8] c" br label %done\0A\00" -@.str1068 = private unnamed_addr constant [7 x i8] c"done:\0A\00" -@.str1069 = private unnamed_addr constant [49 x i8] c" %e = phi i32 [ %re, %reuse ], [ %ec, %fresh ]\0A\00" -@.str1070 = private unnamed_addr constant [30 x i8] c" call void @L_reset(i32 %e)\0A\00" -@.str1071 = private unnamed_addr constant [33 x i8] c" %ap = getelementptr inbounds [\00" -@.str1072 = private unnamed_addr constant [38 x i8] c" x i32], ptr @L_alive, i32 0, i32 %e\0A\00" -@.str1073 = private unnamed_addr constant [24 x i8] c" store i32 1, ptr %ap\0A\00" -@.str1074 = private unnamed_addr constant [17 x i8] c" ret i32 %e\0A}\0A\0A\00" -@.str1075 = private unnamed_addr constant [45 x i8] c"define void @L_free_entity(i32 %e) {\0Aentry:\0A\00" -@.str1076 = private unnamed_addr constant [33 x i8] c" %ap = getelementptr inbounds [\00" -@.str1077 = private unnamed_addr constant [38 x i8] c" x i32], ptr @L_alive, i32 0, i32 %e\0A\00" -@.str1078 = private unnamed_addr constant [24 x i8] c" store i32 0, ptr %ap\0A\00" -@.str1079 = private unnamed_addr constant [30 x i8] c" call void @L_reset(i32 %e)\0A\00" -@.str1080 = private unnamed_addr constant [32 x i8] c" %fn = load i32, ptr @L_freen\0A\00" -@.str1081 = private unnamed_addr constant [33 x i8] c" %fp = getelementptr inbounds [\00" -@.str1082 = private unnamed_addr constant [42 x i8] c" x i32], ptr @L_freelist, i32 0, i32 %fn\0A\00" -@.str1083 = private unnamed_addr constant [25 x i8] c" store i32 %e, ptr %fp\0A\00" -@.str1084 = private unnamed_addr constant [25 x i8] c" %fn1 = add i32 %fn, 1\0A\00" -@.str1085 = private unnamed_addr constant [32 x i8] c" store i32 %fn1, ptr @L_freen\0A\00" -@.str1086 = private unnamed_addr constant [15 x i8] c" ret void\0A}\0A\0A\00" -@.str1087 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str1088 = private unnamed_addr constant [4 x i8] c"i32\00" -@.str1089 = private unnamed_addr constant [2 x i8] c"0\00" -@.str1090 = private unnamed_addr constant [6 x i8] c"qcond\00" -@.str1091 = private unnamed_addr constant [6 x i8] c"qbody\00" -@.str1092 = private unnamed_addr constant [6 x i8] c"qnext\00" -@.str1093 = private unnamed_addr constant [5 x i8] c"qend\00" -@.str1094 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1095 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1096 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1097 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str1098 = private unnamed_addr constant [22 x i8] c"load i32, ptr @L_entc\00" -@.str1099 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" -@.str1100 = private unnamed_addr constant [3 x i8] c", \00" -@.str1101 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1102 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1103 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1104 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1105 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1106 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str1107 = private unnamed_addr constant [3 x i8] c" \00" -@.str1108 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1109 = private unnamed_addr constant [35 x i8] c" x i32], ptr @L_alive, i32 0, i32 \00" -@.str1110 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1111 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str1112 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str1113 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str1114 = private unnamed_addr constant [3 x i8] c"qa\00" -@.str1115 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1116 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1117 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1118 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1119 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1120 = private unnamed_addr constant [2 x i8] c"0\00" -@.str1121 = private unnamed_addr constant [3 x i8] c" \00" -@.str1122 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1123 = private unnamed_addr constant [34 x i8] c" x i32], ptr @L_kind, i32 0, i32 \00" -@.str1124 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1125 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str1126 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" -@.str1127 = private unnamed_addr constant [3 x i8] c", \00" +@.str989 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str990 = private unnamed_addr constant [9 x i8] c"add i32 \00" +@.str991 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str992 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str993 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str994 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str995 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str996 = private unnamed_addr constant [8 x i8] c"%retval\00" +@.str997 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" +@.str998 = private unnamed_addr constant [2 x i8] c"_\00" +@.str999 = private unnamed_addr constant [5 x i8] c"mend\00" +@.str1000 = private unnamed_addr constant [2 x i8] c"0\00" +@.str1001 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str1002 = private unnamed_addr constant [3 x i8] c", \00" +@.str1003 = private unnamed_addr constant [7 x i8] c"or i1 \00" +@.str1004 = private unnamed_addr constant [3 x i8] c", \00" +@.str1005 = private unnamed_addr constant [6 x i8] c"mbody\00" +@.str1006 = private unnamed_addr constant [5 x i8] c"marm\00" +@.str1007 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1008 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1009 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1010 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1011 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1012 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str1013 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1014 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1015 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str1016 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1017 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1018 = private unnamed_addr constant [2 x i8] c"0\00" +@.str1019 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str1020 = private unnamed_addr constant [5 x i8] c"null\00" +@.str1021 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str1022 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1023 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str1024 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1025 = private unnamed_addr constant [22 x i8] c"cannot emit statement\00" +@.str1026 = private unnamed_addr constant [36 x i8] c"@L_running = internal global i32 1\0A\00" +@.str1027 = private unnamed_addr constant [32 x i8] c"@L_key = internal global i32 0\0A\00" +@.str1028 = private unnamed_addr constant [33 x i8] c"@L_entc = internal global i32 0\0A\00" +@.str1029 = private unnamed_addr constant [29 x i8] c"@L_alive = internal global [\00" +@.str1030 = private unnamed_addr constant [25 x i8] c" x i32] zeroinitializer\0A\00" +@.str1031 = private unnamed_addr constant [28 x i8] c"@L_kind = internal global [\00" +@.str1032 = private unnamed_addr constant [25 x i8] c" x i32] zeroinitializer\0A\00" +@.str1033 = private unnamed_addr constant [32 x i8] c"@L_freelist = internal global [\00" +@.str1034 = private unnamed_addr constant [25 x i8] c" x i32] zeroinitializer\0A\00" +@.str1035 = private unnamed_addr constant [34 x i8] c"@L_freen = internal global i32 0\0A\00" +@.str1036 = private unnamed_addr constant [6 x i8] c"%Cmp_\00" +@.str1037 = private unnamed_addr constant [11 x i8] c" = type { \00" +@.str1038 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str1039 = private unnamed_addr constant [3 x i8] c", \00" +@.str1040 = private unnamed_addr constant [4 x i8] c" }\0A\00" +@.str1041 = private unnamed_addr constant [4 x i8] c"@S_\00" +@.str1042 = private unnamed_addr constant [21 x i8] c" = internal global [\00" +@.str1043 = private unnamed_addr constant [9 x i8] c" x %Cmp_\00" +@.str1044 = private unnamed_addr constant [19 x i8] c"] zeroinitializer\0A\00" +@.str1045 = private unnamed_addr constant [4 x i8] c"@H_\00" +@.str1046 = private unnamed_addr constant [21 x i8] c" = internal global [\00" +@.str1047 = private unnamed_addr constant [24 x i8] c" x i8] zeroinitializer\0A\00" +@.str1048 = private unnamed_addr constant [39 x i8] c"define void @L_reset(i32 %e) {\0Aentry:\0A\00" +@.str1049 = private unnamed_addr constant [3 x i8] c"%h\00" +@.str1050 = private unnamed_addr constant [3 x i8] c" \00" +@.str1051 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" +@.str1052 = private unnamed_addr constant [16 x i8] c" x i8], ptr @H_\00" +@.str1053 = private unnamed_addr constant [17 x i8] c", i32 0, i32 %e\0A\00" +@.str1054 = private unnamed_addr constant [19 x i8] c" store i8 0, ptr \00" +@.str1055 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1056 = private unnamed_addr constant [32 x i8] c" %k = getelementptr inbounds [\00" +@.str1057 = private unnamed_addr constant [37 x i8] c" x i32], ptr @L_kind, i32 0, i32 %e\0A\00" +@.str1058 = private unnamed_addr constant [37 x i8] c" store i32 0, ptr %k\0A ret void\0A}\0A\0A\00" +@.str1059 = private unnamed_addr constant [32 x i8] c"define i32 @L_alloc() {\0Aentry:\0A\00" +@.str1060 = private unnamed_addr constant [32 x i8] c" %fn = load i32, ptr @L_freen\0A\00" +@.str1061 = private unnamed_addr constant [30 x i8] c" %has = icmp sgt i32 %fn, 0\0A\00" +@.str1062 = private unnamed_addr constant [42 x i8] c" br i1 %has, label %reuse, label %fresh\0A\00" +@.str1063 = private unnamed_addr constant [8 x i8] c"reuse:\0A\00" +@.str1064 = private unnamed_addr constant [25 x i8] c" %fn1 = sub i32 %fn, 1\0A\00" +@.str1065 = private unnamed_addr constant [32 x i8] c" store i32 %fn1, ptr @L_freen\0A\00" +@.str1066 = private unnamed_addr constant [33 x i8] c" %fp = getelementptr inbounds [\00" +@.str1067 = private unnamed_addr constant [43 x i8] c" x i32], ptr @L_freelist, i32 0, i32 %fn1\0A\00" +@.str1068 = private unnamed_addr constant [27 x i8] c" %re = load i32, ptr %fp\0A\00" +@.str1069 = private unnamed_addr constant [18 x i8] c" br label %done\0A\00" +@.str1070 = private unnamed_addr constant [8 x i8] c"fresh:\0A\00" +@.str1071 = private unnamed_addr constant [31 x i8] c" %ec = load i32, ptr @L_entc\0A\00" +@.str1072 = private unnamed_addr constant [25 x i8] c" %ec1 = add i32 %ec, 1\0A\00" +@.str1073 = private unnamed_addr constant [31 x i8] c" store i32 %ec1, ptr @L_entc\0A\00" +@.str1074 = private unnamed_addr constant [18 x i8] c" br label %done\0A\00" +@.str1075 = private unnamed_addr constant [7 x i8] c"done:\0A\00" +@.str1076 = private unnamed_addr constant [49 x i8] c" %e = phi i32 [ %re, %reuse ], [ %ec, %fresh ]\0A\00" +@.str1077 = private unnamed_addr constant [30 x i8] c" call void @L_reset(i32 %e)\0A\00" +@.str1078 = private unnamed_addr constant [33 x i8] c" %ap = getelementptr inbounds [\00" +@.str1079 = private unnamed_addr constant [38 x i8] c" x i32], ptr @L_alive, i32 0, i32 %e\0A\00" +@.str1080 = private unnamed_addr constant [24 x i8] c" store i32 1, ptr %ap\0A\00" +@.str1081 = private unnamed_addr constant [17 x i8] c" ret i32 %e\0A}\0A\0A\00" +@.str1082 = private unnamed_addr constant [45 x i8] c"define void @L_free_entity(i32 %e) {\0Aentry:\0A\00" +@.str1083 = private unnamed_addr constant [33 x i8] c" %ap = getelementptr inbounds [\00" +@.str1084 = private unnamed_addr constant [38 x i8] c" x i32], ptr @L_alive, i32 0, i32 %e\0A\00" +@.str1085 = private unnamed_addr constant [24 x i8] c" store i32 0, ptr %ap\0A\00" +@.str1086 = private unnamed_addr constant [30 x i8] c" call void @L_reset(i32 %e)\0A\00" +@.str1087 = private unnamed_addr constant [32 x i8] c" %fn = load i32, ptr @L_freen\0A\00" +@.str1088 = private unnamed_addr constant [33 x i8] c" %fp = getelementptr inbounds [\00" +@.str1089 = private unnamed_addr constant [42 x i8] c" x i32], ptr @L_freelist, i32 0, i32 %fn\0A\00" +@.str1090 = private unnamed_addr constant [25 x i8] c" store i32 %e, ptr %fp\0A\00" +@.str1091 = private unnamed_addr constant [25 x i8] c" %fn1 = add i32 %fn, 1\0A\00" +@.str1092 = private unnamed_addr constant [32 x i8] c" store i32 %fn1, ptr @L_freen\0A\00" +@.str1093 = private unnamed_addr constant [15 x i8] c" ret void\0A}\0A\0A\00" +@.str1094 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str1095 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str1096 = private unnamed_addr constant [2 x i8] c"0\00" +@.str1097 = private unnamed_addr constant [6 x i8] c"qcond\00" +@.str1098 = private unnamed_addr constant [6 x i8] c"qbody\00" +@.str1099 = private unnamed_addr constant [6 x i8] c"qnext\00" +@.str1100 = private unnamed_addr constant [5 x i8] c"qend\00" +@.str1101 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str1102 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1103 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1104 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str1105 = private unnamed_addr constant [22 x i8] c"load i32, ptr @L_entc\00" +@.str1106 = private unnamed_addr constant [14 x i8] c"icmp slt i32 \00" +@.str1107 = private unnamed_addr constant [3 x i8] c", \00" +@.str1108 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1109 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1110 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1111 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1112 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1113 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str1114 = private unnamed_addr constant [3 x i8] c" \00" +@.str1115 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" +@.str1116 = private unnamed_addr constant [35 x i8] c" x i32], ptr @L_alive, i32 0, i32 \00" +@.str1117 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1118 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str1119 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str1120 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str1121 = private unnamed_addr constant [3 x i8] c"qa\00" +@.str1122 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1123 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1124 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1125 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1126 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1127 = private unnamed_addr constant [2 x i8] c"0\00" @.str1128 = private unnamed_addr constant [3 x i8] c" \00" @.str1129 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1130 = private unnamed_addr constant [16 x i8] c" x i8], ptr @H_\00" -@.str1131 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" -@.str1132 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1133 = private unnamed_addr constant [14 x i8] c"load i8, ptr \00" -@.str1134 = private unnamed_addr constant [12 x i8] c"icmp ne i8 \00" -@.str1135 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str1136 = private unnamed_addr constant [3 x i8] c"qt\00" -@.str1137 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1138 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1139 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1140 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1141 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1142 = private unnamed_addr constant [3 x i8] c" \00" -@.str1143 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1144 = private unnamed_addr constant [9 x i8] c" x %Cmp_\00" -@.str1145 = private unnamed_addr constant [11 x i8] c"], ptr @S_\00" -@.str1146 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str1130 = private unnamed_addr constant [34 x i8] c" x i32], ptr @L_kind, i32 0, i32 \00" +@.str1131 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1132 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str1133 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str1134 = private unnamed_addr constant [3 x i8] c", \00" +@.str1135 = private unnamed_addr constant [3 x i8] c" \00" +@.str1136 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" +@.str1137 = private unnamed_addr constant [16 x i8] c" x i8], ptr @H_\00" +@.str1138 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str1139 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1140 = private unnamed_addr constant [14 x i8] c"load i8, ptr \00" +@.str1141 = private unnamed_addr constant [12 x i8] c"icmp ne i8 \00" +@.str1142 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str1143 = private unnamed_addr constant [3 x i8] c"qt\00" +@.str1144 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1145 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1146 = private unnamed_addr constant [10 x i8] c", label %\00" @.str1147 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1148 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str1149 = private unnamed_addr constant [13 x i8] c" store ptr \00" -@.str1150 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str1151 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1152 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str1153 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str1154 = private unnamed_addr constant [3 x i8] c"qw\00" -@.str1155 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1156 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1157 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1148 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1149 = private unnamed_addr constant [3 x i8] c" \00" +@.str1150 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" +@.str1151 = private unnamed_addr constant [9 x i8] c" x %Cmp_\00" +@.str1152 = private unnamed_addr constant [11 x i8] c"], ptr @S_\00" +@.str1153 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str1154 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1155 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str1156 = private unnamed_addr constant [13 x i8] c" store ptr \00" +@.str1157 = private unnamed_addr constant [7 x i8] c", ptr \00" @.str1158 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1159 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1160 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1161 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1162 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1163 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" -@.str1164 = private unnamed_addr constant [9 x i8] c"add i32 \00" -@.str1165 = private unnamed_addr constant [4 x i8] c", 1\00" -@.str1166 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str1159 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str1160 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str1161 = private unnamed_addr constant [3 x i8] c"qw\00" +@.str1162 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1163 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1164 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1165 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1166 = private unnamed_addr constant [3 x i8] c":\0A\00" @.str1167 = private unnamed_addr constant [13 x i8] c" br label %\00" @.str1168 = private unnamed_addr constant [2 x i8] c"\0A\00" @.str1169 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1170 = private unnamed_addr constant [26 x i8] c"spawn: unknown component \00" -@.str1171 = private unnamed_addr constant [3 x i8] c" \00" -@.str1172 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1173 = private unnamed_addr constant [16 x i8] c" x i8], ptr @H_\00" -@.str1174 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str1170 = private unnamed_addr constant [15 x i8] c"load i32, ptr \00" +@.str1171 = private unnamed_addr constant [9 x i8] c"add i32 \00" +@.str1172 = private unnamed_addr constant [4 x i8] c", 1\00" +@.str1173 = private unnamed_addr constant [4 x i8] c"i32\00" +@.str1174 = private unnamed_addr constant [13 x i8] c" br label %\00" @.str1175 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1176 = private unnamed_addr constant [19 x i8] c" store i8 1, ptr \00" -@.str1177 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1176 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1177 = private unnamed_addr constant [26 x i8] c"spawn: unknown component \00" @.str1178 = private unnamed_addr constant [3 x i8] c" \00" @.str1179 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1180 = private unnamed_addr constant [9 x i8] c" x %Cmp_\00" -@.str1181 = private unnamed_addr constant [11 x i8] c"], ptr @S_\00" -@.str1182 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" -@.str1183 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1184 = private unnamed_addr constant [3 x i8] c" \00" -@.str1185 = private unnamed_addr constant [32 x i8] c" = getelementptr inbounds %Cmp_\00" -@.str1186 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str1187 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" -@.str1188 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1189 = private unnamed_addr constant [2 x i8] c"0\00" -@.str1190 = private unnamed_addr constant [4 x i8] c"ptr\00" -@.str1191 = private unnamed_addr constant [5 x i8] c"null\00" -@.str1192 = private unnamed_addr constant [9 x i8] c" store \00" -@.str1193 = private unnamed_addr constant [2 x i8] c" \00" -@.str1194 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1180 = private unnamed_addr constant [16 x i8] c" x i8], ptr @H_\00" +@.str1181 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str1182 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1183 = private unnamed_addr constant [19 x i8] c" store i8 1, ptr \00" +@.str1184 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1185 = private unnamed_addr constant [3 x i8] c" \00" +@.str1186 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" +@.str1187 = private unnamed_addr constant [9 x i8] c" x %Cmp_\00" +@.str1188 = private unnamed_addr constant [11 x i8] c"], ptr @S_\00" +@.str1189 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str1190 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1191 = private unnamed_addr constant [3 x i8] c" \00" +@.str1192 = private unnamed_addr constant [32 x i8] c" = getelementptr inbounds %Cmp_\00" +@.str1193 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1194 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" @.str1195 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1196 = private unnamed_addr constant [3 x i8] c" \00" -@.str1197 = private unnamed_addr constant [32 x i8] c" = getelementptr inbounds %Cmp_\00" -@.str1198 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str1199 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" -@.str1200 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1201 = private unnamed_addr constant [9 x i8] c" store \00" -@.str1202 = private unnamed_addr constant [2 x i8] c" \00" -@.str1203 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str1204 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1205 = private unnamed_addr constant [20 x i8] c"call i32 @L_alloc()\00" -@.str1206 = private unnamed_addr constant [3 x i8] c" \00" -@.str1207 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" -@.str1208 = private unnamed_addr constant [34 x i8] c" x i32], ptr @L_kind, i32 0, i32 \00" -@.str1209 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1210 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str1211 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str1212 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1213 = private unnamed_addr constant [32 x i8] c" call void @L_free_entity(i32 \00" -@.str1214 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str1215 = private unnamed_addr constant [5 x i8] c"void\00" -@.str1216 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" -@.str1217 = private unnamed_addr constant [17 x i8] c"ret:\0A ret void\0A\00" -@.str1218 = private unnamed_addr constant [18 x i8] c"define void @sys_\00" -@.str1219 = private unnamed_addr constant [13 x i8] c"() {\0Aentry:\0A\00" -@.str1220 = private unnamed_addr constant [4 x i8] c"}\0A\0A\00" -@.str1221 = private unnamed_addr constant [18 x i8] c" call void @sys_\00" -@.str1222 = private unnamed_addr constant [4 x i8] c"()\0A\00" -@.str1223 = private unnamed_addr constant [49 x i8] c"define i32 @main(i32 %argc, ptr %argv) {\0Aentry:\0A\00" -@.str1224 = private unnamed_addr constant [32 x i8] c" store i32 %argc, ptr @L_argc\0A\00" -@.str1225 = private unnamed_addr constant [32 x i8] c" store ptr %argv, ptr @L_argv\0A\00" -@.str1226 = private unnamed_addr constant [8 x i8] c"rt_init\00" -@.str1227 = private unnamed_addr constant [27 x i8] c" call void @fn_rt_init()\0A\00" -@.str1228 = private unnamed_addr constant [6 x i8] c"Start\00" -@.str1229 = private unnamed_addr constant [18 x i8] c" br label %loop\0A\00" -@.str1230 = private unnamed_addr constant [7 x i8] c"loop:\0A\00" -@.str1231 = private unnamed_addr constant [25 x i8] c"load i32, ptr @L_running\00" -@.str1232 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str1233 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str1234 = private unnamed_addr constant [11 x i8] c"rt_running\00" -@.str1235 = private unnamed_addr constant [26 x i8] c"call i32 @fn_rt_running()\00" -@.str1236 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" -@.str1237 = private unnamed_addr constant [4 x i8] c", 0\00" -@.str1238 = private unnamed_addr constant [8 x i8] c"and i1 \00" -@.str1239 = private unnamed_addr constant [3 x i8] c", \00" -@.str1240 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1241 = private unnamed_addr constant [28 x i8] c", label %body, label %done\0A\00" -@.str1242 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1243 = private unnamed_addr constant [28 x i8] c", label %body, label %done\0A\00" -@.str1244 = private unnamed_addr constant [7 x i8] c"body:\0A\00" -@.str1245 = private unnamed_addr constant [8 x i8] c"rt_poll\00" -@.str1246 = private unnamed_addr constant [23 x i8] c"call i32 @fn_rt_poll()\00" -@.str1247 = private unnamed_addr constant [13 x i8] c" store i32 \00" -@.str1248 = private unnamed_addr constant [14 x i8] c", ptr @L_key\0A\00" -@.str1249 = private unnamed_addr constant [6 x i8] c"Input\00" -@.str1250 = private unnamed_addr constant [12 x i8] c"FixedUpdate\00" -@.str1251 = private unnamed_addr constant [7 x i8] c"Update\00" -@.str1252 = private unnamed_addr constant [11 x i8] c"LateUpdate\00" -@.str1253 = private unnamed_addr constant [7 x i8] c"Render\00" -@.str1254 = private unnamed_addr constant [18 x i8] c" br label %loop\0A\00" -@.str1255 = private unnamed_addr constant [7 x i8] c"done:\0A\00" -@.str1256 = private unnamed_addr constant [12 x i8] c"rt_shutdown\00" -@.str1257 = private unnamed_addr constant [31 x i8] c" call void @fn_rt_shutdown()\0A\00" -@.str1258 = private unnamed_addr constant [15 x i8] c" ret i32 0\0A}\0A\00" -@.str1259 = private unnamed_addr constant [25 x i8] c"call i32 @fn_rt_reg(i32 \00" -@.str1260 = private unnamed_addr constant [2 x i8] c")\00" -@.str1261 = private unnamed_addr constant [6 x i8] c"smend\00" -@.str1262 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" -@.str1263 = private unnamed_addr constant [3 x i8] c", \00" -@.str1264 = private unnamed_addr constant [6 x i8] c"sbody\00" -@.str1265 = private unnamed_addr constant [5 x i8] c"sarm\00" -@.str1266 = private unnamed_addr constant [9 x i8] c" br i1 \00" -@.str1267 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1268 = private unnamed_addr constant [10 x i8] c", label %\00" -@.str1269 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1270 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1271 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1272 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1273 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1274 = private unnamed_addr constant [13 x i8] c" br label %\00" -@.str1275 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1276 = private unnamed_addr constant [3 x i8] c":\0A\00" -@.str1277 = private unnamed_addr constant [27 x i8] c"'become' outside a machine\00" -@.str1278 = private unnamed_addr constant [18 x i8] c"become: no state \00" -@.str1279 = private unnamed_addr constant [31 x i8] c" call void @fn_rt_setreg(i32 \00" -@.str1280 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str1281 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str1282 = private unnamed_addr constant [4 x i8] c"%io\00" -@.str1283 = private unnamed_addr constant [3 x i8] c" \00" -@.str1284 = private unnamed_addr constant [14 x i8] c" = call i64 @\00" -@.str1285 = private unnamed_addr constant [6 x i8] c"(ptr \00" -@.str1286 = private unnamed_addr constant [14 x i8] c", i64 1, i64 \00" -@.str1287 = private unnamed_addr constant [11 x i8] c", ptr %f)\0A\00" -@.str1288 = private unnamed_addr constant [8 x i8] c"@L_entc\00" -@.str1289 = private unnamed_addr constant [2 x i8] c"4\00" -@.str1290 = private unnamed_addr constant [9 x i8] c"@L_freen\00" -@.str1291 = private unnamed_addr constant [2 x i8] c"4\00" -@.str1292 = private unnamed_addr constant [21 x i8] c" %nalive = mul i64 \00" -@.str1293 = private unnamed_addr constant [5 x i8] c", 4\0A\00" -@.str1294 = private unnamed_addr constant [9 x i8] c"@L_alive\00" -@.str1295 = private unnamed_addr constant [8 x i8] c"%nalive\00" -@.str1296 = private unnamed_addr constant [12 x i8] c"@L_freelist\00" -@.str1297 = private unnamed_addr constant [8 x i8] c"%nalive\00" -@.str1298 = private unnamed_addr constant [8 x i8] c"@L_kind\00" -@.str1299 = private unnamed_addr constant [8 x i8] c"%nalive\00" -@.str1300 = private unnamed_addr constant [4 x i8] c"@g_\00" -@.str1301 = private unnamed_addr constant [2 x i8] c"4\00" -@.str1302 = private unnamed_addr constant [5 x i8] c"%csz\00" -@.str1303 = private unnamed_addr constant [3 x i8] c" \00" -@.str1304 = private unnamed_addr constant [37 x i8] c" = ptrtoint ptr getelementptr (%Cmp_\00" -@.str1305 = private unnamed_addr constant [17 x i8] c", ptr null, i32 \00" -@.str1306 = private unnamed_addr constant [10 x i8] c") to i64\0A\00" -@.str1307 = private unnamed_addr constant [4 x i8] c"@S_\00" -@.str1308 = private unnamed_addr constant [4 x i8] c"@H_\00" -@.str1309 = private unnamed_addr constant [70 x i8] c"@.sav_path = private unnamed_addr constant [10 x i8] c\22ludic.sav\5C00\22\0A\00" -@.str1310 = private unnamed_addr constant [60 x i8] c"@.sav_wb = private unnamed_addr constant [3 x i8] c\22wb\5C00\22\0A\00" -@.str1311 = private unnamed_addr constant [60 x i8] c"@.sav_rb = private unnamed_addr constant [3 x i8] c\22rb\5C00\22\0A\00" -@.str1312 = private unnamed_addr constant [14 x i8] c"rt_save_state\00" -@.str1313 = private unnamed_addr constant [14 x i8] c"rt_load_state\00" -@.str1314 = private unnamed_addr constant [32 x i8] c"define void @L_save() {\0Aentry:\0A\00" -@.str1315 = private unnamed_addr constant [54 x i8] c" %f = call ptr @fopen(ptr @.sav_path, ptr @.sav_wb)\0A\00" -@.str1316 = private unnamed_addr constant [31 x i8] c" %bad = icmp eq ptr %f, null\0A\00" -@.str1317 = private unnamed_addr constant [41 x i8] c" br i1 %bad, label %out, label %go\0Ago:\0A\00" -@.str1318 = private unnamed_addr constant [7 x i8] c"fwrite\00" -@.str1319 = private unnamed_addr constant [39 x i8] c" call void @fn_rt_save_state(ptr %f)\0A\00" -@.str1320 = private unnamed_addr constant [68 x i8] c" %c = call i32 @fclose(ptr %f)\0A br label %out\0Aout:\0A ret void\0A}\0A\0A\00" -@.str1321 = private unnamed_addr constant [31 x i8] c"define i32 @L_load() {\0Aentry:\0A\00" -@.str1322 = private unnamed_addr constant [54 x i8] c" %f = call ptr @fopen(ptr @.sav_path, ptr @.sav_rb)\0A\00" +@.str1196 = private unnamed_addr constant [2 x i8] c"0\00" +@.str1197 = private unnamed_addr constant [4 x i8] c"ptr\00" +@.str1198 = private unnamed_addr constant [5 x i8] c"null\00" +@.str1199 = private unnamed_addr constant [9 x i8] c" store \00" +@.str1200 = private unnamed_addr constant [2 x i8] c" \00" +@.str1201 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1202 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1203 = private unnamed_addr constant [3 x i8] c" \00" +@.str1204 = private unnamed_addr constant [32 x i8] c" = getelementptr inbounds %Cmp_\00" +@.str1205 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1206 = private unnamed_addr constant [14 x i8] c", i32 0, i32 \00" +@.str1207 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1208 = private unnamed_addr constant [9 x i8] c" store \00" +@.str1209 = private unnamed_addr constant [2 x i8] c" \00" +@.str1210 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1211 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1212 = private unnamed_addr constant [20 x i8] c"call i32 @L_alloc()\00" +@.str1213 = private unnamed_addr constant [3 x i8] c" \00" +@.str1214 = private unnamed_addr constant [28 x i8] c" = getelementptr inbounds [\00" +@.str1215 = private unnamed_addr constant [34 x i8] c" x i32], ptr @L_kind, i32 0, i32 \00" +@.str1216 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1217 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str1218 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1219 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1220 = private unnamed_addr constant [32 x i8] c" call void @L_free_entity(i32 \00" +@.str1221 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str1222 = private unnamed_addr constant [5 x i8] c"void\00" +@.str1223 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" +@.str1224 = private unnamed_addr constant [17 x i8] c"ret:\0A ret void\0A\00" +@.str1225 = private unnamed_addr constant [18 x i8] c"define void @sys_\00" +@.str1226 = private unnamed_addr constant [13 x i8] c"() {\0Aentry:\0A\00" +@.str1227 = private unnamed_addr constant [4 x i8] c"}\0A\0A\00" +@.str1228 = private unnamed_addr constant [18 x i8] c" call void @sys_\00" +@.str1229 = private unnamed_addr constant [4 x i8] c"()\0A\00" +@.str1230 = private unnamed_addr constant [49 x i8] c"define i32 @main(i32 %argc, ptr %argv) {\0Aentry:\0A\00" +@.str1231 = private unnamed_addr constant [32 x i8] c" store i32 %argc, ptr @L_argc\0A\00" +@.str1232 = private unnamed_addr constant [32 x i8] c" store ptr %argv, ptr @L_argv\0A\00" +@.str1233 = private unnamed_addr constant [8 x i8] c"rt_init\00" +@.str1234 = private unnamed_addr constant [27 x i8] c" call void @fn_rt_init()\0A\00" +@.str1235 = private unnamed_addr constant [6 x i8] c"Start\00" +@.str1236 = private unnamed_addr constant [18 x i8] c" br label %loop\0A\00" +@.str1237 = private unnamed_addr constant [7 x i8] c"loop:\0A\00" +@.str1238 = private unnamed_addr constant [25 x i8] c"load i32, ptr @L_running\00" +@.str1239 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str1240 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str1241 = private unnamed_addr constant [11 x i8] c"rt_running\00" +@.str1242 = private unnamed_addr constant [26 x i8] c"call i32 @fn_rt_running()\00" +@.str1243 = private unnamed_addr constant [13 x i8] c"icmp ne i32 \00" +@.str1244 = private unnamed_addr constant [4 x i8] c", 0\00" +@.str1245 = private unnamed_addr constant [8 x i8] c"and i1 \00" +@.str1246 = private unnamed_addr constant [3 x i8] c", \00" +@.str1247 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1248 = private unnamed_addr constant [28 x i8] c", label %body, label %done\0A\00" +@.str1249 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1250 = private unnamed_addr constant [28 x i8] c", label %body, label %done\0A\00" +@.str1251 = private unnamed_addr constant [7 x i8] c"body:\0A\00" +@.str1252 = private unnamed_addr constant [8 x i8] c"rt_poll\00" +@.str1253 = private unnamed_addr constant [23 x i8] c"call i32 @fn_rt_poll()\00" +@.str1254 = private unnamed_addr constant [13 x i8] c" store i32 \00" +@.str1255 = private unnamed_addr constant [14 x i8] c", ptr @L_key\0A\00" +@.str1256 = private unnamed_addr constant [6 x i8] c"Input\00" +@.str1257 = private unnamed_addr constant [12 x i8] c"FixedUpdate\00" +@.str1258 = private unnamed_addr constant [7 x i8] c"Update\00" +@.str1259 = private unnamed_addr constant [11 x i8] c"LateUpdate\00" +@.str1260 = private unnamed_addr constant [7 x i8] c"Render\00" +@.str1261 = private unnamed_addr constant [18 x i8] c" br label %loop\0A\00" +@.str1262 = private unnamed_addr constant [7 x i8] c"done:\0A\00" +@.str1263 = private unnamed_addr constant [12 x i8] c"rt_shutdown\00" +@.str1264 = private unnamed_addr constant [31 x i8] c" call void @fn_rt_shutdown()\0A\00" +@.str1265 = private unnamed_addr constant [15 x i8] c" ret i32 0\0A}\0A\00" +@.str1266 = private unnamed_addr constant [25 x i8] c"call i32 @fn_rt_reg(i32 \00" +@.str1267 = private unnamed_addr constant [2 x i8] c")\00" +@.str1268 = private unnamed_addr constant [6 x i8] c"smend\00" +@.str1269 = private unnamed_addr constant [13 x i8] c"icmp eq i32 \00" +@.str1270 = private unnamed_addr constant [3 x i8] c", \00" +@.str1271 = private unnamed_addr constant [6 x i8] c"sbody\00" +@.str1272 = private unnamed_addr constant [5 x i8] c"sarm\00" +@.str1273 = private unnamed_addr constant [9 x i8] c" br i1 \00" +@.str1274 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1275 = private unnamed_addr constant [10 x i8] c", label %\00" +@.str1276 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1277 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1278 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str1279 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1280 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1281 = private unnamed_addr constant [13 x i8] c" br label %\00" +@.str1282 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1283 = private unnamed_addr constant [3 x i8] c":\0A\00" +@.str1284 = private unnamed_addr constant [27 x i8] c"'become' outside a machine\00" +@.str1285 = private unnamed_addr constant [18 x i8] c"become: no state \00" +@.str1286 = private unnamed_addr constant [31 x i8] c" call void @fn_rt_setreg(i32 \00" +@.str1287 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str1288 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str1289 = private unnamed_addr constant [4 x i8] c"%io\00" +@.str1290 = private unnamed_addr constant [3 x i8] c" \00" +@.str1291 = private unnamed_addr constant [14 x i8] c" = call i64 @\00" +@.str1292 = private unnamed_addr constant [6 x i8] c"(ptr \00" +@.str1293 = private unnamed_addr constant [14 x i8] c", i64 1, i64 \00" +@.str1294 = private unnamed_addr constant [11 x i8] c", ptr %f)\0A\00" +@.str1295 = private unnamed_addr constant [8 x i8] c"@L_entc\00" +@.str1296 = private unnamed_addr constant [2 x i8] c"4\00" +@.str1297 = private unnamed_addr constant [9 x i8] c"@L_freen\00" +@.str1298 = private unnamed_addr constant [2 x i8] c"4\00" +@.str1299 = private unnamed_addr constant [21 x i8] c" %nalive = mul i64 \00" +@.str1300 = private unnamed_addr constant [5 x i8] c", 4\0A\00" +@.str1301 = private unnamed_addr constant [9 x i8] c"@L_alive\00" +@.str1302 = private unnamed_addr constant [8 x i8] c"%nalive\00" +@.str1303 = private unnamed_addr constant [12 x i8] c"@L_freelist\00" +@.str1304 = private unnamed_addr constant [8 x i8] c"%nalive\00" +@.str1305 = private unnamed_addr constant [8 x i8] c"@L_kind\00" +@.str1306 = private unnamed_addr constant [8 x i8] c"%nalive\00" +@.str1307 = private unnamed_addr constant [4 x i8] c"@g_\00" +@.str1308 = private unnamed_addr constant [2 x i8] c"4\00" +@.str1309 = private unnamed_addr constant [5 x i8] c"%csz\00" +@.str1310 = private unnamed_addr constant [3 x i8] c" \00" +@.str1311 = private unnamed_addr constant [37 x i8] c" = ptrtoint ptr getelementptr (%Cmp_\00" +@.str1312 = private unnamed_addr constant [17 x i8] c", ptr null, i32 \00" +@.str1313 = private unnamed_addr constant [10 x i8] c") to i64\0A\00" +@.str1314 = private unnamed_addr constant [4 x i8] c"@S_\00" +@.str1315 = private unnamed_addr constant [4 x i8] c"@H_\00" +@.str1316 = private unnamed_addr constant [70 x i8] c"@.sav_path = private unnamed_addr constant [10 x i8] c\22ludic.sav\5C00\22\0A\00" +@.str1317 = private unnamed_addr constant [60 x i8] c"@.sav_wb = private unnamed_addr constant [3 x i8] c\22wb\5C00\22\0A\00" +@.str1318 = private unnamed_addr constant [60 x i8] c"@.sav_rb = private unnamed_addr constant [3 x i8] c\22rb\5C00\22\0A\00" +@.str1319 = private unnamed_addr constant [14 x i8] c"rt_save_state\00" +@.str1320 = private unnamed_addr constant [14 x i8] c"rt_load_state\00" +@.str1321 = private unnamed_addr constant [32 x i8] c"define void @L_save() {\0Aentry:\0A\00" +@.str1322 = private unnamed_addr constant [54 x i8] c" %f = call ptr @fopen(ptr @.sav_path, ptr @.sav_wb)\0A\00" @.str1323 = private unnamed_addr constant [31 x i8] c" %bad = icmp eq ptr %f, null\0A\00" -@.str1324 = private unnamed_addr constant [60 x i8] c" br i1 %bad, label %miss, label %go\0Amiss:\0A ret i32 0\0Ago:\0A\00" -@.str1325 = private unnamed_addr constant [6 x i8] c"fread\00" -@.str1326 = private unnamed_addr constant [39 x i8] c" call void @fn_rt_load_state(ptr %f)\0A\00" -@.str1327 = private unnamed_addr constant [48 x i8] c" %c = call i32 @fclose(ptr %f)\0A ret i32 1\0A}\0A\0A\00" -@.str1328 = private unnamed_addr constant [6 x i8] c"panel\00" -@.str1329 = private unnamed_addr constant [4 x i8] c"col\00" -@.str1330 = private unnamed_addr constant [4 x i8] c"row\00" -@.str1331 = private unnamed_addr constant [6 x i8] c"label\00" -@.str1332 = private unnamed_addr constant [7 x i8] c"button\00" -@.str1333 = private unnamed_addr constant [6 x i8] c"image\00" -@.str1334 = private unnamed_addr constant [7 x i8] c"spacer\00" -@.str1335 = private unnamed_addr constant [3 x i8] c"id\00" -@.str1336 = private unnamed_addr constant [31 x i8] c" call void @fn_rt_ui_set(i32 \00" -@.str1337 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str1338 = private unnamed_addr constant [7 x i8] c", i32 \00" -@.str1339 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str1340 = private unnamed_addr constant [2 x i8] c"w\00" -@.str1341 = private unnamed_addr constant [2 x i8] c"h\00" -@.str1342 = private unnamed_addr constant [2 x i8] c"x\00" -@.str1343 = private unnamed_addr constant [2 x i8] c"y\00" -@.str1344 = private unnamed_addr constant [4 x i8] c"pad\00" -@.str1345 = private unnamed_addr constant [4 x i8] c"gap\00" -@.str1346 = private unnamed_addr constant [3 x i8] c"bg\00" -@.str1347 = private unnamed_addr constant [3 x i8] c"fg\00" -@.str1348 = private unnamed_addr constant [7 x i8] c"border\00" -@.str1349 = private unnamed_addr constant [5 x i8] c"grow\00" -@.str1350 = private unnamed_addr constant [5 x i8] c"font\00" -@.str1351 = private unnamed_addr constant [5 x i8] c"size\00" -@.str1352 = private unnamed_addr constant [6 x i8] c"inset\00" -@.str1353 = private unnamed_addr constant [6 x i8] c"focus\00" -@.str1354 = private unnamed_addr constant [33 x i8] c" call void @fn_rt_ui_reset(i32 \00" -@.str1355 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str1356 = private unnamed_addr constant [2 x i8] c"1\00" -@.str1357 = private unnamed_addr constant [3 x i8] c"id\00" -@.str1358 = private unnamed_addr constant [5 x i8] c"text\00" -@.str1359 = private unnamed_addr constant [39 x i8] c" call void @fn_rt_ui_static_text(i32 \00" -@.str1360 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str1361 = private unnamed_addr constant [3 x i8] c")\0A\00" -@.str1362 = private unnamed_addr constant [5 x i8] c"skin\00" -@.str1363 = private unnamed_addr constant [6 x i8] c"image\00" -@.str1364 = private unnamed_addr constant [32 x i8] c"call i32 @fn_rt_image_load(ptr \00" -@.str1365 = private unnamed_addr constant [2 x i8] c")\00" -@.str1366 = private unnamed_addr constant [5 x i8] c"skin\00" -@.str1367 = private unnamed_addr constant [6 x i8] c"align\00" -@.str1368 = private unnamed_addr constant [7 x i8] c"center\00" -@.str1369 = private unnamed_addr constant [4 x i8] c"end\00" -@.str1370 = private unnamed_addr constant [2 x i8] c"1\00" -@.str1371 = private unnamed_addr constant [34 x i8] c"define void @ui_build() {\0Aentry:\0A\00" -@.str1372 = private unnamed_addr constant [15 x i8] c" ret void\0A}\0A\0A\00" -@.str1373 = private unnamed_addr constant [3 x i8] c", \00" -@.str1374 = private unnamed_addr constant [7 x i8] c" %arg_\00" -@.str1375 = private unnamed_addr constant [5 x i8] c"void\00" -@.str1376 = private unnamed_addr constant [20 x i8] c" %retval = alloca \00" -@.str1377 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1378 = private unnamed_addr constant [9 x i8] c" store \00" -@.str1379 = private unnamed_addr constant [7 x i8] c" %arg_\00" -@.str1380 = private unnamed_addr constant [7 x i8] c", ptr \00" -@.str1381 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1382 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" -@.str1383 = private unnamed_addr constant [6 x i8] c"ret:\0A\00" -@.str1384 = private unnamed_addr constant [5 x i8] c"void\00" -@.str1385 = private unnamed_addr constant [12 x i8] c" ret void\0A\00" -@.str1386 = private unnamed_addr constant [6 x i8] c"load \00" -@.str1387 = private unnamed_addr constant [14 x i8] c", ptr %retval\00" -@.str1388 = private unnamed_addr constant [7 x i8] c" ret \00" -@.str1389 = private unnamed_addr constant [2 x i8] c" \00" -@.str1390 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1391 = private unnamed_addr constant [8 x i8] c"define \00" -@.str1392 = private unnamed_addr constant [6 x i8] c" @fn_\00" -@.str1393 = private unnamed_addr constant [2 x i8] c"(\00" -@.str1394 = private unnamed_addr constant [12 x i8] c") {\0Aentry:\0A\00" -@.str1395 = private unnamed_addr constant [4 x i8] c"}\0A\0A\00" -@.str1396 = private unnamed_addr constant [4 x i8] c"int\00" -@.str1397 = private unnamed_addr constant [24 x i8] c" %retval = alloca i32\0A\00" -@.str1398 = private unnamed_addr constant [32 x i8] c" store i32 %argc, ptr @L_argc\0A\00" -@.str1399 = private unnamed_addr constant [32 x i8] c" store ptr %argv, ptr @L_argv\0A\00" -@.str1400 = private unnamed_addr constant [28 x i8] c" store i32 0, ptr %retval\0A\00" -@.str1401 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" -@.str1402 = private unnamed_addr constant [6 x i8] c"ret:\0A\00" -@.str1403 = private unnamed_addr constant [22 x i8] c"load i32, ptr %retval\00" -@.str1404 = private unnamed_addr constant [11 x i8] c" ret i32 \00" -@.str1405 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1406 = private unnamed_addr constant [49 x i8] c"define i32 @main(i32 %argc, ptr %argv) {\0Aentry:\0A\00" -@.str1407 = private unnamed_addr constant [3 x i8] c"}\0A\00" -@.str1408 = private unnamed_addr constant [3 x i8] c"wb\00" -@.str1409 = private unnamed_addr constant [7 x i8] c".ludic\00" -@.str1410 = private unnamed_addr constant [2 x i8] c"/\00" -@.str1411 = private unnamed_addr constant [6 x i8] c"ludic\00" -@.str1412 = private unnamed_addr constant [11 x i8] c"--windowed\00" -@.str1413 = private unnamed_addr constant [11 x i8] c"--headless\00" -@.str1414 = private unnamed_addr constant [12 x i8] c"--emit-llvm\00" -@.str1415 = private unnamed_addr constant [6 x i8] c"--fmt\00" -@.str1416 = private unnamed_addr constant [13 x i8] c"--save-temps\00" -@.str1417 = private unnamed_addr constant [6 x i8] c"--run\00" -@.str1418 = private unnamed_addr constant [3 x i8] c"-o\00" -@.str1419 = private unnamed_addr constant [31 x i8] c"ludicc: ignoring unknown flag \00" -@.str1420 = private unnamed_addr constant [2 x i8] c"\0A\00" -@.str1421 = private unnamed_addr constant [90 x i8] c"usage: ludicc [-o out] [--windowed|--headless] [--emit-llvm] [--save-temps]\0A\00" -@.str1422 = private unnamed_addr constant [27 x i8] c"ludicc: cannot open input\0A\00" -@.str1423 = private unnamed_addr constant [16 x i8] c"/tmp/ludic-run-\00" -@.str1424 = private unnamed_addr constant [10 x i8] c"mkdir -p \00" -@.str1425 = private unnamed_addr constant [4 x i8] c".ll\00" -@.str1426 = private unnamed_addr constant [25 x i8] c"ludicc: cannot write IR\0A\00" -@.str1427 = private unnamed_addr constant [9 x i8] c"LUDIC_CC\00" -@.str1428 = private unnamed_addr constant [6 x i8] c"clang\00" -@.str1429 = private unnamed_addr constant [11 x i8] c"LUDIC_HOME\00" -@.str1430 = private unnamed_addr constant [27 x i8] c" -O2 -Wno-override-module \00" -@.str1431 = private unnamed_addr constant [24 x i8] c"runtime/native/cocoa.ll\00" -@.str1432 = private unnamed_addr constant [2 x i8] c" \00" -@.str1433 = private unnamed_addr constant [42 x i8] c" -framework Cocoa -Wl,-rpath,@loader_path\00" -@.str1434 = private unnamed_addr constant [5 x i8] c" -o \00" -@.str1435 = private unnamed_addr constant [7 x i8] c"rm -f \00" -@.str1436 = private unnamed_addr constant [21 x i8] c"ludicc: link failed\0A\00" +@.str1324 = private unnamed_addr constant [41 x i8] c" br i1 %bad, label %out, label %go\0Ago:\0A\00" +@.str1325 = private unnamed_addr constant [7 x i8] c"fwrite\00" +@.str1326 = private unnamed_addr constant [39 x i8] c" call void @fn_rt_save_state(ptr %f)\0A\00" +@.str1327 = private unnamed_addr constant [68 x i8] c" %c = call i32 @fclose(ptr %f)\0A br label %out\0Aout:\0A ret void\0A}\0A\0A\00" +@.str1328 = private unnamed_addr constant [31 x i8] c"define i32 @L_load() {\0Aentry:\0A\00" +@.str1329 = private unnamed_addr constant [54 x i8] c" %f = call ptr @fopen(ptr @.sav_path, ptr @.sav_rb)\0A\00" +@.str1330 = private unnamed_addr constant [31 x i8] c" %bad = icmp eq ptr %f, null\0A\00" +@.str1331 = private unnamed_addr constant [60 x i8] c" br i1 %bad, label %miss, label %go\0Amiss:\0A ret i32 0\0Ago:\0A\00" +@.str1332 = private unnamed_addr constant [6 x i8] c"fread\00" +@.str1333 = private unnamed_addr constant [39 x i8] c" call void @fn_rt_load_state(ptr %f)\0A\00" +@.str1334 = private unnamed_addr constant [48 x i8] c" %c = call i32 @fclose(ptr %f)\0A ret i32 1\0A}\0A\0A\00" +@.str1335 = private unnamed_addr constant [6 x i8] c"panel\00" +@.str1336 = private unnamed_addr constant [4 x i8] c"col\00" +@.str1337 = private unnamed_addr constant [4 x i8] c"row\00" +@.str1338 = private unnamed_addr constant [6 x i8] c"label\00" +@.str1339 = private unnamed_addr constant [7 x i8] c"button\00" +@.str1340 = private unnamed_addr constant [6 x i8] c"image\00" +@.str1341 = private unnamed_addr constant [7 x i8] c"spacer\00" +@.str1342 = private unnamed_addr constant [3 x i8] c"id\00" +@.str1343 = private unnamed_addr constant [31 x i8] c" call void @fn_rt_ui_set(i32 \00" +@.str1344 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str1345 = private unnamed_addr constant [7 x i8] c", i32 \00" +@.str1346 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str1347 = private unnamed_addr constant [2 x i8] c"w\00" +@.str1348 = private unnamed_addr constant [2 x i8] c"h\00" +@.str1349 = private unnamed_addr constant [2 x i8] c"x\00" +@.str1350 = private unnamed_addr constant [2 x i8] c"y\00" +@.str1351 = private unnamed_addr constant [4 x i8] c"pad\00" +@.str1352 = private unnamed_addr constant [4 x i8] c"gap\00" +@.str1353 = private unnamed_addr constant [3 x i8] c"bg\00" +@.str1354 = private unnamed_addr constant [3 x i8] c"fg\00" +@.str1355 = private unnamed_addr constant [7 x i8] c"border\00" +@.str1356 = private unnamed_addr constant [5 x i8] c"grow\00" +@.str1357 = private unnamed_addr constant [5 x i8] c"font\00" +@.str1358 = private unnamed_addr constant [5 x i8] c"size\00" +@.str1359 = private unnamed_addr constant [6 x i8] c"inset\00" +@.str1360 = private unnamed_addr constant [6 x i8] c"focus\00" +@.str1361 = private unnamed_addr constant [33 x i8] c" call void @fn_rt_ui_reset(i32 \00" +@.str1362 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str1363 = private unnamed_addr constant [2 x i8] c"1\00" +@.str1364 = private unnamed_addr constant [3 x i8] c"id\00" +@.str1365 = private unnamed_addr constant [5 x i8] c"text\00" +@.str1366 = private unnamed_addr constant [39 x i8] c" call void @fn_rt_ui_static_text(i32 \00" +@.str1367 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1368 = private unnamed_addr constant [3 x i8] c")\0A\00" +@.str1369 = private unnamed_addr constant [5 x i8] c"skin\00" +@.str1370 = private unnamed_addr constant [6 x i8] c"image\00" +@.str1371 = private unnamed_addr constant [32 x i8] c"call i32 @fn_rt_image_load(ptr \00" +@.str1372 = private unnamed_addr constant [2 x i8] c")\00" +@.str1373 = private unnamed_addr constant [5 x i8] c"skin\00" +@.str1374 = private unnamed_addr constant [6 x i8] c"align\00" +@.str1375 = private unnamed_addr constant [7 x i8] c"center\00" +@.str1376 = private unnamed_addr constant [4 x i8] c"end\00" +@.str1377 = private unnamed_addr constant [2 x i8] c"1\00" +@.str1378 = private unnamed_addr constant [34 x i8] c"define void @ui_build() {\0Aentry:\0A\00" +@.str1379 = private unnamed_addr constant [15 x i8] c" ret void\0A}\0A\0A\00" +@.str1380 = private unnamed_addr constant [3 x i8] c", \00" +@.str1381 = private unnamed_addr constant [7 x i8] c" %arg_\00" +@.str1382 = private unnamed_addr constant [5 x i8] c"void\00" +@.str1383 = private unnamed_addr constant [20 x i8] c" %retval = alloca \00" +@.str1384 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1385 = private unnamed_addr constant [9 x i8] c" store \00" +@.str1386 = private unnamed_addr constant [7 x i8] c" %arg_\00" +@.str1387 = private unnamed_addr constant [7 x i8] c", ptr \00" +@.str1388 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1389 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" +@.str1390 = private unnamed_addr constant [6 x i8] c"ret:\0A\00" +@.str1391 = private unnamed_addr constant [5 x i8] c"void\00" +@.str1392 = private unnamed_addr constant [12 x i8] c" ret void\0A\00" +@.str1393 = private unnamed_addr constant [6 x i8] c"load \00" +@.str1394 = private unnamed_addr constant [14 x i8] c", ptr %retval\00" +@.str1395 = private unnamed_addr constant [7 x i8] c" ret \00" +@.str1396 = private unnamed_addr constant [2 x i8] c" \00" +@.str1397 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1398 = private unnamed_addr constant [8 x i8] c"define \00" +@.str1399 = private unnamed_addr constant [6 x i8] c" @fn_\00" +@.str1400 = private unnamed_addr constant [2 x i8] c"(\00" +@.str1401 = private unnamed_addr constant [12 x i8] c") {\0Aentry:\0A\00" +@.str1402 = private unnamed_addr constant [4 x i8] c"}\0A\0A\00" +@.str1403 = private unnamed_addr constant [4 x i8] c"int\00" +@.str1404 = private unnamed_addr constant [24 x i8] c" %retval = alloca i32\0A\00" +@.str1405 = private unnamed_addr constant [32 x i8] c" store i32 %argc, ptr @L_argc\0A\00" +@.str1406 = private unnamed_addr constant [32 x i8] c" store ptr %argv, ptr @L_argv\0A\00" +@.str1407 = private unnamed_addr constant [28 x i8] c" store i32 0, ptr %retval\0A\00" +@.str1408 = private unnamed_addr constant [17 x i8] c" br label %ret\0A\00" +@.str1409 = private unnamed_addr constant [6 x i8] c"ret:\0A\00" +@.str1410 = private unnamed_addr constant [22 x i8] c"load i32, ptr %retval\00" +@.str1411 = private unnamed_addr constant [11 x i8] c" ret i32 \00" +@.str1412 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1413 = private unnamed_addr constant [49 x i8] c"define i32 @main(i32 %argc, ptr %argv) {\0Aentry:\0A\00" +@.str1414 = private unnamed_addr constant [3 x i8] c"}\0A\00" +@.str1415 = private unnamed_addr constant [3 x i8] c"wb\00" +@.str1416 = private unnamed_addr constant [7 x i8] c".ludic\00" +@.str1417 = private unnamed_addr constant [2 x i8] c"/\00" +@.str1418 = private unnamed_addr constant [6 x i8] c"ludic\00" +@.str1419 = private unnamed_addr constant [11 x i8] c"--windowed\00" +@.str1420 = private unnamed_addr constant [11 x i8] c"--headless\00" +@.str1421 = private unnamed_addr constant [12 x i8] c"--emit-llvm\00" +@.str1422 = private unnamed_addr constant [6 x i8] c"--fmt\00" +@.str1423 = private unnamed_addr constant [13 x i8] c"--save-temps\00" +@.str1424 = private unnamed_addr constant [6 x i8] c"--run\00" +@.str1425 = private unnamed_addr constant [3 x i8] c"-o\00" +@.str1426 = private unnamed_addr constant [31 x i8] c"ludicc: ignoring unknown flag \00" +@.str1427 = private unnamed_addr constant [2 x i8] c"\0A\00" +@.str1428 = private unnamed_addr constant [90 x i8] c"usage: ludicc [-o out] [--windowed|--headless] [--emit-llvm] [--save-temps]\0A\00" +@.str1429 = private unnamed_addr constant [27 x i8] c"ludicc: cannot open input\0A\00" +@.str1430 = private unnamed_addr constant [16 x i8] c"/tmp/ludic-run-\00" +@.str1431 = private unnamed_addr constant [10 x i8] c"mkdir -p \00" +@.str1432 = private unnamed_addr constant [4 x i8] c".ll\00" +@.str1433 = private unnamed_addr constant [25 x i8] c"ludicc: cannot write IR\0A\00" +@.str1434 = private unnamed_addr constant [9 x i8] c"LUDIC_CC\00" +@.str1435 = private unnamed_addr constant [6 x i8] c"clang\00" +@.str1436 = private unnamed_addr constant [11 x i8] c"LUDIC_HOME\00" +@.str1437 = private unnamed_addr constant [27 x i8] c" -O2 -Wno-override-module \00" +@.str1438 = private unnamed_addr constant [24 x i8] c"runtime/native/cocoa.ll\00" +@.str1439 = private unnamed_addr constant [2 x i8] c" \00" +@.str1440 = private unnamed_addr constant [42 x i8] c" -framework Cocoa -Wl,-rpath,@loader_path\00" +@.str1441 = private unnamed_addr constant [5 x i8] c" -o \00" +@.str1442 = private unnamed_addr constant [7 x i8] c"rm -f \00" +@.str1443 = private unnamed_addr constant [21 x i8] c"ludicc: link failed\0A\00" define i32 @fn_streq(ptr %arg_a, ptr %arg_b) { entry: %retval = alloca i32 @@ -4717,6 +4724,8 @@ define ptr @fn_block() { entry: %retval = alloca ptr %t1 = alloca ptr + %t37 = alloca i32 + %t45 = alloca ptr call void @fn_skipnl() call void @fn_eat_op(ptr @.str44) %t0 = call ptr @fn_node(i32 7) @@ -4763,15 +4772,100 @@ put7: store ptr %t23, ptr %t25 %t26 = add i32 %t11, 1 store i32 %t26, ptr %t8 + %t27 = load ptr, ptr @g_toks + %t28 = getelementptr inbounds %LSlice, ptr %t27, i32 0, i32 0 + %t29 = load ptr, ptr %t28 + %t30 = load i32, ptr @g_pi + %t31 = getelementptr inbounds ptr, ptr %t29, i32 %t30 + %t32 = load ptr, ptr %t31 + %t33 = getelementptr inbounds %Str_Tok, ptr %t32, i32 0, i32 0 + %t34 = load i32, ptr %t33 + %t35 = icmp eq i32 %t34, 4 + %t36 = zext i1 %t35 to i32 + store i32 %t36, ptr %t37 + %t38 = call i32 @fn_is_op(ptr @.str46) + %t39 = icmp ne i32 %t38, 0 + br i1 %t39, label %then8, label %ifend10 +then8: + store i32 1, ptr %t37 + br label %ifend10 +ifend10: + %t40 = load i32, ptr %t37 + %t41 = icmp eq i32 %t40, 0 + %t42 = zext i1 %t41 to i32 + %t43 = icmp ne i32 %t42, 0 + br i1 %t43, label %then11, label %ifend13 +then11: + %t44 = load ptr, ptr @__stderrp + store ptr %t44, ptr %t45 + %t46 = load ptr, ptr %t45 + %t47 = zext i32 4 to i64 + %t48 = call i64 @fwrite(ptr @.str47, i64 1, i64 %t47, ptr %t46) + %t49 = trunc i64 %t48 to i32 + %t50 = load ptr, ptr @g_toks + %t51 = getelementptr inbounds %LSlice, ptr %t50, i32 0, i32 0 + %t52 = load ptr, ptr %t51 + %t53 = load i32, ptr @g_pi + %t54 = getelementptr inbounds ptr, ptr %t52, i32 %t53 + %t55 = load ptr, ptr %t54 + %t56 = getelementptr inbounds %Str_Tok, ptr %t55, i32 0, i32 1 + %t57 = load ptr, ptr %t56 + %t58 = icmp eq ptr %t57, null + %t59 = zext i1 %t58 to i32 + %t60 = icmp eq i32 %t59, 0 + %t61 = zext i1 %t60 to i32 + %t62 = icmp ne i32 %t61, 0 + br i1 %t62, label %then14, label %ifend16 +then14: + %t63 = load ptr, ptr %t45 + %t64 = load ptr, ptr @g_toks + %t65 = getelementptr inbounds %LSlice, ptr %t64, i32 0, i32 0 + %t66 = load ptr, ptr %t65 + %t67 = load i32, ptr @g_pi + %t68 = getelementptr inbounds ptr, ptr %t66, i32 %t67 + %t69 = load ptr, ptr %t68 + %t70 = getelementptr inbounds %Str_Tok, ptr %t69, i32 0, i32 1 + %t71 = load ptr, ptr %t70 + %t72 = load ptr, ptr @g_toks + %t73 = getelementptr inbounds %LSlice, ptr %t72, i32 0, i32 0 + %t74 = load ptr, ptr %t73 + %t75 = load i32, ptr @g_pi + %t76 = getelementptr inbounds ptr, ptr %t74, i32 %t75 + %t77 = load ptr, ptr %t76 + %t78 = getelementptr inbounds %Str_Tok, ptr %t77, i32 0, i32 1 + %t79 = load ptr, ptr %t78 + %t80 = call i32 @fn_slen(ptr %t79) + %t81 = zext i32 %t80 to i64 + %t82 = call i64 @fwrite(ptr %t71, i64 1, i64 %t81, ptr %t63) + %t83 = trunc i64 %t82 to i32 + br label %ifend16 +ifend16: + %t84 = load ptr, ptr %t45 + %t85 = zext i32 1 to i64 + %t86 = call i64 @fwrite(ptr @.str48, i64 1, i64 %t85, ptr %t84) + %t87 = trunc i64 %t86 to i32 + %t88 = load ptr, ptr @g_toks + %t89 = getelementptr inbounds %LSlice, ptr %t88, i32 0, i32 0 + %t90 = load ptr, ptr %t89 + %t91 = load i32, ptr @g_pi + %t92 = getelementptr inbounds ptr, ptr %t90, i32 %t91 + %t93 = load ptr, ptr %t92 + %t94 = getelementptr inbounds %Str_Tok, ptr %t93, i32 0, i32 3 + %t95 = load i32, ptr %t94 + %t96 = add i32 7770000, %t95 + call i32 (ptr, ...) @printf(ptr @.fmt_int, i32 %t96) + call void @fn_perr(ptr @.str49) + br label %ifend13 +ifend13: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str46) - %t27 = load ptr, ptr %t1 - store ptr %t27, ptr %retval + call void @fn_eat_op(ptr @.str50) + %t97 = load ptr, ptr %t1 + store ptr %t97, ptr %retval br label %ret ret: - %t28 = load ptr, ptr %retval - ret ptr %t28 + %t98 = load ptr, ptr %retval + ret ptr %t98 } define ptr @fn_stmt() { @@ -4782,26 +4876,29 @@ entry: %t48 = alloca ptr %t49 = alloca i32 %t81 = alloca ptr - %t109 = alloca ptr - %t125 = alloca ptr - %t144 = alloca ptr - %t149 = alloca ptr - %t174 = alloca ptr - %t182 = alloca ptr - %t184 = alloca ptr - %t225 = alloca ptr - %t238 = alloca ptr - %t253 = alloca ptr - %t282 = alloca ptr - %t290 = alloca ptr - %t324 = alloca ptr - %t374 = alloca ptr - %t375 = alloca i32 - %t376 = alloca i32 - %t377 = alloca i32 - %t378 = alloca i32 - %t406 = alloca ptr - %t427 = alloca ptr + %t89 = alloca i32 + %t112 = alloca ptr + %t128 = alloca ptr + %t147 = alloca ptr + %t152 = alloca ptr + %t177 = alloca ptr + %t181 = alloca i32 + %t186 = alloca ptr + %t188 = alloca ptr + %t200 = alloca ptr + %t243 = alloca ptr + %t256 = alloca ptr + %t271 = alloca ptr + %t300 = alloca ptr + %t308 = alloca ptr + %t342 = alloca ptr + %t392 = alloca ptr + %t393 = alloca i32 + %t394 = alloca i32 + %t395 = alloca i32 + %t396 = alloca i32 + %t424 = alloca ptr + %t445 = alloca ptr %t0 = load ptr, ptr @g_toks %t1 = getelementptr inbounds %LSlice, ptr %t0, i32 0, i32 0 %t2 = load ptr, ptr %t1 @@ -4820,7 +4917,7 @@ then0: %t13 = load ptr, ptr %t6 %t14 = getelementptr inbounds %Str_Tok, ptr %t13, i32 0, i32 1 %t15 = load ptr, ptr %t14 - %t16 = call i32 @fn_streq(ptr %t15, ptr @.str47) + %t16 = call i32 @fn_streq(ptr %t15, ptr @.str51) %t17 = icmp ne i32 %t16, 0 br i1 %t17, label %then3, label %ifend5 then3: @@ -4833,7 +4930,7 @@ then3: %t23 = getelementptr inbounds %Str_Node, ptr %t22, i32 0, i32 1 %t24 = call ptr @fn_eat_id() store ptr %t24, ptr %t23 - %t25 = call i32 @fn_is_op(ptr @.str48) + %t25 = call i32 @fn_is_op(ptr @.str52) %t26 = icmp ne i32 %t25, 0 br i1 %t26, label %then6, label %ifend8 then6: @@ -4846,7 +4943,7 @@ then6: store ptr %t31, ptr %t30 br label %ifend8 ifend8: - %t32 = call i32 @fn_is_op(ptr @.str49) + %t32 = call i32 @fn_is_op(ptr @.str53) %t33 = icmp ne i32 %t32, 0 br i1 %t33, label %then9, label %ifend11 then9: @@ -4866,7 +4963,7 @@ ifend5: %t40 = load ptr, ptr %t6 %t41 = getelementptr inbounds %Str_Tok, ptr %t40, i32 0, i32 1 %t42 = load ptr, ptr %t41 - %t43 = call i32 @fn_streq(ptr %t42, ptr @.str50) + %t43 = call i32 @fn_streq(ptr %t42, ptr @.str54) %t44 = icmp ne i32 %t43, 0 br i1 %t44, label %then12, label %ifend14 then12: @@ -4890,7 +4987,7 @@ then12: store i32 %t61, ptr %t49 br i1 %t60, label %sc15, label %scend16 sc15: - %t62 = call i32 @fn_is_op(ptr @.str51) + %t62 = call i32 @fn_is_op(ptr @.str55) %t63 = icmp eq i32 %t62, 0 %t64 = zext i1 %t63 to i32 %t65 = icmp ne i32 %t64, 0 @@ -4915,7 +5012,7 @@ ifend14: %t73 = load ptr, ptr %t6 %t74 = getelementptr inbounds %Str_Tok, ptr %t73, i32 0, i32 1 %t75 = load ptr, ptr %t74 - %t76 = call i32 @fn_streq(ptr %t75, ptr @.str52) + %t76 = call i32 @fn_streq(ptr %t75, ptr @.str56) %t77 = icmp ne i32 %t76, 0 br i1 %t77, label %then20, label %ifend22 then20: @@ -4932,577 +5029,607 @@ then20: %t86 = getelementptr inbounds %Str_Node, ptr %t85, i32 0, i32 5 %t87 = call ptr @fn_block() store ptr %t87, ptr %t86 + %t88 = load i32, ptr @g_pi + store i32 %t88, ptr %t89 call void @fn_skipnl() - %t88 = call i32 @fn_is_id(ptr @.str53) - %t89 = icmp ne i32 %t88, 0 - br i1 %t89, label %then23, label %ifend25 + %t90 = call i32 @fn_is_id(ptr @.str57) + %t91 = icmp ne i32 %t90, 0 + br i1 %t91, label %then23, label %else24 then23: - %t90 = load i32, ptr @g_pi - %t91 = add i32 %t90, 1 - store i32 %t91, ptr @g_pi + %t92 = load i32, ptr @g_pi + %t93 = add i32 %t92, 1 + store i32 %t93, ptr @g_pi call void @fn_skipnl() - %t92 = call i32 @fn_is_id(ptr @.str54) - %t93 = icmp ne i32 %t92, 0 - br i1 %t93, label %then26, label %else27 + %t94 = call i32 @fn_is_id(ptr @.str58) + %t95 = icmp ne i32 %t94, 0 + br i1 %t95, label %then26, label %else27 then26: - %t94 = load ptr, ptr %t81 - %t95 = getelementptr inbounds %Str_Node, ptr %t94, i32 0, i32 6 - %t96 = call ptr @fn_stmt() - store ptr %t96, ptr %t95 + %t96 = load ptr, ptr %t81 + %t97 = getelementptr inbounds %Str_Node, ptr %t96, i32 0, i32 6 + %t98 = call ptr @fn_stmt() + store ptr %t98, ptr %t97 br label %ifend28 else27: - %t97 = load ptr, ptr %t81 - %t98 = getelementptr inbounds %Str_Node, ptr %t97, i32 0, i32 6 - %t99 = call ptr @fn_block() - store ptr %t99, ptr %t98 + %t99 = load ptr, ptr %t81 + %t100 = getelementptr inbounds %Str_Node, ptr %t99, i32 0, i32 6 + %t101 = call ptr @fn_block() + store ptr %t101, ptr %t100 br label %ifend28 ifend28: br label %ifend25 +else24: + %t102 = load i32, ptr %t89 + store i32 %t102, ptr @g_pi + br label %ifend25 ifend25: - %t100 = load ptr, ptr %t81 - store ptr %t100, ptr %retval + %t103 = load ptr, ptr %t81 + store ptr %t103, ptr %retval br label %ret ifend22: - %t101 = load ptr, ptr %t6 - %t102 = getelementptr inbounds %Str_Tok, ptr %t101, i32 0, i32 1 - %t103 = load ptr, ptr %t102 - %t104 = call i32 @fn_streq(ptr %t103, ptr @.str55) - %t105 = icmp ne i32 %t104, 0 - br i1 %t105, label %then29, label %ifend31 + %t104 = load ptr, ptr %t6 + %t105 = getelementptr inbounds %Str_Tok, ptr %t104, i32 0, i32 1 + %t106 = load ptr, ptr %t105 + %t107 = call i32 @fn_streq(ptr %t106, ptr @.str59) + %t108 = icmp ne i32 %t107, 0 + br i1 %t108, label %then29, label %ifend31 then29: - %t106 = load i32, ptr @g_pi - %t107 = add i32 %t106, 1 - store i32 %t107, ptr @g_pi - %t108 = call ptr @fn_node(i32 12) - store ptr %t108, ptr %t109 - %t110 = load ptr, ptr %t109 - %t111 = getelementptr inbounds %Str_Node, ptr %t110, i32 0, i32 4 - %t112 = call ptr @fn_expr() - store ptr %t112, ptr %t111 - %t113 = load ptr, ptr %t109 - %t114 = getelementptr inbounds %Str_Node, ptr %t113, i32 0, i32 5 - %t115 = call ptr @fn_block() + %t109 = load i32, ptr @g_pi + %t110 = add i32 %t109, 1 + store i32 %t110, ptr @g_pi + %t111 = call ptr @fn_node(i32 12) + store ptr %t111, ptr %t112 + %t113 = load ptr, ptr %t112 + %t114 = getelementptr inbounds %Str_Node, ptr %t113, i32 0, i32 4 + %t115 = call ptr @fn_expr() store ptr %t115, ptr %t114 - %t116 = load ptr, ptr %t109 - store ptr %t116, ptr %retval + %t116 = load ptr, ptr %t112 + %t117 = getelementptr inbounds %Str_Node, ptr %t116, i32 0, i32 5 + %t118 = call ptr @fn_block() + store ptr %t118, ptr %t117 + %t119 = load ptr, ptr %t112 + store ptr %t119, ptr %retval br label %ret ifend31: - %t117 = load ptr, ptr %t6 - %t118 = getelementptr inbounds %Str_Tok, ptr %t117, i32 0, i32 1 - %t119 = load ptr, ptr %t118 - %t120 = call i32 @fn_streq(ptr %t119, ptr @.str56) - %t121 = icmp ne i32 %t120, 0 - br i1 %t121, label %then32, label %ifend34 + %t120 = load ptr, ptr %t6 + %t121 = getelementptr inbounds %Str_Tok, ptr %t120, i32 0, i32 1 + %t122 = load ptr, ptr %t121 + %t123 = call i32 @fn_streq(ptr %t122, ptr @.str60) + %t124 = icmp ne i32 %t123, 0 + br i1 %t124, label %then32, label %ifend34 then32: - %t122 = load i32, ptr @g_pi - %t123 = add i32 %t122, 1 - store i32 %t123, ptr @g_pi - %t124 = call ptr @fn_node(i32 13) - store ptr %t124, ptr %t125 - %t126 = load ptr, ptr %t125 - %t127 = getelementptr inbounds %Str_Node, ptr %t126, i32 0, i32 4 - %t128 = call ptr @fn_expr() - store ptr %t128, ptr %t127 - %t129 = load ptr, ptr %t125 - %t130 = getelementptr inbounds %Str_Node, ptr %t129, i32 0, i32 5 - %t131 = call ptr @fn_block() + %t125 = load i32, ptr @g_pi + %t126 = add i32 %t125, 1 + store i32 %t126, ptr @g_pi + %t127 = call ptr @fn_node(i32 13) + store ptr %t127, ptr %t128 + %t129 = load ptr, ptr %t128 + %t130 = getelementptr inbounds %Str_Node, ptr %t129, i32 0, i32 4 + %t131 = call ptr @fn_expr() store ptr %t131, ptr %t130 - %t132 = load ptr, ptr %t125 - store ptr %t132, ptr %retval + %t132 = load ptr, ptr %t128 + %t133 = getelementptr inbounds %Str_Node, ptr %t132, i32 0, i32 5 + %t134 = call ptr @fn_block() + store ptr %t134, ptr %t133 + %t135 = load ptr, ptr %t128 + store ptr %t135, ptr %retval br label %ret ifend34: - %t133 = load ptr, ptr %t6 - %t134 = getelementptr inbounds %Str_Tok, ptr %t133, i32 0, i32 1 - %t135 = load ptr, ptr %t134 - %t136 = call i32 @fn_streq(ptr %t135, ptr @.str57) - %t137 = icmp ne i32 %t136, 0 - br i1 %t137, label %then35, label %ifend37 + %t136 = load ptr, ptr %t6 + %t137 = getelementptr inbounds %Str_Tok, ptr %t136, i32 0, i32 1 + %t138 = load ptr, ptr %t137 + %t139 = call i32 @fn_streq(ptr %t138, ptr @.str61) + %t140 = icmp ne i32 %t139, 0 + br i1 %t140, label %then35, label %ifend37 then35: - %t138 = load i32, ptr @g_pi - %t139 = add i32 %t138, 1 - store i32 %t139, ptr @g_pi - %t140 = call i32 @fn_is_op(ptr @.str58) - %t141 = icmp ne i32 %t140, 0 - br i1 %t141, label %then38, label %ifend40 + %t141 = load i32, ptr @g_pi + %t142 = add i32 %t141, 1 + store i32 %t142, ptr @g_pi + %t143 = call i32 @fn_is_op(ptr @.str62) + %t144 = icmp ne i32 %t143, 0 + br i1 %t144, label %then38, label %ifend40 then38: - %t142 = call ptr @fn_parse_query_for() - store ptr %t142, ptr %retval + %t145 = call ptr @fn_parse_query_for() + store ptr %t145, ptr %retval br label %ret ifend40: - %t143 = call ptr @fn_node(i32 14) - store ptr %t143, ptr %t144 - %t145 = load ptr, ptr %t144 - %t146 = getelementptr inbounds %Str_Node, ptr %t145, i32 0, i32 1 - %t147 = call ptr @fn_eat_id() - store ptr %t147, ptr %t146 - %t148 = call ptr @fn_eat_id() - store ptr %t148, ptr %t149 - %t150 = load ptr, ptr %t144 - %t151 = getelementptr inbounds %Str_Node, ptr %t150, i32 0, i32 4 - %t152 = call ptr @fn_expr() - store ptr %t152, ptr %t151 - call void @fn_eat_op(ptr @.str59) - %t153 = load ptr, ptr %t144 - %t154 = getelementptr inbounds %Str_Node, ptr %t153, i32 0, i32 5 + %t146 = call ptr @fn_node(i32 14) + store ptr %t146, ptr %t147 + %t148 = load ptr, ptr %t147 + %t149 = getelementptr inbounds %Str_Node, ptr %t148, i32 0, i32 1 + %t150 = call ptr @fn_eat_id() + store ptr %t150, ptr %t149 + %t151 = call ptr @fn_eat_id() + store ptr %t151, ptr %t152 + %t153 = load ptr, ptr %t147 + %t154 = getelementptr inbounds %Str_Node, ptr %t153, i32 0, i32 4 %t155 = call ptr @fn_expr() store ptr %t155, ptr %t154 - %t156 = load ptr, ptr %t144 - %t157 = getelementptr inbounds %Str_Node, ptr %t156, i32 0, i32 6 - %t158 = call ptr @fn_block() + call void @fn_eat_op(ptr @.str63) + %t156 = load ptr, ptr %t147 + %t157 = getelementptr inbounds %Str_Node, ptr %t156, i32 0, i32 5 + %t158 = call ptr @fn_expr() store ptr %t158, ptr %t157 - %t159 = load ptr, ptr %t144 - store ptr %t159, ptr %retval + %t159 = load ptr, ptr %t147 + %t160 = getelementptr inbounds %Str_Node, ptr %t159, i32 0, i32 6 + %t161 = call ptr @fn_block() + store ptr %t161, ptr %t160 + %t162 = load ptr, ptr %t147 + store ptr %t162, ptr %retval br label %ret ifend37: - %t160 = load ptr, ptr %t6 - %t161 = getelementptr inbounds %Str_Tok, ptr %t160, i32 0, i32 1 - %t162 = load ptr, ptr %t161 - %t163 = call i32 @fn_streq(ptr %t162, ptr @.str60) - %t164 = icmp ne i32 %t163, 0 - br i1 %t164, label %then41, label %ifend43 + %t163 = load ptr, ptr %t6 + %t164 = getelementptr inbounds %Str_Tok, ptr %t163, i32 0, i32 1 + %t165 = load ptr, ptr %t164 + %t166 = call i32 @fn_streq(ptr %t165, ptr @.str64) + %t167 = icmp ne i32 %t166, 0 + br i1 %t167, label %then41, label %ifend43 then41: - %t165 = call ptr @fn_parse_spawn() - store ptr %t165, ptr %retval + %t168 = call ptr @fn_parse_spawn() + store ptr %t168, ptr %retval br label %ret ifend43: - %t166 = load ptr, ptr %t6 - %t167 = getelementptr inbounds %Str_Tok, ptr %t166, i32 0, i32 1 - %t168 = load ptr, ptr %t167 - %t169 = call i32 @fn_streq(ptr %t168, ptr @.str61) - %t170 = icmp ne i32 %t169, 0 - br i1 %t170, label %then44, label %ifend46 + %t169 = load ptr, ptr %t6 + %t170 = getelementptr inbounds %Str_Tok, ptr %t169, i32 0, i32 1 + %t171 = load ptr, ptr %t170 + %t172 = call i32 @fn_streq(ptr %t171, ptr @.str65) + %t173 = icmp ne i32 %t172, 0 + br i1 %t173, label %then44, label %ifend46 then44: - %t171 = load i32, ptr @g_pi - %t172 = add i32 %t171, 1 - store i32 %t172, ptr @g_pi - %t173 = call ptr @fn_node(i32 24) - store ptr %t173, ptr %t174 - %t175 = load ptr, ptr %t174 - %t176 = getelementptr inbounds %Str_Node, ptr %t175, i32 0, i32 4 - %t177 = call ptr @fn_expr() - store ptr %t177, ptr %t176 + %t174 = load i32, ptr @g_pi + %t175 = add i32 %t174, 1 + store i32 %t175, ptr @g_pi + %t176 = call ptr @fn_node(i32 24) + store ptr %t176, ptr %t177 + %t178 = load ptr, ptr %t177 + %t179 = getelementptr inbounds %Str_Node, ptr %t178, i32 0, i32 4 + %t180 = call ptr @fn_expr() + store ptr %t180, ptr %t179 call void @fn_skipnl() - call void @fn_eat_op(ptr @.str62) + call void @fn_eat_op(ptr @.str66) + store i32 0, ptr %t181 br label %wcond47 wcond47: - %t178 = icmp ne i32 1, 0 - br i1 %t178, label %wbody48, label %wend49 + %t182 = icmp ne i32 1, 0 + br i1 %t182, label %wbody48, label %wend49 wbody48: call void @fn_skipnl() - %t179 = call i32 @fn_is_op(ptr @.str63) - %t180 = icmp ne i32 %t179, 0 - br i1 %t180, label %then50, label %ifend52 + %t183 = call i32 @fn_is_op(ptr @.str67) + %t184 = icmp ne i32 %t183, 0 + br i1 %t184, label %then50, label %ifend52 then50: br label %wend49 ifend52: - %t181 = call ptr @fn_eat_id() - store ptr %t181, ptr %t182 - %t183 = call ptr @fn_node(i32 25) - store ptr %t183, ptr %t184 - %t185 = load ptr, ptr %t184 - %t186 = getelementptr inbounds %Str_Node, ptr %t185, i32 0, i32 1 - %t187 = call ptr @fn_eat_id() - store ptr %t187, ptr %t186 - call void @fn_eat_op(ptr @.str64) - %t188 = load ptr, ptr %t184 - %t189 = getelementptr inbounds %Str_Node, ptr %t188, i32 0, i32 5 - %t190 = call ptr @fn_expr() - store ptr %t190, ptr %t189 + %t185 = call ptr @fn_eat_id() + store ptr %t185, ptr %t186 + %t187 = call ptr @fn_node(i32 25) + store ptr %t187, ptr %t188 + %t189 = load ptr, ptr %t188 + %t190 = getelementptr inbounds %Str_Node, ptr %t189, i32 0, i32 1 + %t191 = call ptr @fn_eat_id() + store ptr %t191, ptr %t190 + %t192 = call i32 @fn_is_op(ptr @.str68) + %t193 = icmp ne i32 %t192, 0 + br i1 %t193, label %then53, label %else54 +then53: + %t194 = load i32, ptr @g_pi + %t195 = add i32 %t194, 1 + store i32 %t195, ptr @g_pi + %t196 = load ptr, ptr %t188 + %t197 = getelementptr inbounds %Str_Node, ptr %t196, i32 0, i32 5 + %t198 = call ptr @fn_expr() + store ptr %t198, ptr %t197 + br label %ifend55 +else54: + %t199 = call ptr @fn_node(i32 30) + store ptr %t199, ptr %t200 + %t201 = load ptr, ptr %t200 + %t202 = getelementptr inbounds %Str_Node, ptr %t201, i32 0, i32 2 + %t203 = load i32, ptr %t181 + store i32 %t203, ptr %t202 + %t204 = load ptr, ptr %t188 + %t205 = getelementptr inbounds %Str_Node, ptr %t204, i32 0, i32 5 + %t206 = load ptr, ptr %t200 + store ptr %t206, ptr %t205 + br label %ifend55 +ifend55: call void @fn_skipnl() - %t191 = load ptr, ptr %t184 - %t192 = getelementptr inbounds %Str_Node, ptr %t191, i32 0, i32 4 - %t193 = call ptr @fn_block() - store ptr %t193, ptr %t192 - %t194 = load ptr, ptr %t174 - %t195 = getelementptr inbounds %Str_Node, ptr %t194, i32 0, i32 7 - %t196 = load ptr, ptr %t195 - %t197 = getelementptr inbounds %LSlice, ptr %t196, i32 0, i32 1 - %t198 = getelementptr inbounds %LSlice, ptr %t196, i32 0, i32 2 - %t199 = getelementptr inbounds %LSlice, ptr %t196, i32 0, i32 0 - %t200 = load i32, ptr %t197 - %t201 = load i32, ptr %t198 - %t202 = icmp sge i32 %t200, %t201 - br i1 %t202, label %grow53, label %put54 -grow53: - %t203 = mul i32 %t201, 2 - %t204 = icmp eq i32 %t201, 0 - %t205 = select i1 %t204, i32 8, i32 %t203 - %t206 = getelementptr ptr, ptr null, i32 1 - %t207 = ptrtoint ptr %t206 to i64 - %t208 = zext i32 %t205 to i64 - %t209 = mul i64 %t208, %t207 - %t210 = load ptr, ptr %t199 - %t211 = call ptr @realloc(ptr %t210, i64 %t209) - store ptr %t211, ptr %t199 - store i32 %t205, ptr %t198 - br label %put54 -put54: - %t212 = load ptr, ptr %t184 - %t213 = load ptr, ptr %t199 - %t214 = getelementptr inbounds ptr, ptr %t213, i32 %t200 - store ptr %t212, ptr %t214 - %t215 = add i32 %t200, 1 - store i32 %t215, ptr %t197 + %t207 = load ptr, ptr %t188 + %t208 = getelementptr inbounds %Str_Node, ptr %t207, i32 0, i32 4 + %t209 = call ptr @fn_block() + store ptr %t209, ptr %t208 + %t210 = load ptr, ptr %t177 + %t211 = getelementptr inbounds %Str_Node, ptr %t210, i32 0, i32 7 + %t212 = load ptr, ptr %t211 + %t213 = getelementptr inbounds %LSlice, ptr %t212, i32 0, i32 1 + %t214 = getelementptr inbounds %LSlice, ptr %t212, i32 0, i32 2 + %t215 = getelementptr inbounds %LSlice, ptr %t212, i32 0, i32 0 + %t216 = load i32, ptr %t213 + %t217 = load i32, ptr %t214 + %t218 = icmp sge i32 %t216, %t217 + br i1 %t218, label %grow56, label %put57 +grow56: + %t219 = mul i32 %t217, 2 + %t220 = icmp eq i32 %t217, 0 + %t221 = select i1 %t220, i32 8, i32 %t219 + %t222 = getelementptr ptr, ptr null, i32 1 + %t223 = ptrtoint ptr %t222 to i64 + %t224 = zext i32 %t221 to i64 + %t225 = mul i64 %t224, %t223 + %t226 = load ptr, ptr %t215 + %t227 = call ptr @realloc(ptr %t226, i64 %t225) + store ptr %t227, ptr %t215 + store i32 %t221, ptr %t214 + br label %put57 +put57: + %t228 = load ptr, ptr %t188 + %t229 = load ptr, ptr %t215 + %t230 = getelementptr inbounds ptr, ptr %t229, i32 %t216 + store ptr %t228, ptr %t230 + %t231 = add i32 %t216, 1 + store i32 %t231, ptr %t213 + %t232 = load i32, ptr %t181 + %t233 = add i32 %t232, 1 + store i32 %t233, ptr %t181 br label %wcond47 wend49: - call void @fn_eat_op(ptr @.str65) - %t216 = load ptr, ptr %t174 - store ptr %t216, ptr %retval + call void @fn_eat_op(ptr @.str69) + %t234 = load ptr, ptr %t177 + store ptr %t234, ptr %retval br label %ret ifend46: - %t217 = load ptr, ptr %t6 - %t218 = getelementptr inbounds %Str_Tok, ptr %t217, i32 0, i32 1 - %t219 = load ptr, ptr %t218 - %t220 = call i32 @fn_streq(ptr %t219, ptr @.str66) - %t221 = icmp ne i32 %t220, 0 - br i1 %t221, label %then55, label %ifend57 -then55: - %t222 = load i32, ptr @g_pi - %t223 = add i32 %t222, 1 - store i32 %t223, ptr @g_pi - %t224 = call ptr @fn_node(i32 26) - store ptr %t224, ptr %t225 - %t226 = load ptr, ptr %t225 - %t227 = getelementptr inbounds %Str_Node, ptr %t226, i32 0, i32 1 - %t228 = call ptr @fn_eat_id() - store ptr %t228, ptr %t227 - %t229 = load ptr, ptr %t225 - store ptr %t229, ptr %retval - br label %ret -ifend57: - %t230 = load ptr, ptr %t6 - %t231 = getelementptr inbounds %Str_Tok, ptr %t230, i32 0, i32 1 - %t232 = load ptr, ptr %t231 - %t233 = call i32 @fn_streq(ptr %t232, ptr @.str67) - %t234 = icmp ne i32 %t233, 0 - br i1 %t234, label %then58, label %ifend60 + %t235 = load ptr, ptr %t6 + %t236 = getelementptr inbounds %Str_Tok, ptr %t235, i32 0, i32 1 + %t237 = load ptr, ptr %t236 + %t238 = call i32 @fn_streq(ptr %t237, ptr @.str70) + %t239 = icmp ne i32 %t238, 0 + br i1 %t239, label %then58, label %ifend60 then58: - %t235 = load i32, ptr @g_pi - %t236 = add i32 %t235, 1 - store i32 %t236, ptr @g_pi - %t237 = call ptr @fn_node(i32 26) - store ptr %t237, ptr %t238 - %t239 = load ptr, ptr %t238 - %t240 = getelementptr inbounds %Str_Node, ptr %t239, i32 0, i32 1 - %t241 = call ptr @fn_eat_id() - store ptr %t241, ptr %t240 - %t242 = load ptr, ptr %t238 - %t243 = getelementptr inbounds %Str_Node, ptr %t242, i32 0, i32 2 - store i32 1, ptr %t243 - %t244 = load ptr, ptr %t238 - store ptr %t244, ptr %retval + %t240 = load i32, ptr @g_pi + %t241 = add i32 %t240, 1 + store i32 %t241, ptr @g_pi + %t242 = call ptr @fn_node(i32 26) + store ptr %t242, ptr %t243 + %t244 = load ptr, ptr %t243 + %t245 = getelementptr inbounds %Str_Node, ptr %t244, i32 0, i32 1 + %t246 = call ptr @fn_eat_id() + store ptr %t246, ptr %t245 + %t247 = load ptr, ptr %t243 + store ptr %t247, ptr %retval br label %ret ifend60: - %t245 = load ptr, ptr %t6 - %t246 = getelementptr inbounds %Str_Tok, ptr %t245, i32 0, i32 1 - %t247 = load ptr, ptr %t246 - %t248 = call i32 @fn_streq(ptr %t247, ptr @.str68) - %t249 = icmp ne i32 %t248, 0 - br i1 %t249, label %then61, label %ifend63 + %t248 = load ptr, ptr %t6 + %t249 = getelementptr inbounds %Str_Tok, ptr %t248, i32 0, i32 1 + %t250 = load ptr, ptr %t249 + %t251 = call i32 @fn_streq(ptr %t250, ptr @.str71) + %t252 = icmp ne i32 %t251, 0 + br i1 %t252, label %then61, label %ifend63 then61: - %t250 = load i32, ptr @g_pi - %t251 = add i32 %t250, 1 - store i32 %t251, ptr @g_pi - %t252 = call ptr @fn_node(i32 23) - store ptr %t252, ptr %t253 - %t254 = load ptr, ptr %t253 - %t255 = getelementptr inbounds %Str_Node, ptr %t254, i32 0, i32 4 - %t256 = call ptr @fn_expr() - store ptr %t256, ptr %t255 - %t257 = load ptr, ptr %t253 - store ptr %t257, ptr %retval + %t253 = load i32, ptr @g_pi + %t254 = add i32 %t253, 1 + store i32 %t254, ptr @g_pi + %t255 = call ptr @fn_node(i32 26) + store ptr %t255, ptr %t256 + %t257 = load ptr, ptr %t256 + %t258 = getelementptr inbounds %Str_Node, ptr %t257, i32 0, i32 1 + %t259 = call ptr @fn_eat_id() + store ptr %t259, ptr %t258 + %t260 = load ptr, ptr %t256 + %t261 = getelementptr inbounds %Str_Node, ptr %t260, i32 0, i32 2 + store i32 1, ptr %t261 + %t262 = load ptr, ptr %t256 + store ptr %t262, ptr %retval br label %ret ifend63: - %t258 = load ptr, ptr %t6 - %t259 = getelementptr inbounds %Str_Tok, ptr %t258, i32 0, i32 1 - %t260 = load ptr, ptr %t259 - %t261 = call i32 @fn_streq(ptr %t260, ptr @.str69) - %t262 = icmp ne i32 %t261, 0 - br i1 %t262, label %then64, label %ifend66 + %t263 = load ptr, ptr %t6 + %t264 = getelementptr inbounds %Str_Tok, ptr %t263, i32 0, i32 1 + %t265 = load ptr, ptr %t264 + %t266 = call i32 @fn_streq(ptr %t265, ptr @.str72) + %t267 = icmp ne i32 %t266, 0 + br i1 %t267, label %then64, label %ifend66 then64: - %t263 = load i32, ptr @g_pi - %t264 = add i32 %t263, 1 - store i32 %t264, ptr @g_pi - %t265 = call ptr @fn_node(i32 17) - store ptr %t265, ptr %retval + %t268 = load i32, ptr @g_pi + %t269 = add i32 %t268, 1 + store i32 %t269, ptr @g_pi + %t270 = call ptr @fn_node(i32 23) + store ptr %t270, ptr %t271 + %t272 = load ptr, ptr %t271 + %t273 = getelementptr inbounds %Str_Node, ptr %t272, i32 0, i32 4 + %t274 = call ptr @fn_expr() + store ptr %t274, ptr %t273 + %t275 = load ptr, ptr %t271 + store ptr %t275, ptr %retval br label %ret ifend66: - %t266 = load ptr, ptr %t6 - %t267 = getelementptr inbounds %Str_Tok, ptr %t266, i32 0, i32 1 - %t268 = load ptr, ptr %t267 - %t269 = call i32 @fn_streq(ptr %t268, ptr @.str70) - %t270 = icmp ne i32 %t269, 0 - br i1 %t270, label %then67, label %ifend69 + %t276 = load ptr, ptr %t6 + %t277 = getelementptr inbounds %Str_Tok, ptr %t276, i32 0, i32 1 + %t278 = load ptr, ptr %t277 + %t279 = call i32 @fn_streq(ptr %t278, ptr @.str73) + %t280 = icmp ne i32 %t279, 0 + br i1 %t280, label %then67, label %ifend69 then67: - %t271 = load i32, ptr @g_pi - %t272 = add i32 %t271, 1 - store i32 %t272, ptr @g_pi - %t273 = call ptr @fn_node(i32 18) - store ptr %t273, ptr %retval + %t281 = load i32, ptr @g_pi + %t282 = add i32 %t281, 1 + store i32 %t282, ptr @g_pi + %t283 = call ptr @fn_node(i32 17) + store ptr %t283, ptr %retval br label %ret ifend69: - %t274 = load ptr, ptr %t6 - %t275 = getelementptr inbounds %Str_Tok, ptr %t274, i32 0, i32 1 - %t276 = load ptr, ptr %t275 - %t277 = call i32 @fn_streq(ptr %t276, ptr @.str71) - %t278 = icmp ne i32 %t277, 0 - br i1 %t278, label %then70, label %ifend72 -then70: - %t279 = load i32, ptr @g_pi - %t280 = add i32 %t279, 1 - store i32 %t280, ptr @g_pi - %t281 = call ptr @fn_node(i32 19) - store ptr %t281, ptr %t282 - %t283 = load ptr, ptr %t282 - %t284 = getelementptr inbounds %Str_Node, ptr %t283, i32 0, i32 4 - %t285 = call ptr @fn_expr() - store ptr %t285, ptr %t284 - call void @fn_skipnl() - call void @fn_eat_op(ptr @.str72) - br label %wcond73 -wcond73: - %t286 = icmp ne i32 1, 0 - br i1 %t286, label %wbody74, label %wend75 -wbody74: - call void @fn_skipnl() - %t287 = call i32 @fn_is_op(ptr @.str73) + %t284 = load ptr, ptr %t6 + %t285 = getelementptr inbounds %Str_Tok, ptr %t284, i32 0, i32 1 + %t286 = load ptr, ptr %t285 + %t287 = call i32 @fn_streq(ptr %t286, ptr @.str74) %t288 = icmp ne i32 %t287, 0 - br i1 %t288, label %then76, label %ifend78 -then76: - br label %wend75 -ifend78: - %t289 = call ptr @fn_node(i32 20) - store ptr %t289, ptr %t290 - br label %wcond79 -wcond79: - %t291 = icmp ne i32 1, 0 - br i1 %t291, label %wbody80, label %wend81 -wbody80: - %t292 = load ptr, ptr %t290 - %t293 = getelementptr inbounds %Str_Node, ptr %t292, i32 0, i32 7 - %t294 = load ptr, ptr %t293 - %t295 = getelementptr inbounds %LSlice, ptr %t294, i32 0, i32 1 - %t296 = getelementptr inbounds %LSlice, ptr %t294, i32 0, i32 2 - %t297 = getelementptr inbounds %LSlice, ptr %t294, i32 0, i32 0 - %t298 = load i32, ptr %t295 - %t299 = load i32, ptr %t296 - %t300 = icmp sge i32 %t298, %t299 - br i1 %t300, label %grow82, label %put83 -grow82: - %t301 = mul i32 %t299, 2 - %t302 = icmp eq i32 %t299, 0 - %t303 = select i1 %t302, i32 8, i32 %t301 - %t304 = getelementptr ptr, ptr null, i32 1 - %t305 = ptrtoint ptr %t304 to i64 - %t306 = zext i32 %t303 to i64 - %t307 = mul i64 %t306, %t305 - %t308 = load ptr, ptr %t297 - %t309 = call ptr @realloc(ptr %t308, i64 %t307) - store ptr %t309, ptr %t297 - store i32 %t303, ptr %t296 - br label %put83 -put83: - %t310 = call ptr @fn_expr() - %t311 = load ptr, ptr %t297 - %t312 = getelementptr inbounds ptr, ptr %t311, i32 %t298 - store ptr %t310, ptr %t312 - %t313 = add i32 %t298, 1 - store i32 %t313, ptr %t295 - %t314 = call i32 @fn_is_op(ptr @.str74) - %t315 = icmp ne i32 %t314, 0 - br i1 %t315, label %then84, label %ifend86 -then84: - %t316 = load i32, ptr @g_pi - %t317 = add i32 %t316, 1 - store i32 %t317, ptr @g_pi - call void @fn_skipnl() - br label %wcond79 -ifend86: - br label %wend81 -wend81: - call void @fn_eat_op(ptr @.str75) - call void @fn_skipnl() - %t318 = call i32 @fn_is_op(ptr @.str76) - %t319 = icmp ne i32 %t318, 0 - br i1 %t319, label %then87, label %else88 -then87: - %t320 = load ptr, ptr %t290 - %t321 = getelementptr inbounds %Str_Node, ptr %t320, i32 0, i32 4 - %t322 = call ptr @fn_block() - store ptr %t322, ptr %t321 - br label %ifend89 -else88: - %t323 = call ptr @fn_node(i32 7) - store ptr %t323, ptr %t324 - %t325 = load ptr, ptr %t324 - %t326 = getelementptr inbounds %Str_Node, ptr %t325, i32 0, i32 7 - %t327 = load ptr, ptr %t326 - %t328 = getelementptr inbounds %LSlice, ptr %t327, i32 0, i32 1 - %t329 = getelementptr inbounds %LSlice, ptr %t327, i32 0, i32 2 - %t330 = getelementptr inbounds %LSlice, ptr %t327, i32 0, i32 0 - %t331 = load i32, ptr %t328 - %t332 = load i32, ptr %t329 - %t333 = icmp sge i32 %t331, %t332 - br i1 %t333, label %grow90, label %put91 -grow90: - %t334 = mul i32 %t332, 2 - %t335 = icmp eq i32 %t332, 0 - %t336 = select i1 %t335, i32 8, i32 %t334 - %t337 = getelementptr ptr, ptr null, i32 1 - %t338 = ptrtoint ptr %t337 to i64 - %t339 = zext i32 %t336 to i64 - %t340 = mul i64 %t339, %t338 - %t341 = load ptr, ptr %t330 - %t342 = call ptr @realloc(ptr %t341, i64 %t340) - store ptr %t342, ptr %t330 - store i32 %t336, ptr %t329 - br label %put91 -put91: - %t343 = call ptr @fn_stmt() - %t344 = load ptr, ptr %t330 - %t345 = getelementptr inbounds ptr, ptr %t344, i32 %t331 - store ptr %t343, ptr %t345 - %t346 = add i32 %t331, 1 - store i32 %t346, ptr %t328 - %t347 = load ptr, ptr %t290 - %t348 = getelementptr inbounds %Str_Node, ptr %t347, i32 0, i32 4 - %t349 = load ptr, ptr %t324 - store ptr %t349, ptr %t348 - br label %ifend89 -ifend89: - %t350 = load ptr, ptr %t282 - %t351 = getelementptr inbounds %Str_Node, ptr %t350, i32 0, i32 7 - %t352 = load ptr, ptr %t351 - %t353 = getelementptr inbounds %LSlice, ptr %t352, i32 0, i32 1 - %t354 = getelementptr inbounds %LSlice, ptr %t352, i32 0, i32 2 - %t355 = getelementptr inbounds %LSlice, ptr %t352, i32 0, i32 0 - %t356 = load i32, ptr %t353 - %t357 = load i32, ptr %t354 - %t358 = icmp sge i32 %t356, %t357 - br i1 %t358, label %grow92, label %put93 -grow92: - %t359 = mul i32 %t357, 2 - %t360 = icmp eq i32 %t357, 0 - %t361 = select i1 %t360, i32 8, i32 %t359 - %t362 = getelementptr ptr, ptr null, i32 1 - %t363 = ptrtoint ptr %t362 to i64 - %t364 = zext i32 %t361 to i64 - %t365 = mul i64 %t364, %t363 - %t366 = load ptr, ptr %t355 - %t367 = call ptr @realloc(ptr %t366, i64 %t365) - store ptr %t367, ptr %t355 - store i32 %t361, ptr %t354 - br label %put93 -put93: - %t368 = load ptr, ptr %t290 - %t369 = load ptr, ptr %t355 - %t370 = getelementptr inbounds ptr, ptr %t369, i32 %t356 - store ptr %t368, ptr %t370 - %t371 = add i32 %t356, 1 - store i32 %t371, ptr %t353 - br label %wcond73 -wend75: - call void @fn_eat_op(ptr @.str77) - %t372 = load ptr, ptr %t282 - store ptr %t372, ptr %retval + br i1 %t288, label %then70, label %ifend72 +then70: + %t289 = load i32, ptr @g_pi + %t290 = add i32 %t289, 1 + store i32 %t290, ptr @g_pi + %t291 = call ptr @fn_node(i32 18) + store ptr %t291, ptr %retval br label %ret ifend72: + %t292 = load ptr, ptr %t6 + %t293 = getelementptr inbounds %Str_Tok, ptr %t292, i32 0, i32 1 + %t294 = load ptr, ptr %t293 + %t295 = call i32 @fn_streq(ptr %t294, ptr @.str75) + %t296 = icmp ne i32 %t295, 0 + br i1 %t296, label %then73, label %ifend75 +then73: + %t297 = load i32, ptr @g_pi + %t298 = add i32 %t297, 1 + store i32 %t298, ptr @g_pi + %t299 = call ptr @fn_node(i32 19) + store ptr %t299, ptr %t300 + %t301 = load ptr, ptr %t300 + %t302 = getelementptr inbounds %Str_Node, ptr %t301, i32 0, i32 4 + %t303 = call ptr @fn_expr() + store ptr %t303, ptr %t302 + call void @fn_skipnl() + call void @fn_eat_op(ptr @.str76) + br label %wcond76 +wcond76: + %t304 = icmp ne i32 1, 0 + br i1 %t304, label %wbody77, label %wend78 +wbody77: + call void @fn_skipnl() + %t305 = call i32 @fn_is_op(ptr @.str77) + %t306 = icmp ne i32 %t305, 0 + br i1 %t306, label %then79, label %ifend81 +then79: + br label %wend78 +ifend81: + %t307 = call ptr @fn_node(i32 20) + store ptr %t307, ptr %t308 + br label %wcond82 +wcond82: + %t309 = icmp ne i32 1, 0 + br i1 %t309, label %wbody83, label %wend84 +wbody83: + %t310 = load ptr, ptr %t308 + %t311 = getelementptr inbounds %Str_Node, ptr %t310, i32 0, i32 7 + %t312 = load ptr, ptr %t311 + %t313 = getelementptr inbounds %LSlice, ptr %t312, i32 0, i32 1 + %t314 = getelementptr inbounds %LSlice, ptr %t312, i32 0, i32 2 + %t315 = getelementptr inbounds %LSlice, ptr %t312, i32 0, i32 0 + %t316 = load i32, ptr %t313 + %t317 = load i32, ptr %t314 + %t318 = icmp sge i32 %t316, %t317 + br i1 %t318, label %grow85, label %put86 +grow85: + %t319 = mul i32 %t317, 2 + %t320 = icmp eq i32 %t317, 0 + %t321 = select i1 %t320, i32 8, i32 %t319 + %t322 = getelementptr ptr, ptr null, i32 1 + %t323 = ptrtoint ptr %t322 to i64 + %t324 = zext i32 %t321 to i64 + %t325 = mul i64 %t324, %t323 + %t326 = load ptr, ptr %t315 + %t327 = call ptr @realloc(ptr %t326, i64 %t325) + store ptr %t327, ptr %t315 + store i32 %t321, ptr %t314 + br label %put86 +put86: + %t328 = call ptr @fn_expr() + %t329 = load ptr, ptr %t315 + %t330 = getelementptr inbounds ptr, ptr %t329, i32 %t316 + store ptr %t328, ptr %t330 + %t331 = add i32 %t316, 1 + store i32 %t331, ptr %t313 + %t332 = call i32 @fn_is_op(ptr @.str78) + %t333 = icmp ne i32 %t332, 0 + br i1 %t333, label %then87, label %ifend89 +then87: + %t334 = load i32, ptr @g_pi + %t335 = add i32 %t334, 1 + store i32 %t335, ptr @g_pi + call void @fn_skipnl() + br label %wcond82 +ifend89: + br label %wend84 +wend84: + call void @fn_eat_op(ptr @.str79) + call void @fn_skipnl() + %t336 = call i32 @fn_is_op(ptr @.str80) + %t337 = icmp ne i32 %t336, 0 + br i1 %t337, label %then90, label %else91 +then90: + %t338 = load ptr, ptr %t308 + %t339 = getelementptr inbounds %Str_Node, ptr %t338, i32 0, i32 4 + %t340 = call ptr @fn_block() + store ptr %t340, ptr %t339 + br label %ifend92 +else91: + %t341 = call ptr @fn_node(i32 7) + store ptr %t341, ptr %t342 + %t343 = load ptr, ptr %t342 + %t344 = getelementptr inbounds %Str_Node, ptr %t343, i32 0, i32 7 + %t345 = load ptr, ptr %t344 + %t346 = getelementptr inbounds %LSlice, ptr %t345, i32 0, i32 1 + %t347 = getelementptr inbounds %LSlice, ptr %t345, i32 0, i32 2 + %t348 = getelementptr inbounds %LSlice, ptr %t345, i32 0, i32 0 + %t349 = load i32, ptr %t346 + %t350 = load i32, ptr %t347 + %t351 = icmp sge i32 %t349, %t350 + br i1 %t351, label %grow93, label %put94 +grow93: + %t352 = mul i32 %t350, 2 + %t353 = icmp eq i32 %t350, 0 + %t354 = select i1 %t353, i32 8, i32 %t352 + %t355 = getelementptr ptr, ptr null, i32 1 + %t356 = ptrtoint ptr %t355 to i64 + %t357 = zext i32 %t354 to i64 + %t358 = mul i64 %t357, %t356 + %t359 = load ptr, ptr %t348 + %t360 = call ptr @realloc(ptr %t359, i64 %t358) + store ptr %t360, ptr %t348 + store i32 %t354, ptr %t347 + br label %put94 +put94: + %t361 = call ptr @fn_stmt() + %t362 = load ptr, ptr %t348 + %t363 = getelementptr inbounds ptr, ptr %t362, i32 %t349 + store ptr %t361, ptr %t363 + %t364 = add i32 %t349, 1 + store i32 %t364, ptr %t346 + %t365 = load ptr, ptr %t308 + %t366 = getelementptr inbounds %Str_Node, ptr %t365, i32 0, i32 4 + %t367 = load ptr, ptr %t342 + store ptr %t367, ptr %t366 + br label %ifend92 +ifend92: + %t368 = load ptr, ptr %t300 + %t369 = getelementptr inbounds %Str_Node, ptr %t368, i32 0, i32 7 + %t370 = load ptr, ptr %t369 + %t371 = getelementptr inbounds %LSlice, ptr %t370, i32 0, i32 1 + %t372 = getelementptr inbounds %LSlice, ptr %t370, i32 0, i32 2 + %t373 = getelementptr inbounds %LSlice, ptr %t370, i32 0, i32 0 + %t374 = load i32, ptr %t371 + %t375 = load i32, ptr %t372 + %t376 = icmp sge i32 %t374, %t375 + br i1 %t376, label %grow95, label %put96 +grow95: + %t377 = mul i32 %t375, 2 + %t378 = icmp eq i32 %t375, 0 + %t379 = select i1 %t378, i32 8, i32 %t377 + %t380 = getelementptr ptr, ptr null, i32 1 + %t381 = ptrtoint ptr %t380 to i64 + %t382 = zext i32 %t379 to i64 + %t383 = mul i64 %t382, %t381 + %t384 = load ptr, ptr %t373 + %t385 = call ptr @realloc(ptr %t384, i64 %t383) + store ptr %t385, ptr %t373 + store i32 %t379, ptr %t372 + br label %put96 +put96: + %t386 = load ptr, ptr %t308 + %t387 = load ptr, ptr %t373 + %t388 = getelementptr inbounds ptr, ptr %t387, i32 %t374 + store ptr %t386, ptr %t388 + %t389 = add i32 %t374, 1 + store i32 %t389, ptr %t371 + br label %wcond76 +wend78: + call void @fn_eat_op(ptr @.str81) + %t390 = load ptr, ptr %t300 + store ptr %t390, ptr %retval + br label %ret +ifend75: br label %ifend2 ifend2: - %t373 = call ptr @fn_expr() - store ptr %t373, ptr %t374 - %t379 = call i32 @fn_is_op(ptr @.str78) - %t380 = icmp ne i32 %t379, 0 - %t381 = zext i1 %t380 to i32 - store i32 %t381, ptr %t378 - br i1 %t380, label %scend95, label %sc94 -sc94: - %t382 = call i32 @fn_is_op(ptr @.str79) - %t383 = icmp ne i32 %t382, 0 - %t384 = zext i1 %t383 to i32 - store i32 %t384, ptr %t378 - br label %scend95 -scend95: - %t385 = load i32, ptr %t378 - %t386 = icmp ne i32 %t385, 0 - %t387 = zext i1 %t386 to i32 - store i32 %t387, ptr %t377 - br i1 %t386, label %scend97, label %sc96 -sc96: - %t388 = call i32 @fn_is_op(ptr @.str80) - %t389 = icmp ne i32 %t388, 0 - %t390 = zext i1 %t389 to i32 - store i32 %t390, ptr %t377 - br label %scend97 -scend97: - %t391 = load i32, ptr %t377 - %t392 = icmp ne i32 %t391, 0 - %t393 = zext i1 %t392 to i32 - store i32 %t393, ptr %t376 - br i1 %t392, label %scend99, label %sc98 -sc98: - %t394 = call i32 @fn_is_op(ptr @.str81) - %t395 = icmp ne i32 %t394, 0 - %t396 = zext i1 %t395 to i32 - store i32 %t396, ptr %t376 - br label %scend99 -scend99: - %t397 = load i32, ptr %t376 + %t391 = call ptr @fn_expr() + store ptr %t391, ptr %t392 + %t397 = call i32 @fn_is_op(ptr @.str82) %t398 = icmp ne i32 %t397, 0 %t399 = zext i1 %t398 to i32 - store i32 %t399, ptr %t375 - br i1 %t398, label %scend101, label %sc100 -sc100: - %t400 = call i32 @fn_is_op(ptr @.str82) + store i32 %t399, ptr %t396 + br i1 %t398, label %scend98, label %sc97 +sc97: + %t400 = call i32 @fn_is_op(ptr @.str83) %t401 = icmp ne i32 %t400, 0 %t402 = zext i1 %t401 to i32 - store i32 %t402, ptr %t375 - br label %scend101 -scend101: - %t403 = load i32, ptr %t375 + store i32 %t402, ptr %t396 + br label %scend98 +scend98: + %t403 = load i32, ptr %t396 %t404 = icmp ne i32 %t403, 0 - br i1 %t404, label %then102, label %ifend104 -then102: - %t405 = call ptr @fn_node(i32 11) - store ptr %t405, ptr %t406 - %t407 = load ptr, ptr %t406 - %t408 = getelementptr inbounds %Str_Node, ptr %t407, i32 0, i32 1 - %t409 = load ptr, ptr @g_toks - %t410 = getelementptr inbounds %LSlice, ptr %t409, i32 0, i32 0 - %t411 = load ptr, ptr %t410 - %t412 = load i32, ptr @g_pi - %t413 = getelementptr inbounds ptr, ptr %t411, i32 %t412 - %t414 = load ptr, ptr %t413 - %t415 = getelementptr inbounds %Str_Tok, ptr %t414, i32 0, i32 1 - %t416 = load ptr, ptr %t415 - store ptr %t416, ptr %t408 - %t417 = load i32, ptr @g_pi - %t418 = add i32 %t417, 1 - store i32 %t418, ptr @g_pi - %t419 = load ptr, ptr %t406 - %t420 = getelementptr inbounds %Str_Node, ptr %t419, i32 0, i32 4 - %t421 = load ptr, ptr %t374 - store ptr %t421, ptr %t420 - %t422 = load ptr, ptr %t406 - %t423 = getelementptr inbounds %Str_Node, ptr %t422, i32 0, i32 5 - %t424 = call ptr @fn_expr() - store ptr %t424, ptr %t423 - %t425 = load ptr, ptr %t406 - store ptr %t425, ptr %retval + %t405 = zext i1 %t404 to i32 + store i32 %t405, ptr %t395 + br i1 %t404, label %scend100, label %sc99 +sc99: + %t406 = call i32 @fn_is_op(ptr @.str84) + %t407 = icmp ne i32 %t406, 0 + %t408 = zext i1 %t407 to i32 + store i32 %t408, ptr %t395 + br label %scend100 +scend100: + %t409 = load i32, ptr %t395 + %t410 = icmp ne i32 %t409, 0 + %t411 = zext i1 %t410 to i32 + store i32 %t411, ptr %t394 + br i1 %t410, label %scend102, label %sc101 +sc101: + %t412 = call i32 @fn_is_op(ptr @.str85) + %t413 = icmp ne i32 %t412, 0 + %t414 = zext i1 %t413 to i32 + store i32 %t414, ptr %t394 + br label %scend102 +scend102: + %t415 = load i32, ptr %t394 + %t416 = icmp ne i32 %t415, 0 + %t417 = zext i1 %t416 to i32 + store i32 %t417, ptr %t393 + br i1 %t416, label %scend104, label %sc103 +sc103: + %t418 = call i32 @fn_is_op(ptr @.str86) + %t419 = icmp ne i32 %t418, 0 + %t420 = zext i1 %t419 to i32 + store i32 %t420, ptr %t393 + br label %scend104 +scend104: + %t421 = load i32, ptr %t393 + %t422 = icmp ne i32 %t421, 0 + br i1 %t422, label %then105, label %ifend107 +then105: + %t423 = call ptr @fn_node(i32 11) + store ptr %t423, ptr %t424 + %t425 = load ptr, ptr %t424 + %t426 = getelementptr inbounds %Str_Node, ptr %t425, i32 0, i32 1 + %t427 = load ptr, ptr @g_toks + %t428 = getelementptr inbounds %LSlice, ptr %t427, i32 0, i32 0 + %t429 = load ptr, ptr %t428 + %t430 = load i32, ptr @g_pi + %t431 = getelementptr inbounds ptr, ptr %t429, i32 %t430 + %t432 = load ptr, ptr %t431 + %t433 = getelementptr inbounds %Str_Tok, ptr %t432, i32 0, i32 1 + %t434 = load ptr, ptr %t433 + store ptr %t434, ptr %t426 + %t435 = load i32, ptr @g_pi + %t436 = add i32 %t435, 1 + store i32 %t436, ptr @g_pi + %t437 = load ptr, ptr %t424 + %t438 = getelementptr inbounds %Str_Node, ptr %t437, i32 0, i32 4 + %t439 = load ptr, ptr %t392 + store ptr %t439, ptr %t438 + %t440 = load ptr, ptr %t424 + %t441 = getelementptr inbounds %Str_Node, ptr %t440, i32 0, i32 5 + %t442 = call ptr @fn_expr() + store ptr %t442, ptr %t441 + %t443 = load ptr, ptr %t424 + store ptr %t443, ptr %retval br label %ret -ifend104: - %t426 = call ptr @fn_node(i32 16) - store ptr %t426, ptr %t427 - %t428 = load ptr, ptr %t427 - %t429 = getelementptr inbounds %Str_Node, ptr %t428, i32 0, i32 4 - %t430 = load ptr, ptr %t374 - store ptr %t430, ptr %t429 - %t431 = load ptr, ptr %t427 - store ptr %t431, ptr %retval +ifend107: + %t444 = call ptr @fn_node(i32 16) + store ptr %t444, ptr %t445 + %t446 = load ptr, ptr %t445 + %t447 = getelementptr inbounds %Str_Node, ptr %t446, i32 0, i32 4 + %t448 = load ptr, ptr %t392 + store ptr %t448, ptr %t447 + %t449 = load ptr, ptr %t445 + store ptr %t449, ptr %retval br label %ret ret: - %t432 = load ptr, ptr %retval - ret ptr %t432 + %t450 = load ptr, ptr %retval + ret ptr %t450 } define ptr @fn_parse_struct() { @@ -5520,14 +5647,14 @@ entry: %t6 = call ptr @fn_eat_id() store ptr %t6, ptr %t5 call void @fn_skipnl() - call void @fn_eat_op(ptr @.str83) + call void @fn_eat_op(ptr @.str87) br label %wcond0 wcond0: %t7 = icmp ne i32 1, 0 br i1 %t7, label %wbody1, label %wend2 wbody1: call void @fn_skipnl() - %t8 = call i32 @fn_is_op(ptr @.str84) + %t8 = call i32 @fn_is_op(ptr @.str88) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then3, label %ifend5 then3: @@ -5539,12 +5666,12 @@ ifend5: %t13 = getelementptr inbounds %Str_Node, ptr %t12, i32 0, i32 1 %t14 = call ptr @fn_eat_id() store ptr %t14, ptr %t13 - call void @fn_eat_op(ptr @.str85) + call void @fn_eat_op(ptr @.str89) %t15 = load ptr, ptr %t11 %t16 = getelementptr inbounds %Str_Node, ptr %t15, i32 0, i32 3 %t17 = call ptr @fn_ptype() store ptr %t17, ptr %t16 - %t18 = call i32 @fn_is_op(ptr @.str86) + %t18 = call i32 @fn_is_op(ptr @.str90) %t19 = icmp ne i32 %t18, 0 br i1 %t19, label %then6, label %ifend8 then6: @@ -5587,7 +5714,7 @@ put10: store ptr %t43, ptr %t45 %t46 = add i32 %t31, 1 store i32 %t46, ptr %t28 - %t47 = call i32 @fn_is_op(ptr @.str87) + %t47 = call i32 @fn_is_op(ptr @.str91) %t48 = icmp ne i32 %t47, 0 br i1 %t48, label %then11, label %ifend13 then11: @@ -5598,7 +5725,7 @@ then11: ifend13: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str88) + call void @fn_eat_op(ptr @.str92) %t51 = load ptr, ptr %t3 store ptr %t51, ptr %retval br label %ret @@ -5620,12 +5747,12 @@ entry: %t5 = getelementptr inbounds %Str_Node, ptr %t4, i32 0, i32 1 %t6 = call ptr @fn_eat_id() store ptr %t6, ptr %t5 - call void @fn_eat_op(ptr @.str89) + call void @fn_eat_op(ptr @.str93) %t7 = load ptr, ptr %t3 %t8 = getelementptr inbounds %Str_Node, ptr %t7, i32 0, i32 3 %t9 = call ptr @fn_ptype() store ptr %t9, ptr %t8 - %t10 = call i32 @fn_is_op(ptr @.str90) + %t10 = call i32 @fn_is_op(ptr @.str94) %t11 = icmp ne i32 %t10, 0 br i1 %t11, label %then0, label %ifend2 then0: @@ -5659,12 +5786,12 @@ entry: %t5 = getelementptr inbounds %Str_Node, ptr %t4, i32 0, i32 1 %t6 = call ptr @fn_eat_id() store ptr %t6, ptr %t5 - call void @fn_eat_op(ptr @.str91) + call void @fn_eat_op(ptr @.str95) %t7 = load ptr, ptr %t3 %t8 = getelementptr inbounds %Str_Node, ptr %t7, i32 0, i32 3 %t9 = call ptr @fn_ptype() store ptr %t9, ptr %t8 - call void @fn_eat_op(ptr @.str92) + call void @fn_eat_op(ptr @.str96) %t10 = load ptr, ptr %t3 %t11 = getelementptr inbounds %Str_Node, ptr %t10, i32 0, i32 4 %t12 = call ptr @fn_expr() @@ -5691,10 +5818,10 @@ entry: %t5 = getelementptr inbounds %Str_Node, ptr %t4, i32 0, i32 1 %t6 = call ptr @fn_eat_id() store ptr %t6, ptr %t5 - call void @fn_eat_op(ptr @.str93) + call void @fn_eat_op(ptr @.str97) br label %wcond0 wcond0: - %t7 = call i32 @fn_is_op(ptr @.str94) + %t7 = call i32 @fn_is_op(ptr @.str98) %t8 = icmp eq i32 %t7, 0 %t9 = zext i1 %t8 to i32 %t10 = icmp ne i32 %t9, 0 @@ -5706,7 +5833,7 @@ wbody1: %t14 = getelementptr inbounds %Str_Node, ptr %t13, i32 0, i32 1 %t15 = call ptr @fn_eat_id() store ptr %t15, ptr %t14 - call void @fn_eat_op(ptr @.str95) + call void @fn_eat_op(ptr @.str99) %t16 = load ptr, ptr %t12 %t17 = getelementptr inbounds %Str_Node, ptr %t16, i32 0, i32 3 %t18 = call ptr @fn_ptype() @@ -5741,7 +5868,7 @@ put4: store ptr %t37, ptr %t39 %t40 = add i32 %t25, 1 store i32 %t40, ptr %t22 - %t41 = call i32 @fn_is_op(ptr @.str96) + %t41 = call i32 @fn_is_op(ptr @.str100) %t42 = icmp ne i32 %t41, 0 br i1 %t42, label %then5, label %ifend7 then5: @@ -5752,11 +5879,11 @@ then5: ifend7: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str97) + call void @fn_eat_op(ptr @.str101) %t45 = load ptr, ptr %t3 %t46 = getelementptr inbounds %Str_Node, ptr %t45, i32 0, i32 3 - store ptr @.str98, ptr %t46 - %t47 = call i32 @fn_is_op(ptr @.str99) + store ptr @.str102, ptr %t46 + %t47 = call i32 @fn_is_op(ptr @.str103) %t48 = icmp ne i32 %t47, 0 br i1 %t48, label %then8, label %ifend10 then8: @@ -5849,7 +5976,7 @@ wend2: %t26 = icmp ne i32 %t25, 0 br i1 %t26, label %then6, label %ifend8 then6: - store ptr @.str100, ptr %retval + store ptr @.str104, ptr %retval br label %ret ifend8: %t27 = load ptr, ptr %t0 @@ -5939,463 +6066,500 @@ ret: define void @fn_parse_one_decl() { entry: - %t10 = alloca ptr - %t20 = alloca ptr - %t90 = alloca i32 - %t190 = alloca ptr - %t213 = alloca i32 - %t0 = call i32 @fn_is_id(ptr @.str101) - %t1 = icmp ne i32 %t0, 0 - br i1 %t1, label %then0, label %ifend2 -then0: - %t2 = load i32, ptr @g_pi - %t3 = add i32 %t2, 1 - store i32 %t3, ptr @g_pi - %t4 = load ptr, ptr @g_toks - %t5 = getelementptr inbounds %LSlice, ptr %t4, i32 0, i32 0 - %t6 = load ptr, ptr %t5 - %t7 = load i32, ptr @g_pi - %t8 = getelementptr inbounds ptr, ptr %t6, i32 %t7 - %t9 = load ptr, ptr %t8 - store ptr %t9, ptr %t10 - %t11 = load ptr, ptr %t10 - %t12 = getelementptr inbounds %Str_Tok, ptr %t11, i32 0, i32 0 - %t13 = load i32, ptr %t12 - %t14 = icmp ne i32 %t13, 2 - %t15 = zext i1 %t14 to i32 - %t16 = icmp ne i32 %t15, 0 - br i1 %t16, label %then3, label %ifend5 + %t0 = alloca i32 + %t6 = alloca ptr + %t12 = alloca i32 + %t38 = alloca ptr + %t48 = alloca ptr + %t231 = alloca ptr + store i32 0, ptr %t0 + br label %wcond0 +wcond0: + %t1 = call i32 @fn_is_op(ptr @.str105) + %t2 = icmp ne i32 %t1, 0 + br i1 %t2, label %wbody1, label %wend2 +wbody1: + %t3 = load i32, ptr @g_pi + %t4 = add i32 %t3, 1 + store i32 %t4, ptr @g_pi + %t5 = call ptr @fn_eat_id() + store ptr %t5, ptr %t6 + %t7 = load ptr, ptr %t6 + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str106) + %t9 = icmp ne i32 %t8, 0 + br i1 %t9, label %then3, label %ifend5 then3: - call void @fn_perr(ptr @.str102) + store i32 1, ptr %t0 br label %ifend5 ifend5: - %t17 = load ptr, ptr %t10 - %t18 = getelementptr inbounds %Str_Tok, ptr %t17, i32 0, i32 1 - %t19 = load ptr, ptr %t18 - store ptr %t19, ptr %t20 - %t21 = load i32, ptr @g_pi - %t22 = add i32 %t21, 1 - store i32 %t22, ptr @g_pi - %t23 = load ptr, ptr %t20 - call void @fn_do_import(ptr %t23) - br label %ret -ifend2: - %t24 = call i32 @fn_is_id(ptr @.str103) - %t25 = icmp ne i32 %t24, 0 - br i1 %t25, label %then6, label %ifend8 + %t10 = call i32 @fn_is_op(ptr @.str107) + %t11 = icmp ne i32 %t10, 0 + br i1 %t11, label %then6, label %ifend8 then6: - %t26 = load ptr, ptr @g_prog - %t27 = getelementptr inbounds %LSlice, ptr %t26, i32 0, i32 1 - %t28 = getelementptr inbounds %LSlice, ptr %t26, i32 0, i32 2 - %t29 = getelementptr inbounds %LSlice, ptr %t26, i32 0, i32 0 - %t30 = load i32, ptr %t27 - %t31 = load i32, ptr %t28 - %t32 = icmp sge i32 %t30, %t31 - br i1 %t32, label %grow9, label %put10 -grow9: - %t33 = mul i32 %t31, 2 - %t34 = icmp eq i32 %t31, 0 - %t35 = select i1 %t34, i32 8, i32 %t33 - %t36 = getelementptr ptr, ptr null, i32 1 - %t37 = ptrtoint ptr %t36 to i64 - %t38 = zext i32 %t35 to i64 - %t39 = mul i64 %t38, %t37 - %t40 = load ptr, ptr %t29 - %t41 = call ptr @realloc(ptr %t40, i64 %t39) - store ptr %t41, ptr %t29 - store i32 %t35, ptr %t28 - br label %put10 -put10: - %t42 = call ptr @fn_parse_struct() - %t43 = load ptr, ptr %t29 - %t44 = getelementptr inbounds ptr, ptr %t43, i32 %t30 - store ptr %t42, ptr %t44 - %t45 = add i32 %t30, 1 - store i32 %t45, ptr %t27 - br label %ret + store i32 0, ptr %t12 + br label %wcond9 +wcond9: + %t13 = icmp ne i32 1, 0 + br i1 %t13, label %wbody10, label %wend11 +wbody10: + %t14 = call i32 @fn_is_op(ptr @.str108) + %t15 = icmp ne i32 %t14, 0 + br i1 %t15, label %then12, label %ifend14 +then12: + %t16 = load i32, ptr %t12 + %t17 = add i32 %t16, 1 + store i32 %t17, ptr %t12 + br label %ifend14 +ifend14: + %t18 = call i32 @fn_is_op(ptr @.str109) + %t19 = icmp ne i32 %t18, 0 + br i1 %t19, label %then15, label %ifend17 +then15: + %t20 = load i32, ptr %t12 + %t21 = sub i32 %t20, 1 + store i32 %t21, ptr %t12 + br label %ifend17 +ifend17: + %t22 = load i32, ptr @g_pi + %t23 = add i32 %t22, 1 + store i32 %t23, ptr @g_pi + %t24 = load i32, ptr %t12 + %t25 = icmp eq i32 %t24, 0 + %t26 = zext i1 %t25 to i32 + %t27 = icmp ne i32 %t26, 0 + br i1 %t27, label %then18, label %ifend20 +then18: + br label %wend11 +ifend20: + br label %wcond9 +wend11: + br label %ifend8 ifend8: - %t46 = call i32 @fn_is_id(ptr @.str104) - %t47 = icmp ne i32 %t46, 0 - br i1 %t47, label %then11, label %ifend13 -then11: - %t48 = load ptr, ptr @g_prog - %t49 = getelementptr inbounds %LSlice, ptr %t48, i32 0, i32 1 - %t50 = getelementptr inbounds %LSlice, ptr %t48, i32 0, i32 2 - %t51 = getelementptr inbounds %LSlice, ptr %t48, i32 0, i32 0 - %t52 = load i32, ptr %t49 - %t53 = load i32, ptr %t50 - %t54 = icmp sge i32 %t52, %t53 - br i1 %t54, label %grow14, label %put15 -grow14: - %t55 = mul i32 %t53, 2 - %t56 = icmp eq i32 %t53, 0 - %t57 = select i1 %t56, i32 8, i32 %t55 - %t58 = getelementptr ptr, ptr null, i32 1 - %t59 = ptrtoint ptr %t58 to i64 - %t60 = zext i32 %t57 to i64 - %t61 = mul i64 %t60, %t59 - %t62 = load ptr, ptr %t51 - %t63 = call ptr @realloc(ptr %t62, i64 %t61) - store ptr %t63, ptr %t51 - store i32 %t57, ptr %t50 - br label %put15 -put15: - %t64 = call ptr @fn_parse_component() - %t65 = load ptr, ptr %t51 - %t66 = getelementptr inbounds ptr, ptr %t65, i32 %t52 - store ptr %t64, ptr %t66 - %t67 = add i32 %t52, 1 - store i32 %t67, ptr %t49 + call void @fn_skipnl() + br label %wcond0 +wend2: + %t28 = call i32 @fn_is_id(ptr @.str110) + %t29 = icmp ne i32 %t28, 0 + br i1 %t29, label %then21, label %ifend23 +then21: + %t30 = load i32, ptr @g_pi + %t31 = add i32 %t30, 1 + store i32 %t31, ptr @g_pi + %t32 = load ptr, ptr @g_toks + %t33 = getelementptr inbounds %LSlice, ptr %t32, i32 0, i32 0 + %t34 = load ptr, ptr %t33 + %t35 = load i32, ptr @g_pi + %t36 = getelementptr inbounds ptr, ptr %t34, i32 %t35 + %t37 = load ptr, ptr %t36 + store ptr %t37, ptr %t38 + %t39 = load ptr, ptr %t38 + %t40 = getelementptr inbounds %Str_Tok, ptr %t39, i32 0, i32 0 + %t41 = load i32, ptr %t40 + %t42 = icmp ne i32 %t41, 2 + %t43 = zext i1 %t42 to i32 + %t44 = icmp ne i32 %t43, 0 + br i1 %t44, label %then24, label %ifend26 +then24: + call void @fn_perr(ptr @.str111) + br label %ifend26 +ifend26: + %t45 = load ptr, ptr %t38 + %t46 = getelementptr inbounds %Str_Tok, ptr %t45, i32 0, i32 1 + %t47 = load ptr, ptr %t46 + store ptr %t47, ptr %t48 + %t49 = load i32, ptr @g_pi + %t50 = add i32 %t49, 1 + store i32 %t50, ptr @g_pi + %t51 = load ptr, ptr %t48 + call void @fn_do_import(ptr %t51) br label %ret -ifend13: - %t68 = call i32 @fn_is_id(ptr @.str105) - %t69 = icmp ne i32 %t68, 0 - br i1 %t69, label %then16, label %ifend18 -then16: - %t70 = load ptr, ptr @g_prog - %t71 = getelementptr inbounds %LSlice, ptr %t70, i32 0, i32 1 - %t72 = getelementptr inbounds %LSlice, ptr %t70, i32 0, i32 2 - %t73 = getelementptr inbounds %LSlice, ptr %t70, i32 0, i32 0 - %t74 = load i32, ptr %t71 - %t75 = load i32, ptr %t72 - %t76 = icmp sge i32 %t74, %t75 - br i1 %t76, label %grow19, label %put20 -grow19: - %t77 = mul i32 %t75, 2 - %t78 = icmp eq i32 %t75, 0 - %t79 = select i1 %t78, i32 8, i32 %t77 - %t80 = getelementptr ptr, ptr null, i32 1 - %t81 = ptrtoint ptr %t80 to i64 - %t82 = zext i32 %t79 to i64 - %t83 = mul i64 %t82, %t81 - %t84 = load ptr, ptr %t73 - %t85 = call ptr @realloc(ptr %t84, i64 %t83) - store ptr %t85, ptr %t73 - store i32 %t79, ptr %t72 - br label %put20 -put20: - %t86 = call ptr @fn_parse_archetype() - %t87 = load ptr, ptr %t73 - %t88 = getelementptr inbounds ptr, ptr %t87, i32 %t74 - store ptr %t86, ptr %t88 - %t89 = add i32 %t74, 1 - store i32 %t89, ptr %t71 +ifend23: + %t52 = call i32 @fn_is_id(ptr @.str112) + %t53 = icmp ne i32 %t52, 0 + br i1 %t53, label %then27, label %ifend29 +then27: + %t54 = load ptr, ptr @g_prog + %t55 = getelementptr inbounds %LSlice, ptr %t54, i32 0, i32 1 + %t56 = getelementptr inbounds %LSlice, ptr %t54, i32 0, i32 2 + %t57 = getelementptr inbounds %LSlice, ptr %t54, i32 0, i32 0 + %t58 = load i32, ptr %t55 + %t59 = load i32, ptr %t56 + %t60 = icmp sge i32 %t58, %t59 + br i1 %t60, label %grow30, label %put31 +grow30: + %t61 = mul i32 %t59, 2 + %t62 = icmp eq i32 %t59, 0 + %t63 = select i1 %t62, i32 8, i32 %t61 + %t64 = getelementptr ptr, ptr null, i32 1 + %t65 = ptrtoint ptr %t64 to i64 + %t66 = zext i32 %t63 to i64 + %t67 = mul i64 %t66, %t65 + %t68 = load ptr, ptr %t57 + %t69 = call ptr @realloc(ptr %t68, i64 %t67) + store ptr %t69, ptr %t57 + store i32 %t63, ptr %t56 + br label %put31 +put31: + %t70 = call ptr @fn_parse_struct() + %t71 = load ptr, ptr %t57 + %t72 = getelementptr inbounds ptr, ptr %t71, i32 %t58 + store ptr %t70, ptr %t72 + %t73 = add i32 %t58, 1 + store i32 %t73, ptr %t55 br label %ret -ifend18: - %t91 = call i32 @fn_is_id(ptr @.str106) - %t92 = icmp ne i32 %t91, 0 - %t93 = zext i1 %t92 to i32 - store i32 %t93, ptr %t90 - br i1 %t92, label %scend22, label %sc21 -sc21: - %t94 = call i32 @fn_is_id(ptr @.str107) - %t95 = icmp ne i32 %t94, 0 - %t96 = zext i1 %t95 to i32 - store i32 %t96, ptr %t90 - br label %scend22 -scend22: - %t97 = load i32, ptr %t90 - %t98 = icmp ne i32 %t97, 0 - br i1 %t98, label %then23, label %ifend25 -then23: - %t99 = load ptr, ptr @g_prog - %t100 = getelementptr inbounds %LSlice, ptr %t99, i32 0, i32 1 - %t101 = getelementptr inbounds %LSlice, ptr %t99, i32 0, i32 2 - %t102 = getelementptr inbounds %LSlice, ptr %t99, i32 0, i32 0 +ifend29: + %t74 = call i32 @fn_is_id(ptr @.str113) + %t75 = icmp ne i32 %t74, 0 + br i1 %t75, label %then32, label %ifend34 +then32: + %t76 = load ptr, ptr @g_prog + %t77 = getelementptr inbounds %LSlice, ptr %t76, i32 0, i32 1 + %t78 = getelementptr inbounds %LSlice, ptr %t76, i32 0, i32 2 + %t79 = getelementptr inbounds %LSlice, ptr %t76, i32 0, i32 0 + %t80 = load i32, ptr %t77 + %t81 = load i32, ptr %t78 + %t82 = icmp sge i32 %t80, %t81 + br i1 %t82, label %grow35, label %put36 +grow35: + %t83 = mul i32 %t81, 2 + %t84 = icmp eq i32 %t81, 0 + %t85 = select i1 %t84, i32 8, i32 %t83 + %t86 = getelementptr ptr, ptr null, i32 1 + %t87 = ptrtoint ptr %t86 to i64 + %t88 = zext i32 %t85 to i64 + %t89 = mul i64 %t88, %t87 + %t90 = load ptr, ptr %t79 + %t91 = call ptr @realloc(ptr %t90, i64 %t89) + store ptr %t91, ptr %t79 + store i32 %t85, ptr %t78 + br label %put36 +put36: + %t92 = call ptr @fn_parse_enum() + %t93 = load ptr, ptr %t79 + %t94 = getelementptr inbounds ptr, ptr %t93, i32 %t80 + store ptr %t92, ptr %t94 + %t95 = add i32 %t80, 1 + store i32 %t95, ptr %t77 + br label %ret +ifend34: + %t96 = call i32 @fn_is_id(ptr @.str114) + %t97 = icmp ne i32 %t96, 0 + br i1 %t97, label %then37, label %ifend39 +then37: + %t98 = load ptr, ptr @g_prog + %t99 = getelementptr inbounds %LSlice, ptr %t98, i32 0, i32 1 + %t100 = getelementptr inbounds %LSlice, ptr %t98, i32 0, i32 2 + %t101 = getelementptr inbounds %LSlice, ptr %t98, i32 0, i32 0 + %t102 = load i32, ptr %t99 %t103 = load i32, ptr %t100 - %t104 = load i32, ptr %t101 - %t105 = icmp sge i32 %t103, %t104 - br i1 %t105, label %grow26, label %put27 -grow26: - %t106 = mul i32 %t104, 2 - %t107 = icmp eq i32 %t104, 0 - %t108 = select i1 %t107, i32 8, i32 %t106 - %t109 = getelementptr ptr, ptr null, i32 1 - %t110 = ptrtoint ptr %t109 to i64 - %t111 = zext i32 %t108 to i64 - %t112 = mul i64 %t111, %t110 - %t113 = load ptr, ptr %t102 - %t114 = call ptr @realloc(ptr %t113, i64 %t112) - store ptr %t114, ptr %t102 - store i32 %t108, ptr %t101 - br label %put27 -put27: - %t115 = call ptr @fn_parse_system() - %t116 = load ptr, ptr %t102 - %t117 = getelementptr inbounds ptr, ptr %t116, i32 %t103 - store ptr %t115, ptr %t117 - %t118 = add i32 %t103, 1 - store i32 %t118, ptr %t100 + %t104 = icmp sge i32 %t102, %t103 + br i1 %t104, label %grow40, label %put41 +grow40: + %t105 = mul i32 %t103, 2 + %t106 = icmp eq i32 %t103, 0 + %t107 = select i1 %t106, i32 8, i32 %t105 + %t108 = getelementptr ptr, ptr null, i32 1 + %t109 = ptrtoint ptr %t108 to i64 + %t110 = zext i32 %t107 to i64 + %t111 = mul i64 %t110, %t109 + %t112 = load ptr, ptr %t101 + %t113 = call ptr @realloc(ptr %t112, i64 %t111) + store ptr %t113, ptr %t101 + store i32 %t107, ptr %t100 + br label %put41 +put41: + %t114 = call ptr @fn_parse_component() + %t115 = load ptr, ptr %t101 + %t116 = getelementptr inbounds ptr, ptr %t115, i32 %t102 + store ptr %t114, ptr %t116 + %t117 = add i32 %t102, 1 + store i32 %t117, ptr %t99 br label %ret -ifend25: - %t119 = call i32 @fn_is_id(ptr @.str108) - %t120 = icmp ne i32 %t119, 0 - br i1 %t120, label %then28, label %ifend30 -then28: - %t121 = load ptr, ptr @g_prog - %t122 = getelementptr inbounds %LSlice, ptr %t121, i32 0, i32 1 - %t123 = getelementptr inbounds %LSlice, ptr %t121, i32 0, i32 2 - %t124 = getelementptr inbounds %LSlice, ptr %t121, i32 0, i32 0 +ifend39: + %t118 = call i32 @fn_is_id(ptr @.str115) + %t119 = icmp ne i32 %t118, 0 + br i1 %t119, label %then42, label %ifend44 +then42: + %t120 = load ptr, ptr @g_prog + %t121 = getelementptr inbounds %LSlice, ptr %t120, i32 0, i32 1 + %t122 = getelementptr inbounds %LSlice, ptr %t120, i32 0, i32 2 + %t123 = getelementptr inbounds %LSlice, ptr %t120, i32 0, i32 0 + %t124 = load i32, ptr %t121 %t125 = load i32, ptr %t122 - %t126 = load i32, ptr %t123 - %t127 = icmp sge i32 %t125, %t126 - br i1 %t127, label %grow31, label %put32 -grow31: - %t128 = mul i32 %t126, 2 - %t129 = icmp eq i32 %t126, 0 - %t130 = select i1 %t129, i32 8, i32 %t128 - %t131 = getelementptr ptr, ptr null, i32 1 - %t132 = ptrtoint ptr %t131 to i64 - %t133 = zext i32 %t130 to i64 - %t134 = mul i64 %t133, %t132 - %t135 = load ptr, ptr %t124 - %t136 = call ptr @realloc(ptr %t135, i64 %t134) - store ptr %t136, ptr %t124 - store i32 %t130, ptr %t123 - br label %put32 -put32: - %t137 = call ptr @fn_parse_ui() - %t138 = load ptr, ptr %t124 - %t139 = getelementptr inbounds ptr, ptr %t138, i32 %t125 - store ptr %t137, ptr %t139 - %t140 = add i32 %t125, 1 - store i32 %t140, ptr %t122 + %t126 = icmp sge i32 %t124, %t125 + br i1 %t126, label %grow45, label %put46 +grow45: + %t127 = mul i32 %t125, 2 + %t128 = icmp eq i32 %t125, 0 + %t129 = select i1 %t128, i32 8, i32 %t127 + %t130 = getelementptr ptr, ptr null, i32 1 + %t131 = ptrtoint ptr %t130 to i64 + %t132 = zext i32 %t129 to i64 + %t133 = mul i64 %t132, %t131 + %t134 = load ptr, ptr %t123 + %t135 = call ptr @realloc(ptr %t134, i64 %t133) + store ptr %t135, ptr %t123 + store i32 %t129, ptr %t122 + br label %put46 +put46: + %t136 = call ptr @fn_parse_archetype() + %t137 = load ptr, ptr %t123 + %t138 = getelementptr inbounds ptr, ptr %t137, i32 %t124 + store ptr %t136, ptr %t138 + %t139 = add i32 %t124, 1 + store i32 %t139, ptr %t121 br label %ret -ifend30: - %t141 = call i32 @fn_is_id(ptr @.str109) - %t142 = icmp ne i32 %t141, 0 - br i1 %t142, label %then33, label %ifend35 -then33: - %t143 = load ptr, ptr @g_prog - %t144 = getelementptr inbounds %LSlice, ptr %t143, i32 0, i32 1 - %t145 = getelementptr inbounds %LSlice, ptr %t143, i32 0, i32 2 - %t146 = getelementptr inbounds %LSlice, ptr %t143, i32 0, i32 0 +ifend44: + %t140 = call i32 @fn_is_id(ptr @.str116) + %t141 = icmp ne i32 %t140, 0 + br i1 %t141, label %then47, label %ifend49 +then47: + %t142 = load ptr, ptr @g_prog + %t143 = getelementptr inbounds %LSlice, ptr %t142, i32 0, i32 1 + %t144 = getelementptr inbounds %LSlice, ptr %t142, i32 0, i32 2 + %t145 = getelementptr inbounds %LSlice, ptr %t142, i32 0, i32 0 + %t146 = load i32, ptr %t143 %t147 = load i32, ptr %t144 - %t148 = load i32, ptr %t145 - %t149 = icmp sge i32 %t147, %t148 - br i1 %t149, label %grow36, label %put37 -grow36: - %t150 = mul i32 %t148, 2 - %t151 = icmp eq i32 %t148, 0 - %t152 = select i1 %t151, i32 8, i32 %t150 - %t153 = getelementptr ptr, ptr null, i32 1 - %t154 = ptrtoint ptr %t153 to i64 - %t155 = zext i32 %t152 to i64 - %t156 = mul i64 %t155, %t154 - %t157 = load ptr, ptr %t146 - %t158 = call ptr @realloc(ptr %t157, i64 %t156) - store ptr %t158, ptr %t146 - store i32 %t152, ptr %t145 - br label %put37 -put37: - %t159 = call ptr @fn_parse_var() - %t160 = load ptr, ptr %t146 - %t161 = getelementptr inbounds ptr, ptr %t160, i32 %t147 - store ptr %t159, ptr %t161 - %t162 = add i32 %t147, 1 - store i32 %t162, ptr %t144 + %t148 = icmp sge i32 %t146, %t147 + br i1 %t148, label %grow50, label %put51 +grow50: + %t149 = mul i32 %t147, 2 + %t150 = icmp eq i32 %t147, 0 + %t151 = select i1 %t150, i32 8, i32 %t149 + %t152 = getelementptr ptr, ptr null, i32 1 + %t153 = ptrtoint ptr %t152 to i64 + %t154 = zext i32 %t151 to i64 + %t155 = mul i64 %t154, %t153 + %t156 = load ptr, ptr %t145 + %t157 = call ptr @realloc(ptr %t156, i64 %t155) + store ptr %t157, ptr %t145 + store i32 %t151, ptr %t144 + br label %put51 +put51: + %t158 = call ptr @fn_parse_system() + %t159 = load ptr, ptr %t145 + %t160 = getelementptr inbounds ptr, ptr %t159, i32 %t146 + store ptr %t158, ptr %t160 + %t161 = add i32 %t146, 1 + store i32 %t161, ptr %t143 br label %ret -ifend35: - %t163 = call i32 @fn_is_id(ptr @.str110) - %t164 = icmp ne i32 %t163, 0 - br i1 %t164, label %then38, label %ifend40 -then38: - %t165 = load ptr, ptr @g_prog - %t166 = getelementptr inbounds %LSlice, ptr %t165, i32 0, i32 1 - %t167 = getelementptr inbounds %LSlice, ptr %t165, i32 0, i32 2 - %t168 = getelementptr inbounds %LSlice, ptr %t165, i32 0, i32 0 +ifend49: + %t162 = call i32 @fn_is_id(ptr @.str117) + %t163 = icmp ne i32 %t162, 0 + br i1 %t163, label %then52, label %ifend54 +then52: + %t164 = load ptr, ptr @g_prog + %t165 = getelementptr inbounds %LSlice, ptr %t164, i32 0, i32 1 + %t166 = getelementptr inbounds %LSlice, ptr %t164, i32 0, i32 2 + %t167 = getelementptr inbounds %LSlice, ptr %t164, i32 0, i32 0 + %t168 = load i32, ptr %t165 %t169 = load i32, ptr %t166 - %t170 = load i32, ptr %t167 - %t171 = icmp sge i32 %t169, %t170 - br i1 %t171, label %grow41, label %put42 -grow41: - %t172 = mul i32 %t170, 2 - %t173 = icmp eq i32 %t170, 0 - %t174 = select i1 %t173, i32 8, i32 %t172 - %t175 = getelementptr ptr, ptr null, i32 1 - %t176 = ptrtoint ptr %t175 to i64 - %t177 = zext i32 %t174 to i64 - %t178 = mul i64 %t177, %t176 - %t179 = load ptr, ptr %t168 - %t180 = call ptr @realloc(ptr %t179, i64 %t178) - store ptr %t180, ptr %t168 - store i32 %t174, ptr %t167 - br label %put42 -put42: - %t181 = call ptr @fn_parse_const() - %t182 = load ptr, ptr %t168 - %t183 = getelementptr inbounds ptr, ptr %t182, i32 %t169 - store ptr %t181, ptr %t183 - %t184 = add i32 %t169, 1 - store i32 %t184, ptr %t166 + %t170 = icmp sge i32 %t168, %t169 + br i1 %t170, label %grow55, label %put56 +grow55: + %t171 = mul i32 %t169, 2 + %t172 = icmp eq i32 %t169, 0 + %t173 = select i1 %t172, i32 8, i32 %t171 + %t174 = getelementptr ptr, ptr null, i32 1 + %t175 = ptrtoint ptr %t174 to i64 + %t176 = zext i32 %t173 to i64 + %t177 = mul i64 %t176, %t175 + %t178 = load ptr, ptr %t167 + %t179 = call ptr @realloc(ptr %t178, i64 %t177) + store ptr %t179, ptr %t167 + store i32 %t173, ptr %t166 + br label %put56 +put56: + %t180 = call ptr @fn_parse_ui() + %t181 = load ptr, ptr %t167 + %t182 = getelementptr inbounds ptr, ptr %t181, i32 %t168 + store ptr %t180, ptr %t182 + %t183 = add i32 %t168, 1 + store i32 %t183, ptr %t165 br label %ret -ifend40: - %t185 = call i32 @fn_is_id(ptr @.str111) - %t186 = icmp ne i32 %t185, 0 - br i1 %t186, label %then43, label %ifend45 -then43: - %t187 = load i32, ptr @g_pi - %t188 = add i32 %t187, 1 - store i32 %t188, ptr @g_pi - %t189 = call ptr @fn_parse_fn() - store ptr %t189, ptr %t190 - %t191 = load ptr, ptr %t190 - %t192 = getelementptr inbounds %Str_Node, ptr %t191, i32 0, i32 2 - store i32 1, ptr %t192 - %t193 = load ptr, ptr @g_prog - %t194 = getelementptr inbounds %LSlice, ptr %t193, i32 0, i32 1 - %t195 = getelementptr inbounds %LSlice, ptr %t193, i32 0, i32 2 - %t196 = getelementptr inbounds %LSlice, ptr %t193, i32 0, i32 0 - %t197 = load i32, ptr %t194 - %t198 = load i32, ptr %t195 - %t199 = icmp sge i32 %t197, %t198 - br i1 %t199, label %grow46, label %put47 -grow46: - %t200 = mul i32 %t198, 2 - %t201 = icmp eq i32 %t198, 0 - %t202 = select i1 %t201, i32 8, i32 %t200 - %t203 = getelementptr ptr, ptr null, i32 1 - %t204 = ptrtoint ptr %t203 to i64 - %t205 = zext i32 %t202 to i64 - %t206 = mul i64 %t205, %t204 - %t207 = load ptr, ptr %t196 - %t208 = call ptr @realloc(ptr %t207, i64 %t206) - store ptr %t208, ptr %t196 - store i32 %t202, ptr %t195 - br label %put47 -put47: - %t209 = load ptr, ptr %t190 - %t210 = load ptr, ptr %t196 - %t211 = getelementptr inbounds ptr, ptr %t210, i32 %t197 - store ptr %t209, ptr %t211 - %t212 = add i32 %t197, 1 - store i32 %t212, ptr %t194 +ifend54: + %t184 = call i32 @fn_is_id(ptr @.str118) + %t185 = icmp ne i32 %t184, 0 + br i1 %t185, label %then57, label %ifend59 +then57: + %t186 = load ptr, ptr @g_prog + %t187 = getelementptr inbounds %LSlice, ptr %t186, i32 0, i32 1 + %t188 = getelementptr inbounds %LSlice, ptr %t186, i32 0, i32 2 + %t189 = getelementptr inbounds %LSlice, ptr %t186, i32 0, i32 0 + %t190 = load i32, ptr %t187 + %t191 = load i32, ptr %t188 + %t192 = icmp sge i32 %t190, %t191 + br i1 %t192, label %grow60, label %put61 +grow60: + %t193 = mul i32 %t191, 2 + %t194 = icmp eq i32 %t191, 0 + %t195 = select i1 %t194, i32 8, i32 %t193 + %t196 = getelementptr ptr, ptr null, i32 1 + %t197 = ptrtoint ptr %t196 to i64 + %t198 = zext i32 %t195 to i64 + %t199 = mul i64 %t198, %t197 + %t200 = load ptr, ptr %t189 + %t201 = call ptr @realloc(ptr %t200, i64 %t199) + store ptr %t201, ptr %t189 + store i32 %t195, ptr %t188 + br label %put61 +put61: + %t202 = call ptr @fn_parse_var() + %t203 = load ptr, ptr %t189 + %t204 = getelementptr inbounds ptr, ptr %t203, i32 %t190 + store ptr %t202, ptr %t204 + %t205 = add i32 %t190, 1 + store i32 %t205, ptr %t187 br label %ret -ifend45: - %t214 = call i32 @fn_is_id(ptr @.str112) - %t215 = icmp ne i32 %t214, 0 - %t216 = zext i1 %t215 to i32 - store i32 %t216, ptr %t213 - br i1 %t215, label %scend49, label %sc48 -sc48: - %t217 = call i32 @fn_is_id(ptr @.str113) - %t218 = icmp ne i32 %t217, 0 - %t219 = zext i1 %t218 to i32 - store i32 %t219, ptr %t213 - br label %scend49 -scend49: - %t220 = load i32, ptr %t213 - %t221 = icmp ne i32 %t220, 0 - br i1 %t221, label %then50, label %ifend52 -then50: - %t222 = call i32 @fn_is_id(ptr @.str114) - %t223 = icmp ne i32 %t222, 0 - br i1 %t223, label %then53, label %ifend55 -then53: - %t224 = load i32, ptr @g_pi - %t225 = add i32 %t224, 1 - store i32 %t225, ptr @g_pi - br label %ifend55 -ifend55: - %t226 = load ptr, ptr @g_prog - %t227 = getelementptr inbounds %LSlice, ptr %t226, i32 0, i32 1 - %t228 = getelementptr inbounds %LSlice, ptr %t226, i32 0, i32 2 - %t229 = getelementptr inbounds %LSlice, ptr %t226, i32 0, i32 0 - %t230 = load i32, ptr %t227 - %t231 = load i32, ptr %t228 - %t232 = icmp sge i32 %t230, %t231 - br i1 %t232, label %grow56, label %put57 -grow56: - %t233 = mul i32 %t231, 2 - %t234 = icmp eq i32 %t231, 0 - %t235 = select i1 %t234, i32 8, i32 %t233 - %t236 = getelementptr ptr, ptr null, i32 1 - %t237 = ptrtoint ptr %t236 to i64 - %t238 = zext i32 %t235 to i64 - %t239 = mul i64 %t238, %t237 - %t240 = load ptr, ptr %t229 - %t241 = call ptr @realloc(ptr %t240, i64 %t239) - store ptr %t241, ptr %t229 - store i32 %t235, ptr %t228 - br label %put57 -put57: - %t242 = call ptr @fn_parse_fn() - %t243 = load ptr, ptr %t229 - %t244 = getelementptr inbounds ptr, ptr %t243, i32 %t230 - store ptr %t242, ptr %t244 - %t245 = add i32 %t230, 1 - store i32 %t245, ptr %t227 +ifend59: + %t206 = call i32 @fn_is_id(ptr @.str119) + %t207 = icmp ne i32 %t206, 0 + br i1 %t207, label %then62, label %ifend64 +then62: + %t208 = load ptr, ptr @g_prog + %t209 = getelementptr inbounds %LSlice, ptr %t208, i32 0, i32 1 + %t210 = getelementptr inbounds %LSlice, ptr %t208, i32 0, i32 2 + %t211 = getelementptr inbounds %LSlice, ptr %t208, i32 0, i32 0 + %t212 = load i32, ptr %t209 + %t213 = load i32, ptr %t210 + %t214 = icmp sge i32 %t212, %t213 + br i1 %t214, label %grow65, label %put66 +grow65: + %t215 = mul i32 %t213, 2 + %t216 = icmp eq i32 %t213, 0 + %t217 = select i1 %t216, i32 8, i32 %t215 + %t218 = getelementptr ptr, ptr null, i32 1 + %t219 = ptrtoint ptr %t218 to i64 + %t220 = zext i32 %t217 to i64 + %t221 = mul i64 %t220, %t219 + %t222 = load ptr, ptr %t211 + %t223 = call ptr @realloc(ptr %t222, i64 %t221) + store ptr %t223, ptr %t211 + store i32 %t217, ptr %t210 + br label %put66 +put66: + %t224 = call ptr @fn_parse_const() + %t225 = load ptr, ptr %t211 + %t226 = getelementptr inbounds ptr, ptr %t225, i32 %t212 + store ptr %t224, ptr %t226 + %t227 = add i32 %t212, 1 + store i32 %t227, ptr %t209 br label %ret -ifend52: - %t246 = call i32 @fn_is_id(ptr @.str115) - %t247 = icmp ne i32 %t246, 0 - br i1 %t247, label %then58, label %ifend60 -then58: - %t248 = load ptr, ptr @g_prog - %t249 = getelementptr inbounds %LSlice, ptr %t248, i32 0, i32 1 - %t250 = getelementptr inbounds %LSlice, ptr %t248, i32 0, i32 2 - %t251 = getelementptr inbounds %LSlice, ptr %t248, i32 0, i32 0 - %t252 = load i32, ptr %t249 - %t253 = load i32, ptr %t250 - %t254 = icmp sge i32 %t252, %t253 - br i1 %t254, label %grow61, label %put62 -grow61: - %t255 = mul i32 %t253, 2 - %t256 = icmp eq i32 %t253, 0 - %t257 = select i1 %t256, i32 8, i32 %t255 - %t258 = getelementptr ptr, ptr null, i32 1 - %t259 = ptrtoint ptr %t258 to i64 - %t260 = zext i32 %t257 to i64 - %t261 = mul i64 %t260, %t259 - %t262 = load ptr, ptr %t251 - %t263 = call ptr @realloc(ptr %t262, i64 %t261) - store ptr %t263, ptr %t251 - store i32 %t257, ptr %t250 - br label %put62 -put62: - %t264 = call ptr @fn_parse_extern() - %t265 = load ptr, ptr %t251 - %t266 = getelementptr inbounds ptr, ptr %t265, i32 %t252 - store ptr %t264, ptr %t266 - %t267 = add i32 %t252, 1 - store i32 %t267, ptr %t249 +ifend64: + %t228 = call i32 @fn_is_id(ptr @.str120) + %t229 = icmp ne i32 %t228, 0 + br i1 %t229, label %then67, label %ifend69 +then67: + %t230 = call ptr @fn_parse_fn() + store ptr %t230, ptr %t231 + %t232 = load i32, ptr %t0 + %t233 = icmp ne i32 %t232, 0 + br i1 %t233, label %then70, label %ifend72 +then70: + %t234 = load ptr, ptr %t231 + %t235 = getelementptr inbounds %Str_Node, ptr %t234, i32 0, i32 2 + store i32 1, ptr %t235 + br label %ifend72 +ifend72: + %t236 = load ptr, ptr @g_prog + %t237 = getelementptr inbounds %LSlice, ptr %t236, i32 0, i32 1 + %t238 = getelementptr inbounds %LSlice, ptr %t236, i32 0, i32 2 + %t239 = getelementptr inbounds %LSlice, ptr %t236, i32 0, i32 0 + %t240 = load i32, ptr %t237 + %t241 = load i32, ptr %t238 + %t242 = icmp sge i32 %t240, %t241 + br i1 %t242, label %grow73, label %put74 +grow73: + %t243 = mul i32 %t241, 2 + %t244 = icmp eq i32 %t241, 0 + %t245 = select i1 %t244, i32 8, i32 %t243 + %t246 = getelementptr ptr, ptr null, i32 1 + %t247 = ptrtoint ptr %t246 to i64 + %t248 = zext i32 %t245 to i64 + %t249 = mul i64 %t248, %t247 + %t250 = load ptr, ptr %t239 + %t251 = call ptr @realloc(ptr %t250, i64 %t249) + store ptr %t251, ptr %t239 + store i32 %t245, ptr %t238 + br label %put74 +put74: + %t252 = load ptr, ptr %t231 + %t253 = load ptr, ptr %t239 + %t254 = getelementptr inbounds ptr, ptr %t253, i32 %t240 + store ptr %t252, ptr %t254 + %t255 = add i32 %t240, 1 + store i32 %t255, ptr %t237 br label %ret -ifend60: - %t268 = call i32 @fn_is_id(ptr @.str116) - %t269 = icmp ne i32 %t268, 0 - br i1 %t269, label %then63, label %ifend65 -then63: - %t270 = load ptr, ptr @g_prog - %t271 = getelementptr inbounds %LSlice, ptr %t270, i32 0, i32 1 - %t272 = getelementptr inbounds %LSlice, ptr %t270, i32 0, i32 2 - %t273 = getelementptr inbounds %LSlice, ptr %t270, i32 0, i32 0 - %t274 = load i32, ptr %t271 - %t275 = load i32, ptr %t272 - %t276 = icmp sge i32 %t274, %t275 - br i1 %t276, label %grow66, label %put67 -grow66: - %t277 = mul i32 %t275, 2 - %t278 = icmp eq i32 %t275, 0 - %t279 = select i1 %t278, i32 8, i32 %t277 - %t280 = getelementptr ptr, ptr null, i32 1 - %t281 = ptrtoint ptr %t280 to i64 - %t282 = zext i32 %t279 to i64 - %t283 = mul i64 %t282, %t281 - %t284 = load ptr, ptr %t273 - %t285 = call ptr @realloc(ptr %t284, i64 %t283) - store ptr %t285, ptr %t273 - store i32 %t279, ptr %t272 - br label %put67 -put67: - %t286 = call ptr @fn_parse_main() - %t287 = load ptr, ptr %t273 - %t288 = getelementptr inbounds ptr, ptr %t287, i32 %t274 - store ptr %t286, ptr %t288 - %t289 = add i32 %t274, 1 - store i32 %t289, ptr %t271 +ifend69: + %t256 = call i32 @fn_is_id(ptr @.str121) + %t257 = icmp ne i32 %t256, 0 + br i1 %t257, label %then75, label %ifend77 +then75: + %t258 = load ptr, ptr @g_prog + %t259 = getelementptr inbounds %LSlice, ptr %t258, i32 0, i32 1 + %t260 = getelementptr inbounds %LSlice, ptr %t258, i32 0, i32 2 + %t261 = getelementptr inbounds %LSlice, ptr %t258, i32 0, i32 0 + %t262 = load i32, ptr %t259 + %t263 = load i32, ptr %t260 + %t264 = icmp sge i32 %t262, %t263 + br i1 %t264, label %grow78, label %put79 +grow78: + %t265 = mul i32 %t263, 2 + %t266 = icmp eq i32 %t263, 0 + %t267 = select i1 %t266, i32 8, i32 %t265 + %t268 = getelementptr ptr, ptr null, i32 1 + %t269 = ptrtoint ptr %t268 to i64 + %t270 = zext i32 %t267 to i64 + %t271 = mul i64 %t270, %t269 + %t272 = load ptr, ptr %t261 + %t273 = call ptr @realloc(ptr %t272, i64 %t271) + store ptr %t273, ptr %t261 + store i32 %t267, ptr %t260 + br label %put79 +put79: + %t274 = call ptr @fn_parse_extern() + %t275 = load ptr, ptr %t261 + %t276 = getelementptr inbounds ptr, ptr %t275, i32 %t262 + store ptr %t274, ptr %t276 + %t277 = add i32 %t262, 1 + store i32 %t277, ptr %t259 br label %ret -ifend65: - call void @fn_perr(ptr @.str117) +ifend77: + %t278 = call i32 @fn_is_id(ptr @.str122) + %t279 = icmp ne i32 %t278, 0 + br i1 %t279, label %then80, label %ifend82 +then80: + %t280 = load ptr, ptr @g_prog + %t281 = getelementptr inbounds %LSlice, ptr %t280, i32 0, i32 1 + %t282 = getelementptr inbounds %LSlice, ptr %t280, i32 0, i32 2 + %t283 = getelementptr inbounds %LSlice, ptr %t280, i32 0, i32 0 + %t284 = load i32, ptr %t281 + %t285 = load i32, ptr %t282 + %t286 = icmp sge i32 %t284, %t285 + br i1 %t286, label %grow83, label %put84 +grow83: + %t287 = mul i32 %t285, 2 + %t288 = icmp eq i32 %t285, 0 + %t289 = select i1 %t288, i32 8, i32 %t287 + %t290 = getelementptr ptr, ptr null, i32 1 + %t291 = ptrtoint ptr %t290 to i64 + %t292 = zext i32 %t289 to i64 + %t293 = mul i64 %t292, %t291 + %t294 = load ptr, ptr %t283 + %t295 = call ptr @realloc(ptr %t294, i64 %t293) + store ptr %t295, ptr %t283 + store i32 %t289, ptr %t282 + br label %put84 +put84: + %t296 = call ptr @fn_parse_main() + %t297 = load ptr, ptr %t283 + %t298 = getelementptr inbounds ptr, ptr %t297, i32 %t284 + store ptr %t296, ptr %t298 + %t299 = add i32 %t284, 1 + store i32 %t299, ptr %t281 + br label %ret +ifend82: + call void @fn_perr(ptr @.str123) br label %ret ret: ret void @@ -6459,7 +6623,7 @@ put4: br i1 %t34, label %then5, label %ifend7 then5: %t35 = load ptr, ptr %t4 - %t36 = call ptr @fn_sconcat(ptr @.str118, ptr %t35) + %t36 = call ptr @fn_sconcat(ptr @.str124, ptr %t35) call void @fn_perr(ptr %t36) br label %ifend7 ifend7: @@ -6519,8 +6683,8 @@ then0: ifend2: %t4 = load ptr, ptr @g_cur_dir store ptr %t4, ptr %t5 - store ptr @.str119, ptr @g_cur_dir - call void @fn_do_import(ptr @.str120) + store ptr @.str125, ptr @g_cur_dir + call void @fn_do_import(ptr @.str126) %t6 = load ptr, ptr %t5 store ptr %t6, ptr @g_cur_dir br label %ret @@ -6554,10 +6718,10 @@ entry: store i32 0, ptr %t11 store ptr %t8, ptr @g_loaded_paths call void @fn_skipnl() - store ptr @.str121, ptr @g_g_game_name + store ptr @.str127, ptr @g_g_game_name br label %wcond0 wcond0: - %t12 = call i32 @fn_is_id(ptr @.str122) + %t12 = call i32 @fn_is_id(ptr @.str128) %t13 = icmp ne i32 %t12, 0 br i1 %t13, label %wbody1, label %wend2 wbody1: @@ -6583,13 +6747,13 @@ wbody1: call void @fn_skipnl() br label %wcond0 wend2: - %t31 = call i32 @fn_is_id(ptr @.str123) + %t31 = call i32 @fn_is_id(ptr @.str129) %t32 = icmp ne i32 %t31, 0 %t33 = zext i1 %t32 to i32 store i32 %t33, ptr %t30 br i1 %t32, label %scend4, label %sc3 sc3: - %t34 = call i32 @fn_is_id(ptr @.str124) + %t34 = call i32 @fn_is_id(ptr @.str130) %t35 = icmp ne i32 %t34, 0 %t36 = zext i1 %t35 to i32 store i32 %t36, ptr %t30 @@ -6605,7 +6769,7 @@ then5: %t41 = call ptr @fn_eat_id() store ptr %t41, ptr @g_g_game_name call void @fn_skipnl() - call void @fn_eat_op(ptr @.str125) + call void @fn_eat_op(ptr @.str131) br label %ifend7 ifend7: br label %wcond8 @@ -6629,7 +6793,7 @@ wbody9: then11: br label %wend10 ifend13: - %t54 = call i32 @fn_is_op(ptr @.str126) + %t54 = call i32 @fn_is_op(ptr @.str132) %t55 = icmp ne i32 %t54, 0 br i1 %t55, label %then14, label %ifend16 then14: @@ -6658,14 +6822,14 @@ entry: %t6 = call ptr @fn_eat_id() store ptr %t6, ptr %t5 call void @fn_skipnl() - call void @fn_eat_op(ptr @.str127) + call void @fn_eat_op(ptr @.str133) br label %wcond0 wcond0: %t7 = icmp ne i32 1, 0 br i1 %t7, label %wbody1, label %wend2 wbody1: call void @fn_skipnl() - %t8 = call i32 @fn_is_op(ptr @.str128) + %t8 = call i32 @fn_is_op(ptr @.str134) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then3, label %ifend5 then3: @@ -6677,12 +6841,12 @@ ifend5: %t13 = getelementptr inbounds %Str_Node, ptr %t12, i32 0, i32 1 %t14 = call ptr @fn_eat_id() store ptr %t14, ptr %t13 - call void @fn_eat_op(ptr @.str129) + call void @fn_eat_op(ptr @.str135) %t15 = load ptr, ptr %t11 %t16 = getelementptr inbounds %Str_Node, ptr %t15, i32 0, i32 3 %t17 = call ptr @fn_ptype() store ptr %t17, ptr %t16 - %t18 = call i32 @fn_is_op(ptr @.str130) + %t18 = call i32 @fn_is_op(ptr @.str136) %t19 = icmp ne i32 %t18, 0 br i1 %t19, label %then6, label %ifend8 then6: @@ -6725,7 +6889,7 @@ put10: store ptr %t43, ptr %t45 %t46 = add i32 %t31, 1 store i32 %t46, ptr %t28 - %t47 = call i32 @fn_is_op(ptr @.str131) + %t47 = call i32 @fn_is_op(ptr @.str137) %t48 = icmp ne i32 %t47, 0 br i1 %t48, label %then11, label %ifend13 then11: @@ -6736,7 +6900,7 @@ then11: ifend13: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str132) + call void @fn_eat_op(ptr @.str138) %t51 = load ptr, ptr %t3 store ptr %t51, ptr %retval br label %ret @@ -6748,7 +6912,7 @@ ret: define void @fn_skip_clause() { entry: %t2 = alloca i32 - %t0 = call i32 @fn_is_op(ptr @.str133) + %t0 = call i32 @fn_is_op(ptr @.str139) %t1 = icmp ne i32 %t0, 0 br i1 %t1, label %then0, label %ifend2 then0: @@ -6758,7 +6922,7 @@ wcond3: %t3 = icmp ne i32 1, 0 br i1 %t3, label %wbody4, label %wend5 wbody4: - %t4 = call i32 @fn_is_op(ptr @.str134) + %t4 = call i32 @fn_is_op(ptr @.str140) %t5 = icmp ne i32 %t4, 0 br i1 %t5, label %then6, label %ifend8 then6: @@ -6767,7 +6931,7 @@ then6: store i32 %t7, ptr %t2 br label %ifend8 ifend8: - %t8 = call i32 @fn_is_op(ptr @.str135) + %t8 = call i32 @fn_is_op(ptr @.str141) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then9, label %ifend11 then9: @@ -6799,308 +6963,273 @@ ret: define ptr @fn_parse_system() { entry: %retval = alloca ptr - %t7 = alloca ptr - %t13 = alloca i32 - %t15 = alloca ptr - %t22 = alloca ptr - %t25 = alloca i32 - %t48 = alloca i32 - %t49 = alloca i32 - %t50 = alloca i32 - %t84 = alloca ptr - %t125 = alloca ptr - %t132 = alloca ptr - %t0 = call i32 @fn_is_id(ptr @.str136) - %t1 = icmp ne i32 %t0, 0 - br i1 %t1, label %then0, label %ifend2 -then0: - %t2 = load i32, ptr @g_pi - %t3 = add i32 %t2, 1 - store i32 %t3, ptr @g_pi - br label %ifend2 -ifend2: - %t4 = load i32, ptr @g_pi - %t5 = add i32 %t4, 1 - store i32 %t5, ptr @g_pi - %t6 = call ptr @fn_node(i32 9) - store ptr %t6, ptr %t7 - %t8 = load ptr, ptr %t7 - %t9 = getelementptr inbounds %Str_Node, ptr %t8, i32 0, i32 1 - %t10 = call ptr @fn_eat_id() - store ptr %t10, ptr %t9 - %t11 = load ptr, ptr %t7 - %t12 = getelementptr inbounds %Str_Node, ptr %t11, i32 0, i32 3 - store ptr @.str137, ptr %t12 - store i32 0, ptr %t13 - %t14 = call ptr @fn_node(i32 21) - store ptr %t14, ptr %t15 - br label %wcond3 -wcond3: - %t16 = icmp ne i32 1, 0 - br i1 %t16, label %wbody4, label %wend5 -wbody4: + %t3 = alloca ptr + %t9 = alloca i32 + %t11 = alloca ptr + %t18 = alloca ptr + %t21 = alloca i32 + %t44 = alloca i32 + %t66 = alloca ptr + %t107 = alloca ptr + %t114 = alloca ptr + %t0 = load i32, ptr @g_pi + %t1 = add i32 %t0, 1 + store i32 %t1, ptr @g_pi + %t2 = call ptr @fn_node(i32 9) + store ptr %t2, ptr %t3 + %t4 = load ptr, ptr %t3 + %t5 = getelementptr inbounds %Str_Node, ptr %t4, i32 0, i32 1 + %t6 = call ptr @fn_eat_id() + store ptr %t6, ptr %t5 + %t7 = load ptr, ptr %t3 + %t8 = getelementptr inbounds %Str_Node, ptr %t7, i32 0, i32 3 + store ptr @.str142, ptr %t8 + store i32 0, ptr %t9 + %t10 = call ptr @fn_node(i32 21) + store ptr %t10, ptr %t11 + br label %wcond0 +wcond0: + %t12 = icmp ne i32 1, 0 + br i1 %t12, label %wbody1, label %wend2 +wbody1: call void @fn_skipnl() - %t17 = call i32 @fn_is_op(ptr @.str138) - %t18 = icmp ne i32 %t17, 0 - br i1 %t18, label %then6, label %ifend8 + %t13 = call i32 @fn_is_op(ptr @.str143) + %t14 = icmp ne i32 %t13, 0 + br i1 %t14, label %then3, label %ifend5 +then3: + %t15 = load i32, ptr @g_pi + %t16 = add i32 %t15, 1 + store i32 %t16, ptr @g_pi + %t17 = call ptr @fn_eat_id() + store ptr %t17, ptr %t18 + %t19 = call i32 @fn_is_op(ptr @.str144) + %t20 = icmp ne i32 %t19, 0 + br i1 %t20, label %then6, label %ifend8 then6: - %t19 = load i32, ptr @g_pi - %t20 = add i32 %t19, 1 - store i32 %t20, ptr @g_pi - %t21 = call ptr @fn_eat_id() - store ptr %t21, ptr %t22 - %t23 = call i32 @fn_is_op(ptr @.str139) + store i32 0, ptr %t21 + br label %wcond9 +wcond9: + %t22 = icmp ne i32 1, 0 + br i1 %t22, label %wbody10, label %wend11 +wbody10: + %t23 = call i32 @fn_is_op(ptr @.str145) %t24 = icmp ne i32 %t23, 0 - br i1 %t24, label %then9, label %ifend11 -then9: - store i32 0, ptr %t25 - br label %wcond12 -wcond12: - %t26 = icmp ne i32 1, 0 - br i1 %t26, label %wbody13, label %wend14 -wbody13: - %t27 = call i32 @fn_is_op(ptr @.str140) + br i1 %t24, label %then12, label %ifend14 +then12: + %t25 = load i32, ptr %t21 + %t26 = add i32 %t25, 1 + store i32 %t26, ptr %t21 + br label %ifend14 +ifend14: + %t27 = call i32 @fn_is_op(ptr @.str146) %t28 = icmp ne i32 %t27, 0 br i1 %t28, label %then15, label %ifend17 then15: - %t29 = load i32, ptr %t25 - %t30 = add i32 %t29, 1 - store i32 %t30, ptr %t25 + %t29 = load i32, ptr %t21 + %t30 = sub i32 %t29, 1 + store i32 %t30, ptr %t21 br label %ifend17 ifend17: - %t31 = call i32 @fn_is_op(ptr @.str141) - %t32 = icmp ne i32 %t31, 0 - br i1 %t32, label %then18, label %ifend20 + %t31 = load i32, ptr @g_pi + %t32 = add i32 %t31, 1 + store i32 %t32, ptr @g_pi + %t33 = load i32, ptr %t21 + %t34 = icmp eq i32 %t33, 0 + %t35 = zext i1 %t34 to i32 + %t36 = icmp ne i32 %t35, 0 + br i1 %t36, label %then18, label %ifend20 then18: - %t33 = load i32, ptr %t25 - %t34 = sub i32 %t33, 1 - store i32 %t34, ptr %t25 - br label %ifend20 + br label %wend11 ifend20: - %t35 = load i32, ptr @g_pi - %t36 = add i32 %t35, 1 - store i32 %t36, ptr @g_pi - %t37 = load i32, ptr %t25 - %t38 = icmp eq i32 %t37, 0 - %t39 = zext i1 %t38 to i32 - %t40 = icmp ne i32 %t39, 0 - br i1 %t40, label %then21, label %ifend23 -then21: - br label %wend14 -ifend23: - br label %wcond12 -wend14: - br label %ifend11 -ifend11: - br label %wcond3 + br label %wcond9 +wend11: + br label %ifend8 ifend8: - %t41 = call i32 @fn_is_id(ptr @.str142) - %t42 = icmp ne i32 %t41, 0 - br i1 %t42, label %then24, label %ifend26 -then24: - %t43 = load i32, ptr @g_pi - %t44 = add i32 %t43, 1 - store i32 %t44, ptr @g_pi - %t45 = load ptr, ptr %t7 - %t46 = getelementptr inbounds %Str_Node, ptr %t45, i32 0, i32 3 - %t47 = call ptr @fn_eat_id() - store ptr %t47, ptr %t46 - br label %wcond3 -ifend26: - %t51 = call i32 @fn_is_id(ptr @.str143) + br label %wcond0 +ifend5: + %t37 = call i32 @fn_is_id(ptr @.str147) + %t38 = icmp ne i32 %t37, 0 + br i1 %t38, label %then21, label %ifend23 +then21: + %t39 = load i32, ptr @g_pi + %t40 = add i32 %t39, 1 + store i32 %t40, ptr @g_pi + %t41 = load ptr, ptr %t3 + %t42 = getelementptr inbounds %Str_Node, ptr %t41, i32 0, i32 3 + %t43 = call ptr @fn_eat_id() + store ptr %t43, ptr %t42 + br label %wcond0 +ifend23: + %t45 = call i32 @fn_is_id(ptr @.str148) + %t46 = icmp ne i32 %t45, 0 + %t47 = zext i1 %t46 to i32 + store i32 %t47, ptr %t44 + br i1 %t46, label %scend25, label %sc24 +sc24: + %t48 = call i32 @fn_is_id(ptr @.str149) + %t49 = icmp ne i32 %t48, 0 + %t50 = zext i1 %t49 to i32 + store i32 %t50, ptr %t44 + br label %scend25 +scend25: + %t51 = load i32, ptr %t44 %t52 = icmp ne i32 %t51, 0 - %t53 = zext i1 %t52 to i32 - store i32 %t53, ptr %t50 - br i1 %t52, label %scend28, label %sc27 -sc27: - %t54 = call i32 @fn_is_id(ptr @.str144) - %t55 = icmp ne i32 %t54, 0 - %t56 = zext i1 %t55 to i32 - store i32 %t56, ptr %t50 - br label %scend28 -scend28: - %t57 = load i32, ptr %t50 - %t58 = icmp ne i32 %t57, 0 - %t59 = zext i1 %t58 to i32 - store i32 %t59, ptr %t49 - br i1 %t58, label %scend30, label %sc29 -sc29: - %t60 = call i32 @fn_is_id(ptr @.str145) - %t61 = icmp ne i32 %t60, 0 - %t62 = zext i1 %t61 to i32 - store i32 %t62, ptr %t49 - br label %scend30 -scend30: - %t63 = load i32, ptr %t49 - %t64 = icmp ne i32 %t63, 0 - %t65 = zext i1 %t64 to i32 - store i32 %t65, ptr %t48 - br i1 %t64, label %scend32, label %sc31 -sc31: - %t66 = call i32 @fn_is_id(ptr @.str146) - %t67 = icmp ne i32 %t66, 0 - %t68 = zext i1 %t67 to i32 - store i32 %t68, ptr %t48 - br label %scend32 -scend32: - %t69 = load i32, ptr %t48 - %t70 = icmp ne i32 %t69, 0 - br i1 %t70, label %then33, label %ifend35 -then33: - %t71 = load i32, ptr @g_pi - %t72 = add i32 %t71, 1 - store i32 %t72, ptr @g_pi + br i1 %t52, label %then26, label %ifend28 +then26: + %t53 = load i32, ptr @g_pi + %t54 = add i32 %t53, 1 + store i32 %t54, ptr @g_pi call void @fn_skip_clause() - br label %wcond3 -ifend35: - %t73 = call i32 @fn_is_id(ptr @.str147) - %t74 = icmp ne i32 %t73, 0 - br i1 %t74, label %then36, label %ifend38 -then36: - %t75 = load i32, ptr @g_pi - %t76 = add i32 %t75, 1 - store i32 %t76, ptr @g_pi - store i32 1, ptr %t13 - %t77 = call i32 @fn_is_op(ptr @.str148) - %t78 = icmp ne i32 %t77, 0 - br i1 %t78, label %then39, label %ifend41 -then39: - call void @fn_eat_op(ptr @.str149) - br label %wcond42 -wcond42: - %t79 = call i32 @fn_is_op(ptr @.str150) - %t80 = icmp eq i32 %t79, 0 - %t81 = zext i1 %t80 to i32 - %t82 = icmp ne i32 %t81, 0 - br i1 %t82, label %wbody43, label %wend44 -wbody43: - %t83 = call ptr @fn_node(i32 33) - store ptr %t83, ptr %t84 - %t85 = load ptr, ptr %t84 - %t86 = getelementptr inbounds %Str_Node, ptr %t85, i32 0, i32 1 - %t87 = call ptr @fn_eat_id() - store ptr %t87, ptr %t86 - %t88 = load ptr, ptr %t15 - %t89 = getelementptr inbounds %Str_Node, ptr %t88, i32 0, i32 7 - %t90 = load ptr, ptr %t89 - %t91 = getelementptr inbounds %LSlice, ptr %t90, i32 0, i32 1 - %t92 = getelementptr inbounds %LSlice, ptr %t90, i32 0, i32 2 - %t93 = getelementptr inbounds %LSlice, ptr %t90, i32 0, i32 0 - %t94 = load i32, ptr %t91 - %t95 = load i32, ptr %t92 - %t96 = icmp sge i32 %t94, %t95 - br i1 %t96, label %grow45, label %put46 -grow45: - %t97 = mul i32 %t95, 2 - %t98 = icmp eq i32 %t95, 0 - %t99 = select i1 %t98, i32 8, i32 %t97 - %t100 = getelementptr ptr, ptr null, i32 1 - %t101 = ptrtoint ptr %t100 to i64 - %t102 = zext i32 %t99 to i64 - %t103 = mul i64 %t102, %t101 - %t104 = load ptr, ptr %t93 - %t105 = call ptr @realloc(ptr %t104, i64 %t103) - store ptr %t105, ptr %t93 - store i32 %t99, ptr %t92 - br label %put46 -put46: - %t106 = load ptr, ptr %t84 - %t107 = load ptr, ptr %t93 - %t108 = getelementptr inbounds ptr, ptr %t107, i32 %t94 - store ptr %t106, ptr %t108 - %t109 = add i32 %t94, 1 - store i32 %t109, ptr %t91 - %t110 = call i32 @fn_is_op(ptr @.str151) - %t111 = icmp ne i32 %t110, 0 - br i1 %t111, label %then47, label %ifend49 -then47: - %t112 = load i32, ptr @g_pi - %t113 = add i32 %t112, 1 - store i32 %t113, ptr @g_pi - br label %ifend49 -ifend49: - br label %wcond42 -wend44: + br label %wcond0 +ifend28: + %t55 = call i32 @fn_is_id(ptr @.str150) + %t56 = icmp ne i32 %t55, 0 + br i1 %t56, label %then29, label %ifend31 +then29: + %t57 = load i32, ptr @g_pi + %t58 = add i32 %t57, 1 + store i32 %t58, ptr @g_pi + store i32 1, ptr %t9 + %t59 = call i32 @fn_is_op(ptr @.str151) + %t60 = icmp ne i32 %t59, 0 + br i1 %t60, label %then32, label %ifend34 +then32: call void @fn_eat_op(ptr @.str152) - br label %ifend41 -ifend41: - %t114 = load ptr, ptr %t15 - %t115 = getelementptr inbounds %Str_Node, ptr %t114, i32 0, i32 6 - %t116 = call ptr @fn_parse_query_tail() - store ptr %t116, ptr %t115 - %t117 = load ptr, ptr %t15 - %t118 = getelementptr inbounds %Str_Node, ptr %t117, i32 0, i32 5 - %t119 = load ptr, ptr %t15 - %t120 = getelementptr inbounds %Str_Node, ptr %t119, i32 0, i32 6 - %t121 = load ptr, ptr %t120 - %t122 = getelementptr inbounds %Str_Node, ptr %t121, i32 0, i32 4 - %t123 = load ptr, ptr %t122 - store ptr %t123, ptr %t118 - br label %wcond3 -ifend38: - br label %wend5 -wend5: + br label %wcond35 +wcond35: + %t61 = call i32 @fn_is_op(ptr @.str153) + %t62 = icmp eq i32 %t61, 0 + %t63 = zext i1 %t62 to i32 + %t64 = icmp ne i32 %t63, 0 + br i1 %t64, label %wbody36, label %wend37 +wbody36: + %t65 = call ptr @fn_node(i32 33) + store ptr %t65, ptr %t66 + %t67 = load ptr, ptr %t66 + %t68 = getelementptr inbounds %Str_Node, ptr %t67, i32 0, i32 1 + %t69 = call ptr @fn_eat_id() + store ptr %t69, ptr %t68 + %t70 = load ptr, ptr %t11 + %t71 = getelementptr inbounds %Str_Node, ptr %t70, i32 0, i32 7 + %t72 = load ptr, ptr %t71 + %t73 = getelementptr inbounds %LSlice, ptr %t72, i32 0, i32 1 + %t74 = getelementptr inbounds %LSlice, ptr %t72, i32 0, i32 2 + %t75 = getelementptr inbounds %LSlice, ptr %t72, i32 0, i32 0 + %t76 = load i32, ptr %t73 + %t77 = load i32, ptr %t74 + %t78 = icmp sge i32 %t76, %t77 + br i1 %t78, label %grow38, label %put39 +grow38: + %t79 = mul i32 %t77, 2 + %t80 = icmp eq i32 %t77, 0 + %t81 = select i1 %t80, i32 8, i32 %t79 + %t82 = getelementptr ptr, ptr null, i32 1 + %t83 = ptrtoint ptr %t82 to i64 + %t84 = zext i32 %t81 to i64 + %t85 = mul i64 %t84, %t83 + %t86 = load ptr, ptr %t75 + %t87 = call ptr @realloc(ptr %t86, i64 %t85) + store ptr %t87, ptr %t75 + store i32 %t81, ptr %t74 + br label %put39 +put39: + %t88 = load ptr, ptr %t66 + %t89 = load ptr, ptr %t75 + %t90 = getelementptr inbounds ptr, ptr %t89, i32 %t76 + store ptr %t88, ptr %t90 + %t91 = add i32 %t76, 1 + store i32 %t91, ptr %t73 + %t92 = call i32 @fn_is_op(ptr @.str154) + %t93 = icmp ne i32 %t92, 0 + br i1 %t93, label %then40, label %ifend42 +then40: + %t94 = load i32, ptr @g_pi + %t95 = add i32 %t94, 1 + store i32 %t95, ptr @g_pi + br label %ifend42 +ifend42: + br label %wcond35 +wend37: + call void @fn_eat_op(ptr @.str155) + br label %ifend34 +ifend34: + %t96 = load ptr, ptr %t11 + %t97 = getelementptr inbounds %Str_Node, ptr %t96, i32 0, i32 6 + %t98 = call ptr @fn_parse_query_tail() + store ptr %t98, ptr %t97 + %t99 = load ptr, ptr %t11 + %t100 = getelementptr inbounds %Str_Node, ptr %t99, i32 0, i32 5 + %t101 = load ptr, ptr %t11 + %t102 = getelementptr inbounds %Str_Node, ptr %t101, i32 0, i32 6 + %t103 = load ptr, ptr %t102 + %t104 = getelementptr inbounds %Str_Node, ptr %t103, i32 0, i32 4 + %t105 = load ptr, ptr %t104 + store ptr %t105, ptr %t100 + br label %wcond0 +ifend31: + br label %wend2 +wend2: call void @fn_skipnl() - %t124 = call ptr @fn_block() - store ptr %t124, ptr %t125 - %t126 = load i32, ptr %t13 - %t127 = icmp ne i32 %t126, 0 - br i1 %t127, label %then50, label %else51 -then50: - %t128 = load ptr, ptr %t15 - %t129 = getelementptr inbounds %Str_Node, ptr %t128, i32 0, i32 4 - %t130 = load ptr, ptr %t125 - store ptr %t130, ptr %t129 - %t131 = call ptr @fn_node(i32 7) - store ptr %t131, ptr %t132 - %t133 = load ptr, ptr %t132 - %t134 = getelementptr inbounds %Str_Node, ptr %t133, i32 0, i32 7 - %t135 = load ptr, ptr %t134 - %t136 = getelementptr inbounds %LSlice, ptr %t135, i32 0, i32 1 - %t137 = getelementptr inbounds %LSlice, ptr %t135, i32 0, i32 2 - %t138 = getelementptr inbounds %LSlice, ptr %t135, i32 0, i32 0 - %t139 = load i32, ptr %t136 - %t140 = load i32, ptr %t137 - %t141 = icmp sge i32 %t139, %t140 - br i1 %t141, label %grow53, label %put54 -grow53: - %t142 = mul i32 %t140, 2 - %t143 = icmp eq i32 %t140, 0 - %t144 = select i1 %t143, i32 8, i32 %t142 - %t145 = getelementptr ptr, ptr null, i32 1 - %t146 = ptrtoint ptr %t145 to i64 - %t147 = zext i32 %t144 to i64 - %t148 = mul i64 %t147, %t146 - %t149 = load ptr, ptr %t138 - %t150 = call ptr @realloc(ptr %t149, i64 %t148) - store ptr %t150, ptr %t138 - store i32 %t144, ptr %t137 - br label %put54 -put54: - %t151 = load ptr, ptr %t15 - %t152 = load ptr, ptr %t138 - %t153 = getelementptr inbounds ptr, ptr %t152, i32 %t139 - store ptr %t151, ptr %t153 - %t154 = add i32 %t139, 1 - store i32 %t154, ptr %t136 - %t155 = load ptr, ptr %t7 - %t156 = getelementptr inbounds %Str_Node, ptr %t155, i32 0, i32 4 - %t157 = load ptr, ptr %t132 - store ptr %t157, ptr %t156 - br label %ifend52 -else51: - %t158 = load ptr, ptr %t7 - %t159 = getelementptr inbounds %Str_Node, ptr %t158, i32 0, i32 4 - %t160 = load ptr, ptr %t125 - store ptr %t160, ptr %t159 - br label %ifend52 -ifend52: - %t161 = load ptr, ptr %t7 - store ptr %t161, ptr %retval + %t106 = call ptr @fn_block() + store ptr %t106, ptr %t107 + %t108 = load i32, ptr %t9 + %t109 = icmp ne i32 %t108, 0 + br i1 %t109, label %then43, label %else44 +then43: + %t110 = load ptr, ptr %t11 + %t111 = getelementptr inbounds %Str_Node, ptr %t110, i32 0, i32 4 + %t112 = load ptr, ptr %t107 + store ptr %t112, ptr %t111 + %t113 = call ptr @fn_node(i32 7) + store ptr %t113, ptr %t114 + %t115 = load ptr, ptr %t114 + %t116 = getelementptr inbounds %Str_Node, ptr %t115, i32 0, i32 7 + %t117 = load ptr, ptr %t116 + %t118 = getelementptr inbounds %LSlice, ptr %t117, i32 0, i32 1 + %t119 = getelementptr inbounds %LSlice, ptr %t117, i32 0, i32 2 + %t120 = getelementptr inbounds %LSlice, ptr %t117, i32 0, i32 0 + %t121 = load i32, ptr %t118 + %t122 = load i32, ptr %t119 + %t123 = icmp sge i32 %t121, %t122 + br i1 %t123, label %grow46, label %put47 +grow46: + %t124 = mul i32 %t122, 2 + %t125 = icmp eq i32 %t122, 0 + %t126 = select i1 %t125, i32 8, i32 %t124 + %t127 = getelementptr ptr, ptr null, i32 1 + %t128 = ptrtoint ptr %t127 to i64 + %t129 = zext i32 %t126 to i64 + %t130 = mul i64 %t129, %t128 + %t131 = load ptr, ptr %t120 + %t132 = call ptr @realloc(ptr %t131, i64 %t130) + store ptr %t132, ptr %t120 + store i32 %t126, ptr %t119 + br label %put47 +put47: + %t133 = load ptr, ptr %t11 + %t134 = load ptr, ptr %t120 + %t135 = getelementptr inbounds ptr, ptr %t134, i32 %t121 + store ptr %t133, ptr %t135 + %t136 = add i32 %t121, 1 + store i32 %t136, ptr %t118 + %t137 = load ptr, ptr %t3 + %t138 = getelementptr inbounds %Str_Node, ptr %t137, i32 0, i32 4 + %t139 = load ptr, ptr %t114 + store ptr %t139, ptr %t138 + br label %ifend45 +else44: + %t140 = load ptr, ptr %t3 + %t141 = getelementptr inbounds %Str_Node, ptr %t140, i32 0, i32 4 + %t142 = load ptr, ptr %t107 + store ptr %t142, ptr %t141 + br label %ifend45 +ifend45: + %t143 = load ptr, ptr %t3 + store ptr %t143, ptr %retval br label %ret ret: - %t162 = load ptr, ptr %retval - ret ptr %t162 + %t144 = load ptr, ptr %retval + ret ptr %t144 } define ptr @fn_parse_query_tail() { @@ -7109,18 +7238,18 @@ entry: %t1 = alloca ptr %t11 = alloca ptr %t40 = alloca ptr - call void @fn_eat_op(ptr @.str153) + call void @fn_eat_op(ptr @.str156) %t0 = call ptr @fn_node(i32 7) store ptr %t0, ptr %t1 br label %wcond0 wcond0: - %t2 = call i32 @fn_is_op(ptr @.str154) + %t2 = call i32 @fn_is_op(ptr @.str157) %t3 = icmp eq i32 %t2, 0 %t4 = zext i1 %t3 to i32 %t5 = icmp ne i32 %t4, 0 br i1 %t5, label %wbody1, label %wend2 wbody1: - %t6 = call i32 @fn_is_op(ptr @.str155) + %t6 = call i32 @fn_is_op(ptr @.str158) %t7 = icmp ne i32 %t6, 0 br i1 %t7, label %then3, label %else4 then3: @@ -7166,7 +7295,7 @@ put7: store ptr %t35, ptr %t37 %t38 = add i32 %t23, 1 store i32 %t38, ptr %t20 - call void @fn_eat_op(ptr @.str156) + call void @fn_eat_op(ptr @.str159) br label %ifend5 else4: %t39 = call ptr @fn_node(i32 33) @@ -7210,7 +7339,7 @@ put9: store i32 %t67, ptr %t49 br label %ifend5 ifend5: - %t68 = call i32 @fn_is_op(ptr @.str157) + %t68 = call i32 @fn_is_op(ptr @.str160) %t69 = icmp ne i32 %t68, 0 br i1 %t69, label %then10, label %ifend12 then10: @@ -7221,8 +7350,8 @@ then10: ifend12: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str158) - %t72 = call i32 @fn_is_id(ptr @.str159) + call void @fn_eat_op(ptr @.str161) + %t72 = call i32 @fn_is_id(ptr @.str162) %t73 = icmp ne i32 %t72, 0 br i1 %t73, label %then13, label %ifend15 then13: @@ -7252,10 +7381,10 @@ entry: %t40 = alloca ptr %t0 = call ptr @fn_node(i32 21) store ptr %t0, ptr %t1 - call void @fn_eat_op(ptr @.str160) + call void @fn_eat_op(ptr @.str163) br label %wcond0 wcond0: - %t2 = call i32 @fn_is_op(ptr @.str161) + %t2 = call i32 @fn_is_op(ptr @.str164) %t3 = icmp eq i32 %t2, 0 %t4 = zext i1 %t3 to i32 %t5 = icmp ne i32 %t4, 0 @@ -7297,7 +7426,7 @@ put4: store ptr %t29, ptr %t31 %t32 = add i32 %t17, 1 store i32 %t32, ptr %t14 - %t33 = call i32 @fn_is_op(ptr @.str162) + %t33 = call i32 @fn_is_op(ptr @.str165) %t34 = icmp ne i32 %t33, 0 br i1 %t34, label %then5, label %ifend7 then5: @@ -7308,7 +7437,7 @@ then5: ifend7: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str163) + call void @fn_eat_op(ptr @.str166) %t37 = call ptr @fn_eat_id() store ptr %t37, ptr %t38 %t39 = call ptr @fn_eat_id() @@ -7352,14 +7481,14 @@ entry: %t6 = call ptr @fn_eat_id() store ptr %t6, ptr %t5 call void @fn_skipnl() - call void @fn_eat_op(ptr @.str164) + call void @fn_eat_op(ptr @.str167) br label %wcond0 wcond0: %t7 = icmp ne i32 1, 0 br i1 %t7, label %wbody1, label %wend2 wbody1: call void @fn_skipnl() - %t8 = call i32 @fn_is_op(ptr @.str165) + %t8 = call i32 @fn_is_op(ptr @.str168) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then3, label %ifend5 then3: @@ -7371,7 +7500,6 @@ ifend5: %t13 = getelementptr inbounds %Str_Node, ptr %t12, i32 0, i32 1 %t14 = call ptr @fn_eat_id() store ptr %t14, ptr %t13 - call void @fn_eat_op(ptr @.str166) %t15 = load ptr, ptr %t11 %t16 = getelementptr inbounds %Str_Node, ptr %t15, i32 0, i32 4 %t17 = call ptr @fn_record() @@ -7406,7 +7534,7 @@ put7: store ptr %t36, ptr %t38 %t39 = add i32 %t24, 1 store i32 %t39, ptr %t21 - %t40 = call i32 @fn_is_op(ptr @.str167) + %t40 = call i32 @fn_is_op(ptr @.str169) %t41 = icmp ne i32 %t40, 0 br i1 %t41, label %then8, label %ifend10 then8: @@ -7417,7 +7545,7 @@ then8: ifend10: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str168) + call void @fn_eat_op(ptr @.str170) %t44 = load ptr, ptr %t3 store ptr %t44, ptr %retval br label %ret @@ -7426,7 +7554,7 @@ ret: ret ptr %t45 } -define ptr @fn_parse_archetype() { +define ptr @fn_parse_enum() { entry: %retval = alloca ptr %t3 = alloca ptr @@ -7434,21 +7562,21 @@ entry: %t0 = load i32, ptr @g_pi %t1 = add i32 %t0, 1 store i32 %t1, ptr @g_pi - %t2 = call ptr @fn_node(i32 10) + %t2 = call ptr @fn_node(i32 27) store ptr %t2, ptr %t3 %t4 = load ptr, ptr %t3 %t5 = getelementptr inbounds %Str_Node, ptr %t4, i32 0, i32 1 %t6 = call ptr @fn_eat_id() store ptr %t6, ptr %t5 call void @fn_skipnl() - call void @fn_eat_op(ptr @.str169) + call void @fn_eat_op(ptr @.str171) br label %wcond0 wcond0: %t7 = icmp ne i32 1, 0 br i1 %t7, label %wbody1, label %wend2 wbody1: call void @fn_skipnl() - %t8 = call i32 @fn_is_op(ptr @.str170) + %t8 = call i32 @fn_is_op(ptr @.str172) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then3, label %ifend5 then3: @@ -7490,7 +7618,7 @@ put7: store ptr %t33, ptr %t35 %t36 = add i32 %t21, 1 store i32 %t36, ptr %t18 - %t37 = call i32 @fn_is_op(ptr @.str171) + %t37 = call i32 @fn_is_op(ptr @.str173) %t38 = icmp ne i32 %t37, 0 br i1 %t38, label %then8, label %ifend10 then8: @@ -7502,7 +7630,92 @@ ifend10: call void @fn_skipnl() br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str172) + call void @fn_eat_op(ptr @.str174) + %t41 = load ptr, ptr %t3 + store ptr %t41, ptr %retval + br label %ret +ret: + %t42 = load ptr, ptr %retval + ret ptr %t42 +} + +define ptr @fn_parse_archetype() { +entry: + %retval = alloca ptr + %t3 = alloca ptr + %t11 = alloca ptr + %t0 = load i32, ptr @g_pi + %t1 = add i32 %t0, 1 + store i32 %t1, ptr @g_pi + %t2 = call ptr @fn_node(i32 10) + store ptr %t2, ptr %t3 + %t4 = load ptr, ptr %t3 + %t5 = getelementptr inbounds %Str_Node, ptr %t4, i32 0, i32 1 + %t6 = call ptr @fn_eat_id() + store ptr %t6, ptr %t5 + call void @fn_skipnl() + call void @fn_eat_op(ptr @.str175) + br label %wcond0 +wcond0: + %t7 = icmp ne i32 1, 0 + br i1 %t7, label %wbody1, label %wend2 +wbody1: + call void @fn_skipnl() + %t8 = call i32 @fn_is_op(ptr @.str176) + %t9 = icmp ne i32 %t8, 0 + br i1 %t9, label %then3, label %ifend5 +then3: + br label %wend2 +ifend5: + %t10 = call ptr @fn_node(i32 33) + store ptr %t10, ptr %t11 + %t12 = load ptr, ptr %t11 + %t13 = getelementptr inbounds %Str_Node, ptr %t12, i32 0, i32 1 + %t14 = call ptr @fn_eat_id() + store ptr %t14, ptr %t13 + %t15 = load ptr, ptr %t3 + %t16 = getelementptr inbounds %Str_Node, ptr %t15, i32 0, i32 7 + %t17 = load ptr, ptr %t16 + %t18 = getelementptr inbounds %LSlice, ptr %t17, i32 0, i32 1 + %t19 = getelementptr inbounds %LSlice, ptr %t17, i32 0, i32 2 + %t20 = getelementptr inbounds %LSlice, ptr %t17, i32 0, i32 0 + %t21 = load i32, ptr %t18 + %t22 = load i32, ptr %t19 + %t23 = icmp sge i32 %t21, %t22 + br i1 %t23, label %grow6, label %put7 +grow6: + %t24 = mul i32 %t22, 2 + %t25 = icmp eq i32 %t22, 0 + %t26 = select i1 %t25, i32 8, i32 %t24 + %t27 = getelementptr ptr, ptr null, i32 1 + %t28 = ptrtoint ptr %t27 to i64 + %t29 = zext i32 %t26 to i64 + %t30 = mul i64 %t29, %t28 + %t31 = load ptr, ptr %t20 + %t32 = call ptr @realloc(ptr %t31, i64 %t30) + store ptr %t32, ptr %t20 + store i32 %t26, ptr %t19 + br label %put7 +put7: + %t33 = load ptr, ptr %t11 + %t34 = load ptr, ptr %t20 + %t35 = getelementptr inbounds ptr, ptr %t34, i32 %t21 + store ptr %t33, ptr %t35 + %t36 = add i32 %t21, 1 + store i32 %t36, ptr %t18 + %t37 = call i32 @fn_is_op(ptr @.str177) + %t38 = icmp ne i32 %t37, 0 + br i1 %t38, label %then8, label %ifend10 +then8: + %t39 = load i32, ptr @g_pi + %t40 = add i32 %t39, 1 + store i32 %t40, ptr @g_pi + br label %ifend10 +ifend10: + call void @fn_skipnl() + br label %wcond0 +wend2: + call void @fn_eat_op(ptr @.str178) %t41 = load ptr, ptr %t3 store ptr %t41, ptr %retval br label %ret @@ -7529,10 +7742,10 @@ entry: %t7 = getelementptr inbounds %Str_Node, ptr %t6, i32 0, i32 1 %t8 = call ptr @fn_eat_id() store ptr %t8, ptr %t7 - call void @fn_eat_op(ptr @.str173) + call void @fn_eat_op(ptr @.str179) br label %wcond0 wcond0: - %t9 = call i32 @fn_is_op(ptr @.str174) + %t9 = call i32 @fn_is_op(ptr @.str180) %t10 = icmp eq i32 %t9, 0 %t11 = zext i1 %t10 to i32 %t12 = icmp ne i32 %t11, 0 @@ -7544,7 +7757,7 @@ wbody1: %t16 = getelementptr inbounds %Str_Node, ptr %t15, i32 0, i32 1 %t17 = call ptr @fn_eat_id() store ptr %t17, ptr %t16 - call void @fn_eat_op(ptr @.str175) + call void @fn_eat_op(ptr @.str181) %t18 = load ptr, ptr %t14 %t19 = getelementptr inbounds %Str_Node, ptr %t18, i32 0, i32 3 %t20 = call ptr @fn_ptype() @@ -7579,7 +7792,7 @@ put4: store ptr %t39, ptr %t41 %t42 = add i32 %t27, 1 store i32 %t42, ptr %t24 - %t43 = call i32 @fn_is_op(ptr @.str176) + %t43 = call i32 @fn_is_op(ptr @.str182) %t44 = icmp ne i32 %t43, 0 br i1 %t44, label %then5, label %ifend7 then5: @@ -7590,11 +7803,11 @@ then5: ifend7: br label %wcond0 wend2: - call void @fn_eat_op(ptr @.str177) + call void @fn_eat_op(ptr @.str183) %t47 = load ptr, ptr %t5 %t48 = getelementptr inbounds %Str_Node, ptr %t47, i32 0, i32 3 - store ptr @.str178, ptr %t48 - %t49 = call i32 @fn_is_op(ptr @.str179) + store ptr @.str184, ptr %t48 + %t49 = call i32 @fn_is_op(ptr @.str185) %t50 = icmp ne i32 %t49, 0 br i1 %t50, label %then8, label %ifend10 then8: @@ -7607,7 +7820,7 @@ then8: store ptr %t55, ptr %t54 br label %ifend10 ifend10: - call void @fn_eat_op(ptr @.str180) + call void @fn_eat_op(ptr @.str186) %t56 = load ptr, ptr @g_toks %t57 = getelementptr inbounds %LSlice, ptr %t56, i32 0, i32 0 %t58 = load ptr, ptr %t57 @@ -7703,7 +7916,7 @@ sc5: %t44 = load ptr, ptr %t43 %t45 = getelementptr inbounds %Str_Tok, ptr %t44, i32 0, i32 1 %t46 = load ptr, ptr %t45 - %t47 = call i32 @fn_streq(ptr %t46, ptr @.str181) + %t47 = call i32 @fn_streq(ptr %t46, ptr @.str187) %t48 = icmp ne i32 %t47, 0 %t49 = zext i1 %t48 to i32 store i32 %t49, ptr %t8 @@ -7719,7 +7932,7 @@ wbody1: %t55 = getelementptr inbounds %Str_Node, ptr %t54, i32 0, i32 1 %t56 = call ptr @fn_eat_id() store ptr %t56, ptr %t55 - call void @fn_eat_op(ptr @.str182) + call void @fn_eat_op(ptr @.str188) %t57 = load ptr, ptr %t53 %t58 = getelementptr inbounds %Str_Node, ptr %t57, i32 0, i32 4 %t59 = call ptr @fn_expr() @@ -7759,7 +7972,7 @@ put8: br label %wcond0 wend2: call void @fn_skipnl() - %t84 = call i32 @fn_is_op(ptr @.str183) + %t84 = call i32 @fn_is_op(ptr @.str189) %t85 = icmp ne i32 %t84, 0 br i1 %t85, label %then9, label %ifend11 then9: @@ -7772,7 +7985,7 @@ wcond12: br i1 %t88, label %wbody13, label %wend14 wbody13: call void @fn_skipnl() - %t89 = call i32 @fn_is_op(ptr @.str184) + %t89 = call i32 @fn_is_op(ptr @.str190) %t90 = icmp ne i32 %t89, 0 br i1 %t90, label %then15, label %ifend17 then15: @@ -7810,7 +8023,7 @@ put19: store i32 %t112, ptr %t94 br label %wcond12 wend14: - call void @fn_eat_op(ptr @.str185) + call void @fn_eat_op(ptr @.str191) br label %ifend11 ifend11: %t113 = load ptr, ptr %t1 @@ -7838,14 +8051,14 @@ entry: %t8 = getelementptr inbounds %Str_Node, ptr %t7, i32 0, i32 2 store i32 1, ptr %t8 call void @fn_skipnl() - call void @fn_eat_op(ptr @.str186) + call void @fn_eat_op(ptr @.str192) call void @fn_skipnl() %t9 = load ptr, ptr %t3 %t10 = getelementptr inbounds %Str_Node, ptr %t9, i32 0, i32 4 %t11 = call ptr @fn_parse_widget() store ptr %t11, ptr %t10 call void @fn_skipnl() - call void @fn_eat_op(ptr @.str187) + call void @fn_eat_op(ptr @.str193) %t12 = load ptr, ptr %t3 store ptr %t12, ptr %retval br label %ret @@ -7918,23 +8131,23 @@ entry: store ptr %arg_llt, ptr %t0 %t1 = load i32, ptr @g_ll_t %t2 = call ptr @fn_itoa(i32 %t1) - %t3 = call ptr @fn_sconcat(ptr @.str188, ptr %t2) + %t3 = call ptr @fn_sconcat(ptr @.str194, ptr %t2) store ptr %t3, ptr %t4 %t5 = load i32, ptr @g_ll_t %t6 = add i32 %t5, 1 store i32 %t6, ptr @g_ll_t %t7 = load ptr, ptr @g_falloc - call void @fn_buf_puts(ptr %t7, ptr @.str189) + call void @fn_buf_puts(ptr %t7, ptr @.str195) %t8 = load ptr, ptr @g_falloc %t9 = load ptr, ptr %t4 call void @fn_buf_puts(ptr %t8, ptr %t9) %t10 = load ptr, ptr @g_falloc - call void @fn_buf_puts(ptr %t10, ptr @.str190) + call void @fn_buf_puts(ptr %t10, ptr @.str196) %t11 = load ptr, ptr @g_falloc %t12 = load ptr, ptr %t0 call void @fn_buf_puts(ptr %t11, ptr %t12) %t13 = load ptr, ptr @g_falloc - call void @fn_buf_puts(ptr %t13, ptr @.str191) + call void @fn_buf_puts(ptr %t13, ptr @.str197) %t14 = load ptr, ptr %t4 store ptr %t14, ptr %retval br label %ret @@ -8041,7 +8254,7 @@ entry: %t3 = alloca ptr %t0 = load i32, ptr @g_ll_t %t1 = call ptr @fn_itoa(i32 %t0) - %t2 = call ptr @fn_sconcat(ptr @.str192, ptr %t1) + %t2 = call ptr @fn_sconcat(ptr @.str198, ptr %t1) store ptr %t2, ptr %t3 %t4 = load i32, ptr @g_ll_t %t5 = add i32 %t4, 1 @@ -8084,14 +8297,14 @@ entry: %t2 = alloca i32 store ptr %arg_t, ptr %t0 %t3 = load ptr, ptr %t0 - %t4 = call i32 @fn_streq(ptr %t3, ptr @.str193) + %t4 = call i32 @fn_streq(ptr %t3, ptr @.str199) %t5 = icmp ne i32 %t4, 0 %t6 = zext i1 %t5 to i32 store i32 %t6, ptr %t2 br i1 %t5, label %scend1, label %sc0 sc0: %t7 = load ptr, ptr %t0 - %t8 = call i32 @fn_streq(ptr %t7, ptr @.str194) + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str200) %t9 = icmp ne i32 %t8, 0 %t10 = zext i1 %t9 to i32 store i32 %t10, ptr %t2 @@ -8104,7 +8317,7 @@ scend1: br i1 %t12, label %scend3, label %sc2 sc2: %t14 = load ptr, ptr %t0 - %t15 = call i32 @fn_streq(ptr %t14, ptr @.str195) + %t15 = call i32 @fn_streq(ptr %t14, ptr @.str201) %t16 = icmp ne i32 %t15, 0 %t17 = zext i1 %t16 to i32 store i32 %t17, ptr %t1 @@ -8114,18 +8327,18 @@ scend3: %t19 = icmp ne i32 %t18, 0 br i1 %t19, label %then4, label %ifend6 then4: - store ptr @.str196, ptr %retval + store ptr @.str202, ptr %retval br label %ret ifend6: %t20 = load ptr, ptr %t0 - %t21 = call i32 @fn_streq(ptr %t20, ptr @.str197) + %t21 = call i32 @fn_streq(ptr %t20, ptr @.str203) %t22 = icmp ne i32 %t21, 0 br i1 %t22, label %then7, label %ifend9 then7: - store ptr @.str198, ptr %retval + store ptr @.str204, ptr %retval br label %ret ifend9: - store ptr @.str199, ptr %retval + store ptr @.str205, ptr %retval br label %ret ret: %t23 = load ptr, ptr %retval @@ -8449,12 +8662,12 @@ entry: br i1 %t7, label %then0, label %ifend2 then0: %t8 = load ptr, ptr %t0 - %t9 = call ptr @fn_sconcat(ptr @.str200, ptr %t8) + %t9 = call ptr @fn_sconcat(ptr @.str206, ptr %t8) store ptr %t9, ptr %retval br label %ret ifend2: %t10 = load ptr, ptr %t0 - %t11 = call ptr @fn_sconcat(ptr @.str201, ptr %t10) + %t11 = call ptr @fn_sconcat(ptr @.str207, ptr %t10) store ptr %t11, ptr %retval br label %ret ret: @@ -8571,7 +8784,7 @@ ifend5: store i32 %t36, ptr %t2 br label %wcond0 wend2: - store ptr @.str202, ptr %retval + store ptr @.str208, ptr %retval br label %ret ret: %t37 = load ptr, ptr %retval @@ -8674,6 +8887,113 @@ ret: ret ptr %t54 } +define i32 @fn_enum_ordinal(ptr %arg_ename, ptr %arg_vname) { +entry: + %retval = alloca i32 + %t0 = alloca ptr + %t1 = alloca ptr + %t2 = alloca i32 + %t16 = alloca ptr + %t17 = alloca i32 + %t34 = alloca i32 + store ptr %arg_ename, ptr %t0 + store ptr %arg_vname, ptr %t1 + store i32 0, ptr %t2 + br label %wcond0 +wcond0: + %t3 = load i32, ptr %t2 + %t4 = load ptr, ptr @g_prog + %t5 = getelementptr inbounds %LSlice, ptr %t4, i32 0, i32 1 + %t6 = load i32, ptr %t5 + %t7 = icmp slt i32 %t3, %t6 + %t8 = zext i1 %t7 to i32 + %t9 = icmp ne i32 %t8, 0 + br i1 %t9, label %wbody1, label %wend2 +wbody1: + %t10 = load ptr, ptr @g_prog + %t11 = getelementptr inbounds %LSlice, ptr %t10, i32 0, i32 0 + %t12 = load ptr, ptr %t11 + %t13 = load i32, ptr %t2 + %t14 = getelementptr inbounds ptr, ptr %t12, i32 %t13 + %t15 = load ptr, ptr %t14 + store ptr %t15, ptr %t16 + %t18 = load ptr, ptr %t16 + %t19 = getelementptr inbounds %Str_Node, ptr %t18, i32 0, i32 0 + %t20 = load i32, ptr %t19 + %t21 = icmp eq i32 %t20, 27 + %t22 = zext i1 %t21 to i32 + %t23 = icmp ne i32 %t22, 0 + %t24 = zext i1 %t23 to i32 + store i32 %t24, ptr %t17 + br i1 %t23, label %sc3, label %scend4 +sc3: + %t25 = load ptr, ptr %t16 + %t26 = getelementptr inbounds %Str_Node, ptr %t25, i32 0, i32 1 + %t27 = load ptr, ptr %t26 + %t28 = load ptr, ptr %t0 + %t29 = call i32 @fn_streq(ptr %t27, ptr %t28) + %t30 = icmp ne i32 %t29, 0 + %t31 = zext i1 %t30 to i32 + store i32 %t31, ptr %t17 + br label %scend4 +scend4: + %t32 = load i32, ptr %t17 + %t33 = icmp ne i32 %t32, 0 + br i1 %t33, label %then5, label %ifend7 +then5: + store i32 0, ptr %t34 + br label %wcond8 +wcond8: + %t35 = load i32, ptr %t34 + %t36 = load ptr, ptr %t16 + %t37 = getelementptr inbounds %Str_Node, ptr %t36, i32 0, i32 7 + %t38 = load ptr, ptr %t37 + %t39 = getelementptr inbounds %LSlice, ptr %t38, i32 0, i32 1 + %t40 = load i32, ptr %t39 + %t41 = icmp slt i32 %t35, %t40 + %t42 = zext i1 %t41 to i32 + %t43 = icmp ne i32 %t42, 0 + br i1 %t43, label %wbody9, label %wend10 +wbody9: + %t44 = load ptr, ptr %t16 + %t45 = getelementptr inbounds %Str_Node, ptr %t44, i32 0, i32 7 + %t46 = load ptr, ptr %t45 + %t47 = getelementptr inbounds %LSlice, ptr %t46, i32 0, i32 0 + %t48 = load ptr, ptr %t47 + %t49 = load i32, ptr %t34 + %t50 = getelementptr inbounds ptr, ptr %t48, i32 %t49 + %t51 = load ptr, ptr %t50 + %t52 = getelementptr inbounds %Str_Node, ptr %t51, i32 0, i32 1 + %t53 = load ptr, ptr %t52 + %t54 = load ptr, ptr %t1 + %t55 = call i32 @fn_streq(ptr %t53, ptr %t54) + %t56 = icmp ne i32 %t55, 0 + br i1 %t56, label %then11, label %ifend13 +then11: + %t57 = load i32, ptr %t34 + store i32 %t57, ptr %retval + br label %ret +ifend13: + %t58 = load i32, ptr %t34 + %t59 = add i32 %t58, 1 + store i32 %t59, ptr %t34 + br label %wcond8 +wend10: + br label %ifend7 +ifend7: + %t60 = load i32, ptr %t2 + %t61 = add i32 %t60, 1 + store i32 %t61, ptr %t2 + br label %wcond0 +wend2: + %t62 = sub i32 0, 1 + store i32 %t62, ptr %retval + br label %ret +ret: + %t63 = load i32, ptr %retval + ret i32 %t63 +} + define ptr @fn_find_fn(ptr %arg_name) { entry: %retval = alloca ptr @@ -8967,7 +9287,7 @@ entry: store ptr %arg_s, ptr %t0 %t1 = load i32, ptr @g_ll_str %t2 = call ptr @fn_itoa(i32 %t1) - %t3 = call ptr @fn_sconcat(ptr @.str203, ptr %t2) + %t3 = call ptr @fn_sconcat(ptr @.str209, ptr %t2) store ptr %t3, ptr %t4 %t5 = load i32, ptr @g_ll_str %t6 = add i32 %t5, 1 @@ -8977,12 +9297,12 @@ entry: store i32 %t8, ptr %t9 %t10 = load ptr, ptr %t4 call void @fn_emith(ptr %t10) - call void @fn_emith(ptr @.str204) + call void @fn_emith(ptr @.str210) %t11 = load i32, ptr %t9 %t12 = add i32 %t11, 1 %t13 = call ptr @fn_itoa(i32 %t12) call void @fn_emith(ptr %t13) - call void @fn_emith(ptr @.str205) + call void @fn_emith(ptr @.str211) store i32 0, ptr %t14 br label %wcond0 wcond0: @@ -9071,7 +9391,7 @@ ifend11: store i32 %t69, ptr %t14 br label %wcond0 wend2: - call void @fn_emith(ptr @.str206) + call void @fn_emith(ptr @.str212) %t70 = load ptr, ptr %t4 store ptr %t70, ptr %retval br label %ret @@ -9090,16 +9410,16 @@ entry: store ptr %arg_idx, ptr %t1 %t2 = call ptr @fn_nreg() store ptr %t2, ptr %t3 - call void @fn_emit(ptr @.str207) + call void @fn_emit(ptr @.str213) %t4 = load ptr, ptr %t3 call void @fn_emit(ptr %t4) - call void @fn_emit(ptr @.str208) + call void @fn_emit(ptr @.str214) %t5 = load ptr, ptr %t0 call void @fn_emit(ptr %t5) - call void @fn_emit(ptr @.str209) + call void @fn_emit(ptr @.str215) %t6 = load ptr, ptr %t1 call void @fn_emit(ptr %t6) - call void @fn_emit(ptr @.str210) + call void @fn_emit(ptr @.str216) %t7 = load ptr, ptr %t3 store ptr %t7, ptr %retval br label %ret @@ -9130,14 +9450,14 @@ then0: %t8 = getelementptr inbounds %Str_Node, ptr %t7, i32 0, i32 3 %t9 = load ptr, ptr %t8 %t10 = call ptr @fn_llty(ptr %t9) - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str211) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str217) %t12 = icmp ne i32 %t11, 0 br i1 %t12, label %then3, label %ifend5 then3: - store ptr @.str212, ptr %retval + store ptr @.str218, ptr %retval br label %ret ifend5: - store ptr @.str213, ptr %retval + store ptr @.str219, ptr %retval br label %ret ifend2: %t13 = load ptr, ptr %t0 @@ -9204,7 +9524,7 @@ sc13: %t58 = load ptr, ptr %t16 %t59 = getelementptr inbounds %Str_Node, ptr %t58, i32 0, i32 1 %t60 = load ptr, ptr %t59 - %t61 = call i32 @fn_streq(ptr %t60, ptr @.str214) + %t61 = call i32 @fn_streq(ptr %t60, ptr @.str220) %t62 = icmp ne i32 %t61, 0 %t63 = zext i1 %t62 to i32 store i32 %t63, ptr %t50 @@ -9238,7 +9558,7 @@ then17: %t81 = getelementptr inbounds %Str_Node, ptr %t80, i32 0, i32 2 %t82 = load i32, ptr %t81 %t83 = call ptr @fn_itoa(i32 %t82) - %t84 = call ptr @fn_sconcat(ptr @.str215, ptr %t83) + %t84 = call ptr @fn_sconcat(ptr @.str221, ptr %t83) store ptr %t84, ptr %retval br label %ret ifend19: @@ -9246,14 +9566,14 @@ ifend19: %t86 = getelementptr inbounds %Str_Node, ptr %t85, i32 0, i32 3 %t87 = load ptr, ptr %t86 %t88 = call ptr @fn_llty(ptr %t87) - %t89 = call i32 @fn_streq(ptr %t88, ptr @.str216) + %t89 = call i32 @fn_streq(ptr %t88, ptr @.str222) %t90 = icmp ne i32 %t89, 0 br i1 %t90, label %then20, label %ifend22 then20: - store ptr @.str217, ptr %retval + store ptr @.str223, ptr %retval br label %ret ifend22: - store ptr @.str218, ptr %retval + store ptr @.str224, ptr %retval br label %ret ret: %t91 = load ptr, ptr %retval @@ -9266,12 +9586,6 @@ entry: %t19 = alloca ptr %t37 = alloca i32 %t79 = alloca ptr - call void @fn_emith(ptr @.str219) - call void @fn_emith(ptr @.str220) - call void @fn_emith(ptr @.str221) - call void @fn_emith(ptr @.str222) - call void @fn_emith(ptr @.str223) - call void @fn_emith(ptr @.str224) call void @fn_emith(ptr @.str225) call void @fn_emith(ptr @.str226) call void @fn_emith(ptr @.str227) @@ -9297,16 +9611,22 @@ entry: call void @fn_emith(ptr @.str247) call void @fn_emith(ptr @.str248) call void @fn_emith(ptr @.str249) + call void @fn_emith(ptr @.str250) + call void @fn_emith(ptr @.str251) + call void @fn_emith(ptr @.str252) + call void @fn_emith(ptr @.str253) + call void @fn_emith(ptr @.str254) + call void @fn_emith(ptr @.str255) %t0 = load ptr, ptr @g_g_game_name %t1 = call i32 @fn_slen(ptr %t0) %t2 = add i32 %t1, 1 %t3 = call ptr @fn_itoa(i32 %t2) call void @fn_emith(ptr %t3) - call void @fn_emith(ptr @.str250) + call void @fn_emith(ptr @.str256) %t4 = load ptr, ptr @g_g_game_name call void @fn_emith(ptr %t4) - call void @fn_emith(ptr @.str251) - call void @fn_emith(ptr @.str252) + call void @fn_emith(ptr @.str257) + call void @fn_emith(ptr @.str258) store i32 0, ptr %t5 br label %wcond0 wcond0: @@ -9334,12 +9654,12 @@ wbody1: %t25 = icmp ne i32 %t24, 0 br i1 %t25, label %then3, label %ifend5 then3: - call void @fn_emith(ptr @.str253) + call void @fn_emith(ptr @.str259) %t26 = load ptr, ptr %t19 %t27 = getelementptr inbounds %Str_Node, ptr %t26, i32 0, i32 1 %t28 = load ptr, ptr %t27 call void @fn_emith(ptr %t28) - call void @fn_emith(ptr @.str254) + call void @fn_emith(ptr @.str260) %t29 = load ptr, ptr %t19 %t30 = getelementptr inbounds %Str_Node, ptr %t29, i32 0, i32 7 %t31 = load ptr, ptr %t30 @@ -9350,7 +9670,7 @@ then3: %t36 = icmp ne i32 %t35, 0 br i1 %t36, label %then6, label %ifend8 then6: - call void @fn_emith(ptr @.str255) + call void @fn_emith(ptr @.str261) br label %ifend8 ifend8: store i32 0, ptr %t37 @@ -9373,7 +9693,7 @@ wbody10: %t50 = icmp ne i32 %t49, 0 br i1 %t50, label %then12, label %ifend14 then12: - call void @fn_emith(ptr @.str256) + call void @fn_emith(ptr @.str262) br label %ifend14 ifend14: %t51 = load ptr, ptr %t19 @@ -9393,7 +9713,7 @@ ifend14: store i32 %t63, ptr %t37 br label %wcond9 wend11: - call void @fn_emith(ptr @.str257) + call void @fn_emith(ptr @.str263) br label %ifend5 ifend5: %t64 = load i32, ptr %t5 @@ -9428,22 +9748,22 @@ wbody16: %t85 = icmp ne i32 %t84, 0 br i1 %t85, label %then18, label %ifend20 then18: - call void @fn_emith(ptr @.str258) + call void @fn_emith(ptr @.str264) %t86 = load ptr, ptr %t79 %t87 = getelementptr inbounds %Str_Node, ptr %t86, i32 0, i32 1 %t88 = load ptr, ptr %t87 call void @fn_emith(ptr %t88) - call void @fn_emith(ptr @.str259) + call void @fn_emith(ptr @.str265) %t89 = load ptr, ptr %t79 %t90 = getelementptr inbounds %Str_Node, ptr %t89, i32 0, i32 3 %t91 = load ptr, ptr %t90 %t92 = call ptr @fn_llty(ptr %t91) call void @fn_emith(ptr %t92) - call void @fn_emith(ptr @.str260) + call void @fn_emith(ptr @.str266) %t93 = load ptr, ptr %t79 %t94 = call ptr @fn_global_init(ptr %t93) call void @fn_emith(ptr %t94) - call void @fn_emith(ptr @.str261) + call void @fn_emith(ptr @.str267) br label %ifend20 ifend20: %t95 = load i32, ptr %t5 @@ -9484,7 +9804,7 @@ then0: %t15 = load ptr, ptr %t5 %t16 = getelementptr inbounds %Str_Val, ptr %t15, i32 0, i32 1 %t17 = load ptr, ptr %t16 - %t18 = call ptr @fn_sconcat(ptr @.str262, ptr %t17) + %t18 = call ptr @fn_sconcat(ptr @.str268, ptr %t17) call void @fn_perr(ptr %t18) br label %ifend2 ifend2: @@ -9503,7 +9823,7 @@ then3: %t29 = load ptr, ptr %t0 %t30 = getelementptr inbounds %Str_Node, ptr %t29, i32 0, i32 1 %t31 = load ptr, ptr %t30 - %t32 = call ptr @fn_sconcat(ptr @.str263, ptr %t31) + %t32 = call ptr @fn_sconcat(ptr @.str269, ptr %t31) call void @fn_perr(ptr %t32) br label %ifend5 ifend5: @@ -9515,25 +9835,25 @@ ifend5: store ptr %t37, ptr @g_g_addr_ty %t38 = call ptr @fn_nreg() store ptr %t38, ptr %t39 - call void @fn_emit(ptr @.str264) + call void @fn_emit(ptr @.str270) %t40 = load ptr, ptr %t39 call void @fn_emit(ptr %t40) - call void @fn_emit(ptr @.str265) + call void @fn_emit(ptr @.str271) %t41 = load ptr, ptr %t5 %t42 = getelementptr inbounds %Str_Val, ptr %t41, i32 0, i32 1 %t43 = load ptr, ptr %t42 %t44 = call ptr @fn_layout_ty(ptr %t43) call void @fn_emit(ptr %t44) - call void @fn_emit(ptr @.str266) + call void @fn_emit(ptr @.str272) %t45 = load ptr, ptr %t5 %t46 = getelementptr inbounds %Str_Val, ptr %t45, i32 0, i32 0 %t47 = load ptr, ptr %t46 call void @fn_emit(ptr %t47) - call void @fn_emit(ptr @.str267) + call void @fn_emit(ptr @.str273) %t48 = load i32, ptr %t24 %t49 = call ptr @fn_itoa(i32 %t48) call void @fn_emit(ptr %t49) - call void @fn_emit(ptr @.str268) + call void @fn_emit(ptr @.str274) %t50 = load ptr, ptr %t39 store ptr %t50, ptr %retval br label %ret @@ -9567,7 +9887,7 @@ entry: %t12 = icmp ne i32 %t11, 0 br i1 %t12, label %then0, label %ifend2 then0: - call void @fn_perr(ptr @.str269) + call void @fn_perr(ptr @.str275) br label %ifend2 ifend2: %t13 = load ptr, ptr %t5 @@ -9579,24 +9899,24 @@ ifend2: store ptr %t18, ptr @g_g_addr_ty %t19 = call ptr @fn_nreg() store ptr %t19, ptr %t20 - call void @fn_emit(ptr @.str270) + call void @fn_emit(ptr @.str276) %t21 = load ptr, ptr %t20 call void @fn_emit(ptr %t21) - call void @fn_emit(ptr @.str271) + call void @fn_emit(ptr @.str277) %t22 = load ptr, ptr %t5 %t23 = getelementptr inbounds %Str_Val, ptr %t22, i32 0, i32 0 %t24 = load ptr, ptr %t23 call void @fn_emit(ptr %t24) - call void @fn_emit(ptr @.str272) + call void @fn_emit(ptr @.str278) %t25 = call ptr @fn_nreg() store ptr %t25, ptr %t26 - call void @fn_emit(ptr @.str273) + call void @fn_emit(ptr @.str279) %t27 = load ptr, ptr %t26 call void @fn_emit(ptr %t27) - call void @fn_emit(ptr @.str274) + call void @fn_emit(ptr @.str280) %t28 = load ptr, ptr %t20 call void @fn_emit(ptr %t28) - call void @fn_emit(ptr @.str275) + call void @fn_emit(ptr @.str281) %t29 = load ptr, ptr %t0 %t30 = getelementptr inbounds %Str_Node, ptr %t29, i32 0, i32 5 %t31 = load ptr, ptr %t30 @@ -9604,22 +9924,22 @@ ifend2: store ptr %t32, ptr %t33 %t34 = call ptr @fn_nreg() store ptr %t34, ptr %t35 - call void @fn_emit(ptr @.str276) + call void @fn_emit(ptr @.str282) %t36 = load ptr, ptr %t35 call void @fn_emit(ptr %t36) - call void @fn_emit(ptr @.str277) + call void @fn_emit(ptr @.str283) %t37 = load ptr, ptr %t17 %t38 = call ptr @fn_llty(ptr %t37) call void @fn_emit(ptr %t38) - call void @fn_emit(ptr @.str278) + call void @fn_emit(ptr @.str284) %t39 = load ptr, ptr %t26 call void @fn_emit(ptr %t39) - call void @fn_emit(ptr @.str279) + call void @fn_emit(ptr @.str285) %t40 = load ptr, ptr %t33 %t41 = getelementptr inbounds %Str_Val, ptr %t40, i32 0, i32 0 %t42 = load ptr, ptr %t41 call void @fn_emit(ptr %t42) - call void @fn_emit(ptr @.str280) + call void @fn_emit(ptr @.str286) %t43 = load ptr, ptr %t35 store ptr %t43, ptr %retval br label %ret @@ -9653,14 +9973,14 @@ entry: %t169 = alloca i32 store ptr %arg_name, ptr %t0 %t3 = load ptr, ptr %t0 - %t4 = call i32 @fn_streq(ptr %t3, ptr @.str281) + %t4 = call i32 @fn_streq(ptr %t3, ptr @.str287) %t5 = icmp ne i32 %t4, 0 %t6 = zext i1 %t5 to i32 store i32 %t6, ptr %t2 br i1 %t5, label %scend1, label %sc0 sc0: %t7 = load ptr, ptr %t0 - %t8 = call i32 @fn_streq(ptr %t7, ptr @.str282) + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str288) %t9 = icmp ne i32 %t8, 0 %t10 = zext i1 %t9 to i32 store i32 %t10, ptr %t2 @@ -9673,7 +9993,7 @@ scend1: br i1 %t12, label %scend3, label %sc2 sc2: %t14 = load ptr, ptr %t0 - %t15 = call i32 @fn_streq(ptr %t14, ptr @.str283) + %t15 = call i32 @fn_streq(ptr %t14, ptr @.str289) %t16 = icmp ne i32 %t15, 0 %t17 = zext i1 %t16 to i32 store i32 %t17, ptr %t1 @@ -9687,14 +10007,14 @@ then4: br label %ret ifend6: %t22 = load ptr, ptr %t0 - %t23 = call i32 @fn_streq(ptr %t22, ptr @.str284) + %t23 = call i32 @fn_streq(ptr %t22, ptr @.str290) %t24 = icmp ne i32 %t23, 0 %t25 = zext i1 %t24 to i32 store i32 %t25, ptr %t21 br i1 %t24, label %scend8, label %sc7 sc7: %t26 = load ptr, ptr %t0 - %t27 = call i32 @fn_streq(ptr %t26, ptr @.str285) + %t27 = call i32 @fn_streq(ptr %t26, ptr @.str291) %t28 = icmp ne i32 %t27, 0 %t29 = zext i1 %t28 to i32 store i32 %t29, ptr %t21 @@ -9707,7 +10027,7 @@ scend8: br i1 %t31, label %scend10, label %sc9 sc9: %t33 = load ptr, ptr %t0 - %t34 = call i32 @fn_streq(ptr %t33, ptr @.str286) + %t34 = call i32 @fn_streq(ptr %t33, ptr @.str292) %t35 = icmp ne i32 %t34, 0 %t36 = zext i1 %t35 to i32 store i32 %t36, ptr %t20 @@ -9721,14 +10041,14 @@ then11: br label %ret ifend13: %t41 = load ptr, ptr %t0 - %t42 = call i32 @fn_streq(ptr %t41, ptr @.str287) + %t42 = call i32 @fn_streq(ptr %t41, ptr @.str293) %t43 = icmp ne i32 %t42, 0 %t44 = zext i1 %t43 to i32 store i32 %t44, ptr %t40 br i1 %t43, label %scend15, label %sc14 sc14: %t45 = load ptr, ptr %t0 - %t46 = call i32 @fn_streq(ptr %t45, ptr @.str288) + %t46 = call i32 @fn_streq(ptr %t45, ptr @.str294) %t47 = icmp ne i32 %t46, 0 %t48 = zext i1 %t47 to i32 store i32 %t48, ptr %t40 @@ -9741,7 +10061,7 @@ scend15: br i1 %t50, label %scend17, label %sc16 sc16: %t52 = load ptr, ptr %t0 - %t53 = call i32 @fn_streq(ptr %t52, ptr @.str289) + %t53 = call i32 @fn_streq(ptr %t52, ptr @.str295) %t54 = icmp ne i32 %t53, 0 %t55 = zext i1 %t54 to i32 store i32 %t55, ptr %t39 @@ -9755,14 +10075,14 @@ then18: br label %ret ifend20: %t60 = load ptr, ptr %t0 - %t61 = call i32 @fn_streq(ptr %t60, ptr @.str290) + %t61 = call i32 @fn_streq(ptr %t60, ptr @.str296) %t62 = icmp ne i32 %t61, 0 %t63 = zext i1 %t62 to i32 store i32 %t63, ptr %t59 br i1 %t62, label %scend22, label %sc21 sc21: %t64 = load ptr, ptr %t0 - %t65 = call i32 @fn_streq(ptr %t64, ptr @.str291) + %t65 = call i32 @fn_streq(ptr %t64, ptr @.str297) %t66 = icmp ne i32 %t65, 0 %t67 = zext i1 %t66 to i32 store i32 %t67, ptr %t59 @@ -9775,7 +10095,7 @@ scend22: br i1 %t69, label %scend24, label %sc23 sc23: %t71 = load ptr, ptr %t0 - %t72 = call i32 @fn_streq(ptr %t71, ptr @.str292) + %t72 = call i32 @fn_streq(ptr %t71, ptr @.str298) %t73 = icmp ne i32 %t72, 0 %t74 = zext i1 %t73 to i32 store i32 %t74, ptr %t58 @@ -9789,14 +10109,14 @@ then25: br label %ret ifend27: %t78 = load ptr, ptr %t0 - %t79 = call i32 @fn_streq(ptr %t78, ptr @.str293) + %t79 = call i32 @fn_streq(ptr %t78, ptr @.str299) %t80 = icmp ne i32 %t79, 0 %t81 = zext i1 %t80 to i32 store i32 %t81, ptr %t77 br i1 %t80, label %scend29, label %sc28 sc28: %t82 = load ptr, ptr %t0 - %t83 = call i32 @fn_streq(ptr %t82, ptr @.str294) + %t83 = call i32 @fn_streq(ptr %t82, ptr @.str300) %t84 = icmp ne i32 %t83, 0 %t85 = zext i1 %t84 to i32 store i32 %t85, ptr %t77 @@ -9810,14 +10130,14 @@ then30: br label %ret ifend32: %t91 = load ptr, ptr %t0 - %t92 = call i32 @fn_streq(ptr %t91, ptr @.str295) + %t92 = call i32 @fn_streq(ptr %t91, ptr @.str301) %t93 = icmp ne i32 %t92, 0 %t94 = zext i1 %t93 to i32 store i32 %t94, ptr %t90 br i1 %t93, label %scend34, label %sc33 sc33: %t95 = load ptr, ptr %t0 - %t96 = call i32 @fn_streq(ptr %t95, ptr @.str296) + %t96 = call i32 @fn_streq(ptr %t95, ptr @.str302) %t97 = icmp ne i32 %t96, 0 %t98 = zext i1 %t97 to i32 store i32 %t98, ptr %t90 @@ -9830,7 +10150,7 @@ scend34: br i1 %t100, label %scend36, label %sc35 sc35: %t102 = load ptr, ptr %t0 - %t103 = call i32 @fn_streq(ptr %t102, ptr @.str297) + %t103 = call i32 @fn_streq(ptr %t102, ptr @.str303) %t104 = icmp ne i32 %t103, 0 %t105 = zext i1 %t104 to i32 store i32 %t105, ptr %t89 @@ -9843,7 +10163,7 @@ scend36: br i1 %t107, label %scend38, label %sc37 sc37: %t109 = load ptr, ptr %t0 - %t110 = call i32 @fn_streq(ptr %t109, ptr @.str298) + %t110 = call i32 @fn_streq(ptr %t109, ptr @.str304) %t111 = icmp ne i32 %t110, 0 %t112 = zext i1 %t111 to i32 store i32 %t112, ptr %t88 @@ -9857,14 +10177,14 @@ then39: br label %ret ifend41: %t116 = load ptr, ptr %t0 - %t117 = call i32 @fn_streq(ptr %t116, ptr @.str299) + %t117 = call i32 @fn_streq(ptr %t116, ptr @.str305) %t118 = icmp ne i32 %t117, 0 %t119 = zext i1 %t118 to i32 store i32 %t119, ptr %t115 br i1 %t118, label %scend43, label %sc42 sc42: %t120 = load ptr, ptr %t0 - %t121 = call i32 @fn_streq(ptr %t120, ptr @.str300) + %t121 = call i32 @fn_streq(ptr %t120, ptr @.str306) %t122 = icmp ne i32 %t121, 0 %t123 = zext i1 %t122 to i32 store i32 %t123, ptr %t115 @@ -9878,14 +10198,14 @@ then44: br label %ret ifend46: %t131 = load ptr, ptr %t0 - %t132 = call i32 @fn_streq(ptr %t131, ptr @.str301) + %t132 = call i32 @fn_streq(ptr %t131, ptr @.str307) %t133 = icmp ne i32 %t132, 0 %t134 = zext i1 %t133 to i32 store i32 %t134, ptr %t130 br i1 %t133, label %scend48, label %sc47 sc47: %t135 = load ptr, ptr %t0 - %t136 = call i32 @fn_streq(ptr %t135, ptr @.str302) + %t136 = call i32 @fn_streq(ptr %t135, ptr @.str308) %t137 = icmp ne i32 %t136, 0 %t138 = zext i1 %t137 to i32 store i32 %t138, ptr %t130 @@ -9898,7 +10218,7 @@ scend48: br i1 %t140, label %scend50, label %sc49 sc49: %t142 = load ptr, ptr %t0 - %t143 = call i32 @fn_streq(ptr %t142, ptr @.str303) + %t143 = call i32 @fn_streq(ptr %t142, ptr @.str309) %t144 = icmp ne i32 %t143, 0 %t145 = zext i1 %t144 to i32 store i32 %t145, ptr %t129 @@ -9911,7 +10231,7 @@ scend50: br i1 %t147, label %scend52, label %sc51 sc51: %t149 = load ptr, ptr %t0 - %t150 = call i32 @fn_streq(ptr %t149, ptr @.str304) + %t150 = call i32 @fn_streq(ptr %t149, ptr @.str310) %t151 = icmp ne i32 %t150, 0 %t152 = zext i1 %t151 to i32 store i32 %t152, ptr %t128 @@ -9924,7 +10244,7 @@ scend52: br i1 %t154, label %scend54, label %sc53 sc53: %t156 = load ptr, ptr %t0 - %t157 = call i32 @fn_streq(ptr %t156, ptr @.str305) + %t157 = call i32 @fn_streq(ptr %t156, ptr @.str311) %t158 = icmp ne i32 %t157, 0 %t159 = zext i1 %t158 to i32 store i32 %t159, ptr %t127 @@ -9937,7 +10257,7 @@ scend54: br i1 %t161, label %scend56, label %sc55 sc55: %t163 = load ptr, ptr %t0 - %t164 = call i32 @fn_streq(ptr %t163, ptr @.str306) + %t164 = call i32 @fn_streq(ptr %t163, ptr @.str312) %t165 = icmp ne i32 %t164, 0 %t166 = zext i1 %t165 to i32 store i32 %t166, ptr %t126 @@ -9951,14 +10271,14 @@ then57: br label %ret ifend59: %t170 = load ptr, ptr %t0 - %t171 = call i32 @fn_streq(ptr %t170, ptr @.str307) + %t171 = call i32 @fn_streq(ptr %t170, ptr @.str313) %t172 = icmp ne i32 %t171, 0 %t173 = zext i1 %t172 to i32 store i32 %t173, ptr %t169 br i1 %t172, label %scend61, label %sc60 sc60: %t174 = load ptr, ptr %t0 - %t175 = call i32 @fn_streq(ptr %t174, ptr @.str308) + %t175 = call i32 @fn_streq(ptr %t174, ptr @.str314) %t176 = icmp ne i32 %t175, 0 %t177 = zext i1 %t176 to i32 store i32 %t177, ptr %t169 @@ -9986,13 +10306,13 @@ entry: store ptr %arg_rest, ptr %t0 %t1 = call ptr @fn_nreg() store ptr %t1, ptr %t2 - call void @fn_emit(ptr @.str309) + call void @fn_emit(ptr @.str315) %t3 = load ptr, ptr %t2 call void @fn_emit(ptr %t3) - call void @fn_emit(ptr @.str310) + call void @fn_emit(ptr @.str316) %t4 = load ptr, ptr %t0 call void @fn_emit(ptr %t4) - call void @fn_emit(ptr @.str311) + call void @fn_emit(ptr @.str317) %t5 = load ptr, ptr %t2 store ptr %t5, ptr %retval br label %ret @@ -10093,16 +10413,16 @@ entry: store ptr %arg_e, ptr %t1 store i32 1, ptr @g_g_intrin_ok %t2 = load ptr, ptr %t0 - %t3 = call i32 @fn_streq(ptr %t2, ptr @.str312) + %t3 = call i32 @fn_streq(ptr %t2, ptr @.str318) %t4 = icmp ne i32 %t3, 0 br i1 %t4, label %then0, label %ifend2 then0: - %t5 = call ptr @fn_val(ptr @.str313, ptr @.str314) + %t5 = call ptr @fn_val(ptr @.str319, ptr @.str320) store ptr %t5, ptr %retval br label %ret ifend2: %t6 = load ptr, ptr %t0 - %t7 = call i32 @fn_streq(ptr %t6, ptr @.str315) + %t7 = call i32 @fn_streq(ptr %t6, ptr @.str321) %t8 = icmp ne i32 %t7, 0 br i1 %t8, label %then3, label %ifend5 then3: @@ -10110,20 +10430,20 @@ then3: %t10 = call ptr @fn_arg_code(ptr %t9, i32 0) store ptr %t10, ptr %t11 %t12 = load ptr, ptr %t11 - %t13 = call ptr @fn_sconcat(ptr %t12, ptr @.str317) - %t14 = call ptr @fn_sconcat(ptr @.str316, ptr %t13) + %t13 = call ptr @fn_sconcat(ptr %t12, ptr @.str323) + %t14 = call ptr @fn_sconcat(ptr @.str322, ptr %t13) %t15 = call ptr @fn_emit_bind(ptr %t14) store ptr %t15, ptr %t16 %t17 = load ptr, ptr %t16 - %t18 = call ptr @fn_sconcat(ptr %t17, ptr @.str319) - %t19 = call ptr @fn_sconcat(ptr @.str318, ptr %t18) + %t18 = call ptr @fn_sconcat(ptr %t17, ptr @.str325) + %t19 = call ptr @fn_sconcat(ptr @.str324, ptr %t18) %t20 = call ptr @fn_emit_bind(ptr %t19) - %t21 = call ptr @fn_val(ptr %t20, ptr @.str320) + %t21 = call ptr @fn_val(ptr %t20, ptr @.str326) store ptr %t21, ptr %retval br label %ret ifend5: %t22 = load ptr, ptr %t0 - %t23 = call i32 @fn_streq(ptr %t22, ptr @.str321) + %t23 = call i32 @fn_streq(ptr %t22, ptr @.str327) %t24 = icmp ne i32 %t23, 0 br i1 %t24, label %then6, label %ifend8 then6: @@ -10134,23 +10454,23 @@ then6: %t29 = call ptr @fn_arg_code(ptr %t28, i32 1) store ptr %t29, ptr %t30 %t31 = load ptr, ptr %t30 - %t32 = call ptr @fn_sconcat(ptr %t31, ptr @.str323) - %t33 = call ptr @fn_sconcat(ptr @.str322, ptr %t32) + %t32 = call ptr @fn_sconcat(ptr %t31, ptr @.str329) + %t33 = call ptr @fn_sconcat(ptr @.str328, ptr %t32) %t34 = call ptr @fn_emit_bind(ptr %t33) store ptr %t34, ptr %t35 %t36 = load ptr, ptr %t27 %t37 = load ptr, ptr %t35 - %t38 = call ptr @fn_sconcat(ptr %t37, ptr @.str326) - %t39 = call ptr @fn_sconcat(ptr @.str325, ptr %t38) + %t38 = call ptr @fn_sconcat(ptr %t37, ptr @.str332) + %t39 = call ptr @fn_sconcat(ptr @.str331, ptr %t38) %t40 = call ptr @fn_sconcat(ptr %t36, ptr %t39) - %t41 = call ptr @fn_sconcat(ptr @.str324, ptr %t40) + %t41 = call ptr @fn_sconcat(ptr @.str330, ptr %t40) %t42 = call ptr @fn_emit_bind(ptr %t41) - %t43 = call ptr @fn_val(ptr %t42, ptr @.str327) + %t43 = call ptr @fn_val(ptr %t42, ptr @.str333) store ptr %t43, ptr %retval br label %ret ifend8: %t44 = load ptr, ptr %t0 - %t45 = call i32 @fn_streq(ptr %t44, ptr @.str328) + %t45 = call i32 @fn_streq(ptr %t44, ptr @.str334) %t46 = icmp ne i32 %t45, 0 br i1 %t46, label %then9, label %ifend11 then9: @@ -10165,19 +10485,19 @@ then9: %t55 = call ptr @fn_emit_gep_i8(ptr %t53, ptr %t54) store ptr %t55, ptr %t56 %t57 = load ptr, ptr %t56 - %t58 = call ptr @fn_sconcat(ptr @.str329, ptr %t57) + %t58 = call ptr @fn_sconcat(ptr @.str335, ptr %t57) %t59 = call ptr @fn_emit_bind(ptr %t58) store ptr %t59, ptr %t60 %t61 = load ptr, ptr %t60 - %t62 = call ptr @fn_sconcat(ptr %t61, ptr @.str331) - %t63 = call ptr @fn_sconcat(ptr @.str330, ptr %t62) + %t62 = call ptr @fn_sconcat(ptr %t61, ptr @.str337) + %t63 = call ptr @fn_sconcat(ptr @.str336, ptr %t62) %t64 = call ptr @fn_emit_bind(ptr %t63) - %t65 = call ptr @fn_val(ptr %t64, ptr @.str332) + %t65 = call ptr @fn_val(ptr %t64, ptr @.str338) store ptr %t65, ptr %retval br label %ret ifend11: %t66 = load ptr, ptr %t0 - %t67 = call i32 @fn_streq(ptr %t66, ptr @.str333) + %t67 = call i32 @fn_streq(ptr %t66, ptr @.str339) %t68 = icmp ne i32 %t67, 0 br i1 %t68, label %then12, label %ifend14 then12: @@ -10195,23 +10515,23 @@ then12: %t80 = call ptr @fn_emit_gep_i8(ptr %t78, ptr %t79) store ptr %t80, ptr %t81 %t82 = load ptr, ptr %t77 - %t83 = call ptr @fn_sconcat(ptr %t82, ptr @.str335) - %t84 = call ptr @fn_sconcat(ptr @.str334, ptr %t83) + %t83 = call ptr @fn_sconcat(ptr %t82, ptr @.str341) + %t84 = call ptr @fn_sconcat(ptr @.str340, ptr %t83) %t85 = call ptr @fn_emit_bind(ptr %t84) store ptr %t85, ptr %t86 - call void @fn_emit(ptr @.str336) + call void @fn_emit(ptr @.str342) %t87 = load ptr, ptr %t86 call void @fn_emit(ptr %t87) - call void @fn_emit(ptr @.str337) + call void @fn_emit(ptr @.str343) %t88 = load ptr, ptr %t81 call void @fn_emit(ptr %t88) - call void @fn_emit(ptr @.str338) - %t89 = call ptr @fn_val(ptr @.str339, ptr @.str340) + call void @fn_emit(ptr @.str344) + %t89 = call ptr @fn_val(ptr @.str345, ptr @.str346) store ptr %t89, ptr %retval br label %ret ifend14: %t90 = load ptr, ptr %t0 - %t91 = call i32 @fn_streq(ptr %t90, ptr @.str341) + %t91 = call i32 @fn_streq(ptr %t90, ptr @.str347) %t92 = icmp ne i32 %t91, 0 br i1 %t92, label %then15, label %ifend17 then15: @@ -10219,20 +10539,20 @@ then15: %t94 = call ptr @fn_arg_code(ptr %t93, i32 0) store ptr %t94, ptr %t95 %t96 = load ptr, ptr %t95 - %t97 = call ptr @fn_sconcat(ptr %t96, ptr @.str343) - %t98 = call ptr @fn_sconcat(ptr @.str342, ptr %t97) + %t97 = call ptr @fn_sconcat(ptr %t96, ptr @.str349) + %t98 = call ptr @fn_sconcat(ptr @.str348, ptr %t97) %t99 = call ptr @fn_emit_bind(ptr %t98) store ptr %t99, ptr %t100 %t101 = load ptr, ptr %t100 - %t102 = call ptr @fn_sconcat(ptr %t101, ptr @.str345) - %t103 = call ptr @fn_sconcat(ptr @.str344, ptr %t102) + %t102 = call ptr @fn_sconcat(ptr %t101, ptr @.str351) + %t103 = call ptr @fn_sconcat(ptr @.str350, ptr %t102) %t104 = call ptr @fn_emit_bind(ptr %t103) - %t105 = call ptr @fn_val(ptr %t104, ptr @.str346) + %t105 = call ptr @fn_val(ptr %t104, ptr @.str352) store ptr %t105, ptr %retval br label %ret ifend17: %t106 = load ptr, ptr %t0 - %t107 = call i32 @fn_streq(ptr %t106, ptr @.str347) + %t107 = call i32 @fn_streq(ptr %t106, ptr @.str353) %t108 = icmp ne i32 %t107, 0 br i1 %t108, label %then18, label %ifend20 then18: @@ -10244,24 +10564,24 @@ then18: store ptr %t113, ptr %t114 %t115 = load ptr, ptr %t111 %t116 = load ptr, ptr %t114 - %t117 = call ptr @fn_sconcat(ptr %t116, ptr @.str350) - %t118 = call ptr @fn_sconcat(ptr @.str349, ptr %t117) + %t117 = call ptr @fn_sconcat(ptr %t116, ptr @.str356) + %t118 = call ptr @fn_sconcat(ptr @.str355, ptr %t117) %t119 = call ptr @fn_sconcat(ptr %t115, ptr %t118) - %t120 = call ptr @fn_sconcat(ptr @.str348, ptr %t119) + %t120 = call ptr @fn_sconcat(ptr @.str354, ptr %t119) %t121 = call ptr @fn_emit_bind(ptr %t120) - %t122 = call ptr @fn_val(ptr %t121, ptr @.str351) + %t122 = call ptr @fn_val(ptr %t121, ptr @.str357) store ptr %t122, ptr %retval br label %ret ifend20: %t124 = load ptr, ptr %t0 - %t125 = call i32 @fn_streq(ptr %t124, ptr @.str352) + %t125 = call i32 @fn_streq(ptr %t124, ptr @.str358) %t126 = icmp ne i32 %t125, 0 %t127 = zext i1 %t126 to i32 store i32 %t127, ptr %t123 br i1 %t126, label %scend22, label %sc21 sc21: %t128 = load ptr, ptr %t0 - %t129 = call i32 @fn_streq(ptr %t128, ptr @.str353) + %t129 = call i32 @fn_streq(ptr %t128, ptr @.str359) %t130 = icmp ne i32 %t129, 0 %t131 = zext i1 %t130 to i32 store i32 %t131, ptr %t123 @@ -10281,43 +10601,43 @@ then23: %t141 = call ptr @fn_arg_code(ptr %t140, i32 2) store ptr %t141, ptr %t142 %t143 = load ptr, ptr %t142 - %t144 = call ptr @fn_sconcat(ptr %t143, ptr @.str355) - %t145 = call ptr @fn_sconcat(ptr @.str354, ptr %t144) + %t144 = call ptr @fn_sconcat(ptr %t143, ptr @.str361) + %t145 = call ptr @fn_sconcat(ptr @.str360, ptr %t144) %t146 = call ptr @fn_emit_bind(ptr %t145) store ptr %t146, ptr %t147 - store ptr @.str356, ptr %t148 + store ptr @.str362, ptr %t148 %t149 = load ptr, ptr %t0 - %t150 = call i32 @fn_streq(ptr %t149, ptr @.str357) + %t150 = call i32 @fn_streq(ptr %t149, ptr @.str363) %t151 = icmp ne i32 %t150, 0 br i1 %t151, label %then26, label %ifend28 then26: - store ptr @.str358, ptr %t148 + store ptr @.str364, ptr %t148 br label %ifend28 ifend28: %t152 = load ptr, ptr %t148 %t153 = load ptr, ptr %t139 %t154 = load ptr, ptr %t147 %t155 = load ptr, ptr %t136 - %t156 = call ptr @fn_sconcat(ptr %t155, ptr @.str363) - %t157 = call ptr @fn_sconcat(ptr @.str362, ptr %t156) + %t156 = call ptr @fn_sconcat(ptr %t155, ptr @.str369) + %t157 = call ptr @fn_sconcat(ptr @.str368, ptr %t156) %t158 = call ptr @fn_sconcat(ptr %t154, ptr %t157) - %t159 = call ptr @fn_sconcat(ptr @.str361, ptr %t158) + %t159 = call ptr @fn_sconcat(ptr @.str367, ptr %t158) %t160 = call ptr @fn_sconcat(ptr %t153, ptr %t159) - %t161 = call ptr @fn_sconcat(ptr @.str360, ptr %t160) + %t161 = call ptr @fn_sconcat(ptr @.str366, ptr %t160) %t162 = call ptr @fn_sconcat(ptr %t152, ptr %t161) - %t163 = call ptr @fn_sconcat(ptr @.str359, ptr %t162) + %t163 = call ptr @fn_sconcat(ptr @.str365, ptr %t162) %t164 = call ptr @fn_emit_bind(ptr %t163) store ptr %t164, ptr %t165 %t166 = load ptr, ptr %t165 - %t167 = call ptr @fn_sconcat(ptr %t166, ptr @.str365) - %t168 = call ptr @fn_sconcat(ptr @.str364, ptr %t167) + %t167 = call ptr @fn_sconcat(ptr %t166, ptr @.str371) + %t168 = call ptr @fn_sconcat(ptr @.str370, ptr %t167) %t169 = call ptr @fn_emit_bind(ptr %t168) - %t170 = call ptr @fn_val(ptr %t169, ptr @.str366) + %t170 = call ptr @fn_val(ptr %t169, ptr @.str372) store ptr %t170, ptr %retval br label %ret ifend25: %t171 = load ptr, ptr %t0 - %t172 = call i32 @fn_streq(ptr %t171, ptr @.str367) + %t172 = call i32 @fn_streq(ptr %t171, ptr @.str373) %t173 = icmp ne i32 %t172, 0 br i1 %t173, label %then29, label %ifend31 then29: @@ -10331,26 +10651,26 @@ then29: %t181 = call ptr @fn_arg_code(ptr %t180, i32 2) store ptr %t181, ptr %t182 %t183 = load ptr, ptr %t179 - %t184 = call ptr @fn_sconcat(ptr %t183, ptr @.str369) - %t185 = call ptr @fn_sconcat(ptr @.str368, ptr %t184) + %t184 = call ptr @fn_sconcat(ptr %t183, ptr @.str375) + %t185 = call ptr @fn_sconcat(ptr @.str374, ptr %t184) %t186 = call ptr @fn_emit_bind(ptr %t185) store ptr %t186, ptr %t187 %t188 = load ptr, ptr %t176 %t189 = load ptr, ptr %t187 %t190 = load ptr, ptr %t182 - %t191 = call ptr @fn_sconcat(ptr %t190, ptr @.str373) - %t192 = call ptr @fn_sconcat(ptr @.str372, ptr %t191) + %t191 = call ptr @fn_sconcat(ptr %t190, ptr @.str379) + %t192 = call ptr @fn_sconcat(ptr @.str378, ptr %t191) %t193 = call ptr @fn_sconcat(ptr %t189, ptr %t192) - %t194 = call ptr @fn_sconcat(ptr @.str371, ptr %t193) + %t194 = call ptr @fn_sconcat(ptr @.str377, ptr %t193) %t195 = call ptr @fn_sconcat(ptr %t188, ptr %t194) - %t196 = call ptr @fn_sconcat(ptr @.str370, ptr %t195) + %t196 = call ptr @fn_sconcat(ptr @.str376, ptr %t195) %t197 = call ptr @fn_emit_bind(ptr %t196) - %t198 = call ptr @fn_val(ptr %t197, ptr @.str374) + %t198 = call ptr @fn_val(ptr %t197, ptr @.str380) store ptr %t198, ptr %retval br label %ret ifend31: %t199 = load ptr, ptr %t0 - %t200 = call i32 @fn_streq(ptr %t199, ptr @.str375) + %t200 = call i32 @fn_streq(ptr %t199, ptr @.str381) %t201 = icmp ne i32 %t200, 0 br i1 %t201, label %then32, label %ifend34 then32: @@ -10358,130 +10678,130 @@ then32: %t203 = call ptr @fn_arg_code(ptr %t202, i32 0) store ptr %t203, ptr %t204 %t205 = load ptr, ptr %t204 - %t206 = call ptr @fn_sconcat(ptr %t205, ptr @.str377) - %t207 = call ptr @fn_sconcat(ptr @.str376, ptr %t206) + %t206 = call ptr @fn_sconcat(ptr %t205, ptr @.str383) + %t207 = call ptr @fn_sconcat(ptr @.str382, ptr %t206) %t208 = call ptr @fn_emit_bind(ptr %t207) store ptr %t208, ptr %t209 %t210 = load ptr, ptr %t209 - %t211 = call ptr @fn_sconcat(ptr %t210, ptr @.str379) - %t212 = call ptr @fn_sconcat(ptr @.str378, ptr %t211) + %t211 = call ptr @fn_sconcat(ptr %t210, ptr @.str385) + %t212 = call ptr @fn_sconcat(ptr @.str384, ptr %t211) %t213 = call ptr @fn_emit_bind(ptr %t212) - %t214 = call ptr @fn_val(ptr %t213, ptr @.str380) + %t214 = call ptr @fn_val(ptr %t213, ptr @.str386) store ptr %t214, ptr %retval br label %ret ifend34: %t215 = load ptr, ptr %t0 - %t216 = call i32 @fn_streq(ptr %t215, ptr @.str381) + %t216 = call i32 @fn_streq(ptr %t215, ptr @.str387) %t217 = icmp ne i32 %t216, 0 br i1 %t217, label %then35, label %ifend37 then35: %t218 = load ptr, ptr %t1 %t219 = call ptr @fn_arg_code(ptr %t218, i32 0) store ptr %t219, ptr %t220 - call void @fn_emit(ptr @.str382) + call void @fn_emit(ptr @.str388) %t221 = load ptr, ptr %t220 call void @fn_emit(ptr %t221) - call void @fn_emit(ptr @.str383) - %t222 = call ptr @fn_val(ptr @.str384, ptr @.str385) + call void @fn_emit(ptr @.str389) + %t222 = call ptr @fn_val(ptr @.str390, ptr @.str391) store ptr %t222, ptr %retval br label %ret ifend37: %t223 = load ptr, ptr %t0 - %t224 = call i32 @fn_streq(ptr %t223, ptr @.str386) + %t224 = call i32 @fn_streq(ptr %t223, ptr @.str392) %t225 = icmp ne i32 %t224, 0 br i1 %t225, label %then38, label %ifend40 then38: %t226 = load ptr, ptr %t1 %t227 = call ptr @fn_arg_code(ptr %t226, i32 0) store ptr %t227, ptr %t228 - call void @fn_emit(ptr @.str387) + call void @fn_emit(ptr @.str393) %t229 = load ptr, ptr %t228 call void @fn_emit(ptr %t229) - call void @fn_emit(ptr @.str388) - %t230 = call ptr @fn_val(ptr @.str389, ptr @.str390) + call void @fn_emit(ptr @.str394) + %t230 = call ptr @fn_val(ptr @.str395, ptr @.str396) store ptr %t230, ptr %retval br label %ret ifend40: %t231 = load ptr, ptr %t0 - %t232 = call i32 @fn_streq(ptr %t231, ptr @.str391) + %t232 = call i32 @fn_streq(ptr %t231, ptr @.str397) %t233 = icmp ne i32 %t232, 0 br i1 %t233, label %then41, label %ifend43 then41: %t234 = load ptr, ptr %t1 %t235 = call ptr @fn_arg_code(ptr %t234, i32 0) store ptr %t235, ptr %t236 - call void @fn_emit(ptr @.str392) + call void @fn_emit(ptr @.str398) %t237 = load ptr, ptr %t236 call void @fn_emit(ptr %t237) - call void @fn_emit(ptr @.str393) - %t238 = call ptr @fn_val(ptr @.str394, ptr @.str395) + call void @fn_emit(ptr @.str399) + %t238 = call ptr @fn_val(ptr @.str400, ptr @.str401) store ptr %t238, ptr %retval br label %ret ifend43: %t239 = load ptr, ptr %t0 - %t240 = call i32 @fn_streq(ptr %t239, ptr @.str396) + %t240 = call i32 @fn_streq(ptr %t239, ptr @.str402) %t241 = icmp ne i32 %t240, 0 br i1 %t241, label %then44, label %ifend46 then44: - %t242 = call ptr @fn_emit_bind(ptr @.str397) - %t243 = call ptr @fn_val(ptr %t242, ptr @.str398) + %t242 = call ptr @fn_emit_bind(ptr @.str403) + %t243 = call ptr @fn_val(ptr %t242, ptr @.str404) store ptr %t243, ptr %retval br label %ret ifend46: %t244 = load ptr, ptr %t0 - %t245 = call i32 @fn_streq(ptr %t244, ptr @.str399) + %t245 = call i32 @fn_streq(ptr %t244, ptr @.str405) %t246 = icmp ne i32 %t245, 0 br i1 %t246, label %then47, label %ifend49 then47: %t247 = load ptr, ptr %t1 %t248 = call ptr @fn_arg_code(ptr %t247, i32 0) store ptr %t248, ptr %t249 - %t250 = call ptr @fn_emit_bind(ptr @.str400) + %t250 = call ptr @fn_emit_bind(ptr @.str406) store ptr %t250, ptr %t251 %t252 = load ptr, ptr %t251 %t253 = load ptr, ptr %t249 - %t254 = call ptr @fn_sconcat(ptr @.str402, ptr %t253) + %t254 = call ptr @fn_sconcat(ptr @.str408, ptr %t253) %t255 = call ptr @fn_sconcat(ptr %t252, ptr %t254) - %t256 = call ptr @fn_sconcat(ptr @.str401, ptr %t255) + %t256 = call ptr @fn_sconcat(ptr @.str407, ptr %t255) %t257 = call ptr @fn_emit_bind(ptr %t256) store ptr %t257, ptr %t258 %t259 = load ptr, ptr %t258 - %t260 = call ptr @fn_sconcat(ptr @.str403, ptr %t259) + %t260 = call ptr @fn_sconcat(ptr @.str409, ptr %t259) %t261 = call ptr @fn_emit_bind(ptr %t260) - %t262 = call ptr @fn_val(ptr %t261, ptr @.str404) + %t262 = call ptr @fn_val(ptr %t261, ptr @.str410) store ptr %t262, ptr %retval br label %ret ifend49: %t263 = load ptr, ptr %t0 - %t264 = call i32 @fn_streq(ptr %t263, ptr @.str405) + %t264 = call i32 @fn_streq(ptr %t263, ptr @.str411) %t265 = icmp ne i32 %t264, 0 br i1 %t265, label %then50, label %ifend52 then50: %t266 = load ptr, ptr %t1 %t267 = call ptr @fn_arg_code(ptr %t266, i32 0) store ptr %t267, ptr %t268 - call void @fn_emit(ptr @.str406) + call void @fn_emit(ptr @.str412) %t269 = load ptr, ptr %t268 call void @fn_emit(ptr %t269) - call void @fn_emit(ptr @.str407) - call void @fn_emit(ptr @.str408) + call void @fn_emit(ptr @.str413) + call void @fn_emit(ptr @.str414) store i32 1, ptr @g_g_term - %t270 = call ptr @fn_val(ptr @.str409, ptr @.str410) + %t270 = call ptr @fn_val(ptr @.str415, ptr @.str416) store ptr %t270, ptr %retval br label %ret ifend52: %t271 = load ptr, ptr %t0 - %t272 = call i32 @fn_streq(ptr %t271, ptr @.str411) + %t272 = call i32 @fn_streq(ptr %t271, ptr @.str417) %t273 = icmp ne i32 %t272, 0 br i1 %t273, label %then53, label %ifend55 then53: - %t274 = call ptr @fn_emit_bind(ptr @.str412) - %t275 = call ptr @fn_val(ptr %t274, ptr @.str413) + %t274 = call ptr @fn_emit_bind(ptr @.str418) + %t275 = call ptr @fn_val(ptr %t274, ptr @.str419) store ptr %t275, ptr %retval br label %ret ifend55: %t276 = load ptr, ptr %t0 - %t277 = call i32 @fn_streq(ptr %t276, ptr @.str414) + %t277 = call i32 @fn_streq(ptr %t276, ptr @.str420) %t278 = icmp ne i32 %t277, 0 br i1 %t278, label %then56, label %ifend58 then56: @@ -10489,15 +10809,15 @@ then56: %t280 = call ptr @fn_arg_code(ptr %t279, i32 0) store ptr %t280, ptr %t281 %t282 = load ptr, ptr %t281 - %t283 = call ptr @fn_sconcat(ptr %t282, ptr @.str416) - %t284 = call ptr @fn_sconcat(ptr @.str415, ptr %t283) + %t283 = call ptr @fn_sconcat(ptr %t282, ptr @.str422) + %t284 = call ptr @fn_sconcat(ptr @.str421, ptr %t283) %t285 = call ptr @fn_emit_bind(ptr %t284) - %t286 = call ptr @fn_val(ptr %t285, ptr @.str417) + %t286 = call ptr @fn_val(ptr %t285, ptr @.str423) store ptr %t286, ptr %retval br label %ret ifend58: %t287 = load ptr, ptr %t0 - %t288 = call i32 @fn_streq(ptr %t287, ptr @.str418) + %t288 = call i32 @fn_streq(ptr %t287, ptr @.str424) %t289 = icmp ne i32 %t288, 0 br i1 %t289, label %then59, label %ifend61 then59: @@ -10505,15 +10825,15 @@ then59: %t291 = call ptr @fn_arg_code(ptr %t290, i32 0) store ptr %t291, ptr %t292 %t293 = load ptr, ptr %t292 - %t294 = call ptr @fn_sconcat(ptr %t293, ptr @.str420) - %t295 = call ptr @fn_sconcat(ptr @.str419, ptr %t294) + %t294 = call ptr @fn_sconcat(ptr %t293, ptr @.str426) + %t295 = call ptr @fn_sconcat(ptr @.str425, ptr %t294) %t296 = call ptr @fn_emit_bind(ptr %t295) - %t297 = call ptr @fn_val(ptr %t296, ptr @.str421) + %t297 = call ptr @fn_val(ptr %t296, ptr @.str427) store ptr %t297, ptr %retval br label %ret ifend61: %t298 = load ptr, ptr %t0 - %t299 = call i32 @fn_streq(ptr %t298, ptr @.str422) + %t299 = call i32 @fn_streq(ptr %t298, ptr @.str428) %t300 = icmp ne i32 %t299, 0 br i1 %t300, label %then62, label %ifend64 then62: @@ -10521,22 +10841,22 @@ then62: %t302 = call ptr @fn_arg_code(ptr %t301, i32 0) store ptr %t302, ptr %t303 %t304 = load ptr, ptr %t303 - %t305 = call ptr @fn_sconcat(ptr %t304, ptr @.str424) - %t306 = call ptr @fn_sconcat(ptr @.str423, ptr %t305) + %t305 = call ptr @fn_sconcat(ptr %t304, ptr @.str430) + %t306 = call ptr @fn_sconcat(ptr @.str429, ptr %t305) %t307 = call ptr @fn_emit_bind(ptr %t306) - %t308 = call ptr @fn_val(ptr %t307, ptr @.str425) + %t308 = call ptr @fn_val(ptr %t307, ptr @.str431) store ptr %t308, ptr %retval br label %ret ifend64: %t313 = load ptr, ptr %t0 - %t314 = call i32 @fn_streq(ptr %t313, ptr @.str426) + %t314 = call i32 @fn_streq(ptr %t313, ptr @.str432) %t315 = icmp ne i32 %t314, 0 %t316 = zext i1 %t315 to i32 store i32 %t316, ptr %t312 br i1 %t315, label %scend66, label %sc65 sc65: %t317 = load ptr, ptr %t0 - %t318 = call i32 @fn_streq(ptr %t317, ptr @.str427) + %t318 = call i32 @fn_streq(ptr %t317, ptr @.str433) %t319 = icmp ne i32 %t318, 0 %t320 = zext i1 %t319 to i32 store i32 %t320, ptr %t312 @@ -10549,7 +10869,7 @@ scend66: br i1 %t322, label %scend68, label %sc67 sc67: %t324 = load ptr, ptr %t0 - %t325 = call i32 @fn_streq(ptr %t324, ptr @.str428) + %t325 = call i32 @fn_streq(ptr %t324, ptr @.str434) %t326 = icmp ne i32 %t325, 0 %t327 = zext i1 %t326 to i32 store i32 %t327, ptr %t311 @@ -10562,7 +10882,7 @@ scend68: br i1 %t329, label %scend70, label %sc69 sc69: %t331 = load ptr, ptr %t0 - %t332 = call i32 @fn_streq(ptr %t331, ptr @.str429) + %t332 = call i32 @fn_streq(ptr %t331, ptr @.str435) %t333 = icmp ne i32 %t332, 0 %t334 = zext i1 %t333 to i32 store i32 %t334, ptr %t310 @@ -10575,7 +10895,7 @@ scend70: br i1 %t336, label %scend72, label %sc71 sc71: %t338 = load ptr, ptr %t0 - %t339 = call i32 @fn_streq(ptr %t338, ptr @.str430) + %t339 = call i32 @fn_streq(ptr %t338, ptr @.str436) %t340 = icmp ne i32 %t339, 0 %t341 = zext i1 %t340 to i32 store i32 %t341, ptr %t309 @@ -10591,53 +10911,53 @@ then73: %t347 = load ptr, ptr %t1 %t348 = call ptr @fn_arg_code(ptr %t347, i32 1) store ptr %t348, ptr %t349 - store ptr @.str431, ptr %t350 + store ptr @.str437, ptr %t350 %t351 = load ptr, ptr %t0 - %t352 = call i32 @fn_streq(ptr %t351, ptr @.str432) + %t352 = call i32 @fn_streq(ptr %t351, ptr @.str438) %t353 = icmp ne i32 %t352, 0 br i1 %t353, label %then76, label %ifend78 then76: - store ptr @.str433, ptr %t350 + store ptr @.str439, ptr %t350 br label %ifend78 ifend78: %t354 = load ptr, ptr %t0 - %t355 = call i32 @fn_streq(ptr %t354, ptr @.str434) + %t355 = call i32 @fn_streq(ptr %t354, ptr @.str440) %t356 = icmp ne i32 %t355, 0 br i1 %t356, label %then79, label %ifend81 then79: - store ptr @.str435, ptr %t350 + store ptr @.str441, ptr %t350 br label %ifend81 ifend81: %t357 = load ptr, ptr %t0 - %t358 = call i32 @fn_streq(ptr %t357, ptr @.str436) + %t358 = call i32 @fn_streq(ptr %t357, ptr @.str442) %t359 = icmp ne i32 %t358, 0 br i1 %t359, label %then82, label %ifend84 then82: - store ptr @.str437, ptr %t350 + store ptr @.str443, ptr %t350 br label %ifend84 ifend84: %t360 = load ptr, ptr %t0 - %t361 = call i32 @fn_streq(ptr %t360, ptr @.str438) + %t361 = call i32 @fn_streq(ptr %t360, ptr @.str444) %t362 = icmp ne i32 %t361, 0 br i1 %t362, label %then85, label %ifend87 then85: - store ptr @.str439, ptr %t350 + store ptr @.str445, ptr %t350 br label %ifend87 ifend87: %t363 = load ptr, ptr %t350 %t364 = load ptr, ptr %t346 %t365 = load ptr, ptr %t349 - %t366 = call ptr @fn_sconcat(ptr @.str441, ptr %t365) + %t366 = call ptr @fn_sconcat(ptr @.str447, ptr %t365) %t367 = call ptr @fn_sconcat(ptr %t364, ptr %t366) - %t368 = call ptr @fn_sconcat(ptr @.str440, ptr %t367) + %t368 = call ptr @fn_sconcat(ptr @.str446, ptr %t367) %t369 = call ptr @fn_sconcat(ptr %t363, ptr %t368) %t370 = call ptr @fn_emit_bind(ptr %t369) - %t371 = call ptr @fn_val(ptr %t370, ptr @.str442) + %t371 = call ptr @fn_val(ptr %t370, ptr @.str448) store ptr %t371, ptr %retval br label %ret ifend75: %t372 = load ptr, ptr %t0 - %t373 = call i32 @fn_streq(ptr %t372, ptr @.str443) + %t373 = call i32 @fn_streq(ptr %t372, ptr @.str449) %t374 = icmp ne i32 %t373, 0 br i1 %t374, label %then88, label %ifend90 then88: @@ -10649,25 +10969,25 @@ then88: store ptr %t379, ptr %t380 %t381 = call ptr @fn_nreg() store ptr %t381, ptr %t382 - call void @fn_emit(ptr @.str444) + call void @fn_emit(ptr @.str450) %t383 = load ptr, ptr %t382 call void @fn_emit(ptr %t383) - call void @fn_emit(ptr @.str445) + call void @fn_emit(ptr @.str451) %t384 = load ptr, ptr %t377 call void @fn_emit(ptr %t384) - call void @fn_emit(ptr @.str446) + call void @fn_emit(ptr @.str452) %t385 = load ptr, ptr %t380 call void @fn_emit(ptr %t385) - call void @fn_emit(ptr @.str447) + call void @fn_emit(ptr @.str453) %t386 = load ptr, ptr %t382 - %t387 = call ptr @fn_sconcat(ptr @.str448, ptr %t386) + %t387 = call ptr @fn_sconcat(ptr @.str454, ptr %t386) %t388 = call ptr @fn_emit_bind(ptr %t387) - %t389 = call ptr @fn_val(ptr %t388, ptr @.str449) + %t389 = call ptr @fn_val(ptr %t388, ptr @.str455) store ptr %t389, ptr %retval br label %ret ifend90: %t390 = load ptr, ptr %t0 - %t391 = call i32 @fn_streq(ptr %t390, ptr @.str450) + %t391 = call i32 @fn_streq(ptr %t390, ptr @.str456) %t392 = icmp ne i32 %t391, 0 br i1 %t392, label %then91, label %ifend93 then91: @@ -10682,29 +11002,29 @@ then91: store ptr %t400, ptr %t401 %t402 = call ptr @fn_nreg() store ptr %t402, ptr %t403 - call void @fn_emit(ptr @.str451) + call void @fn_emit(ptr @.str457) %t404 = load ptr, ptr %t403 call void @fn_emit(ptr %t404) - call void @fn_emit(ptr @.str452) + call void @fn_emit(ptr @.str458) %t405 = load ptr, ptr %t395 call void @fn_emit(ptr %t405) - call void @fn_emit(ptr @.str453) + call void @fn_emit(ptr @.str459) %t406 = load ptr, ptr %t398 call void @fn_emit(ptr %t406) - call void @fn_emit(ptr @.str454) - call void @fn_emit(ptr @.str455) + call void @fn_emit(ptr @.str460) + call void @fn_emit(ptr @.str461) %t407 = load ptr, ptr %t401 call void @fn_emit(ptr %t407) - call void @fn_emit(ptr @.str456) + call void @fn_emit(ptr @.str462) %t408 = load ptr, ptr %t403 call void @fn_emit(ptr %t408) - call void @fn_emit(ptr @.str457) - %t409 = call ptr @fn_val(ptr @.str458, ptr @.str459) + call void @fn_emit(ptr @.str463) + %t409 = call ptr @fn_val(ptr @.str464, ptr @.str465) store ptr %t409, ptr %retval br label %ret ifend93: store i32 0, ptr @g_g_intrin_ok - %t410 = call ptr @fn_val(ptr @.str460, ptr @.str461) + %t410 = call ptr @fn_val(ptr @.str466, ptr @.str467) store ptr %t410, ptr %retval br label %ret ret: @@ -10731,14 +11051,14 @@ entry: %t118 = alloca i32 store ptr %arg_name, ptr %t0 %t3 = load ptr, ptr %t0 - %t4 = call i32 @fn_streq(ptr %t3, ptr @.str462) + %t4 = call i32 @fn_streq(ptr %t3, ptr @.str468) %t5 = icmp ne i32 %t4, 0 %t6 = zext i1 %t5 to i32 store i32 %t6, ptr %t2 br i1 %t5, label %scend1, label %sc0 sc0: %t7 = load ptr, ptr %t0 - %t8 = call i32 @fn_streq(ptr %t7, ptr @.str463) + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str469) %t9 = icmp ne i32 %t8, 0 %t10 = zext i1 %t9 to i32 store i32 %t10, ptr %t2 @@ -10751,7 +11071,7 @@ scend1: br i1 %t12, label %scend3, label %sc2 sc2: %t14 = load ptr, ptr %t0 - %t15 = call i32 @fn_streq(ptr %t14, ptr @.str464) + %t15 = call i32 @fn_streq(ptr %t14, ptr @.str470) %t16 = icmp ne i32 %t15, 0 %t17 = zext i1 %t16 to i32 store i32 %t17, ptr %t1 @@ -10765,14 +11085,14 @@ then4: br label %ret ifend6: %t22 = load ptr, ptr %t0 - %t23 = call i32 @fn_streq(ptr %t22, ptr @.str465) + %t23 = call i32 @fn_streq(ptr %t22, ptr @.str471) %t24 = icmp ne i32 %t23, 0 %t25 = zext i1 %t24 to i32 store i32 %t25, ptr %t21 br i1 %t24, label %scend8, label %sc7 sc7: %t26 = load ptr, ptr %t0 - %t27 = call i32 @fn_streq(ptr %t26, ptr @.str466) + %t27 = call i32 @fn_streq(ptr %t26, ptr @.str472) %t28 = icmp ne i32 %t27, 0 %t29 = zext i1 %t28 to i32 store i32 %t29, ptr %t21 @@ -10785,7 +11105,7 @@ scend8: br i1 %t31, label %scend10, label %sc9 sc9: %t33 = load ptr, ptr %t0 - %t34 = call i32 @fn_streq(ptr %t33, ptr @.str467) + %t34 = call i32 @fn_streq(ptr %t33, ptr @.str473) %t35 = icmp ne i32 %t34, 0 %t36 = zext i1 %t35 to i32 store i32 %t36, ptr %t20 @@ -10799,14 +11119,14 @@ then11: br label %ret ifend13: %t40 = load ptr, ptr %t0 - %t41 = call i32 @fn_streq(ptr %t40, ptr @.str468) + %t41 = call i32 @fn_streq(ptr %t40, ptr @.str474) %t42 = icmp ne i32 %t41, 0 %t43 = zext i1 %t42 to i32 store i32 %t43, ptr %t39 br i1 %t42, label %scend15, label %sc14 sc14: %t44 = load ptr, ptr %t0 - %t45 = call i32 @fn_streq(ptr %t44, ptr @.str469) + %t45 = call i32 @fn_streq(ptr %t44, ptr @.str475) %t46 = icmp ne i32 %t45, 0 %t47 = zext i1 %t46 to i32 store i32 %t47, ptr %t39 @@ -10820,14 +11140,14 @@ then16: br label %ret ifend18: %t53 = load ptr, ptr %t0 - %t54 = call i32 @fn_streq(ptr %t53, ptr @.str470) + %t54 = call i32 @fn_streq(ptr %t53, ptr @.str476) %t55 = icmp ne i32 %t54, 0 %t56 = zext i1 %t55 to i32 store i32 %t56, ptr %t52 br i1 %t55, label %scend20, label %sc19 sc19: %t57 = load ptr, ptr %t0 - %t58 = call i32 @fn_streq(ptr %t57, ptr @.str471) + %t58 = call i32 @fn_streq(ptr %t57, ptr @.str477) %t59 = icmp ne i32 %t58, 0 %t60 = zext i1 %t59 to i32 store i32 %t60, ptr %t52 @@ -10840,7 +11160,7 @@ scend20: br i1 %t62, label %scend22, label %sc21 sc21: %t64 = load ptr, ptr %t0 - %t65 = call i32 @fn_streq(ptr %t64, ptr @.str472) + %t65 = call i32 @fn_streq(ptr %t64, ptr @.str478) %t66 = icmp ne i32 %t65, 0 %t67 = zext i1 %t66 to i32 store i32 %t67, ptr %t51 @@ -10853,7 +11173,7 @@ scend22: br i1 %t69, label %scend24, label %sc23 sc23: %t71 = load ptr, ptr %t0 - %t72 = call i32 @fn_streq(ptr %t71, ptr @.str473) + %t72 = call i32 @fn_streq(ptr %t71, ptr @.str479) %t73 = icmp ne i32 %t72, 0 %t74 = zext i1 %t73 to i32 store i32 %t74, ptr %t50 @@ -10867,14 +11187,14 @@ then25: br label %ret ifend27: %t78 = load ptr, ptr %t0 - %t79 = call i32 @fn_streq(ptr %t78, ptr @.str474) + %t79 = call i32 @fn_streq(ptr %t78, ptr @.str480) %t80 = icmp ne i32 %t79, 0 %t81 = zext i1 %t80 to i32 store i32 %t81, ptr %t77 br i1 %t80, label %scend29, label %sc28 sc28: %t82 = load ptr, ptr %t0 - %t83 = call i32 @fn_streq(ptr %t82, ptr @.str475) + %t83 = call i32 @fn_streq(ptr %t82, ptr @.str481) %t84 = icmp ne i32 %t83, 0 %t85 = zext i1 %t84 to i32 store i32 %t85, ptr %t77 @@ -10888,14 +11208,14 @@ then30: br label %ret ifend32: %t89 = load ptr, ptr %t0 - %t90 = call i32 @fn_streq(ptr %t89, ptr @.str476) + %t90 = call i32 @fn_streq(ptr %t89, ptr @.str482) %t91 = icmp ne i32 %t90, 0 %t92 = zext i1 %t91 to i32 store i32 %t92, ptr %t88 br i1 %t91, label %scend34, label %sc33 sc33: %t93 = load ptr, ptr %t0 - %t94 = call i32 @fn_streq(ptr %t93, ptr @.str477) + %t94 = call i32 @fn_streq(ptr %t93, ptr @.str483) %t95 = icmp ne i32 %t94, 0 %t96 = zext i1 %t95 to i32 store i32 %t96, ptr %t88 @@ -10909,14 +11229,14 @@ then35: br label %ret ifend37: %t101 = load ptr, ptr %t0 - %t102 = call i32 @fn_streq(ptr %t101, ptr @.str478) + %t102 = call i32 @fn_streq(ptr %t101, ptr @.str484) %t103 = icmp ne i32 %t102, 0 %t104 = zext i1 %t103 to i32 store i32 %t104, ptr %t100 br i1 %t103, label %scend39, label %sc38 sc38: %t105 = load ptr, ptr %t0 - %t106 = call i32 @fn_streq(ptr %t105, ptr @.str479) + %t106 = call i32 @fn_streq(ptr %t105, ptr @.str485) %t107 = icmp ne i32 %t106, 0 %t108 = zext i1 %t107 to i32 store i32 %t108, ptr %t100 @@ -10929,7 +11249,7 @@ scend39: br i1 %t110, label %scend41, label %sc40 sc40: %t112 = load ptr, ptr %t0 - %t113 = call i32 @fn_streq(ptr %t112, ptr @.str480) + %t113 = call i32 @fn_streq(ptr %t112, ptr @.str486) %t114 = icmp ne i32 %t113, 0 %t115 = zext i1 %t114 to i32 store i32 %t115, ptr %t99 @@ -10943,14 +11263,14 @@ then42: br label %ret ifend44: %t119 = load ptr, ptr %t0 - %t120 = call i32 @fn_streq(ptr %t119, ptr @.str481) + %t120 = call i32 @fn_streq(ptr %t119, ptr @.str487) %t121 = icmp ne i32 %t120, 0 %t122 = zext i1 %t121 to i32 store i32 %t122, ptr %t118 br i1 %t121, label %scend46, label %sc45 sc45: %t123 = load ptr, ptr %t0 - %t124 = call i32 @fn_streq(ptr %t123, ptr @.str482) + %t124 = call i32 @fn_streq(ptr %t123, ptr @.str488) %t125 = icmp ne i32 %t124, 0 %t126 = zext i1 %t125 to i32 store i32 %t126, ptr %t118 @@ -11017,23 +11337,23 @@ entry: store ptr %arg_name, ptr %t0 store ptr %arg_e, ptr %t1 %t2 = load ptr, ptr %t0 - %t3 = call i32 @fn_streq(ptr %t2, ptr @.str483) + %t3 = call i32 @fn_streq(ptr %t2, ptr @.str489) %t4 = icmp ne i32 %t3, 0 br i1 %t4, label %then0, label %ifend2 then0: %t5 = load ptr, ptr %t1 %t6 = call ptr @fn_arg_code(ptr %t5, i32 0) store ptr %t6, ptr %t7 - call void @fn_emit(ptr @.str484) + call void @fn_emit(ptr @.str490) %t8 = load ptr, ptr %t7 call void @fn_emit(ptr %t8) - call void @fn_emit(ptr @.str485) - %t9 = call ptr @fn_val(ptr @.str486, ptr @.str487) + call void @fn_emit(ptr @.str491) + %t9 = call ptr @fn_val(ptr @.str492, ptr @.str493) store ptr %t9, ptr %retval br label %ret ifend2: %t10 = load ptr, ptr %t0 - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str488) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str494) %t12 = icmp ne i32 %t11, 0 br i1 %t12, label %then3, label %ifend5 then3: @@ -11047,26 +11367,26 @@ then3: %t20 = call ptr @fn_arg_code(ptr %t19, i32 2) store ptr %t20, ptr %t21 %t22 = load ptr, ptr %t21 - %t23 = call ptr @fn_sconcat(ptr %t22, ptr @.str490) - %t24 = call ptr @fn_sconcat(ptr @.str489, ptr %t23) + %t23 = call ptr @fn_sconcat(ptr %t22, ptr @.str496) + %t24 = call ptr @fn_sconcat(ptr @.str495, ptr %t23) %t25 = call ptr @fn_emit_bind(ptr %t24) store ptr %t25, ptr %t26 - call void @fn_emit(ptr @.str491) + call void @fn_emit(ptr @.str497) %t27 = load ptr, ptr %t15 call void @fn_emit(ptr %t27) - call void @fn_emit(ptr @.str492) + call void @fn_emit(ptr @.str498) %t28 = load ptr, ptr %t18 call void @fn_emit(ptr %t28) - call void @fn_emit(ptr @.str493) + call void @fn_emit(ptr @.str499) %t29 = load ptr, ptr %t26 call void @fn_emit(ptr %t29) - call void @fn_emit(ptr @.str494) - %t30 = call ptr @fn_val(ptr @.str495, ptr @.str496) + call void @fn_emit(ptr @.str500) + %t30 = call ptr @fn_val(ptr @.str501, ptr @.str502) store ptr %t30, ptr %retval br label %ret ifend5: %t31 = load ptr, ptr %t0 - %t32 = call i32 @fn_streq(ptr %t31, ptr @.str497) + %t32 = call i32 @fn_streq(ptr %t31, ptr @.str503) %t33 = icmp ne i32 %t32, 0 br i1 %t33, label %then6, label %ifend8 then6: @@ -11080,26 +11400,26 @@ then6: %t41 = call ptr @fn_arg_code(ptr %t40, i32 2) store ptr %t41, ptr %t42 %t43 = load ptr, ptr %t42 - %t44 = call ptr @fn_sconcat(ptr %t43, ptr @.str499) - %t45 = call ptr @fn_sconcat(ptr @.str498, ptr %t44) + %t44 = call ptr @fn_sconcat(ptr %t43, ptr @.str505) + %t45 = call ptr @fn_sconcat(ptr @.str504, ptr %t44) %t46 = call ptr @fn_emit_bind(ptr %t45) store ptr %t46, ptr %t47 - call void @fn_emit(ptr @.str500) + call void @fn_emit(ptr @.str506) %t48 = load ptr, ptr %t36 call void @fn_emit(ptr %t48) - call void @fn_emit(ptr @.str501) + call void @fn_emit(ptr @.str507) %t49 = load ptr, ptr %t39 call void @fn_emit(ptr %t49) - call void @fn_emit(ptr @.str502) + call void @fn_emit(ptr @.str508) %t50 = load ptr, ptr %t47 call void @fn_emit(ptr %t50) - call void @fn_emit(ptr @.str503) - %t51 = call ptr @fn_val(ptr @.str504, ptr @.str505) + call void @fn_emit(ptr @.str509) + %t51 = call ptr @fn_val(ptr @.str510, ptr @.str511) store ptr %t51, ptr %retval br label %ret ifend8: %t52 = load ptr, ptr %t0 - %t53 = call i32 @fn_streq(ptr %t52, ptr @.str506) + %t53 = call i32 @fn_streq(ptr %t52, ptr @.str512) %t54 = icmp ne i32 %t53, 0 br i1 %t54, label %then9, label %ifend11 then9: @@ -11111,49 +11431,49 @@ then9: store ptr %t59, ptr %t60 %t61 = call ptr @fn_nreg() store ptr %t61, ptr %t62 - call void @fn_emit(ptr @.str507) + call void @fn_emit(ptr @.str513) %t63 = load ptr, ptr %t62 call void @fn_emit(ptr %t63) - call void @fn_emit(ptr @.str508) + call void @fn_emit(ptr @.str514) %t64 = load ptr, ptr %t57 call void @fn_emit(ptr %t64) - call void @fn_emit(ptr @.str509) + call void @fn_emit(ptr @.str515) %t65 = load ptr, ptr %t60 call void @fn_emit(ptr %t65) - call void @fn_emit(ptr @.str510) + call void @fn_emit(ptr @.str516) %t66 = load ptr, ptr %t62 - %t67 = call ptr @fn_val(ptr %t66, ptr @.str511) + %t67 = call ptr @fn_val(ptr %t66, ptr @.str517) store ptr %t67, ptr %retval br label %ret ifend11: %t68 = load ptr, ptr %t0 - %t69 = call i32 @fn_streq(ptr %t68, ptr @.str512) + %t69 = call i32 @fn_streq(ptr %t68, ptr @.str518) %t70 = icmp ne i32 %t69, 0 br i1 %t70, label %then12, label %ifend14 then12: - %t71 = call ptr @fn_emit_bind(ptr @.str513) - %t72 = call ptr @fn_val(ptr %t71, ptr @.str514) + %t71 = call ptr @fn_emit_bind(ptr @.str519) + %t72 = call ptr @fn_val(ptr %t71, ptr @.str520) store ptr %t72, ptr %retval br label %ret ifend14: %t73 = load ptr, ptr %t0 - %t74 = call i32 @fn_streq(ptr %t73, ptr @.str515) + %t74 = call i32 @fn_streq(ptr %t73, ptr @.str521) %t75 = icmp ne i32 %t74, 0 br i1 %t75, label %then15, label %ifend17 then15: %t76 = load ptr, ptr %t1 %t77 = call ptr @fn_arg_code(ptr %t76, i32 0) store ptr %t77, ptr %t78 - call void @fn_emit(ptr @.str516) + call void @fn_emit(ptr @.str522) %t79 = load ptr, ptr %t78 call void @fn_emit(ptr %t79) - call void @fn_emit(ptr @.str517) - %t80 = call ptr @fn_val(ptr @.str518, ptr @.str519) + call void @fn_emit(ptr @.str523) + %t80 = call ptr @fn_val(ptr @.str524, ptr @.str525) store ptr %t80, ptr %retval br label %ret ifend17: %t81 = load ptr, ptr %t0 - %t82 = call i32 @fn_streq(ptr %t81, ptr @.str520) + %t82 = call i32 @fn_streq(ptr %t81, ptr @.str526) %t83 = icmp ne i32 %t82, 0 br i1 %t83, label %then18, label %ifend20 then18: @@ -11161,35 +11481,35 @@ then18: %t85 = call ptr @fn_arg_code(ptr %t84, i32 0) store ptr %t85, ptr %t86 %t87 = load ptr, ptr %t86 - %t88 = call ptr @fn_sconcat(ptr %t87, ptr @.str522) - %t89 = call ptr @fn_sconcat(ptr @.str521, ptr %t88) + %t88 = call ptr @fn_sconcat(ptr %t87, ptr @.str528) + %t89 = call ptr @fn_sconcat(ptr @.str527, ptr %t88) %t90 = call ptr @fn_emit_bind(ptr %t89) store ptr %t90, ptr %t91 %t92 = load ptr, ptr %t91 - %t93 = call ptr @fn_sconcat(ptr %t92, ptr @.str524) - %t94 = call ptr @fn_sconcat(ptr @.str523, ptr %t93) + %t93 = call ptr @fn_sconcat(ptr %t92, ptr @.str530) + %t94 = call ptr @fn_sconcat(ptr @.str529, ptr %t93) %t95 = call ptr @fn_emit_bind(ptr %t94) - %t96 = call ptr @fn_val(ptr %t95, ptr @.str525) + %t96 = call ptr @fn_val(ptr %t95, ptr @.str531) store ptr %t96, ptr %retval br label %ret ifend20: %t97 = load ptr, ptr %t0 - %t98 = call i32 @fn_streq(ptr %t97, ptr @.str526) + %t98 = call i32 @fn_streq(ptr %t97, ptr @.str532) %t99 = icmp ne i32 %t98, 0 br i1 %t99, label %then21, label %ifend23 then21: - %t100 = call ptr @fn_emit_bind(ptr @.str527) + %t100 = call ptr @fn_emit_bind(ptr @.str533) store ptr %t100, ptr %t101 %t102 = load ptr, ptr %t101 - %t103 = call ptr @fn_sconcat(ptr %t102, ptr @.str529) - %t104 = call ptr @fn_sconcat(ptr @.str528, ptr %t103) + %t103 = call ptr @fn_sconcat(ptr %t102, ptr @.str535) + %t104 = call ptr @fn_sconcat(ptr @.str534, ptr %t103) %t105 = call ptr @fn_emit_bind(ptr %t104) - %t106 = call ptr @fn_val(ptr %t105, ptr @.str530) + %t106 = call ptr @fn_val(ptr %t105, ptr @.str536) store ptr %t106, ptr %retval br label %ret ifend23: %t107 = load ptr, ptr %t0 - %t108 = call i32 @fn_streq(ptr %t107, ptr @.str531) + %t108 = call i32 @fn_streq(ptr %t107, ptr @.str537) %t109 = icmp ne i32 %t108, 0 br i1 %t109, label %then24, label %ifend26 then24: @@ -11201,25 +11521,25 @@ then24: store ptr %t114, ptr %t115 %t116 = call ptr @fn_nreg() store ptr %t116, ptr %t117 - call void @fn_emit(ptr @.str532) + call void @fn_emit(ptr @.str538) %t118 = load ptr, ptr %t117 call void @fn_emit(ptr %t118) - call void @fn_emit(ptr @.str533) + call void @fn_emit(ptr @.str539) %t119 = load ptr, ptr %t112 call void @fn_emit(ptr %t119) - call void @fn_emit(ptr @.str534) + call void @fn_emit(ptr @.str540) %t120 = load ptr, ptr %t115 call void @fn_emit(ptr %t120) - call void @fn_emit(ptr @.str535) + call void @fn_emit(ptr @.str541) %t121 = load ptr, ptr %t117 - %t122 = call ptr @fn_sconcat(ptr @.str536, ptr %t121) + %t122 = call ptr @fn_sconcat(ptr @.str542, ptr %t121) %t123 = call ptr @fn_emit_bind(ptr %t122) - %t124 = call ptr @fn_val(ptr %t123, ptr @.str537) + %t124 = call ptr @fn_val(ptr %t123, ptr @.str543) store ptr %t124, ptr %retval br label %ret ifend26: %t125 = load ptr, ptr %t0 - %t126 = call i32 @fn_streq(ptr %t125, ptr @.str538) + %t126 = call i32 @fn_streq(ptr %t125, ptr @.str544) %t127 = icmp ne i32 %t126, 0 br i1 %t127, label %then27, label %ifend29 then27: @@ -11234,29 +11554,29 @@ then27: store ptr %t135, ptr %t136 %t137 = call ptr @fn_nreg() store ptr %t137, ptr %t138 - call void @fn_emit(ptr @.str539) + call void @fn_emit(ptr @.str545) %t139 = load ptr, ptr %t138 call void @fn_emit(ptr %t139) - call void @fn_emit(ptr @.str540) + call void @fn_emit(ptr @.str546) %t140 = load ptr, ptr %t130 call void @fn_emit(ptr %t140) - call void @fn_emit(ptr @.str541) + call void @fn_emit(ptr @.str547) %t141 = load ptr, ptr %t133 call void @fn_emit(ptr %t141) - call void @fn_emit(ptr @.str542) - call void @fn_emit(ptr @.str543) + call void @fn_emit(ptr @.str548) + call void @fn_emit(ptr @.str549) %t142 = load ptr, ptr %t136 call void @fn_emit(ptr %t142) - call void @fn_emit(ptr @.str544) + call void @fn_emit(ptr @.str550) %t143 = load ptr, ptr %t138 call void @fn_emit(ptr %t143) - call void @fn_emit(ptr @.str545) - %t144 = call ptr @fn_val(ptr @.str546, ptr @.str547) + call void @fn_emit(ptr @.str551) + %t144 = call ptr @fn_val(ptr @.str552, ptr @.str553) store ptr %t144, ptr %retval br label %ret ifend29: %t145 = load ptr, ptr %t0 - %t146 = call i32 @fn_streq(ptr %t145, ptr @.str548) + %t146 = call i32 @fn_streq(ptr %t145, ptr @.str554) %t147 = icmp ne i32 %t146, 0 br i1 %t147, label %then30, label %ifend32 then30: @@ -11268,25 +11588,25 @@ then30: store ptr %t152, ptr %t153 %t154 = call ptr @fn_nreg() store ptr %t154, ptr %t155 - call void @fn_emit(ptr @.str549) + call void @fn_emit(ptr @.str555) %t156 = load ptr, ptr %t155 call void @fn_emit(ptr %t156) - call void @fn_emit(ptr @.str550) + call void @fn_emit(ptr @.str556) %t157 = load ptr, ptr %t150 call void @fn_emit(ptr %t157) - call void @fn_emit(ptr @.str551) + call void @fn_emit(ptr @.str557) %t158 = load ptr, ptr %t153 call void @fn_emit(ptr %t158) - call void @fn_emit(ptr @.str552) + call void @fn_emit(ptr @.str558) %t159 = load ptr, ptr %t155 - %t160 = call ptr @fn_sconcat(ptr @.str553, ptr %t159) + %t160 = call ptr @fn_sconcat(ptr @.str559, ptr %t159) %t161 = call ptr @fn_emit_bind(ptr %t160) - %t162 = call ptr @fn_val(ptr %t161, ptr @.str554) + %t162 = call ptr @fn_val(ptr %t161, ptr @.str560) store ptr %t162, ptr %retval br label %ret ifend32: %t163 = load ptr, ptr %t0 - %t164 = call i32 @fn_streq(ptr %t163, ptr @.str555) + %t164 = call i32 @fn_streq(ptr %t163, ptr @.str561) %t165 = icmp ne i32 %t164, 0 br i1 %t165, label %then33, label %ifend35 then33: @@ -11301,29 +11621,29 @@ then33: store ptr %t173, ptr %t174 %t175 = call ptr @fn_nreg() store ptr %t175, ptr %t176 - call void @fn_emit(ptr @.str556) + call void @fn_emit(ptr @.str562) %t177 = load ptr, ptr %t176 call void @fn_emit(ptr %t177) - call void @fn_emit(ptr @.str557) + call void @fn_emit(ptr @.str563) %t178 = load ptr, ptr %t168 call void @fn_emit(ptr %t178) - call void @fn_emit(ptr @.str558) + call void @fn_emit(ptr @.str564) %t179 = load ptr, ptr %t171 call void @fn_emit(ptr %t179) - call void @fn_emit(ptr @.str559) - call void @fn_emit(ptr @.str560) + call void @fn_emit(ptr @.str565) + call void @fn_emit(ptr @.str566) %t180 = load ptr, ptr %t174 call void @fn_emit(ptr %t180) - call void @fn_emit(ptr @.str561) + call void @fn_emit(ptr @.str567) %t181 = load ptr, ptr %t176 call void @fn_emit(ptr %t181) - call void @fn_emit(ptr @.str562) - %t182 = call ptr @fn_val(ptr @.str563, ptr @.str564) + call void @fn_emit(ptr @.str568) + %t182 = call ptr @fn_val(ptr @.str569, ptr @.str570) store ptr %t182, ptr %retval br label %ret ifend35: %t183 = load ptr, ptr %t0 - %t184 = call i32 @fn_streq(ptr %t183, ptr @.str565) + %t184 = call i32 @fn_streq(ptr %t183, ptr @.str571) %t185 = icmp ne i32 %t184, 0 br i1 %t185, label %then36, label %ifend38 then36: @@ -11339,12 +11659,12 @@ then36: %t195 = load ptr, ptr %t194 %t196 = getelementptr inbounds %Str_Val, ptr %t195, i32 0, i32 0 %t197 = load ptr, ptr %t196 - %t198 = call ptr @fn_val(ptr %t197, ptr @.str566) + %t198 = call ptr @fn_val(ptr %t197, ptr @.str572) store ptr %t198, ptr %retval br label %ret ifend38: %t199 = load ptr, ptr %t0 - %t200 = call i32 @fn_streq(ptr %t199, ptr @.str567) + %t200 = call i32 @fn_streq(ptr %t199, ptr @.str573) %t201 = icmp ne i32 %t200, 0 br i1 %t201, label %then39, label %ifend41 then39: @@ -11360,12 +11680,12 @@ then39: %t211 = load ptr, ptr %t210 %t212 = getelementptr inbounds %Str_Val, ptr %t211, i32 0, i32 0 %t213 = load ptr, ptr %t212 - %t214 = call ptr @fn_val(ptr %t213, ptr @.str568) + %t214 = call ptr @fn_val(ptr %t213, ptr @.str574) store ptr %t214, ptr %retval br label %ret ifend41: %t215 = load ptr, ptr %t0 - %t216 = call i32 @fn_streq(ptr %t215, ptr @.str569) + %t216 = call i32 @fn_streq(ptr %t215, ptr @.str575) %t217 = icmp ne i32 %t216, 0 br i1 %t217, label %then42, label %ifend44 then42: @@ -11373,45 +11693,45 @@ then42: %t219 = icmp ne i32 %t218, 0 br i1 %t219, label %then45, label %ifend47 then45: - %t220 = call ptr @fn_val(ptr @.str570, ptr @.str571) + %t220 = call ptr @fn_val(ptr @.str576, ptr @.str577) store ptr %t220, ptr %retval br label %ret ifend47: - %t221 = call ptr @fn_val(ptr @.str572, ptr @.str573) + %t221 = call ptr @fn_val(ptr @.str578, ptr @.str579) store ptr %t221, ptr %retval br label %ret ifend44: %t222 = load ptr, ptr %t0 - %t223 = call i32 @fn_streq(ptr %t222, ptr @.str574) + %t223 = call i32 @fn_streq(ptr %t222, ptr @.str580) %t224 = icmp ne i32 %t223, 0 br i1 %t224, label %then48, label %ifend50 then48: - %t225 = call ptr @fn_val(ptr @.str575, ptr @.str576) + %t225 = call ptr @fn_val(ptr @.str581, ptr @.str582) store ptr %t225, ptr %retval br label %ret ifend50: %t226 = load ptr, ptr %t0 - %t227 = call i32 @fn_streq(ptr %t226, ptr @.str577) + %t227 = call i32 @fn_streq(ptr %t226, ptr @.str583) %t228 = icmp ne i32 %t227, 0 br i1 %t228, label %then51, label %ifend53 then51: - %t229 = call ptr @fn_emit_bind(ptr @.str578) - %t230 = call ptr @fn_val(ptr %t229, ptr @.str579) + %t229 = call ptr @fn_emit_bind(ptr @.str584) + %t230 = call ptr @fn_val(ptr %t229, ptr @.str585) store ptr %t230, ptr %retval br label %ret ifend53: %t231 = load ptr, ptr %t0 - %t232 = call i32 @fn_streq(ptr %t231, ptr @.str580) + %t232 = call i32 @fn_streq(ptr %t231, ptr @.str586) %t233 = icmp ne i32 %t232, 0 br i1 %t233, label %then54, label %ifend56 then54: - %t234 = call ptr @fn_emit_bind(ptr @.str581) - %t235 = call ptr @fn_val(ptr %t234, ptr @.str582) + %t234 = call ptr @fn_emit_bind(ptr @.str587) + %t235 = call ptr @fn_val(ptr %t234, ptr @.str588) store ptr %t235, ptr %retval br label %ret ifend56: %t236 = load ptr, ptr %t0 - %t237 = call i32 @fn_streq(ptr %t236, ptr @.str583) + %t237 = call i32 @fn_streq(ptr %t236, ptr @.str589) %t238 = icmp ne i32 %t237, 0 br i1 %t238, label %then57, label %ifend59 then57: @@ -11427,25 +11747,25 @@ then57: %t248 = load ptr, ptr %t1 %t249 = call ptr @fn_arg_code(ptr %t248, i32 3) store ptr %t249, ptr %t250 - call void @fn_emit(ptr @.str584) + call void @fn_emit(ptr @.str590) %t251 = load ptr, ptr %t241 call void @fn_emit(ptr %t251) - call void @fn_emit(ptr @.str585) + call void @fn_emit(ptr @.str591) %t252 = load ptr, ptr %t244 call void @fn_emit(ptr %t252) - call void @fn_emit(ptr @.str586) + call void @fn_emit(ptr @.str592) %t253 = load ptr, ptr %t247 call void @fn_emit(ptr %t253) - call void @fn_emit(ptr @.str587) + call void @fn_emit(ptr @.str593) %t254 = load ptr, ptr %t250 call void @fn_emit(ptr %t254) - call void @fn_emit(ptr @.str588) - %t255 = call ptr @fn_val(ptr @.str589, ptr @.str590) + call void @fn_emit(ptr @.str594) + %t255 = call ptr @fn_val(ptr @.str595, ptr @.str596) store ptr %t255, ptr %retval br label %ret ifend59: %t256 = load ptr, ptr %t0 - %t257 = call i32 @fn_streq(ptr %t256, ptr @.str591) + %t257 = call i32 @fn_streq(ptr %t256, ptr @.str597) %t258 = icmp ne i32 %t257, 0 br i1 %t258, label %then60, label %ifend62 then60: @@ -11458,31 +11778,31 @@ then60: %t265 = load ptr, ptr %t1 %t266 = call ptr @fn_arg_code(ptr %t265, i32 2) store ptr %t266, ptr %t267 - call void @fn_emit(ptr @.str592) + call void @fn_emit(ptr @.str598) %t268 = load ptr, ptr %t261 call void @fn_emit(ptr %t268) - call void @fn_emit(ptr @.str593) + call void @fn_emit(ptr @.str599) %t269 = load ptr, ptr %t264 call void @fn_emit(ptr %t269) - call void @fn_emit(ptr @.str594) + call void @fn_emit(ptr @.str600) %t270 = load ptr, ptr %t267 call void @fn_emit(ptr %t270) - call void @fn_emit(ptr @.str595) - %t271 = call ptr @fn_val(ptr @.str596, ptr @.str597) + call void @fn_emit(ptr @.str601) + %t271 = call ptr @fn_val(ptr @.str602, ptr @.str603) store ptr %t271, ptr %retval br label %ret ifend62: %t272 = load ptr, ptr %t0 - %t273 = call i32 @fn_streq(ptr %t272, ptr @.str598) + %t273 = call i32 @fn_streq(ptr %t272, ptr @.str604) %t274 = icmp ne i32 %t273, 0 br i1 %t274, label %then63, label %ifend65 then63: - call void @fn_emit(ptr @.str599) - %t275 = call ptr @fn_val(ptr @.str600, ptr @.str601) + call void @fn_emit(ptr @.str605) + %t275 = call ptr @fn_val(ptr @.str606, ptr @.str607) store ptr %t275, ptr %retval br label %ret ifend65: - %t276 = call ptr @fn_val(ptr @.str602, ptr @.str603) + %t276 = call ptr @fn_val(ptr @.str608, ptr @.str609) store ptr %t276, ptr %retval br label %ret ret: @@ -11499,14 +11819,14 @@ entry: %t3 = alloca i32 store ptr %arg_name, ptr %t0 %t4 = load ptr, ptr %t0 - %t5 = call i32 @fn_streq(ptr %t4, ptr @.str604) + %t5 = call i32 @fn_streq(ptr %t4, ptr @.str610) %t6 = icmp ne i32 %t5, 0 %t7 = zext i1 %t6 to i32 store i32 %t7, ptr %t3 br i1 %t6, label %scend1, label %sc0 sc0: %t8 = load ptr, ptr %t0 - %t9 = call i32 @fn_streq(ptr %t8, ptr @.str605) + %t9 = call i32 @fn_streq(ptr %t8, ptr @.str611) %t10 = icmp ne i32 %t9, 0 %t11 = zext i1 %t10 to i32 store i32 %t11, ptr %t3 @@ -11519,7 +11839,7 @@ scend1: br i1 %t13, label %scend3, label %sc2 sc2: %t15 = load ptr, ptr %t0 - %t16 = call i32 @fn_streq(ptr %t15, ptr @.str606) + %t16 = call i32 @fn_streq(ptr %t15, ptr @.str612) %t17 = icmp ne i32 %t16, 0 %t18 = zext i1 %t17 to i32 store i32 %t18, ptr %t2 @@ -11532,7 +11852,7 @@ scend3: br i1 %t20, label %scend5, label %sc4 sc4: %t22 = load ptr, ptr %t0 - %t23 = call i32 @fn_streq(ptr %t22, ptr @.str607) + %t23 = call i32 @fn_streq(ptr %t22, ptr @.str613) %t24 = icmp ne i32 %t23, 0 %t25 = zext i1 %t24 to i32 store i32 %t25, ptr %t1 @@ -11568,7 +11888,7 @@ entry: store ptr %arg_name, ptr %t0 store ptr %arg_e, ptr %t1 %t2 = load ptr, ptr %t0 - %t3 = call i32 @fn_streq(ptr %t2, ptr @.str608) + %t3 = call i32 @fn_streq(ptr %t2, ptr @.str614) %t4 = icmp ne i32 %t3, 0 br i1 %t4, label %then0, label %ifend2 then0: @@ -11584,14 +11904,14 @@ then0: %t14 = load ptr, ptr %t13 %t15 = getelementptr inbounds %Str_Val, ptr %t14, i32 0, i32 0 %t16 = load ptr, ptr %t15 - %t17 = call ptr @fn_sconcat(ptr %t16, ptr @.str610) - %t18 = call ptr @fn_sconcat(ptr @.str609, ptr %t17) + %t17 = call ptr @fn_sconcat(ptr %t16, ptr @.str616) + %t18 = call ptr @fn_sconcat(ptr @.str615, ptr %t17) %t19 = call ptr @fn_emit_bind(ptr %t18) store ptr %t19, ptr %t20 %t21 = load ptr, ptr %t13 %t22 = getelementptr inbounds %Str_Val, ptr %t21, i32 0, i32 0 %t23 = load ptr, ptr %t22 - %t24 = call ptr @fn_sconcat(ptr @.str611, ptr %t23) + %t24 = call ptr @fn_sconcat(ptr @.str617, ptr %t23) %t25 = call ptr @fn_emit_bind(ptr %t24) store ptr %t25, ptr %t26 %t27 = load ptr, ptr %t20 @@ -11599,25 +11919,25 @@ then0: %t29 = load ptr, ptr %t13 %t30 = getelementptr inbounds %Str_Val, ptr %t29, i32 0, i32 0 %t31 = load ptr, ptr %t30 - %t32 = call ptr @fn_sconcat(ptr @.str614, ptr %t31) + %t32 = call ptr @fn_sconcat(ptr @.str620, ptr %t31) %t33 = call ptr @fn_sconcat(ptr %t28, ptr %t32) - %t34 = call ptr @fn_sconcat(ptr @.str613, ptr %t33) + %t34 = call ptr @fn_sconcat(ptr @.str619, ptr %t33) %t35 = call ptr @fn_sconcat(ptr %t27, ptr %t34) - %t36 = call ptr @fn_sconcat(ptr @.str612, ptr %t35) + %t36 = call ptr @fn_sconcat(ptr @.str618, ptr %t35) %t37 = call ptr @fn_emit_bind(ptr %t36) - %t38 = call ptr @fn_val(ptr %t37, ptr @.str615) + %t38 = call ptr @fn_val(ptr %t37, ptr @.str621) store ptr %t38, ptr %retval br label %ret ifend2: %t40 = load ptr, ptr %t0 - %t41 = call i32 @fn_streq(ptr %t40, ptr @.str616) + %t41 = call i32 @fn_streq(ptr %t40, ptr @.str622) %t42 = icmp ne i32 %t41, 0 %t43 = zext i1 %t42 to i32 store i32 %t43, ptr %t39 br i1 %t42, label %scend4, label %sc3 sc3: %t44 = load ptr, ptr %t0 - %t45 = call i32 @fn_streq(ptr %t44, ptr @.str617) + %t45 = call i32 @fn_streq(ptr %t44, ptr @.str623) %t46 = icmp ne i32 %t45, 0 %t47 = zext i1 %t46 to i32 store i32 %t47, ptr %t39 @@ -11645,13 +11965,13 @@ then5: %t65 = load ptr, ptr %t64 %t66 = call ptr @fn_emit_expr(ptr %t65) store ptr %t66, ptr %t67 - store ptr @.str618, ptr %t68 + store ptr @.str624, ptr %t68 %t69 = load ptr, ptr %t0 - %t70 = call i32 @fn_streq(ptr %t69, ptr @.str619) + %t70 = call i32 @fn_streq(ptr %t69, ptr @.str625) %t71 = icmp ne i32 %t70, 0 br i1 %t71, label %then8, label %ifend10 then8: - store ptr @.str620, ptr %t68 + store ptr @.str626, ptr %t68 br label %ifend10 ifend10: %t72 = load ptr, ptr %t68 @@ -11661,11 +11981,11 @@ ifend10: %t76 = load ptr, ptr %t67 %t77 = getelementptr inbounds %Str_Val, ptr %t76, i32 0, i32 0 %t78 = load ptr, ptr %t77 - %t79 = call ptr @fn_sconcat(ptr @.str623, ptr %t78) + %t79 = call ptr @fn_sconcat(ptr @.str629, ptr %t78) %t80 = call ptr @fn_sconcat(ptr %t75, ptr %t79) - %t81 = call ptr @fn_sconcat(ptr @.str622, ptr %t80) + %t81 = call ptr @fn_sconcat(ptr @.str628, ptr %t80) %t82 = call ptr @fn_sconcat(ptr %t72, ptr %t81) - %t83 = call ptr @fn_sconcat(ptr @.str621, ptr %t82) + %t83 = call ptr @fn_sconcat(ptr @.str627, ptr %t82) %t84 = call ptr @fn_emit_bind(ptr %t83) store ptr %t84, ptr %t85 %t86 = load ptr, ptr %t85 @@ -11675,13 +11995,13 @@ ifend10: %t90 = load ptr, ptr %t67 %t91 = getelementptr inbounds %Str_Val, ptr %t90, i32 0, i32 0 %t92 = load ptr, ptr %t91 - %t93 = call ptr @fn_sconcat(ptr @.str626, ptr %t92) + %t93 = call ptr @fn_sconcat(ptr @.str632, ptr %t92) %t94 = call ptr @fn_sconcat(ptr %t89, ptr %t93) - %t95 = call ptr @fn_sconcat(ptr @.str625, ptr %t94) + %t95 = call ptr @fn_sconcat(ptr @.str631, ptr %t94) %t96 = call ptr @fn_sconcat(ptr %t86, ptr %t95) - %t97 = call ptr @fn_sconcat(ptr @.str624, ptr %t96) + %t97 = call ptr @fn_sconcat(ptr @.str630, ptr %t96) %t98 = call ptr @fn_emit_bind(ptr %t97) - %t99 = call ptr @fn_val(ptr %t98, ptr @.str627) + %t99 = call ptr @fn_val(ptr %t98, ptr @.str633) store ptr %t99, ptr %retval br label %ret ifend7: @@ -11718,9 +12038,9 @@ ifend7: %t130 = load ptr, ptr %t126 %t131 = getelementptr inbounds %Str_Val, ptr %t130, i32 0, i32 0 %t132 = load ptr, ptr %t131 - %t133 = call ptr @fn_sconcat(ptr @.str629, ptr %t132) + %t133 = call ptr @fn_sconcat(ptr @.str635, ptr %t132) %t134 = call ptr @fn_sconcat(ptr %t129, ptr %t133) - %t135 = call ptr @fn_sconcat(ptr @.str628, ptr %t134) + %t135 = call ptr @fn_sconcat(ptr @.str634, ptr %t134) %t136 = call ptr @fn_emit_bind(ptr %t135) store ptr %t136, ptr %t137 %t138 = load ptr, ptr %t137 @@ -11730,20 +12050,20 @@ ifend7: %t142 = load ptr, ptr %t126 %t143 = getelementptr inbounds %Str_Val, ptr %t142, i32 0, i32 0 %t144 = load ptr, ptr %t143 - %t145 = call ptr @fn_sconcat(ptr @.str632, ptr %t144) + %t145 = call ptr @fn_sconcat(ptr @.str638, ptr %t144) %t146 = call ptr @fn_sconcat(ptr %t141, ptr %t145) - %t147 = call ptr @fn_sconcat(ptr @.str631, ptr %t146) + %t147 = call ptr @fn_sconcat(ptr @.str637, ptr %t146) %t148 = call ptr @fn_sconcat(ptr %t138, ptr %t147) - %t149 = call ptr @fn_sconcat(ptr @.str630, ptr %t148) + %t149 = call ptr @fn_sconcat(ptr @.str636, ptr %t148) %t150 = call ptr @fn_emit_bind(ptr %t149) store ptr %t150, ptr %t151 %t152 = load ptr, ptr %t117 %t153 = getelementptr inbounds %Str_Val, ptr %t152, i32 0, i32 0 %t154 = load ptr, ptr %t153 %t155 = load ptr, ptr %t151 - %t156 = call ptr @fn_sconcat(ptr @.str634, ptr %t155) + %t156 = call ptr @fn_sconcat(ptr @.str640, ptr %t155) %t157 = call ptr @fn_sconcat(ptr %t154, ptr %t156) - %t158 = call ptr @fn_sconcat(ptr @.str633, ptr %t157) + %t158 = call ptr @fn_sconcat(ptr @.str639, ptr %t157) %t159 = call ptr @fn_emit_bind(ptr %t158) store ptr %t159, ptr %t160 %t161 = load ptr, ptr %t160 @@ -11751,13 +12071,13 @@ ifend7: %t163 = getelementptr inbounds %Str_Val, ptr %t162, i32 0, i32 0 %t164 = load ptr, ptr %t163 %t165 = load ptr, ptr %t151 - %t166 = call ptr @fn_sconcat(ptr @.str637, ptr %t165) + %t166 = call ptr @fn_sconcat(ptr @.str643, ptr %t165) %t167 = call ptr @fn_sconcat(ptr %t164, ptr %t166) - %t168 = call ptr @fn_sconcat(ptr @.str636, ptr %t167) + %t168 = call ptr @fn_sconcat(ptr @.str642, ptr %t167) %t169 = call ptr @fn_sconcat(ptr %t161, ptr %t168) - %t170 = call ptr @fn_sconcat(ptr @.str635, ptr %t169) + %t170 = call ptr @fn_sconcat(ptr @.str641, ptr %t169) %t171 = call ptr @fn_emit_bind(ptr %t170) - %t172 = call ptr @fn_val(ptr %t171, ptr @.str638) + %t172 = call ptr @fn_val(ptr %t171, ptr @.str644) store ptr %t172, ptr %retval br label %ret ret: @@ -11772,13 +12092,13 @@ entry: %t5 = alloca ptr store ptr %arg_llt, ptr %t0 %t1 = load ptr, ptr %t0 - %t2 = call ptr @fn_sconcat(ptr %t1, ptr @.str640) - %t3 = call ptr @fn_sconcat(ptr @.str639, ptr %t2) + %t2 = call ptr @fn_sconcat(ptr %t1, ptr @.str646) + %t3 = call ptr @fn_sconcat(ptr @.str645, ptr %t2) %t4 = call ptr @fn_emit_bind(ptr %t3) store ptr %t4, ptr %t5 %t6 = load ptr, ptr %t5 - %t7 = call ptr @fn_sconcat(ptr %t6, ptr @.str642) - %t8 = call ptr @fn_sconcat(ptr @.str641, ptr %t7) + %t7 = call ptr @fn_sconcat(ptr %t6, ptr @.str648) + %t8 = call ptr @fn_sconcat(ptr @.str647, ptr %t7) %t9 = call ptr @fn_emit_bind(ptr %t8) store ptr %t9, ptr %retval br label %ret @@ -11810,16 +12130,16 @@ entry: %t7 = icmp ne i32 %t6, 0 br i1 %t7, label %then0, label %ifend2 then0: - call void @fn_perr(ptr @.str643) + call void @fn_perr(ptr @.str649) br label %ifend2 ifend2: %t8 = load ptr, ptr %t0 - %t9 = call ptr @fn_sconcat(ptr @.str644, ptr %t8) + %t9 = call ptr @fn_sconcat(ptr @.str650, ptr %t8) %t10 = call ptr @fn_emit_sizeof(ptr %t9) store ptr %t10, ptr %t11 %t12 = load ptr, ptr %t11 - %t13 = call ptr @fn_sconcat(ptr %t12, ptr @.str646) - %t14 = call ptr @fn_sconcat(ptr @.str645, ptr %t13) + %t13 = call ptr @fn_sconcat(ptr %t12, ptr @.str652) + %t14 = call ptr @fn_sconcat(ptr @.str651, ptr %t13) %t15 = call ptr @fn_emit_bind(ptr %t14) store ptr %t15, ptr %t16 store i32 0, ptr %t17 @@ -11847,32 +12167,32 @@ wbody4: store ptr %t34, ptr %t35 %t36 = call ptr @fn_nreg() store ptr %t36, ptr %t37 - call void @fn_emit(ptr @.str647) + call void @fn_emit(ptr @.str653) %t38 = load ptr, ptr %t37 call void @fn_emit(ptr %t38) - call void @fn_emit(ptr @.str648) + call void @fn_emit(ptr @.str654) %t39 = load ptr, ptr %t0 call void @fn_emit(ptr %t39) - call void @fn_emit(ptr @.str649) + call void @fn_emit(ptr @.str655) %t40 = load ptr, ptr %t16 call void @fn_emit(ptr %t40) - call void @fn_emit(ptr @.str650) + call void @fn_emit(ptr @.str656) %t41 = load i32, ptr %t17 %t42 = call ptr @fn_itoa(i32 %t41) call void @fn_emit(ptr %t42) - call void @fn_emit(ptr @.str651) + call void @fn_emit(ptr @.str657) %t43 = load ptr, ptr %t35 %t44 = getelementptr inbounds %Str_Node, ptr %t43, i32 0, i32 3 %t45 = load ptr, ptr %t44 %t46 = call ptr @fn_llty(ptr %t45) store ptr %t46, ptr %t47 - store ptr @.str652, ptr %t48 + store ptr @.str658, ptr %t48 %t49 = load ptr, ptr %t47 - %t50 = call i32 @fn_streq(ptr %t49, ptr @.str653) + %t50 = call i32 @fn_streq(ptr %t49, ptr @.str659) %t51 = icmp ne i32 %t50, 0 br i1 %t51, label %then6, label %ifend8 then6: - store ptr @.str654, ptr %t48 + store ptr @.str660, ptr %t48 br label %ifend8 ifend8: %t52 = load ptr, ptr %t35 @@ -11896,16 +12216,16 @@ then9: store ptr %t67, ptr %t48 br label %ifend11 ifend11: - call void @fn_emit(ptr @.str655) + call void @fn_emit(ptr @.str661) %t68 = load ptr, ptr %t47 call void @fn_emit(ptr %t68) - call void @fn_emit(ptr @.str656) + call void @fn_emit(ptr @.str662) %t69 = load ptr, ptr %t48 call void @fn_emit(ptr %t69) - call void @fn_emit(ptr @.str657) + call void @fn_emit(ptr @.str663) %t70 = load ptr, ptr %t37 call void @fn_emit(ptr %t70) - call void @fn_emit(ptr @.str658) + call void @fn_emit(ptr @.str664) %t71 = load i32, ptr %t17 %t72 = add i32 %t71, 1 store i32 %t72, ptr %t17 @@ -11931,52 +12251,52 @@ entry: %t14 = alloca ptr %t19 = alloca ptr store ptr %arg_ty, ptr %t0 - %t1 = call ptr @fn_emit_sizeof(ptr @.str659) + %t1 = call ptr @fn_emit_sizeof(ptr @.str665) store ptr %t1, ptr %t2 %t3 = load ptr, ptr %t2 - %t4 = call ptr @fn_sconcat(ptr %t3, ptr @.str661) - %t5 = call ptr @fn_sconcat(ptr @.str660, ptr %t4) + %t4 = call ptr @fn_sconcat(ptr %t3, ptr @.str667) + %t5 = call ptr @fn_sconcat(ptr @.str666, ptr %t4) %t6 = call ptr @fn_emit_bind(ptr %t5) store ptr %t6, ptr %t7 %t8 = call ptr @fn_nreg() store ptr %t8, ptr %t9 - call void @fn_emit(ptr @.str662) + call void @fn_emit(ptr @.str668) %t10 = load ptr, ptr %t9 call void @fn_emit(ptr %t10) - call void @fn_emit(ptr @.str663) + call void @fn_emit(ptr @.str669) %t11 = load ptr, ptr %t7 call void @fn_emit(ptr %t11) - call void @fn_emit(ptr @.str664) - call void @fn_emit(ptr @.str665) + call void @fn_emit(ptr @.str670) + call void @fn_emit(ptr @.str671) %t12 = load ptr, ptr %t9 call void @fn_emit(ptr %t12) - call void @fn_emit(ptr @.str666) + call void @fn_emit(ptr @.str672) %t13 = call ptr @fn_nreg() store ptr %t13, ptr %t14 - call void @fn_emit(ptr @.str667) + call void @fn_emit(ptr @.str673) %t15 = load ptr, ptr %t14 call void @fn_emit(ptr %t15) - call void @fn_emit(ptr @.str668) + call void @fn_emit(ptr @.str674) %t16 = load ptr, ptr %t7 call void @fn_emit(ptr %t16) - call void @fn_emit(ptr @.str669) - call void @fn_emit(ptr @.str670) + call void @fn_emit(ptr @.str675) + call void @fn_emit(ptr @.str676) %t17 = load ptr, ptr %t14 call void @fn_emit(ptr %t17) - call void @fn_emit(ptr @.str671) + call void @fn_emit(ptr @.str677) %t18 = call ptr @fn_nreg() store ptr %t18, ptr %t19 - call void @fn_emit(ptr @.str672) + call void @fn_emit(ptr @.str678) %t20 = load ptr, ptr %t19 call void @fn_emit(ptr %t20) - call void @fn_emit(ptr @.str673) + call void @fn_emit(ptr @.str679) %t21 = load ptr, ptr %t7 call void @fn_emit(ptr %t21) - call void @fn_emit(ptr @.str674) - call void @fn_emit(ptr @.str675) + call void @fn_emit(ptr @.str680) + call void @fn_emit(ptr @.str681) %t22 = load ptr, ptr %t19 call void @fn_emit(ptr %t22) - call void @fn_emit(ptr @.str676) + call void @fn_emit(ptr @.str682) %t23 = load ptr, ptr %t7 %t24 = load ptr, ptr %t0 %t25 = call ptr @fn_val(ptr %t23, ptr %t24) @@ -11997,17 +12317,17 @@ entry: store i32 %arg_i, ptr %t1 %t2 = call ptr @fn_nreg() store ptr %t2, ptr %t3 - call void @fn_emit(ptr @.str677) + call void @fn_emit(ptr @.str683) %t4 = load ptr, ptr %t3 call void @fn_emit(ptr %t4) - call void @fn_emit(ptr @.str678) + call void @fn_emit(ptr @.str684) %t5 = load ptr, ptr %t0 call void @fn_emit(ptr %t5) - call void @fn_emit(ptr @.str679) + call void @fn_emit(ptr @.str685) %t6 = load i32, ptr %t1 %t7 = call ptr @fn_itoa(i32 %t6) call void @fn_emit(ptr %t7) - call void @fn_emit(ptr @.str680) + call void @fn_emit(ptr @.str686) %t8 = load ptr, ptr %t3 store ptr %t8, ptr %retval br label %ret @@ -12038,9 +12358,9 @@ entry: %t13 = call ptr @fn_slice_field(ptr %t12, i32 1) store ptr %t13, ptr %t14 %t15 = load ptr, ptr %t14 - %t16 = call ptr @fn_sconcat(ptr @.str681, ptr %t15) + %t16 = call ptr @fn_sconcat(ptr @.str687, ptr %t15) %t17 = call ptr @fn_emit_bind(ptr %t16) - %t18 = call ptr @fn_val(ptr %t17, ptr @.str682) + %t18 = call ptr @fn_val(ptr %t17, ptr @.str688) store ptr %t18, ptr %retval br label %ret ret: @@ -12108,102 +12428,102 @@ entry: %t29 = call ptr @fn_slice_field(ptr %t28, i32 0) store ptr %t29, ptr %t30 %t31 = load ptr, ptr %t24 - %t32 = call ptr @fn_sconcat(ptr @.str683, ptr %t31) + %t32 = call ptr @fn_sconcat(ptr @.str689, ptr %t31) %t33 = call ptr @fn_emit_bind(ptr %t32) store ptr %t33, ptr %t34 %t35 = load ptr, ptr %t27 - %t36 = call ptr @fn_sconcat(ptr @.str684, ptr %t35) + %t36 = call ptr @fn_sconcat(ptr @.str690, ptr %t35) %t37 = call ptr @fn_emit_bind(ptr %t36) store ptr %t37, ptr %t38 %t39 = load ptr, ptr %t34 %t40 = load ptr, ptr %t38 - %t41 = call ptr @fn_sconcat(ptr @.str686, ptr %t40) + %t41 = call ptr @fn_sconcat(ptr @.str692, ptr %t40) %t42 = call ptr @fn_sconcat(ptr %t39, ptr %t41) - %t43 = call ptr @fn_sconcat(ptr @.str685, ptr %t42) + %t43 = call ptr @fn_sconcat(ptr @.str691, ptr %t42) %t44 = call ptr @fn_emit_bind(ptr %t43) store ptr %t44, ptr %t45 - %t46 = call ptr @fn_lbl(ptr @.str687) + %t46 = call ptr @fn_lbl(ptr @.str693) store ptr %t46, ptr %t47 - %t48 = call ptr @fn_lbl(ptr @.str688) + %t48 = call ptr @fn_lbl(ptr @.str694) store ptr %t48, ptr %t49 - call void @fn_emit(ptr @.str689) + call void @fn_emit(ptr @.str695) %t50 = load ptr, ptr %t45 call void @fn_emit(ptr %t50) - call void @fn_emit(ptr @.str690) + call void @fn_emit(ptr @.str696) %t51 = load ptr, ptr %t47 call void @fn_emit(ptr %t51) - call void @fn_emit(ptr @.str691) + call void @fn_emit(ptr @.str697) %t52 = load ptr, ptr %t49 call void @fn_emit(ptr %t52) - call void @fn_emit(ptr @.str692) + call void @fn_emit(ptr @.str698) %t53 = load ptr, ptr %t47 call void @fn_emit(ptr %t53) - call void @fn_emit(ptr @.str693) + call void @fn_emit(ptr @.str699) %t54 = load ptr, ptr %t38 - %t55 = call ptr @fn_sconcat(ptr %t54, ptr @.str695) - %t56 = call ptr @fn_sconcat(ptr @.str694, ptr %t55) + %t55 = call ptr @fn_sconcat(ptr %t54, ptr @.str701) + %t56 = call ptr @fn_sconcat(ptr @.str700, ptr %t55) %t57 = call ptr @fn_emit_bind(ptr %t56) store ptr %t57, ptr %t58 %t59 = load ptr, ptr %t38 - %t60 = call ptr @fn_sconcat(ptr %t59, ptr @.str697) - %t61 = call ptr @fn_sconcat(ptr @.str696, ptr %t60) + %t60 = call ptr @fn_sconcat(ptr %t59, ptr @.str703) + %t61 = call ptr @fn_sconcat(ptr @.str702, ptr %t60) %t62 = call ptr @fn_emit_bind(ptr %t61) store ptr %t62, ptr %t63 %t64 = load ptr, ptr %t63 %t65 = load ptr, ptr %t58 - %t66 = call ptr @fn_sconcat(ptr @.str699, ptr %t65) + %t66 = call ptr @fn_sconcat(ptr @.str705, ptr %t65) %t67 = call ptr @fn_sconcat(ptr %t64, ptr %t66) - %t68 = call ptr @fn_sconcat(ptr @.str698, ptr %t67) + %t68 = call ptr @fn_sconcat(ptr @.str704, ptr %t67) %t69 = call ptr @fn_emit_bind(ptr %t68) store ptr %t69, ptr %t70 %t71 = load ptr, ptr %t17 %t72 = call ptr @fn_emit_sizeof(ptr %t71) store ptr %t72, ptr %t73 %t74 = load ptr, ptr %t70 - %t75 = call ptr @fn_sconcat(ptr %t74, ptr @.str701) - %t76 = call ptr @fn_sconcat(ptr @.str700, ptr %t75) + %t75 = call ptr @fn_sconcat(ptr %t74, ptr @.str707) + %t76 = call ptr @fn_sconcat(ptr @.str706, ptr %t75) %t77 = call ptr @fn_emit_bind(ptr %t76) store ptr %t77, ptr %t78 %t79 = load ptr, ptr %t78 %t80 = load ptr, ptr %t73 - %t81 = call ptr @fn_sconcat(ptr @.str703, ptr %t80) + %t81 = call ptr @fn_sconcat(ptr @.str709, ptr %t80) %t82 = call ptr @fn_sconcat(ptr %t79, ptr %t81) - %t83 = call ptr @fn_sconcat(ptr @.str702, ptr %t82) + %t83 = call ptr @fn_sconcat(ptr @.str708, ptr %t82) %t84 = call ptr @fn_emit_bind(ptr %t83) store ptr %t84, ptr %t85 %t86 = load ptr, ptr %t30 - %t87 = call ptr @fn_sconcat(ptr @.str704, ptr %t86) + %t87 = call ptr @fn_sconcat(ptr @.str710, ptr %t86) %t88 = call ptr @fn_emit_bind(ptr %t87) store ptr %t88, ptr %t89 %t90 = load ptr, ptr %t89 %t91 = load ptr, ptr %t85 - %t92 = call ptr @fn_sconcat(ptr %t91, ptr @.str707) - %t93 = call ptr @fn_sconcat(ptr @.str706, ptr %t92) + %t92 = call ptr @fn_sconcat(ptr %t91, ptr @.str713) + %t93 = call ptr @fn_sconcat(ptr @.str712, ptr %t92) %t94 = call ptr @fn_sconcat(ptr %t90, ptr %t93) - %t95 = call ptr @fn_sconcat(ptr @.str705, ptr %t94) + %t95 = call ptr @fn_sconcat(ptr @.str711, ptr %t94) %t96 = call ptr @fn_emit_bind(ptr %t95) store ptr %t96, ptr %t97 - call void @fn_emit(ptr @.str708) + call void @fn_emit(ptr @.str714) %t98 = load ptr, ptr %t97 call void @fn_emit(ptr %t98) - call void @fn_emit(ptr @.str709) + call void @fn_emit(ptr @.str715) %t99 = load ptr, ptr %t30 call void @fn_emit(ptr %t99) - call void @fn_emit(ptr @.str710) - call void @fn_emit(ptr @.str711) + call void @fn_emit(ptr @.str716) + call void @fn_emit(ptr @.str717) %t100 = load ptr, ptr %t70 call void @fn_emit(ptr %t100) - call void @fn_emit(ptr @.str712) + call void @fn_emit(ptr @.str718) %t101 = load ptr, ptr %t27 call void @fn_emit(ptr %t101) - call void @fn_emit(ptr @.str713) - call void @fn_emit(ptr @.str714) + call void @fn_emit(ptr @.str719) + call void @fn_emit(ptr @.str720) %t102 = load ptr, ptr %t49 call void @fn_emit(ptr %t102) - call void @fn_emit(ptr @.str715) + call void @fn_emit(ptr @.str721) %t103 = load ptr, ptr %t49 call void @fn_emit(ptr %t103) - call void @fn_emit(ptr @.str716) + call void @fn_emit(ptr @.str722) %t104 = load ptr, ptr %t0 %t105 = getelementptr inbounds %Str_Node, ptr %t104, i32 0, i32 7 %t106 = load ptr, ptr %t105 @@ -12214,49 +12534,49 @@ entry: %t111 = call ptr @fn_emit_expr(ptr %t110) store ptr %t111, ptr %t112 %t113 = load ptr, ptr %t30 - %t114 = call ptr @fn_sconcat(ptr @.str717, ptr %t113) + %t114 = call ptr @fn_sconcat(ptr @.str723, ptr %t113) %t115 = call ptr @fn_emit_bind(ptr %t114) store ptr %t115, ptr %t116 %t117 = call ptr @fn_nreg() store ptr %t117, ptr %t118 - call void @fn_emit(ptr @.str718) + call void @fn_emit(ptr @.str724) %t119 = load ptr, ptr %t118 call void @fn_emit(ptr %t119) - call void @fn_emit(ptr @.str719) + call void @fn_emit(ptr @.str725) %t120 = load ptr, ptr %t17 call void @fn_emit(ptr %t120) - call void @fn_emit(ptr @.str720) + call void @fn_emit(ptr @.str726) %t121 = load ptr, ptr %t116 call void @fn_emit(ptr %t121) - call void @fn_emit(ptr @.str721) + call void @fn_emit(ptr @.str727) %t122 = load ptr, ptr %t34 call void @fn_emit(ptr %t122) - call void @fn_emit(ptr @.str722) - call void @fn_emit(ptr @.str723) + call void @fn_emit(ptr @.str728) + call void @fn_emit(ptr @.str729) %t123 = load ptr, ptr %t17 call void @fn_emit(ptr %t123) - call void @fn_emit(ptr @.str724) + call void @fn_emit(ptr @.str730) %t124 = load ptr, ptr %t112 %t125 = getelementptr inbounds %Str_Val, ptr %t124, i32 0, i32 0 %t126 = load ptr, ptr %t125 call void @fn_emit(ptr %t126) - call void @fn_emit(ptr @.str725) + call void @fn_emit(ptr @.str731) %t127 = load ptr, ptr %t118 call void @fn_emit(ptr %t127) - call void @fn_emit(ptr @.str726) + call void @fn_emit(ptr @.str732) %t128 = load ptr, ptr %t34 - %t129 = call ptr @fn_sconcat(ptr %t128, ptr @.str728) - %t130 = call ptr @fn_sconcat(ptr @.str727, ptr %t129) + %t129 = call ptr @fn_sconcat(ptr %t128, ptr @.str734) + %t130 = call ptr @fn_sconcat(ptr @.str733, ptr %t129) %t131 = call ptr @fn_emit_bind(ptr %t130) store ptr %t131, ptr %t132 - call void @fn_emit(ptr @.str729) + call void @fn_emit(ptr @.str735) %t133 = load ptr, ptr %t132 call void @fn_emit(ptr %t133) - call void @fn_emit(ptr @.str730) + call void @fn_emit(ptr @.str736) %t134 = load ptr, ptr %t24 call void @fn_emit(ptr %t134) - call void @fn_emit(ptr @.str731) - %t135 = call ptr @fn_val(ptr @.str732, ptr @.str733) + call void @fn_emit(ptr @.str737) + %t135 = call ptr @fn_val(ptr @.str738, ptr @.str739) store ptr %t135, ptr %retval br label %ret ret: @@ -12275,9 +12595,9 @@ entry: %t2 = load ptr, ptr %t1 %t3 = call ptr @fn_llty(ptr %t2) %t4 = load ptr, ptr %t0 - %t5 = call ptr @fn_sconcat(ptr @.str735, ptr %t4) + %t5 = call ptr @fn_sconcat(ptr @.str741, ptr %t4) %t6 = call ptr @fn_sconcat(ptr %t3, ptr %t5) - %t7 = call ptr @fn_sconcat(ptr @.str734, ptr %t6) + %t7 = call ptr @fn_sconcat(ptr @.str740, ptr %t6) %t8 = call ptr @fn_emit_bind(ptr %t7) store ptr %t8, ptr %t9 %t10 = load ptr, ptr %t9 @@ -12304,7 +12624,7 @@ entry: %t49 = alloca ptr %t54 = alloca ptr store ptr %arg_e, ptr %t0 - %t1 = call ptr @fn_emit_alloca(ptr @.str736) + %t1 = call ptr @fn_emit_alloca(ptr @.str742) store ptr %t1, ptr %t2 %t3 = load ptr, ptr %t0 %t4 = getelementptr inbounds %Str_Node, ptr %t3, i32 0, i32 4 @@ -12314,60 +12634,60 @@ entry: %t8 = load ptr, ptr %t7 %t9 = getelementptr inbounds %Str_Val, ptr %t8, i32 0, i32 0 %t10 = load ptr, ptr %t9 - %t11 = call ptr @fn_sconcat(ptr %t10, ptr @.str738) - %t12 = call ptr @fn_sconcat(ptr @.str737, ptr %t11) + %t11 = call ptr @fn_sconcat(ptr %t10, ptr @.str744) + %t12 = call ptr @fn_sconcat(ptr @.str743, ptr %t11) %t13 = call ptr @fn_emit_bind(ptr %t12) store ptr %t13, ptr %t14 %t15 = load ptr, ptr %t14 - %t16 = call ptr @fn_sconcat(ptr %t15, ptr @.str740) - %t17 = call ptr @fn_sconcat(ptr @.str739, ptr %t16) + %t16 = call ptr @fn_sconcat(ptr %t15, ptr @.str746) + %t17 = call ptr @fn_sconcat(ptr @.str745, ptr %t16) %t18 = call ptr @fn_emit_bind(ptr %t17) store ptr %t18, ptr %t19 - call void @fn_emit(ptr @.str741) + call void @fn_emit(ptr @.str747) %t20 = load ptr, ptr %t19 call void @fn_emit(ptr %t20) - call void @fn_emit(ptr @.str742) + call void @fn_emit(ptr @.str748) %t21 = load ptr, ptr %t2 call void @fn_emit(ptr %t21) - call void @fn_emit(ptr @.str743) - %t22 = call ptr @fn_lbl(ptr @.str744) + call void @fn_emit(ptr @.str749) + %t22 = call ptr @fn_lbl(ptr @.str750) store ptr %t22, ptr %t23 - %t24 = call ptr @fn_lbl(ptr @.str745) + %t24 = call ptr @fn_lbl(ptr @.str751) store ptr %t24, ptr %t25 %t26 = load ptr, ptr %t0 %t27 = getelementptr inbounds %Str_Node, ptr %t26, i32 0, i32 1 %t28 = load ptr, ptr %t27 - %t29 = call i32 @fn_streq(ptr %t28, ptr @.str746) + %t29 = call i32 @fn_streq(ptr %t28, ptr @.str752) %t30 = icmp ne i32 %t29, 0 br i1 %t30, label %then0, label %else1 then0: - call void @fn_emit(ptr @.str747) + call void @fn_emit(ptr @.str753) %t31 = load ptr, ptr %t14 call void @fn_emit(ptr %t31) - call void @fn_emit(ptr @.str748) + call void @fn_emit(ptr @.str754) %t32 = load ptr, ptr %t23 call void @fn_emit(ptr %t32) - call void @fn_emit(ptr @.str749) + call void @fn_emit(ptr @.str755) %t33 = load ptr, ptr %t25 call void @fn_emit(ptr %t33) - call void @fn_emit(ptr @.str750) + call void @fn_emit(ptr @.str756) br label %ifend2 else1: - call void @fn_emit(ptr @.str751) + call void @fn_emit(ptr @.str757) %t34 = load ptr, ptr %t14 call void @fn_emit(ptr %t34) - call void @fn_emit(ptr @.str752) + call void @fn_emit(ptr @.str758) %t35 = load ptr, ptr %t25 call void @fn_emit(ptr %t35) - call void @fn_emit(ptr @.str753) + call void @fn_emit(ptr @.str759) %t36 = load ptr, ptr %t23 call void @fn_emit(ptr %t36) - call void @fn_emit(ptr @.str754) + call void @fn_emit(ptr @.str760) br label %ifend2 ifend2: %t37 = load ptr, ptr %t23 call void @fn_emit(ptr %t37) - call void @fn_emit(ptr @.str755) + call void @fn_emit(ptr @.str761) %t38 = load ptr, ptr %t0 %t39 = getelementptr inbounds %Str_Node, ptr %t38, i32 0, i32 5 %t40 = load ptr, ptr %t39 @@ -12376,33 +12696,33 @@ ifend2: %t43 = load ptr, ptr %t42 %t44 = getelementptr inbounds %Str_Val, ptr %t43, i32 0, i32 0 %t45 = load ptr, ptr %t44 - %t46 = call ptr @fn_sconcat(ptr %t45, ptr @.str757) - %t47 = call ptr @fn_sconcat(ptr @.str756, ptr %t46) + %t46 = call ptr @fn_sconcat(ptr %t45, ptr @.str763) + %t47 = call ptr @fn_sconcat(ptr @.str762, ptr %t46) %t48 = call ptr @fn_emit_bind(ptr %t47) store ptr %t48, ptr %t49 %t50 = load ptr, ptr %t49 - %t51 = call ptr @fn_sconcat(ptr %t50, ptr @.str759) - %t52 = call ptr @fn_sconcat(ptr @.str758, ptr %t51) + %t51 = call ptr @fn_sconcat(ptr %t50, ptr @.str765) + %t52 = call ptr @fn_sconcat(ptr @.str764, ptr %t51) %t53 = call ptr @fn_emit_bind(ptr %t52) store ptr %t53, ptr %t54 - call void @fn_emit(ptr @.str760) + call void @fn_emit(ptr @.str766) %t55 = load ptr, ptr %t54 call void @fn_emit(ptr %t55) - call void @fn_emit(ptr @.str761) + call void @fn_emit(ptr @.str767) %t56 = load ptr, ptr %t2 call void @fn_emit(ptr %t56) - call void @fn_emit(ptr @.str762) - call void @fn_emit(ptr @.str763) + call void @fn_emit(ptr @.str768) + call void @fn_emit(ptr @.str769) %t57 = load ptr, ptr %t25 call void @fn_emit(ptr %t57) - call void @fn_emit(ptr @.str764) + call void @fn_emit(ptr @.str770) %t58 = load ptr, ptr %t25 call void @fn_emit(ptr %t58) - call void @fn_emit(ptr @.str765) + call void @fn_emit(ptr @.str771) %t59 = load ptr, ptr %t2 - %t60 = call ptr @fn_sconcat(ptr @.str766, ptr %t59) + %t60 = call ptr @fn_sconcat(ptr @.str772, ptr %t59) %t61 = call ptr @fn_emit_bind(ptr %t60) - %t62 = call ptr @fn_val(ptr %t61, ptr @.str767) + %t62 = call ptr @fn_val(ptr %t61, ptr @.str773) store ptr %t62, ptr %retval br label %ret ret: @@ -12416,46 +12736,46 @@ entry: %t0 = alloca ptr store ptr %arg_op, ptr %t0 %t1 = load ptr, ptr %t0 - %t2 = call i32 @fn_streq(ptr %t1, ptr @.str768) + %t2 = call i32 @fn_streq(ptr %t1, ptr @.str774) %t3 = icmp ne i32 %t2, 0 br i1 %t3, label %then0, label %ifend2 then0: - store ptr @.str769, ptr %retval + store ptr @.str775, ptr %retval br label %ret ifend2: %t4 = load ptr, ptr %t0 - %t5 = call i32 @fn_streq(ptr %t4, ptr @.str770) + %t5 = call i32 @fn_streq(ptr %t4, ptr @.str776) %t6 = icmp ne i32 %t5, 0 br i1 %t6, label %then3, label %ifend5 then3: - store ptr @.str771, ptr %retval + store ptr @.str777, ptr %retval br label %ret ifend5: %t7 = load ptr, ptr %t0 - %t8 = call i32 @fn_streq(ptr %t7, ptr @.str772) + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str778) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then6, label %ifend8 then6: - store ptr @.str773, ptr %retval + store ptr @.str779, ptr %retval br label %ret ifend8: %t10 = load ptr, ptr %t0 - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str774) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str780) %t12 = icmp ne i32 %t11, 0 br i1 %t12, label %then9, label %ifend11 then9: - store ptr @.str775, ptr %retval + store ptr @.str781, ptr %retval br label %ret ifend11: %t13 = load ptr, ptr %t0 - %t14 = call i32 @fn_streq(ptr %t13, ptr @.str776) + %t14 = call i32 @fn_streq(ptr %t13, ptr @.str782) %t15 = icmp ne i32 %t14, 0 br i1 %t15, label %then12, label %ifend14 then12: - store ptr @.str777, ptr %retval + store ptr @.str783, ptr %retval br label %ret ifend14: - store ptr @.str778, ptr %retval + store ptr @.str784, ptr %retval br label %ret ret: %t16 = load ptr, ptr %retval @@ -12473,14 +12793,14 @@ entry: %t5 = alloca i32 store ptr %arg_op, ptr %t0 %t6 = load ptr, ptr %t0 - %t7 = call i32 @fn_streq(ptr %t6, ptr @.str779) + %t7 = call i32 @fn_streq(ptr %t6, ptr @.str785) %t8 = icmp ne i32 %t7, 0 %t9 = zext i1 %t8 to i32 store i32 %t9, ptr %t5 br i1 %t8, label %scend1, label %sc0 sc0: %t10 = load ptr, ptr %t0 - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str780) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str786) %t12 = icmp ne i32 %t11, 0 %t13 = zext i1 %t12 to i32 store i32 %t13, ptr %t5 @@ -12493,7 +12813,7 @@ scend1: br i1 %t15, label %scend3, label %sc2 sc2: %t17 = load ptr, ptr %t0 - %t18 = call i32 @fn_streq(ptr %t17, ptr @.str781) + %t18 = call i32 @fn_streq(ptr %t17, ptr @.str787) %t19 = icmp ne i32 %t18, 0 %t20 = zext i1 %t19 to i32 store i32 %t20, ptr %t4 @@ -12506,7 +12826,7 @@ scend3: br i1 %t22, label %scend5, label %sc4 sc4: %t24 = load ptr, ptr %t0 - %t25 = call i32 @fn_streq(ptr %t24, ptr @.str782) + %t25 = call i32 @fn_streq(ptr %t24, ptr @.str788) %t26 = icmp ne i32 %t25, 0 %t27 = zext i1 %t26 to i32 store i32 %t27, ptr %t3 @@ -12519,7 +12839,7 @@ scend5: br i1 %t29, label %scend7, label %sc6 sc6: %t31 = load ptr, ptr %t0 - %t32 = call i32 @fn_streq(ptr %t31, ptr @.str783) + %t32 = call i32 @fn_streq(ptr %t31, ptr @.str789) %t33 = icmp ne i32 %t32, 0 %t34 = zext i1 %t33 to i32 store i32 %t34, ptr %t2 @@ -12532,7 +12852,7 @@ scend7: br i1 %t36, label %scend9, label %sc8 sc8: %t38 = load ptr, ptr %t0 - %t39 = call i32 @fn_streq(ptr %t38, ptr @.str784) + %t39 = call i32 @fn_streq(ptr %t38, ptr @.str790) %t40 = icmp ne i32 %t39, 0 %t41 = zext i1 %t40 to i32 store i32 %t41, ptr %t1 @@ -12552,38 +12872,38 @@ entry: %t0 = alloca ptr store ptr %arg_op, ptr %t0 %t1 = load ptr, ptr %t0 - %t2 = call i32 @fn_streq(ptr %t1, ptr @.str785) + %t2 = call i32 @fn_streq(ptr %t1, ptr @.str791) %t3 = icmp ne i32 %t2, 0 br i1 %t3, label %then0, label %ifend2 then0: - store ptr @.str786, ptr %retval + store ptr @.str792, ptr %retval br label %ret ifend2: %t4 = load ptr, ptr %t0 - %t5 = call i32 @fn_streq(ptr %t4, ptr @.str787) + %t5 = call i32 @fn_streq(ptr %t4, ptr @.str793) %t6 = icmp ne i32 %t5, 0 br i1 %t6, label %then3, label %ifend5 then3: - store ptr @.str788, ptr %retval + store ptr @.str794, ptr %retval br label %ret ifend5: %t7 = load ptr, ptr %t0 - %t8 = call i32 @fn_streq(ptr %t7, ptr @.str789) + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str795) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then6, label %ifend8 then6: - store ptr @.str790, ptr %retval + store ptr @.str796, ptr %retval br label %ret ifend8: %t10 = load ptr, ptr %t0 - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str791) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str797) %t12 = icmp ne i32 %t11, 0 br i1 %t12, label %then9, label %ifend11 then9: - store ptr @.str792, ptr %retval + store ptr @.str798, ptr %retval br label %ret ifend11: - store ptr @.str793, ptr %retval + store ptr @.str799, ptr %retval br label %ret ret: %t13 = load ptr, ptr %retval @@ -12598,7 +12918,7 @@ entry: %t1 = load ptr, ptr %t0 %t2 = getelementptr inbounds %Str_Val, ptr %t1, i32 0, i32 1 %t3 = load ptr, ptr %t2 - %t4 = call i32 @fn_streq(ptr %t3, ptr @.str794) + %t4 = call i32 @fn_streq(ptr %t3, ptr @.str800) %t5 = icmp ne i32 %t4, 0 br i1 %t5, label %then0, label %ifend2 then0: @@ -12611,8 +12931,8 @@ ifend2: %t9 = load ptr, ptr %t0 %t10 = getelementptr inbounds %Str_Val, ptr %t9, i32 0, i32 0 %t11 = load ptr, ptr %t10 - %t12 = call ptr @fn_sconcat(ptr %t11, ptr @.str796) - %t13 = call ptr @fn_sconcat(ptr @.str795, ptr %t12) + %t12 = call ptr @fn_sconcat(ptr %t11, ptr @.str802) + %t13 = call ptr @fn_sconcat(ptr @.str801, ptr %t12) %t14 = call ptr @fn_emit_bind(ptr %t13) store ptr %t14, ptr %retval br label %ret @@ -12649,7 +12969,7 @@ entry: %t2 = load ptr, ptr %t0 %t3 = getelementptr inbounds %Str_Node, ptr %t2, i32 0, i32 1 %t4 = load ptr, ptr %t3 - %t5 = call i32 @fn_streq(ptr %t4, ptr @.str797) + %t5 = call i32 @fn_streq(ptr %t4, ptr @.str803) %t6 = icmp ne i32 %t5, 0 %t7 = zext i1 %t6 to i32 store i32 %t7, ptr %t1 @@ -12658,7 +12978,7 @@ sc0: %t8 = load ptr, ptr %t0 %t9 = getelementptr inbounds %Str_Node, ptr %t8, i32 0, i32 1 %t10 = load ptr, ptr %t9 - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str798) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str804) %t12 = icmp ne i32 %t11, 0 %t13 = zext i1 %t12 to i32 store i32 %t13, ptr %t1 @@ -12686,7 +13006,7 @@ ifend4: %t29 = load ptr, ptr %t22 %t30 = getelementptr inbounds %Str_Val, ptr %t29, i32 0, i32 1 %t31 = load ptr, ptr %t30 - %t32 = call i32 @fn_streq(ptr %t31, ptr @.str799) + %t32 = call i32 @fn_streq(ptr %t31, ptr @.str805) %t33 = icmp ne i32 %t32, 0 %t34 = zext i1 %t33 to i32 store i32 %t34, ptr %t28 @@ -12695,7 +13015,7 @@ sc5: %t35 = load ptr, ptr %t27 %t36 = getelementptr inbounds %Str_Val, ptr %t35, i32 0, i32 1 %t37 = load ptr, ptr %t36 - %t38 = call i32 @fn_streq(ptr %t37, ptr @.str800) + %t38 = call i32 @fn_streq(ptr %t37, ptr @.str806) %t39 = icmp ne i32 %t38, 0 %t40 = zext i1 %t39 to i32 store i32 %t40, ptr %t28 @@ -12736,18 +13056,18 @@ ifend12: %t65 = call ptr @fn_cmp_code(ptr %t64) %t66 = load ptr, ptr %t51 %t67 = load ptr, ptr %t55 - %t68 = call ptr @fn_sconcat(ptr @.str803, ptr %t67) + %t68 = call ptr @fn_sconcat(ptr @.str809, ptr %t67) %t69 = call ptr @fn_sconcat(ptr %t66, ptr %t68) - %t70 = call ptr @fn_sconcat(ptr @.str802, ptr %t69) + %t70 = call ptr @fn_sconcat(ptr @.str808, ptr %t69) %t71 = call ptr @fn_sconcat(ptr %t65, ptr %t70) - %t72 = call ptr @fn_sconcat(ptr @.str801, ptr %t71) + %t72 = call ptr @fn_sconcat(ptr @.str807, ptr %t71) %t73 = call ptr @fn_emit_bind(ptr %t72) store ptr %t73, ptr %t74 %t75 = load ptr, ptr %t74 - %t76 = call ptr @fn_sconcat(ptr %t75, ptr @.str805) - %t77 = call ptr @fn_sconcat(ptr @.str804, ptr %t76) + %t76 = call ptr @fn_sconcat(ptr %t75, ptr @.str811) + %t77 = call ptr @fn_sconcat(ptr @.str810, ptr %t76) %t78 = call ptr @fn_emit_bind(ptr %t77) - %t79 = call ptr @fn_val(ptr %t78, ptr @.str806) + %t79 = call ptr @fn_val(ptr %t78, ptr @.str812) store ptr %t79, ptr %retval br label %ret ifend9: @@ -12764,74 +13084,74 @@ then13: %t88 = load ptr, ptr %t0 %t89 = getelementptr inbounds %Str_Node, ptr %t88, i32 0, i32 1 %t90 = load ptr, ptr %t89 - %t91 = call i32 @fn_streq(ptr %t90, ptr @.str807) + %t91 = call i32 @fn_streq(ptr %t90, ptr @.str813) %t92 = icmp ne i32 %t91, 0 br i1 %t92, label %then16, label %ifend18 then16: %t93 = load ptr, ptr %t84 - %t94 = call ptr @fn_sconcat(ptr %t93, ptr @.str809) - %t95 = call ptr @fn_sconcat(ptr @.str808, ptr %t94) + %t94 = call ptr @fn_sconcat(ptr %t93, ptr @.str815) + %t95 = call ptr @fn_sconcat(ptr @.str814, ptr %t94) %t96 = call ptr @fn_emit_bind(ptr %t95) store ptr %t96, ptr %t97 %t98 = load ptr, ptr %t87 - %t99 = call ptr @fn_sconcat(ptr %t98, ptr @.str811) - %t100 = call ptr @fn_sconcat(ptr @.str810, ptr %t99) + %t99 = call ptr @fn_sconcat(ptr %t98, ptr @.str817) + %t100 = call ptr @fn_sconcat(ptr @.str816, ptr %t99) %t101 = call ptr @fn_emit_bind(ptr %t100) store ptr %t101, ptr %t102 %t103 = load ptr, ptr %t97 %t104 = load ptr, ptr %t102 - %t105 = call ptr @fn_sconcat(ptr @.str813, ptr %t104) + %t105 = call ptr @fn_sconcat(ptr @.str819, ptr %t104) %t106 = call ptr @fn_sconcat(ptr %t103, ptr %t105) - %t107 = call ptr @fn_sconcat(ptr @.str812, ptr %t106) + %t107 = call ptr @fn_sconcat(ptr @.str818, ptr %t106) %t108 = call ptr @fn_emit_bind(ptr %t107) store ptr %t108, ptr %t109 %t110 = load ptr, ptr %t109 - %t111 = call ptr @fn_sconcat(ptr %t110, ptr @.str815) - %t112 = call ptr @fn_sconcat(ptr @.str814, ptr %t111) + %t111 = call ptr @fn_sconcat(ptr %t110, ptr @.str821) + %t112 = call ptr @fn_sconcat(ptr @.str820, ptr %t111) %t113 = call ptr @fn_emit_bind(ptr %t112) store ptr %t113, ptr %t114 %t115 = load ptr, ptr %t114 - %t116 = call ptr @fn_sconcat(ptr %t115, ptr @.str817) - %t117 = call ptr @fn_sconcat(ptr @.str816, ptr %t116) + %t116 = call ptr @fn_sconcat(ptr %t115, ptr @.str823) + %t117 = call ptr @fn_sconcat(ptr @.str822, ptr %t116) %t118 = call ptr @fn_emit_bind(ptr %t117) - %t119 = call ptr @fn_val(ptr %t118, ptr @.str818) + %t119 = call ptr @fn_val(ptr %t118, ptr @.str824) store ptr %t119, ptr %retval br label %ret ifend18: %t120 = load ptr, ptr %t0 %t121 = getelementptr inbounds %Str_Node, ptr %t120, i32 0, i32 1 %t122 = load ptr, ptr %t121 - %t123 = call i32 @fn_streq(ptr %t122, ptr @.str819) + %t123 = call i32 @fn_streq(ptr %t122, ptr @.str825) %t124 = icmp ne i32 %t123, 0 br i1 %t124, label %then19, label %ifend21 then19: %t125 = load ptr, ptr %t84 - %t126 = call ptr @fn_sconcat(ptr %t125, ptr @.str821) - %t127 = call ptr @fn_sconcat(ptr @.str820, ptr %t126) + %t126 = call ptr @fn_sconcat(ptr %t125, ptr @.str827) + %t127 = call ptr @fn_sconcat(ptr @.str826, ptr %t126) %t128 = call ptr @fn_emit_bind(ptr %t127) store ptr %t128, ptr %t129 %t130 = load ptr, ptr %t129 - %t131 = call ptr @fn_sconcat(ptr %t130, ptr @.str823) - %t132 = call ptr @fn_sconcat(ptr @.str822, ptr %t131) + %t131 = call ptr @fn_sconcat(ptr %t130, ptr @.str829) + %t132 = call ptr @fn_sconcat(ptr @.str828, ptr %t131) %t133 = call ptr @fn_emit_bind(ptr %t132) store ptr %t133, ptr %t134 %t135 = load ptr, ptr %t87 - %t136 = call ptr @fn_sconcat(ptr %t135, ptr @.str825) - %t137 = call ptr @fn_sconcat(ptr @.str824, ptr %t136) + %t136 = call ptr @fn_sconcat(ptr %t135, ptr @.str831) + %t137 = call ptr @fn_sconcat(ptr @.str830, ptr %t136) %t138 = call ptr @fn_emit_bind(ptr %t137) store ptr %t138, ptr %t139 %t140 = load ptr, ptr %t134 %t141 = load ptr, ptr %t139 - %t142 = call ptr @fn_sconcat(ptr @.str827, ptr %t141) + %t142 = call ptr @fn_sconcat(ptr @.str833, ptr %t141) %t143 = call ptr @fn_sconcat(ptr %t140, ptr %t142) - %t144 = call ptr @fn_sconcat(ptr @.str826, ptr %t143) + %t144 = call ptr @fn_sconcat(ptr @.str832, ptr %t143) %t145 = call ptr @fn_emit_bind(ptr %t144) store ptr %t145, ptr %t146 %t147 = load ptr, ptr %t146 - %t148 = call ptr @fn_sconcat(ptr %t147, ptr @.str829) - %t149 = call ptr @fn_sconcat(ptr @.str828, ptr %t148) + %t148 = call ptr @fn_sconcat(ptr %t147, ptr @.str835) + %t149 = call ptr @fn_sconcat(ptr @.str834, ptr %t148) %t150 = call ptr @fn_emit_bind(ptr %t149) - %t151 = call ptr @fn_val(ptr %t150, ptr @.str830) + %t151 = call ptr @fn_val(ptr %t150, ptr @.str836) store ptr %t151, ptr %retval br label %ret ifend21: @@ -12841,14 +13161,14 @@ ifend21: %t155 = call ptr @fn_arith_code(ptr %t154) %t156 = load ptr, ptr %t84 %t157 = load ptr, ptr %t87 - %t158 = call ptr @fn_sconcat(ptr @.str832, ptr %t157) + %t158 = call ptr @fn_sconcat(ptr @.str838, ptr %t157) %t159 = call ptr @fn_sconcat(ptr %t156, ptr %t158) - %t160 = call ptr @fn_sconcat(ptr @.str831, ptr %t159) + %t160 = call ptr @fn_sconcat(ptr @.str837, ptr %t159) %t161 = call ptr @fn_sconcat(ptr %t155, ptr %t160) %t162 = call ptr @fn_emit_bind(ptr %t161) store ptr %t162, ptr %t163 %t164 = load ptr, ptr %t163 - %t165 = call ptr @fn_val(ptr %t164, ptr @.str833) + %t165 = call ptr @fn_val(ptr %t164, ptr @.str839) store ptr %t165, ptr %retval br label %ret ifend15: @@ -12862,14 +13182,14 @@ ifend15: %t173 = load ptr, ptr %t27 %t174 = getelementptr inbounds %Str_Val, ptr %t173, i32 0, i32 0 %t175 = load ptr, ptr %t174 - %t176 = call ptr @fn_sconcat(ptr @.str835, ptr %t175) + %t176 = call ptr @fn_sconcat(ptr @.str841, ptr %t175) %t177 = call ptr @fn_sconcat(ptr %t172, ptr %t176) - %t178 = call ptr @fn_sconcat(ptr @.str834, ptr %t177) + %t178 = call ptr @fn_sconcat(ptr @.str840, ptr %t177) %t179 = call ptr @fn_sconcat(ptr %t169, ptr %t178) %t180 = call ptr @fn_emit_bind(ptr %t179) store ptr %t180, ptr %t181 %t182 = load ptr, ptr %t181 - %t183 = call ptr @fn_val(ptr %t182, ptr @.str836) + %t183 = call ptr @fn_val(ptr %t182, ptr @.str842) store ptr %t183, ptr %retval br label %ret ret: @@ -12901,7 +13221,7 @@ entry: %t5 = load ptr, ptr %t4 store ptr %t5, ptr %t6 %t7 = load ptr, ptr %t6 - %t8 = call i32 @fn_streq(ptr %t7, ptr @.str837) + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str843) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then0, label %ifend2 then0: @@ -12911,7 +13231,7 @@ then0: %t13 = icmp ne i32 %t12, 0 br i1 %t13, label %then3, label %ifend5 then3: - %t14 = call ptr @fn_val(ptr @.str838, ptr @.str839) + %t14 = call ptr @fn_val(ptr @.str844, ptr @.str845) store ptr %t14, ptr %retval br label %ret ifend5: @@ -12922,64 +13242,64 @@ ifend5: %t19 = sub i32 %t18, 1 %t20 = getelementptr inbounds ptr, ptr %t17, i32 %t19 %t21 = load ptr, ptr %t20 - %t22 = call ptr @fn_sconcat(ptr @.str840, ptr %t21) + %t22 = call ptr @fn_sconcat(ptr @.str846, ptr %t21) %t23 = call ptr @fn_emit_bind(ptr %t22) - %t24 = call ptr @fn_val(ptr %t23, ptr @.str841) + %t24 = call ptr @fn_val(ptr %t23, ptr @.str847) store ptr %t24, ptr %retval br label %ret ifend2: %t25 = load ptr, ptr %t6 - %t26 = call i32 @fn_streq(ptr %t25, ptr @.str842) + %t26 = call i32 @fn_streq(ptr %t25, ptr @.str848) %t27 = icmp ne i32 %t26, 0 br i1 %t27, label %then6, label %ifend8 then6: - %t28 = call ptr @fn_emit_bind(ptr @.str843) - %t29 = call ptr @fn_val(ptr %t28, ptr @.str844) + %t28 = call ptr @fn_emit_bind(ptr @.str849) + %t29 = call ptr @fn_val(ptr %t28, ptr @.str850) store ptr %t29, ptr %retval br label %ret ifend8: %t30 = load ptr, ptr %t6 - %t31 = call i32 @fn_streq(ptr %t30, ptr @.str845) + %t31 = call i32 @fn_streq(ptr %t30, ptr @.str851) %t32 = icmp ne i32 %t31, 0 br i1 %t32, label %then9, label %ifend11 then9: - call void @fn_emit(ptr @.str846) - %t33 = call ptr @fn_val(ptr @.str847, ptr @.str848) + call void @fn_emit(ptr @.str852) + %t33 = call ptr @fn_val(ptr @.str853, ptr @.str854) store ptr %t33, ptr %retval br label %ret ifend11: %t34 = load ptr, ptr %t6 - %t35 = call i32 @fn_streq(ptr %t34, ptr @.str849) + %t35 = call i32 @fn_streq(ptr %t34, ptr @.str855) %t36 = icmp ne i32 %t35, 0 br i1 %t36, label %then12, label %ifend14 then12: - call void @fn_emit(ptr @.str850) - %t37 = call ptr @fn_val(ptr @.str851, ptr @.str852) + call void @fn_emit(ptr @.str856) + %t37 = call ptr @fn_val(ptr @.str857, ptr @.str858) store ptr %t37, ptr %retval br label %ret ifend14: %t38 = load ptr, ptr %t6 - %t39 = call i32 @fn_streq(ptr %t38, ptr @.str853) + %t39 = call i32 @fn_streq(ptr %t38, ptr @.str859) %t40 = icmp ne i32 %t39, 0 br i1 %t40, label %then15, label %ifend17 then15: - %t41 = call ptr @fn_emit_bind(ptr @.str854) - %t42 = call ptr @fn_val(ptr %t41, ptr @.str855) + %t41 = call ptr @fn_emit_bind(ptr @.str860) + %t42 = call ptr @fn_val(ptr %t41, ptr @.str861) store ptr %t42, ptr %retval br label %ret ifend17: %t43 = load ptr, ptr %t6 - %t44 = call i32 @fn_streq(ptr %t43, ptr @.str856) + %t44 = call i32 @fn_streq(ptr %t43, ptr @.str862) %t45 = icmp ne i32 %t44, 0 br i1 %t45, label %then18, label %ifend20 then18: - call void @fn_emit(ptr @.str857) - %t46 = call ptr @fn_val(ptr @.str858, ptr @.str859) + call void @fn_emit(ptr @.str863) + %t46 = call ptr @fn_val(ptr @.str864, ptr @.str865) store ptr %t46, ptr %retval br label %ret ifend20: %t47 = load ptr, ptr %t6 - %t48 = call i32 @fn_streq(ptr %t47, ptr @.str860) + %t48 = call i32 @fn_streq(ptr %t47, ptr @.str866) %t49 = icmp ne i32 %t48, 0 br i1 %t49, label %then21, label %ifend23 then21: @@ -12989,7 +13309,7 @@ then21: br label %ret ifend23: %t52 = load ptr, ptr %t6 - %t53 = call i32 @fn_streq(ptr %t52, ptr @.str861) + %t53 = call i32 @fn_streq(ptr %t52, ptr @.str867) %t54 = icmp ne i32 %t53, 0 br i1 %t54, label %then24, label %ifend26 then24: @@ -12999,7 +13319,7 @@ then24: br label %ret ifend26: %t57 = load ptr, ptr %t6 - %t58 = call i32 @fn_streq(ptr %t57, ptr @.str862) + %t58 = call i32 @fn_streq(ptr %t57, ptr @.str868) %t59 = icmp ne i32 %t58, 0 br i1 %t59, label %then27, label %ifend29 then27: @@ -13015,15 +13335,15 @@ then27: %t69 = load ptr, ptr %t68 %t70 = getelementptr inbounds %Str_Val, ptr %t69, i32 0, i32 0 %t71 = load ptr, ptr %t70 - %t72 = call ptr @fn_sconcat(ptr %t71, ptr @.str864) - %t73 = call ptr @fn_sconcat(ptr @.str863, ptr %t72) + %t72 = call ptr @fn_sconcat(ptr %t71, ptr @.str870) + %t73 = call ptr @fn_sconcat(ptr @.str869, ptr %t72) %t74 = call ptr @fn_emit_bind(ptr %t73) - %t75 = call ptr @fn_val(ptr %t74, ptr @.str865) + %t75 = call ptr @fn_val(ptr %t74, ptr @.str871) store ptr %t75, ptr %retval br label %ret ifend29: %t76 = load ptr, ptr %t6 - %t77 = call i32 @fn_streq(ptr %t76, ptr @.str866) + %t77 = call i32 @fn_streq(ptr %t76, ptr @.str872) %t78 = icmp ne i32 %t77, 0 br i1 %t78, label %then30, label %ifend32 then30: @@ -13039,10 +13359,10 @@ then30: %t88 = load ptr, ptr %t87 %t89 = getelementptr inbounds %Str_Val, ptr %t88, i32 0, i32 0 %t90 = load ptr, ptr %t89 - %t91 = call ptr @fn_sconcat(ptr %t90, ptr @.str868) - %t92 = call ptr @fn_sconcat(ptr @.str867, ptr %t91) + %t91 = call ptr @fn_sconcat(ptr %t90, ptr @.str874) + %t92 = call ptr @fn_sconcat(ptr @.str873, ptr %t91) %t93 = call ptr @fn_emit_bind(ptr %t92) - %t94 = call ptr @fn_val(ptr %t93, ptr @.str869) + %t94 = call ptr @fn_val(ptr %t93, ptr @.str875) store ptr %t94, ptr %retval br label %ret ifend32: @@ -13091,7 +13411,7 @@ ifend41: br i1 %t121, label %then42, label %ifend44 then42: %t122 = load ptr, ptr %t6 - %t123 = call ptr @fn_sconcat(ptr @.str870, ptr %t122) + %t123 = call ptr @fn_sconcat(ptr @.str876, ptr %t122) store ptr %t123, ptr %t124 %t125 = load ptr, ptr %t124 %t126 = call ptr @fn_find_fn(ptr %t125) @@ -13103,7 +13423,7 @@ then42: br i1 %t130, label %then45, label %ifend47 then45: %t131 = load ptr, ptr %t6 - %t132 = call ptr @fn_sconcat(ptr @.str871, ptr %t131) + %t132 = call ptr @fn_sconcat(ptr @.str877, ptr %t131) call void @fn_perr(ptr %t132) br label %ifend47 ifend47: @@ -13225,10 +13545,10 @@ wend50: %t216 = load ptr, ptr %t215 %t217 = call ptr @fn_llty(ptr %t216) store ptr %t217, ptr %t218 - call void @fn_emit(ptr @.str872) - store ptr @.str873, ptr %t219 + call void @fn_emit(ptr @.str878) + store ptr @.str879, ptr %t219 %t220 = load ptr, ptr %t218 - %t221 = call i32 @fn_streq(ptr %t220, ptr @.str874) + %t221 = call i32 @fn_streq(ptr %t220, ptr @.str880) %t222 = icmp eq i32 %t221, 0 %t223 = zext i1 %t222 to i32 %t224 = icmp ne i32 %t223, 0 @@ -13238,16 +13558,16 @@ then55: store ptr %t225, ptr %t219 %t226 = load ptr, ptr %t219 call void @fn_emit(ptr %t226) - call void @fn_emit(ptr @.str875) + call void @fn_emit(ptr @.str881) br label %ifend57 ifend57: - call void @fn_emit(ptr @.str876) + call void @fn_emit(ptr @.str882) %t227 = load ptr, ptr %t218 call void @fn_emit(ptr %t227) - call void @fn_emit(ptr @.str877) + call void @fn_emit(ptr @.str883) %t228 = load ptr, ptr %t117 call void @fn_emit(ptr %t228) - call void @fn_emit(ptr @.str878) + call void @fn_emit(ptr @.str884) store i32 0, ptr %t148 br label %wcond58 wcond58: @@ -13266,7 +13586,7 @@ wbody59: %t239 = icmp ne i32 %t238, 0 br i1 %t239, label %then61, label %ifend63 then61: - call void @fn_emit(ptr @.str879) + call void @fn_emit(ptr @.str885) br label %ifend63 ifend63: %t240 = load ptr, ptr %t147 @@ -13277,7 +13597,7 @@ ifend63: %t245 = load ptr, ptr %t244 %t246 = call ptr @fn_llty(ptr %t245) call void @fn_emit(ptr %t246) - call void @fn_emit(ptr @.str880) + call void @fn_emit(ptr @.str886) %t247 = load ptr, ptr %t140 %t248 = getelementptr inbounds %LSlice, ptr %t247, i32 0, i32 0 %t249 = load ptr, ptr %t248 @@ -13290,7 +13610,7 @@ ifend63: store i32 %t254, ptr %t148 br label %wcond58 wend60: - call void @fn_emit(ptr @.str881) + call void @fn_emit(ptr @.str887) %t255 = load ptr, ptr %t219 %t256 = load ptr, ptr %t115 %t257 = getelementptr inbounds %Str_Node, ptr %t256, i32 0, i32 3 @@ -13310,10 +13630,11 @@ entry: %t79 = alloca i32 %t101 = alloca ptr %t132 = alloca ptr - %t161 = alloca ptr - %t173 = alloca ptr - %t203 = alloca ptr - %t221 = alloca ptr + %t176 = alloca i32 + %t186 = alloca ptr + %t198 = alloca ptr + %t228 = alloca ptr + %t246 = alloca ptr store ptr %arg_e, ptr %t0 %t1 = load ptr, ptr %t0 %t2 = icmp eq ptr %t1, null @@ -13321,7 +13642,7 @@ entry: %t4 = icmp ne i32 %t3, 0 br i1 %t4, label %then0, label %ifend2 then0: - %t5 = call ptr @fn_val(ptr @.str882, ptr @.str883) + %t5 = call ptr @fn_val(ptr @.str888, ptr @.str889) store ptr %t5, ptr %retval br label %ret ifend2: @@ -13337,7 +13658,7 @@ then3: %t13 = getelementptr inbounds %Str_Node, ptr %t12, i32 0, i32 2 %t14 = load i32, ptr %t13 %t15 = call ptr @fn_itoa(i32 %t14) - %t16 = call ptr @fn_val(ptr %t15, ptr @.str884) + %t16 = call ptr @fn_val(ptr %t15, ptr @.str890) store ptr %t16, ptr %retval br label %ret ifend5: @@ -13353,7 +13674,7 @@ then6: %t24 = getelementptr inbounds %Str_Node, ptr %t23, i32 0, i32 2 %t25 = load i32, ptr %t24 %t26 = call ptr @fn_itoa(i32 %t25) - %t27 = call ptr @fn_val(ptr %t26, ptr @.str885) + %t27 = call ptr @fn_val(ptr %t26, ptr @.str891) store ptr %t27, ptr %retval br label %ret ifend8: @@ -13369,7 +13690,7 @@ then9: %t35 = getelementptr inbounds %Str_Node, ptr %t34, i32 0, i32 2 %t36 = load i32, ptr %t35 %t37 = call ptr @fn_itoa(i32 %t36) - %t38 = call ptr @fn_val(ptr %t37, ptr @.str886) + %t38 = call ptr @fn_val(ptr %t37, ptr @.str892) store ptr %t38, ptr %retval br label %ret ifend11: @@ -13385,7 +13706,7 @@ then12: %t46 = getelementptr inbounds %Str_Node, ptr %t45, i32 0, i32 1 %t47 = load ptr, ptr %t46 %t48 = call ptr @fn_emit_str_const(ptr %t47) - %t49 = call ptr @fn_val(ptr %t48, ptr @.str887) + %t49 = call ptr @fn_val(ptr %t48, ptr @.str893) store ptr %t49, ptr %retval br label %ret ifend14: @@ -13480,7 +13801,7 @@ then30: %t117 = getelementptr inbounds %Str_Node, ptr %t116, i32 0, i32 2 %t118 = load i32, ptr %t117 %t119 = call ptr @fn_itoa(i32 %t118) - %t120 = call ptr @fn_val(ptr %t119, ptr @.str888) + %t120 = call ptr @fn_val(ptr %t119, ptr @.str894) store ptr %t120, ptr %retval br label %ret ifend32: @@ -13491,9 +13812,9 @@ ifend32: %t125 = load ptr, ptr %t0 %t126 = getelementptr inbounds %Str_Node, ptr %t125, i32 0, i32 1 %t127 = load ptr, ptr %t126 - %t128 = call ptr @fn_sconcat(ptr @.str890, ptr %t127) + %t128 = call ptr @fn_sconcat(ptr @.str896, ptr %t127) %t129 = call ptr @fn_sconcat(ptr %t124, ptr %t128) - %t130 = call ptr @fn_sconcat(ptr @.str889, ptr %t129) + %t130 = call ptr @fn_sconcat(ptr @.str895, ptr %t129) %t131 = call ptr @fn_emit_bind(ptr %t130) store ptr %t131, ptr %t132 %t133 = load ptr, ptr %t132 @@ -13516,14 +13837,14 @@ then33: %t145 = load ptr, ptr %t144 %t146 = call i32 @fn_ui_index_of(ptr %t145) %t147 = call ptr @fn_itoa(i32 %t146) - %t148 = call ptr @fn_val(ptr %t147, ptr @.str891) + %t148 = call ptr @fn_val(ptr %t147, ptr @.str897) store ptr %t148, ptr %retval br label %ret ifend35: %t149 = load ptr, ptr %t0 %t150 = getelementptr inbounds %Str_Node, ptr %t149, i32 0, i32 1 %t151 = load ptr, ptr %t150 - %t152 = call ptr @fn_sconcat(ptr @.str892, ptr %t151) + %t152 = call ptr @fn_sconcat(ptr @.str898, ptr %t151) call void @fn_perr(ptr %t152) br label %ifend23 ifend23: @@ -13536,108 +13857,142 @@ ifend23: br i1 %t158, label %then36, label %ifend38 then36: %t159 = load ptr, ptr %t0 - %t160 = call ptr @fn_emit_member_addr(ptr %t159) - store ptr %t160, ptr %t161 - %t162 = load ptr, ptr %t161 - %t163 = load ptr, ptr @g_g_addr_ty - %t164 = call ptr @fn_emit_load_at(ptr %t162, ptr %t163) - store ptr %t164, ptr %retval - br label %ret -ifend38: - %t165 = load ptr, ptr %t0 - %t166 = getelementptr inbounds %Str_Node, ptr %t165, i32 0, i32 0 - %t167 = load i32, ptr %t166 - %t168 = icmp eq i32 %t167, 36 - %t169 = zext i1 %t168 to i32 - %t170 = icmp ne i32 %t169, 0 - br i1 %t170, label %then39, label %ifend41 + %t160 = getelementptr inbounds %Str_Node, ptr %t159, i32 0, i32 4 + %t161 = load ptr, ptr %t160 + %t162 = getelementptr inbounds %Str_Node, ptr %t161, i32 0, i32 0 + %t163 = load i32, ptr %t162 + %t164 = icmp eq i32 %t163, 33 + %t165 = zext i1 %t164 to i32 + %t166 = icmp ne i32 %t165, 0 + br i1 %t166, label %then39, label %ifend41 then39: - %t171 = load ptr, ptr %t0 - %t172 = call ptr @fn_emit_index_addr(ptr %t171) - store ptr %t172, ptr %t173 + %t167 = load ptr, ptr %t0 + %t168 = getelementptr inbounds %Str_Node, ptr %t167, i32 0, i32 4 + %t169 = load ptr, ptr %t168 + %t170 = getelementptr inbounds %Str_Node, ptr %t169, i32 0, i32 1 + %t171 = load ptr, ptr %t170 + %t172 = load ptr, ptr %t0 + %t173 = getelementptr inbounds %Str_Node, ptr %t172, i32 0, i32 1 %t174 = load ptr, ptr %t173 - %t175 = load ptr, ptr @g_g_addr_ty - %t176 = call ptr @fn_emit_load_at(ptr %t174, ptr %t175) - store ptr %t176, ptr %retval - br label %ret -ifend41: - %t177 = load ptr, ptr %t0 - %t178 = getelementptr inbounds %Str_Node, ptr %t177, i32 0, i32 0 - %t179 = load i32, ptr %t178 - %t180 = icmp eq i32 %t179, 34 - %t181 = zext i1 %t180 to i32 - %t182 = icmp ne i32 %t181, 0 - br i1 %t182, label %then42, label %ifend44 + %t175 = call i32 @fn_enum_ordinal(ptr %t171, ptr %t174) + store i32 %t175, ptr %t176 + %t177 = load i32, ptr %t176 + %t178 = icmp sge i32 %t177, 0 + %t179 = zext i1 %t178 to i32 + %t180 = icmp ne i32 %t179, 0 + br i1 %t180, label %then42, label %ifend44 then42: - %t183 = load ptr, ptr %t0 - %t184 = call ptr @fn_emit_call(ptr %t183) - store ptr %t184, ptr %retval + %t181 = load i32, ptr %t176 + %t182 = call ptr @fn_itoa(i32 %t181) + %t183 = call ptr @fn_val(ptr %t182, ptr @.str899) + store ptr %t183, ptr %retval br label %ret ifend44: - %t185 = load ptr, ptr %t0 - %t186 = getelementptr inbounds %Str_Node, ptr %t185, i32 0, i32 0 - %t187 = load i32, ptr %t186 - %t188 = icmp eq i32 %t187, 37 - %t189 = zext i1 %t188 to i32 - %t190 = icmp ne i32 %t189, 0 - br i1 %t190, label %then45, label %ifend47 + br label %ifend41 +ifend41: + %t184 = load ptr, ptr %t0 + %t185 = call ptr @fn_emit_member_addr(ptr %t184) + store ptr %t185, ptr %t186 + %t187 = load ptr, ptr %t186 + %t188 = load ptr, ptr @g_g_addr_ty + %t189 = call ptr @fn_emit_load_at(ptr %t187, ptr %t188) + store ptr %t189, ptr %retval + br label %ret +ifend38: + %t190 = load ptr, ptr %t0 + %t191 = getelementptr inbounds %Str_Node, ptr %t190, i32 0, i32 0 + %t192 = load i32, ptr %t191 + %t193 = icmp eq i32 %t192, 36 + %t194 = zext i1 %t193 to i32 + %t195 = icmp ne i32 %t194, 0 + br i1 %t195, label %then45, label %ifend47 then45: - %t191 = load ptr, ptr %t0 - %t192 = call ptr @fn_emit_bin(ptr %t191) - store ptr %t192, ptr %retval + %t196 = load ptr, ptr %t0 + %t197 = call ptr @fn_emit_index_addr(ptr %t196) + store ptr %t197, ptr %t198 + %t199 = load ptr, ptr %t198 + %t200 = load ptr, ptr @g_g_addr_ty + %t201 = call ptr @fn_emit_load_at(ptr %t199, ptr %t200) + store ptr %t201, ptr %retval br label %ret ifend47: - %t193 = load ptr, ptr %t0 - %t194 = getelementptr inbounds %Str_Node, ptr %t193, i32 0, i32 0 - %t195 = load i32, ptr %t194 - %t196 = icmp eq i32 %t195, 38 - %t197 = zext i1 %t196 to i32 - %t198 = icmp ne i32 %t197, 0 - br i1 %t198, label %then48, label %ifend50 + %t202 = load ptr, ptr %t0 + %t203 = getelementptr inbounds %Str_Node, ptr %t202, i32 0, i32 0 + %t204 = load i32, ptr %t203 + %t205 = icmp eq i32 %t204, 34 + %t206 = zext i1 %t205 to i32 + %t207 = icmp ne i32 %t206, 0 + br i1 %t207, label %then48, label %ifend50 then48: - %t199 = load ptr, ptr %t0 - %t200 = getelementptr inbounds %Str_Node, ptr %t199, i32 0, i32 4 - %t201 = load ptr, ptr %t200 - %t202 = call ptr @fn_emit_expr(ptr %t201) - store ptr %t202, ptr %t203 - %t204 = load ptr, ptr %t0 - %t205 = getelementptr inbounds %Str_Node, ptr %t204, i32 0, i32 1 - %t206 = load ptr, ptr %t205 - %t207 = call i32 @fn_streq(ptr %t206, ptr @.str893) - %t208 = icmp ne i32 %t207, 0 - br i1 %t208, label %then51, label %ifend53 -then51: - %t209 = load ptr, ptr %t203 - %t210 = getelementptr inbounds %Str_Val, ptr %t209, i32 0, i32 0 - %t211 = load ptr, ptr %t210 - %t212 = call ptr @fn_sconcat(ptr @.str894, ptr %t211) - %t213 = call ptr @fn_emit_bind(ptr %t212) - %t214 = call ptr @fn_val(ptr %t213, ptr @.str895) - store ptr %t214, ptr %retval - br label %ret -ifend53: - %t215 = load ptr, ptr %t203 - %t216 = getelementptr inbounds %Str_Val, ptr %t215, i32 0, i32 0 - %t217 = load ptr, ptr %t216 - %t218 = call ptr @fn_sconcat(ptr %t217, ptr @.str897) - %t219 = call ptr @fn_sconcat(ptr @.str896, ptr %t218) - %t220 = call ptr @fn_emit_bind(ptr %t219) - store ptr %t220, ptr %t221 - %t222 = load ptr, ptr %t221 - %t223 = call ptr @fn_sconcat(ptr %t222, ptr @.str899) - %t224 = call ptr @fn_sconcat(ptr @.str898, ptr %t223) - %t225 = call ptr @fn_emit_bind(ptr %t224) - %t226 = call ptr @fn_val(ptr %t225, ptr @.str900) - store ptr %t226, ptr %retval + %t208 = load ptr, ptr %t0 + %t209 = call ptr @fn_emit_call(ptr %t208) + store ptr %t209, ptr %retval br label %ret ifend50: - call void @fn_perr(ptr @.str901) - %t227 = call ptr @fn_val(ptr @.str902, ptr @.str903) - store ptr %t227, ptr %retval + %t210 = load ptr, ptr %t0 + %t211 = getelementptr inbounds %Str_Node, ptr %t210, i32 0, i32 0 + %t212 = load i32, ptr %t211 + %t213 = icmp eq i32 %t212, 37 + %t214 = zext i1 %t213 to i32 + %t215 = icmp ne i32 %t214, 0 + br i1 %t215, label %then51, label %ifend53 +then51: + %t216 = load ptr, ptr %t0 + %t217 = call ptr @fn_emit_bin(ptr %t216) + store ptr %t217, ptr %retval + br label %ret +ifend53: + %t218 = load ptr, ptr %t0 + %t219 = getelementptr inbounds %Str_Node, ptr %t218, i32 0, i32 0 + %t220 = load i32, ptr %t219 + %t221 = icmp eq i32 %t220, 38 + %t222 = zext i1 %t221 to i32 + %t223 = icmp ne i32 %t222, 0 + br i1 %t223, label %then54, label %ifend56 +then54: + %t224 = load ptr, ptr %t0 + %t225 = getelementptr inbounds %Str_Node, ptr %t224, i32 0, i32 4 + %t226 = load ptr, ptr %t225 + %t227 = call ptr @fn_emit_expr(ptr %t226) + store ptr %t227, ptr %t228 + %t229 = load ptr, ptr %t0 + %t230 = getelementptr inbounds %Str_Node, ptr %t229, i32 0, i32 1 + %t231 = load ptr, ptr %t230 + %t232 = call i32 @fn_streq(ptr %t231, ptr @.str900) + %t233 = icmp ne i32 %t232, 0 + br i1 %t233, label %then57, label %ifend59 +then57: + %t234 = load ptr, ptr %t228 + %t235 = getelementptr inbounds %Str_Val, ptr %t234, i32 0, i32 0 + %t236 = load ptr, ptr %t235 + %t237 = call ptr @fn_sconcat(ptr @.str901, ptr %t236) + %t238 = call ptr @fn_emit_bind(ptr %t237) + %t239 = call ptr @fn_val(ptr %t238, ptr @.str902) + store ptr %t239, ptr %retval + br label %ret +ifend59: + %t240 = load ptr, ptr %t228 + %t241 = getelementptr inbounds %Str_Val, ptr %t240, i32 0, i32 0 + %t242 = load ptr, ptr %t241 + %t243 = call ptr @fn_sconcat(ptr %t242, ptr @.str904) + %t244 = call ptr @fn_sconcat(ptr @.str903, ptr %t243) + %t245 = call ptr @fn_emit_bind(ptr %t244) + store ptr %t245, ptr %t246 + %t247 = load ptr, ptr %t246 + %t248 = call ptr @fn_sconcat(ptr %t247, ptr @.str906) + %t249 = call ptr @fn_sconcat(ptr @.str905, ptr %t248) + %t250 = call ptr @fn_emit_bind(ptr %t249) + %t251 = call ptr @fn_val(ptr %t250, ptr @.str907) + store ptr %t251, ptr %retval + br label %ret +ifend56: + call void @fn_perr(ptr @.str908) + %t252 = call ptr @fn_val(ptr @.str909, ptr @.str910) + store ptr %t252, ptr %retval br label %ret ret: - %t228 = load ptr, ptr %retval - ret ptr %t228 + %t253 = load ptr, ptr %retval + ret ptr %t253 } define void @fn_emit_block(ptr %arg_b) { @@ -13692,16 +14047,16 @@ entry: store ptr %arg_lt, ptr %t0 store ptr %arg_v, ptr %t1 store ptr %arg_addr, ptr %t2 - call void @fn_emit(ptr @.str904) + call void @fn_emit(ptr @.str911) %t3 = load ptr, ptr %t0 call void @fn_emit(ptr %t3) - call void @fn_emit(ptr @.str905) + call void @fn_emit(ptr @.str912) %t4 = load ptr, ptr %t1 call void @fn_emit(ptr %t4) - call void @fn_emit(ptr @.str906) + call void @fn_emit(ptr @.str913) %t5 = load ptr, ptr %t2 call void @fn_emit(ptr %t5) - call void @fn_emit(ptr @.str907) + call void @fn_emit(ptr @.str914) br label %ret ret: ret void @@ -13725,8 +14080,8 @@ entry: %t2 = getelementptr inbounds %Str_Node, ptr %t1, i32 0, i32 4 %t3 = load ptr, ptr %t2 store ptr %t3, ptr %t4 - store ptr @.str908, ptr %t5 - store ptr @.str909, ptr %t6 + store ptr @.str915, ptr %t5 + store ptr @.str916, ptr %t6 %t7 = load ptr, ptr %t4 %t8 = getelementptr inbounds %Str_Node, ptr %t7, i32 0, i32 0 %t9 = load i32, ptr %t8 @@ -13776,14 +14131,14 @@ then6: %t43 = load ptr, ptr %t4 %t44 = getelementptr inbounds %Str_Node, ptr %t43, i32 0, i32 1 %t45 = load ptr, ptr %t44 - %t46 = call ptr @fn_sconcat(ptr @.str910, ptr %t45) + %t46 = call ptr @fn_sconcat(ptr @.str917, ptr %t45) call void @fn_perr(ptr %t46) br label %ifend8 ifend8: %t47 = load ptr, ptr %t4 %t48 = getelementptr inbounds %Str_Node, ptr %t47, i32 0, i32 1 %t49 = load ptr, ptr %t48 - %t50 = call ptr @fn_sconcat(ptr @.str911, ptr %t49) + %t50 = call ptr @fn_sconcat(ptr @.str918, ptr %t49) store ptr %t50, ptr %t5 %t51 = load ptr, ptr %t38 %t52 = getelementptr inbounds %Str_Node, ptr %t51, i32 0, i32 3 @@ -13823,7 +14178,7 @@ then12: store ptr %t71, ptr %t6 br label %ifend14 else13: - call void @fn_perr(ptr @.str912) + call void @fn_perr(ptr @.str919) br label %ifend14 ifend14: br label %ifend11 @@ -13845,7 +14200,7 @@ ifend2: %t84 = load ptr, ptr %t0 %t85 = getelementptr inbounds %Str_Node, ptr %t84, i32 0, i32 1 %t86 = load ptr, ptr %t85 - %t87 = call i32 @fn_streq(ptr %t86, ptr @.str913) + %t87 = call i32 @fn_streq(ptr %t86, ptr @.str920) %t88 = icmp eq i32 %t87, 0 %t89 = zext i1 %t88 to i32 %t90 = icmp ne i32 %t89, 0 @@ -13853,48 +14208,48 @@ ifend2: then15: %t91 = load ptr, ptr %t74 %t92 = load ptr, ptr %t5 - %t93 = call ptr @fn_sconcat(ptr @.str915, ptr %t92) + %t93 = call ptr @fn_sconcat(ptr @.str922, ptr %t92) %t94 = call ptr @fn_sconcat(ptr %t91, ptr %t93) - %t95 = call ptr @fn_sconcat(ptr @.str914, ptr %t94) + %t95 = call ptr @fn_sconcat(ptr @.str921, ptr %t94) %t96 = call ptr @fn_emit_bind(ptr %t95) store ptr %t96, ptr %t97 - store ptr @.str916, ptr %t98 + store ptr @.str923, ptr %t98 %t99 = load ptr, ptr %t0 %t100 = getelementptr inbounds %Str_Node, ptr %t99, i32 0, i32 1 %t101 = load ptr, ptr %t100 - %t102 = call i32 @fn_streq(ptr %t101, ptr @.str917) + %t102 = call i32 @fn_streq(ptr %t101, ptr @.str924) %t103 = icmp ne i32 %t102, 0 br i1 %t103, label %then18, label %ifend20 then18: - store ptr @.str918, ptr %t98 + store ptr @.str925, ptr %t98 br label %ifend20 ifend20: %t104 = load ptr, ptr %t0 %t105 = getelementptr inbounds %Str_Node, ptr %t104, i32 0, i32 1 %t106 = load ptr, ptr %t105 - %t107 = call i32 @fn_streq(ptr %t106, ptr @.str919) + %t107 = call i32 @fn_streq(ptr %t106, ptr @.str926) %t108 = icmp ne i32 %t107, 0 br i1 %t108, label %then21, label %ifend23 then21: - store ptr @.str920, ptr %t98 + store ptr @.str927, ptr %t98 br label %ifend23 ifend23: %t109 = load ptr, ptr %t0 %t110 = getelementptr inbounds %Str_Node, ptr %t109, i32 0, i32 1 %t111 = load ptr, ptr %t110 - %t112 = call i32 @fn_streq(ptr %t111, ptr @.str921) + %t112 = call i32 @fn_streq(ptr %t111, ptr @.str928) %t113 = icmp ne i32 %t112, 0 br i1 %t113, label %then24, label %ifend26 then24: - store ptr @.str922, ptr %t98 + store ptr @.str929, ptr %t98 br label %ifend26 ifend26: %t114 = load ptr, ptr %t98 %t115 = load ptr, ptr %t97 %t116 = load ptr, ptr %t83 - %t117 = call ptr @fn_sconcat(ptr @.str924, ptr %t116) + %t117 = call ptr @fn_sconcat(ptr @.str931, ptr %t116) %t118 = call ptr @fn_sconcat(ptr %t115, ptr %t117) - %t119 = call ptr @fn_sconcat(ptr @.str923, ptr %t118) + %t119 = call ptr @fn_sconcat(ptr @.str930, ptr %t118) %t120 = call ptr @fn_sconcat(ptr %t114, ptr %t119) %t121 = call ptr @fn_emit_bind(ptr %t120) store ptr %t121, ptr %t83 @@ -13927,8 +14282,8 @@ entry: %t6 = load ptr, ptr %t5 %t7 = getelementptr inbounds %Str_Val, ptr %t6, i32 0, i32 0 %t8 = load ptr, ptr %t7 - %t9 = call ptr @fn_sconcat(ptr %t8, ptr @.str926) - %t10 = call ptr @fn_sconcat(ptr @.str925, ptr %t9) + %t9 = call ptr @fn_sconcat(ptr %t8, ptr @.str933) + %t10 = call ptr @fn_sconcat(ptr @.str932, ptr %t9) %t11 = call ptr @fn_emit_bind(ptr %t10) store ptr %t11, ptr %t12 %t13 = load ptr, ptr %t0 @@ -13939,43 +14294,43 @@ entry: %t18 = icmp eq i32 %t17, 0 %t19 = zext i1 %t18 to i32 store i32 %t19, ptr %t20 - %t21 = call ptr @fn_lbl(ptr @.str927) + %t21 = call ptr @fn_lbl(ptr @.str934) store ptr %t21, ptr %t22 - %t23 = call ptr @fn_lbl(ptr @.str928) + %t23 = call ptr @fn_lbl(ptr @.str935) store ptr %t23, ptr %t24 - %t25 = call ptr @fn_lbl(ptr @.str929) + %t25 = call ptr @fn_lbl(ptr @.str936) store ptr %t25, ptr %t26 %t27 = load i32, ptr %t20 %t28 = icmp ne i32 %t27, 0 br i1 %t28, label %then0, label %else1 then0: - call void @fn_emit(ptr @.str930) + call void @fn_emit(ptr @.str937) %t29 = load ptr, ptr %t12 call void @fn_emit(ptr %t29) - call void @fn_emit(ptr @.str931) + call void @fn_emit(ptr @.str938) %t30 = load ptr, ptr %t22 call void @fn_emit(ptr %t30) - call void @fn_emit(ptr @.str932) + call void @fn_emit(ptr @.str939) %t31 = load ptr, ptr %t24 call void @fn_emit(ptr %t31) - call void @fn_emit(ptr @.str933) + call void @fn_emit(ptr @.str940) br label %ifend2 else1: - call void @fn_emit(ptr @.str934) + call void @fn_emit(ptr @.str941) %t32 = load ptr, ptr %t12 call void @fn_emit(ptr %t32) - call void @fn_emit(ptr @.str935) + call void @fn_emit(ptr @.str942) %t33 = load ptr, ptr %t22 call void @fn_emit(ptr %t33) - call void @fn_emit(ptr @.str936) + call void @fn_emit(ptr @.str943) %t34 = load ptr, ptr %t26 call void @fn_emit(ptr %t34) - call void @fn_emit(ptr @.str937) + call void @fn_emit(ptr @.str944) br label %ifend2 ifend2: %t35 = load ptr, ptr %t22 call void @fn_emit(ptr %t35) - call void @fn_emit(ptr @.str938) + call void @fn_emit(ptr @.str945) store i32 0, ptr @g_g_term %t36 = load ptr, ptr %t0 %t37 = getelementptr inbounds %Str_Node, ptr %t36, i32 0, i32 5 @@ -13987,10 +14342,10 @@ ifend2: %t42 = icmp ne i32 %t41, 0 br i1 %t42, label %then3, label %ifend5 then3: - call void @fn_emit(ptr @.str939) + call void @fn_emit(ptr @.str946) %t43 = load ptr, ptr %t26 call void @fn_emit(ptr %t43) - call void @fn_emit(ptr @.str940) + call void @fn_emit(ptr @.str947) br label %ifend5 ifend5: %t44 = load i32, ptr %t20 @@ -13999,7 +14354,7 @@ ifend5: then6: %t46 = load ptr, ptr %t24 call void @fn_emit(ptr %t46) - call void @fn_emit(ptr @.str941) + call void @fn_emit(ptr @.str948) store i32 0, ptr @g_g_term %t47 = load ptr, ptr %t0 %t48 = getelementptr inbounds %Str_Node, ptr %t47, i32 0, i32 6 @@ -14029,17 +14384,17 @@ ifend11: %t64 = icmp ne i32 %t63, 0 br i1 %t64, label %then12, label %ifend14 then12: - call void @fn_emit(ptr @.str942) + call void @fn_emit(ptr @.str949) %t65 = load ptr, ptr %t26 call void @fn_emit(ptr %t65) - call void @fn_emit(ptr @.str943) + call void @fn_emit(ptr @.str950) br label %ifend14 ifend14: br label %ifend8 ifend8: %t66 = load ptr, ptr %t26 call void @fn_emit(ptr %t66) - call void @fn_emit(ptr @.str944) + call void @fn_emit(ptr @.str951) store i32 0, ptr @g_g_term br label %ret ret: @@ -14055,19 +14410,19 @@ entry: %t13 = alloca ptr %t20 = alloca ptr store ptr %arg_st, ptr %t0 - %t1 = call ptr @fn_lbl(ptr @.str945) + %t1 = call ptr @fn_lbl(ptr @.str952) store ptr %t1, ptr %t2 - %t3 = call ptr @fn_lbl(ptr @.str946) + %t3 = call ptr @fn_lbl(ptr @.str953) store ptr %t3, ptr %t4 - %t5 = call ptr @fn_lbl(ptr @.str947) + %t5 = call ptr @fn_lbl(ptr @.str954) store ptr %t5, ptr %t6 - call void @fn_emit(ptr @.str948) + call void @fn_emit(ptr @.str955) %t7 = load ptr, ptr %t2 call void @fn_emit(ptr %t7) - call void @fn_emit(ptr @.str949) + call void @fn_emit(ptr @.str956) %t8 = load ptr, ptr %t2 call void @fn_emit(ptr %t8) - call void @fn_emit(ptr @.str950) + call void @fn_emit(ptr @.str957) %t9 = load ptr, ptr %t0 %t10 = getelementptr inbounds %Str_Node, ptr %t9, i32 0, i32 4 %t11 = load ptr, ptr %t10 @@ -14076,23 +14431,23 @@ entry: %t14 = load ptr, ptr %t13 %t15 = getelementptr inbounds %Str_Val, ptr %t14, i32 0, i32 0 %t16 = load ptr, ptr %t15 - %t17 = call ptr @fn_sconcat(ptr %t16, ptr @.str952) - %t18 = call ptr @fn_sconcat(ptr @.str951, ptr %t17) + %t17 = call ptr @fn_sconcat(ptr %t16, ptr @.str959) + %t18 = call ptr @fn_sconcat(ptr @.str958, ptr %t17) %t19 = call ptr @fn_emit_bind(ptr %t18) store ptr %t19, ptr %t20 - call void @fn_emit(ptr @.str953) + call void @fn_emit(ptr @.str960) %t21 = load ptr, ptr %t20 call void @fn_emit(ptr %t21) - call void @fn_emit(ptr @.str954) + call void @fn_emit(ptr @.str961) %t22 = load ptr, ptr %t4 call void @fn_emit(ptr %t22) - call void @fn_emit(ptr @.str955) + call void @fn_emit(ptr @.str962) %t23 = load ptr, ptr %t6 call void @fn_emit(ptr %t23) - call void @fn_emit(ptr @.str956) + call void @fn_emit(ptr @.str963) %t24 = load ptr, ptr %t4 call void @fn_emit(ptr %t24) - call void @fn_emit(ptr @.str957) + call void @fn_emit(ptr @.str964) store i32 0, ptr @g_g_term %t25 = load ptr, ptr %t2 %t26 = load ptr, ptr %t6 @@ -14108,15 +14463,15 @@ entry: %t33 = icmp ne i32 %t32, 0 br i1 %t33, label %then0, label %ifend2 then0: - call void @fn_emit(ptr @.str958) + call void @fn_emit(ptr @.str965) %t34 = load ptr, ptr %t2 call void @fn_emit(ptr %t34) - call void @fn_emit(ptr @.str959) + call void @fn_emit(ptr @.str966) br label %ifend2 ifend2: %t35 = load ptr, ptr %t6 call void @fn_emit(ptr %t35) - call void @fn_emit(ptr @.str960) + call void @fn_emit(ptr @.str967) store i32 0, ptr @g_g_term br label %ret ret: @@ -14138,7 +14493,7 @@ entry: %t62 = alloca ptr %t67 = alloca ptr store ptr %arg_st, ptr %t0 - %t1 = call ptr @fn_emit_alloca(ptr @.str961) + %t1 = call ptr @fn_emit_alloca(ptr @.str968) store ptr %t1, ptr %t2 %t3 = load ptr, ptr %t0 %t4 = getelementptr inbounds %Str_Node, ptr %t3, i32 0, i32 4 @@ -14149,29 +14504,29 @@ entry: %t9 = getelementptr inbounds %Str_Val, ptr %t8, i32 0, i32 0 %t10 = load ptr, ptr %t9 %t11 = load ptr, ptr %t2 - call void @fn_store_at(ptr @.str962, ptr %t10, ptr %t11) + call void @fn_store_at(ptr @.str969, ptr %t10, ptr %t11) %t12 = load ptr, ptr %t0 %t13 = getelementptr inbounds %Str_Node, ptr %t12, i32 0, i32 1 %t14 = load ptr, ptr %t13 %t15 = load ptr, ptr %t2 - call void @fn_loc_push(ptr %t14, ptr %t15, ptr @.str963) - %t16 = call ptr @fn_lbl(ptr @.str964) + call void @fn_loc_push(ptr %t14, ptr %t15, ptr @.str970) + %t16 = call ptr @fn_lbl(ptr @.str971) store ptr %t16, ptr %t17 - %t18 = call ptr @fn_lbl(ptr @.str965) + %t18 = call ptr @fn_lbl(ptr @.str972) store ptr %t18, ptr %t19 - %t20 = call ptr @fn_lbl(ptr @.str966) + %t20 = call ptr @fn_lbl(ptr @.str973) store ptr %t20, ptr %t21 - %t22 = call ptr @fn_lbl(ptr @.str967) + %t22 = call ptr @fn_lbl(ptr @.str974) store ptr %t22, ptr %t23 - call void @fn_emit(ptr @.str968) + call void @fn_emit(ptr @.str975) %t24 = load ptr, ptr %t17 call void @fn_emit(ptr %t24) - call void @fn_emit(ptr @.str969) + call void @fn_emit(ptr @.str976) %t25 = load ptr, ptr %t17 call void @fn_emit(ptr %t25) - call void @fn_emit(ptr @.str970) + call void @fn_emit(ptr @.str977) %t26 = load ptr, ptr %t2 - %t27 = call ptr @fn_sconcat(ptr @.str971, ptr %t26) + %t27 = call ptr @fn_sconcat(ptr @.str978, ptr %t26) %t28 = call ptr @fn_emit_bind(ptr %t27) store ptr %t28, ptr %t29 %t30 = load ptr, ptr %t0 @@ -14183,24 +14538,24 @@ entry: %t36 = load ptr, ptr %t34 %t37 = getelementptr inbounds %Str_Val, ptr %t36, i32 0, i32 0 %t38 = load ptr, ptr %t37 - %t39 = call ptr @fn_sconcat(ptr @.str973, ptr %t38) + %t39 = call ptr @fn_sconcat(ptr @.str980, ptr %t38) %t40 = call ptr @fn_sconcat(ptr %t35, ptr %t39) - %t41 = call ptr @fn_sconcat(ptr @.str972, ptr %t40) + %t41 = call ptr @fn_sconcat(ptr @.str979, ptr %t40) %t42 = call ptr @fn_emit_bind(ptr %t41) store ptr %t42, ptr %t43 - call void @fn_emit(ptr @.str974) + call void @fn_emit(ptr @.str981) %t44 = load ptr, ptr %t43 call void @fn_emit(ptr %t44) - call void @fn_emit(ptr @.str975) + call void @fn_emit(ptr @.str982) %t45 = load ptr, ptr %t19 call void @fn_emit(ptr %t45) - call void @fn_emit(ptr @.str976) + call void @fn_emit(ptr @.str983) %t46 = load ptr, ptr %t23 call void @fn_emit(ptr %t46) - call void @fn_emit(ptr @.str977) + call void @fn_emit(ptr @.str984) %t47 = load ptr, ptr %t19 call void @fn_emit(ptr %t47) - call void @fn_emit(ptr @.str978) + call void @fn_emit(ptr @.str985) store i32 0, ptr @g_g_term %t48 = load ptr, ptr %t21 %t49 = load ptr, ptr %t23 @@ -14216,34 +14571,34 @@ entry: %t56 = icmp ne i32 %t55, 0 br i1 %t56, label %then0, label %ifend2 then0: - call void @fn_emit(ptr @.str979) + call void @fn_emit(ptr @.str986) %t57 = load ptr, ptr %t21 call void @fn_emit(ptr %t57) - call void @fn_emit(ptr @.str980) + call void @fn_emit(ptr @.str987) br label %ifend2 ifend2: %t58 = load ptr, ptr %t21 call void @fn_emit(ptr %t58) - call void @fn_emit(ptr @.str981) + call void @fn_emit(ptr @.str988) %t59 = load ptr, ptr %t2 - %t60 = call ptr @fn_sconcat(ptr @.str982, ptr %t59) + %t60 = call ptr @fn_sconcat(ptr @.str989, ptr %t59) %t61 = call ptr @fn_emit_bind(ptr %t60) store ptr %t61, ptr %t62 %t63 = load ptr, ptr %t62 - %t64 = call ptr @fn_sconcat(ptr %t63, ptr @.str984) - %t65 = call ptr @fn_sconcat(ptr @.str983, ptr %t64) + %t64 = call ptr @fn_sconcat(ptr %t63, ptr @.str991) + %t65 = call ptr @fn_sconcat(ptr @.str990, ptr %t64) %t66 = call ptr @fn_emit_bind(ptr %t65) store ptr %t66, ptr %t67 %t68 = load ptr, ptr %t67 %t69 = load ptr, ptr %t2 - call void @fn_store_at(ptr @.str985, ptr %t68, ptr %t69) - call void @fn_emit(ptr @.str986) + call void @fn_store_at(ptr @.str992, ptr %t68, ptr %t69) + call void @fn_emit(ptr @.str993) %t70 = load ptr, ptr %t17 call void @fn_emit(ptr %t70) - call void @fn_emit(ptr @.str987) + call void @fn_emit(ptr @.str994) %t71 = load ptr, ptr %t23 call void @fn_emit(ptr %t71) - call void @fn_emit(ptr @.str988) + call void @fn_emit(ptr @.str995) store i32 0, ptr @g_g_term br label %ret ret: @@ -14275,10 +14630,10 @@ then0: %t16 = load ptr, ptr %t13 %t17 = getelementptr inbounds %Str_Val, ptr %t16, i32 0, i32 0 %t18 = load ptr, ptr %t17 - call void @fn_store_at(ptr %t15, ptr %t18, ptr @.str989) + call void @fn_store_at(ptr %t15, ptr %t18, ptr @.str996) br label %ifend2 ifend2: - call void @fn_emit(ptr @.str990) + call void @fn_emit(ptr @.str997) store i32 1, ptr @g_g_term br label %ret ret: @@ -14333,7 +14688,7 @@ sc3: %t33 = load ptr, ptr %t32 %t34 = getelementptr inbounds %Str_Node, ptr %t33, i32 0, i32 1 %t35 = load ptr, ptr %t34 - %t36 = call i32 @fn_streq(ptr %t35, ptr @.str991) + %t36 = call i32 @fn_streq(ptr %t35, ptr @.str998) %t37 = icmp ne i32 %t36, 0 %t38 = zext i1 %t37 to i32 store i32 %t38, ptr %t11 @@ -14379,7 +14734,7 @@ entry: %t3 = load ptr, ptr %t2 %t4 = call ptr @fn_emit_expr(ptr %t3) store ptr %t4, ptr %t5 - %t6 = call ptr @fn_lbl(ptr @.str992) + %t6 = call ptr @fn_lbl(ptr @.str999) store ptr %t6, ptr %t7 store ptr null, ptr %t8 store i32 0, ptr %t9 @@ -14414,7 +14769,7 @@ then3: store ptr %t31, ptr %t8 br label %ifend5 else4: - store ptr @.str993, ptr %t32 + store ptr @.str1000, ptr %t32 store i32 1, ptr %t33 store i32 0, ptr %t34 br label %wcond6 @@ -14446,9 +14801,9 @@ wbody7: %t57 = load ptr, ptr %t53 %t58 = getelementptr inbounds %Str_Val, ptr %t57, i32 0, i32 0 %t59 = load ptr, ptr %t58 - %t60 = call ptr @fn_sconcat(ptr @.str995, ptr %t59) + %t60 = call ptr @fn_sconcat(ptr @.str1002, ptr %t59) %t61 = call ptr @fn_sconcat(ptr %t56, ptr %t60) - %t62 = call ptr @fn_sconcat(ptr @.str994, ptr %t61) + %t62 = call ptr @fn_sconcat(ptr @.str1001, ptr %t61) %t63 = call ptr @fn_emit_bind(ptr %t62) store ptr %t63, ptr %t64 %t65 = load i32, ptr %t33 @@ -14462,9 +14817,9 @@ then9: else10: %t68 = load ptr, ptr %t32 %t69 = load ptr, ptr %t64 - %t70 = call ptr @fn_sconcat(ptr @.str997, ptr %t69) + %t70 = call ptr @fn_sconcat(ptr @.str1004, ptr %t69) %t71 = call ptr @fn_sconcat(ptr %t68, ptr %t70) - %t72 = call ptr @fn_sconcat(ptr @.str996, ptr %t71) + %t72 = call ptr @fn_sconcat(ptr @.str1003, ptr %t71) %t73 = call ptr @fn_emit_bind(ptr %t72) store ptr %t73, ptr %t32 br label %ifend11 @@ -14474,23 +14829,23 @@ ifend11: store i32 %t75, ptr %t34 br label %wcond6 wend8: - %t76 = call ptr @fn_lbl(ptr @.str998) + %t76 = call ptr @fn_lbl(ptr @.str1005) store ptr %t76, ptr %t77 - %t78 = call ptr @fn_lbl(ptr @.str999) + %t78 = call ptr @fn_lbl(ptr @.str1006) store ptr %t78, ptr %t79 - call void @fn_emit(ptr @.str1000) + call void @fn_emit(ptr @.str1007) %t80 = load ptr, ptr %t32 call void @fn_emit(ptr %t80) - call void @fn_emit(ptr @.str1001) + call void @fn_emit(ptr @.str1008) %t81 = load ptr, ptr %t77 call void @fn_emit(ptr %t81) - call void @fn_emit(ptr @.str1002) + call void @fn_emit(ptr @.str1009) %t82 = load ptr, ptr %t79 call void @fn_emit(ptr %t82) - call void @fn_emit(ptr @.str1003) + call void @fn_emit(ptr @.str1010) %t83 = load ptr, ptr %t77 call void @fn_emit(ptr %t83) - call void @fn_emit(ptr @.str1004) + call void @fn_emit(ptr @.str1011) store i32 0, ptr @g_g_term %t84 = load ptr, ptr %t27 %t85 = getelementptr inbounds %Str_Node, ptr %t84, i32 0, i32 4 @@ -14502,15 +14857,15 @@ wend8: %t90 = icmp ne i32 %t89, 0 br i1 %t90, label %then12, label %ifend14 then12: - call void @fn_emit(ptr @.str1005) + call void @fn_emit(ptr @.str1012) %t91 = load ptr, ptr %t7 call void @fn_emit(ptr %t91) - call void @fn_emit(ptr @.str1006) + call void @fn_emit(ptr @.str1013) br label %ifend14 ifend14: %t92 = load ptr, ptr %t79 call void @fn_emit(ptr %t92) - call void @fn_emit(ptr @.str1007) + call void @fn_emit(ptr @.str1014) store i32 0, ptr @g_g_term br label %ifend5 ifend5: @@ -14539,15 +14894,15 @@ ifend17: %t107 = icmp ne i32 %t106, 0 br i1 %t107, label %then18, label %ifend20 then18: - call void @fn_emit(ptr @.str1008) + call void @fn_emit(ptr @.str1015) %t108 = load ptr, ptr %t7 call void @fn_emit(ptr %t108) - call void @fn_emit(ptr @.str1009) + call void @fn_emit(ptr @.str1016) br label %ifend20 ifend20: %t109 = load ptr, ptr %t7 call void @fn_emit(ptr %t109) - call void @fn_emit(ptr @.str1010) + call void @fn_emit(ptr @.str1017) store i32 0, ptr @g_g_term br label %ret ret: @@ -14623,14 +14978,14 @@ ifend5: %t47 = icmp ne i32 %t46, 0 br i1 %t47, label %then6, label %else7 then6: - store ptr @.str1011, ptr %t48 + store ptr @.str1018, ptr %t48 %t49 = load ptr, ptr %t10 %t50 = call ptr @fn_llty(ptr %t49) - %t51 = call i32 @fn_streq(ptr %t50, ptr @.str1012) + %t51 = call i32 @fn_streq(ptr %t50, ptr @.str1019) %t52 = icmp ne i32 %t51, 0 br i1 %t52, label %then9, label %ifend11 then9: - store ptr @.str1013, ptr %t48 + store ptr @.str1020, ptr %t48 br label %ifend11 ifend11: %t53 = load ptr, ptr %t10 @@ -14730,7 +15085,7 @@ ifend26: %t113 = icmp ne i32 %t112, 0 br i1 %t113, label %then27, label %ifend29 then27: - call void @fn_emit(ptr @.str1014) + call void @fn_emit(ptr @.str1021) %t114 = load ptr, ptr @g_brk_lbl %t115 = getelementptr inbounds %LSlice, ptr %t114, i32 0, i32 0 %t116 = load ptr, ptr %t115 @@ -14739,7 +15094,7 @@ then27: %t119 = getelementptr inbounds ptr, ptr %t116, i32 %t118 %t120 = load ptr, ptr %t119 call void @fn_emit(ptr %t120) - call void @fn_emit(ptr @.str1015) + call void @fn_emit(ptr @.str1022) store i32 1, ptr @g_g_term br label %ret ifend29: @@ -14751,7 +15106,7 @@ ifend29: %t126 = icmp ne i32 %t125, 0 br i1 %t126, label %then30, label %ifend32 then30: - call void @fn_emit(ptr @.str1016) + call void @fn_emit(ptr @.str1023) %t127 = load ptr, ptr @g_cnt_lbl %t128 = getelementptr inbounds %LSlice, ptr %t127, i32 0, i32 0 %t129 = load ptr, ptr %t128 @@ -14760,7 +15115,7 @@ then30: %t132 = getelementptr inbounds ptr, ptr %t129, i32 %t131 %t133 = load ptr, ptr %t132 call void @fn_emit(ptr %t133) - call void @fn_emit(ptr @.str1017) + call void @fn_emit(ptr @.str1024) store i32 1, ptr @g_g_term br label %ret ifend32: @@ -14851,7 +15206,7 @@ then51: store ptr %t185, ptr %t186 br label %ret ifend53: - call void @fn_perr(ptr @.str1018) + call void @fn_perr(ptr @.str1025) br label %ret ret: ret void @@ -15076,24 +15431,24 @@ entry: %t11 = alloca i32 %t25 = alloca ptr %t45 = alloca i32 - call void @fn_emith(ptr @.str1019) - call void @fn_emith(ptr @.str1020) - call void @fn_emith(ptr @.str1021) + call void @fn_emith(ptr @.str1026) + call void @fn_emith(ptr @.str1027) + call void @fn_emith(ptr @.str1028) %t0 = call ptr @fn_itoa(i32 1024) store ptr %t0, ptr %t1 %t2 = load ptr, ptr %t1 - %t3 = call ptr @fn_sconcat(ptr %t2, ptr @.str1023) - %t4 = call ptr @fn_sconcat(ptr @.str1022, ptr %t3) + %t3 = call ptr @fn_sconcat(ptr %t2, ptr @.str1030) + %t4 = call ptr @fn_sconcat(ptr @.str1029, ptr %t3) call void @fn_emith(ptr %t4) %t5 = load ptr, ptr %t1 - %t6 = call ptr @fn_sconcat(ptr %t5, ptr @.str1025) - %t7 = call ptr @fn_sconcat(ptr @.str1024, ptr %t6) + %t6 = call ptr @fn_sconcat(ptr %t5, ptr @.str1032) + %t7 = call ptr @fn_sconcat(ptr @.str1031, ptr %t6) call void @fn_emith(ptr %t7) %t8 = load ptr, ptr %t1 - %t9 = call ptr @fn_sconcat(ptr %t8, ptr @.str1027) - %t10 = call ptr @fn_sconcat(ptr @.str1026, ptr %t9) + %t9 = call ptr @fn_sconcat(ptr %t8, ptr @.str1034) + %t10 = call ptr @fn_sconcat(ptr @.str1033, ptr %t9) call void @fn_emith(ptr %t10) - call void @fn_emith(ptr @.str1028) + call void @fn_emith(ptr @.str1035) store i32 0, ptr %t11 br label %wcond0 wcond0: @@ -15124,8 +15479,8 @@ then3: %t32 = load ptr, ptr %t25 %t33 = getelementptr inbounds %Str_Node, ptr %t32, i32 0, i32 1 %t34 = load ptr, ptr %t33 - %t35 = call ptr @fn_sconcat(ptr %t34, ptr @.str1030) - %t36 = call ptr @fn_sconcat(ptr @.str1029, ptr %t35) + %t35 = call ptr @fn_sconcat(ptr %t34, ptr @.str1037) + %t36 = call ptr @fn_sconcat(ptr @.str1036, ptr %t35) call void @fn_emith(ptr %t36) %t37 = load ptr, ptr %t25 %t38 = getelementptr inbounds %Str_Node, ptr %t37, i32 0, i32 7 @@ -15137,7 +15492,7 @@ then3: %t44 = icmp ne i32 %t43, 0 br i1 %t44, label %then6, label %ifend8 then6: - call void @fn_emith(ptr @.str1031) + call void @fn_emith(ptr @.str1038) br label %ifend8 ifend8: store i32 0, ptr %t45 @@ -15160,7 +15515,7 @@ wbody10: %t58 = icmp ne i32 %t57, 0 br i1 %t58, label %then12, label %ifend14 then12: - call void @fn_emith(ptr @.str1032) + call void @fn_emith(ptr @.str1039) br label %ifend14 ifend14: %t59 = load ptr, ptr %t25 @@ -15180,7 +15535,7 @@ ifend14: store i32 %t71, ptr %t45 br label %wcond9 wend11: - call void @fn_emith(ptr @.str1033) + call void @fn_emith(ptr @.str1040) %t72 = load ptr, ptr %t25 %t73 = getelementptr inbounds %Str_Node, ptr %t72, i32 0, i32 1 %t74 = load ptr, ptr %t73 @@ -15188,21 +15543,21 @@ wend11: %t76 = load ptr, ptr %t25 %t77 = getelementptr inbounds %Str_Node, ptr %t76, i32 0, i32 1 %t78 = load ptr, ptr %t77 - %t79 = call ptr @fn_sconcat(ptr %t78, ptr @.str1037) - %t80 = call ptr @fn_sconcat(ptr @.str1036, ptr %t79) + %t79 = call ptr @fn_sconcat(ptr %t78, ptr @.str1044) + %t80 = call ptr @fn_sconcat(ptr @.str1043, ptr %t79) %t81 = call ptr @fn_sconcat(ptr %t75, ptr %t80) - %t82 = call ptr @fn_sconcat(ptr @.str1035, ptr %t81) + %t82 = call ptr @fn_sconcat(ptr @.str1042, ptr %t81) %t83 = call ptr @fn_sconcat(ptr %t74, ptr %t82) - %t84 = call ptr @fn_sconcat(ptr @.str1034, ptr %t83) + %t84 = call ptr @fn_sconcat(ptr @.str1041, ptr %t83) call void @fn_emith(ptr %t84) %t85 = load ptr, ptr %t25 %t86 = getelementptr inbounds %Str_Node, ptr %t85, i32 0, i32 1 %t87 = load ptr, ptr %t86 %t88 = load ptr, ptr %t1 - %t89 = call ptr @fn_sconcat(ptr %t88, ptr @.str1040) - %t90 = call ptr @fn_sconcat(ptr @.str1039, ptr %t89) + %t89 = call ptr @fn_sconcat(ptr %t88, ptr @.str1047) + %t90 = call ptr @fn_sconcat(ptr @.str1046, ptr %t89) %t91 = call ptr @fn_sconcat(ptr %t87, ptr %t90) - %t92 = call ptr @fn_sconcat(ptr @.str1038, ptr %t91) + %t92 = call ptr @fn_sconcat(ptr @.str1045, ptr %t91) call void @fn_emith(ptr %t92) br label %ifend5 ifend5: @@ -15223,7 +15578,7 @@ entry: %t24 = alloca ptr %t0 = call ptr @fn_itoa(i32 1024) store ptr %t0, ptr %t1 - call void @fn_emit(ptr @.str1041) + call void @fn_emit(ptr @.str1048) store i32 0, ptr %t2 br label %wcond0 wcond0: @@ -15251,15 +15606,15 @@ wbody1: then3: %t21 = load i32, ptr %t2 %t22 = call ptr @fn_itoa(i32 %t21) - %t23 = call ptr @fn_sconcat(ptr @.str1042, ptr %t22) + %t23 = call ptr @fn_sconcat(ptr @.str1049, ptr %t22) store ptr %t23, ptr %t24 - call void @fn_emit(ptr @.str1043) + call void @fn_emit(ptr @.str1050) %t25 = load ptr, ptr %t24 call void @fn_emit(ptr %t25) - call void @fn_emit(ptr @.str1044) + call void @fn_emit(ptr @.str1051) %t26 = load ptr, ptr %t1 call void @fn_emit(ptr %t26) - call void @fn_emit(ptr @.str1045) + call void @fn_emit(ptr @.str1052) %t27 = load ptr, ptr @g_prog %t28 = getelementptr inbounds %LSlice, ptr %t27, i32 0, i32 0 %t29 = load ptr, ptr %t28 @@ -15269,11 +15624,11 @@ then3: %t33 = getelementptr inbounds %Str_Node, ptr %t32, i32 0, i32 1 %t34 = load ptr, ptr %t33 call void @fn_emit(ptr %t34) - call void @fn_emit(ptr @.str1046) - call void @fn_emit(ptr @.str1047) + call void @fn_emit(ptr @.str1053) + call void @fn_emit(ptr @.str1054) %t35 = load ptr, ptr %t24 call void @fn_emit(ptr %t35) - call void @fn_emit(ptr @.str1048) + call void @fn_emit(ptr @.str1055) br label %ifend5 ifend5: %t36 = load i32, ptr %t2 @@ -15281,21 +15636,12 @@ ifend5: store i32 %t37, ptr %t2 br label %wcond0 wend2: - call void @fn_emit(ptr @.str1049) + call void @fn_emit(ptr @.str1056) %t38 = load ptr, ptr %t1 call void @fn_emit(ptr %t38) - call void @fn_emit(ptr @.str1050) - call void @fn_emit(ptr @.str1051) - call void @fn_emit(ptr @.str1052) - call void @fn_emit(ptr @.str1053) - call void @fn_emit(ptr @.str1054) - call void @fn_emit(ptr @.str1055) - call void @fn_emit(ptr @.str1056) call void @fn_emit(ptr @.str1057) call void @fn_emit(ptr @.str1058) call void @fn_emit(ptr @.str1059) - %t39 = load ptr, ptr %t1 - call void @fn_emit(ptr %t39) call void @fn_emit(ptr @.str1060) call void @fn_emit(ptr @.str1061) call void @fn_emit(ptr @.str1062) @@ -15303,32 +15649,41 @@ wend2: call void @fn_emit(ptr @.str1064) call void @fn_emit(ptr @.str1065) call void @fn_emit(ptr @.str1066) + %t39 = load ptr, ptr %t1 + call void @fn_emit(ptr %t39) call void @fn_emit(ptr @.str1067) call void @fn_emit(ptr @.str1068) call void @fn_emit(ptr @.str1069) call void @fn_emit(ptr @.str1070) call void @fn_emit(ptr @.str1071) - %t40 = load ptr, ptr %t1 - call void @fn_emit(ptr %t40) call void @fn_emit(ptr @.str1072) call void @fn_emit(ptr @.str1073) call void @fn_emit(ptr @.str1074) call void @fn_emit(ptr @.str1075) call void @fn_emit(ptr @.str1076) - %t41 = load ptr, ptr %t1 - call void @fn_emit(ptr %t41) call void @fn_emit(ptr @.str1077) call void @fn_emit(ptr @.str1078) + %t40 = load ptr, ptr %t1 + call void @fn_emit(ptr %t40) call void @fn_emit(ptr @.str1079) call void @fn_emit(ptr @.str1080) call void @fn_emit(ptr @.str1081) - %t42 = load ptr, ptr %t1 - call void @fn_emit(ptr %t42) call void @fn_emit(ptr @.str1082) call void @fn_emit(ptr @.str1083) + %t41 = load ptr, ptr %t1 + call void @fn_emit(ptr %t41) call void @fn_emit(ptr @.str1084) call void @fn_emit(ptr @.str1085) call void @fn_emit(ptr @.str1086) + call void @fn_emit(ptr @.str1087) + call void @fn_emit(ptr @.str1088) + %t42 = load ptr, ptr %t1 + call void @fn_emit(ptr %t42) + call void @fn_emit(ptr @.str1089) + call void @fn_emit(ptr @.str1090) + call void @fn_emit(ptr @.str1091) + call void @fn_emit(ptr @.str1092) + call void @fn_emit(ptr @.str1093) br label %ret ret: ret void @@ -15442,10 +15797,10 @@ entry: store ptr %arg_st, ptr %t0 %t1 = call ptr @fn_itoa(i32 1024) store ptr %t1, ptr %t2 - %t3 = call ptr @fn_emit_alloca(ptr @.str1087) + %t3 = call ptr @fn_emit_alloca(ptr @.str1094) store ptr %t3, ptr %t4 %t5 = load ptr, ptr %t4 - call void @fn_store_at(ptr @.str1088, ptr @.str1089, ptr %t5) + call void @fn_store_at(ptr @.str1095, ptr @.str1096, ptr %t5) %t6 = load i32, ptr @g_nself %t7 = load ptr, ptr @g_self_stk %t8 = getelementptr inbounds %LSlice, ptr %t7, i32 0, i32 1 @@ -15497,88 +15852,88 @@ ifend2: %t39 = load i32, ptr @g_nself %t40 = add i32 %t39, 1 store i32 %t40, ptr @g_nself - %t41 = call ptr @fn_lbl(ptr @.str1090) + %t41 = call ptr @fn_lbl(ptr @.str1097) store ptr %t41, ptr %t42 - %t43 = call ptr @fn_lbl(ptr @.str1091) + %t43 = call ptr @fn_lbl(ptr @.str1098) store ptr %t43, ptr %t44 - %t45 = call ptr @fn_lbl(ptr @.str1092) + %t45 = call ptr @fn_lbl(ptr @.str1099) store ptr %t45, ptr %t46 - %t47 = call ptr @fn_lbl(ptr @.str1093) + %t47 = call ptr @fn_lbl(ptr @.str1100) store ptr %t47, ptr %t48 - call void @fn_emit(ptr @.str1094) + call void @fn_emit(ptr @.str1101) %t49 = load ptr, ptr %t42 call void @fn_emit(ptr %t49) - call void @fn_emit(ptr @.str1095) + call void @fn_emit(ptr @.str1102) %t50 = load ptr, ptr %t42 call void @fn_emit(ptr %t50) - call void @fn_emit(ptr @.str1096) + call void @fn_emit(ptr @.str1103) %t51 = load ptr, ptr %t4 - %t52 = call ptr @fn_sconcat(ptr @.str1097, ptr %t51) + %t52 = call ptr @fn_sconcat(ptr @.str1104, ptr %t51) %t53 = call ptr @fn_emit_bind(ptr %t52) store ptr %t53, ptr %t54 - %t55 = call ptr @fn_emit_bind(ptr @.str1098) + %t55 = call ptr @fn_emit_bind(ptr @.str1105) store ptr %t55, ptr %t56 %t57 = load ptr, ptr %t54 %t58 = load ptr, ptr %t56 - %t59 = call ptr @fn_sconcat(ptr @.str1100, ptr %t58) + %t59 = call ptr @fn_sconcat(ptr @.str1107, ptr %t58) %t60 = call ptr @fn_sconcat(ptr %t57, ptr %t59) - %t61 = call ptr @fn_sconcat(ptr @.str1099, ptr %t60) + %t61 = call ptr @fn_sconcat(ptr @.str1106, ptr %t60) %t62 = call ptr @fn_emit_bind(ptr %t61) store ptr %t62, ptr %t63 - call void @fn_emit(ptr @.str1101) + call void @fn_emit(ptr @.str1108) %t64 = load ptr, ptr %t63 call void @fn_emit(ptr %t64) - call void @fn_emit(ptr @.str1102) + call void @fn_emit(ptr @.str1109) %t65 = load ptr, ptr %t44 call void @fn_emit(ptr %t65) - call void @fn_emit(ptr @.str1103) + call void @fn_emit(ptr @.str1110) %t66 = load ptr, ptr %t48 call void @fn_emit(ptr %t66) - call void @fn_emit(ptr @.str1104) + call void @fn_emit(ptr @.str1111) %t67 = load ptr, ptr %t44 call void @fn_emit(ptr %t67) - call void @fn_emit(ptr @.str1105) + call void @fn_emit(ptr @.str1112) store i32 0, ptr @g_g_term %t68 = load ptr, ptr %t4 - %t69 = call ptr @fn_sconcat(ptr @.str1106, ptr %t68) + %t69 = call ptr @fn_sconcat(ptr @.str1113, ptr %t68) %t70 = call ptr @fn_emit_bind(ptr %t69) store ptr %t70, ptr %t71 %t72 = call ptr @fn_nreg() store ptr %t72, ptr %t73 - call void @fn_emit(ptr @.str1107) + call void @fn_emit(ptr @.str1114) %t74 = load ptr, ptr %t73 call void @fn_emit(ptr %t74) - call void @fn_emit(ptr @.str1108) + call void @fn_emit(ptr @.str1115) %t75 = load ptr, ptr %t2 call void @fn_emit(ptr %t75) - call void @fn_emit(ptr @.str1109) + call void @fn_emit(ptr @.str1116) %t76 = load ptr, ptr %t71 call void @fn_emit(ptr %t76) - call void @fn_emit(ptr @.str1110) + call void @fn_emit(ptr @.str1117) %t77 = load ptr, ptr %t73 - %t78 = call ptr @fn_sconcat(ptr @.str1111, ptr %t77) + %t78 = call ptr @fn_sconcat(ptr @.str1118, ptr %t77) %t79 = call ptr @fn_emit_bind(ptr %t78) store ptr %t79, ptr %t80 %t81 = load ptr, ptr %t80 - %t82 = call ptr @fn_sconcat(ptr %t81, ptr @.str1113) - %t83 = call ptr @fn_sconcat(ptr @.str1112, ptr %t82) + %t82 = call ptr @fn_sconcat(ptr %t81, ptr @.str1120) + %t83 = call ptr @fn_sconcat(ptr @.str1119, ptr %t82) %t84 = call ptr @fn_emit_bind(ptr %t83) store ptr %t84, ptr %t85 - %t86 = call ptr @fn_lbl(ptr @.str1114) + %t86 = call ptr @fn_lbl(ptr @.str1121) store ptr %t86, ptr %t87 - call void @fn_emit(ptr @.str1115) + call void @fn_emit(ptr @.str1122) %t88 = load ptr, ptr %t85 call void @fn_emit(ptr %t88) - call void @fn_emit(ptr @.str1116) + call void @fn_emit(ptr @.str1123) %t89 = load ptr, ptr %t87 call void @fn_emit(ptr %t89) - call void @fn_emit(ptr @.str1117) + call void @fn_emit(ptr @.str1124) %t90 = load ptr, ptr %t46 call void @fn_emit(ptr %t90) - call void @fn_emit(ptr @.str1118) + call void @fn_emit(ptr @.str1125) %t91 = load ptr, ptr %t87 call void @fn_emit(ptr %t91) - call void @fn_emit(ptr @.str1119) + call void @fn_emit(ptr @.str1126) %t92 = load ptr, ptr %t0 %t93 = getelementptr inbounds %Str_Node, ptr %t92, i32 0, i32 6 %t94 = load ptr, ptr %t93 @@ -15611,7 +15966,7 @@ wbody6: %t117 = load ptr, ptr %t116 %t118 = call i32 @fn_find_arch_id(ptr %t117) store i32 %t118, ptr %t119 - store ptr @.str1120, ptr %t120 + store ptr @.str1127, ptr %t120 %t121 = load i32, ptr %t119 %t122 = icmp sgt i32 %t121, 0 %t123 = zext i1 %t122 to i32 @@ -15620,73 +15975,73 @@ wbody6: then8: %t125 = call ptr @fn_nreg() store ptr %t125, ptr %t126 - call void @fn_emit(ptr @.str1121) + call void @fn_emit(ptr @.str1128) %t127 = load ptr, ptr %t126 call void @fn_emit(ptr %t127) - call void @fn_emit(ptr @.str1122) + call void @fn_emit(ptr @.str1129) %t128 = load ptr, ptr %t2 call void @fn_emit(ptr %t128) - call void @fn_emit(ptr @.str1123) + call void @fn_emit(ptr @.str1130) %t129 = load ptr, ptr %t71 call void @fn_emit(ptr %t129) - call void @fn_emit(ptr @.str1124) + call void @fn_emit(ptr @.str1131) %t130 = load ptr, ptr %t126 - %t131 = call ptr @fn_sconcat(ptr @.str1125, ptr %t130) + %t131 = call ptr @fn_sconcat(ptr @.str1132, ptr %t130) %t132 = call ptr @fn_emit_bind(ptr %t131) store ptr %t132, ptr %t133 %t134 = load ptr, ptr %t133 %t135 = load i32, ptr %t119 %t136 = call ptr @fn_itoa(i32 %t135) - %t137 = call ptr @fn_sconcat(ptr @.str1127, ptr %t136) + %t137 = call ptr @fn_sconcat(ptr @.str1134, ptr %t136) %t138 = call ptr @fn_sconcat(ptr %t134, ptr %t137) - %t139 = call ptr @fn_sconcat(ptr @.str1126, ptr %t138) + %t139 = call ptr @fn_sconcat(ptr @.str1133, ptr %t138) %t140 = call ptr @fn_emit_bind(ptr %t139) store ptr %t140, ptr %t120 br label %ifend10 else9: %t141 = call ptr @fn_nreg() store ptr %t141, ptr %t142 - call void @fn_emit(ptr @.str1128) + call void @fn_emit(ptr @.str1135) %t143 = load ptr, ptr %t142 call void @fn_emit(ptr %t143) - call void @fn_emit(ptr @.str1129) + call void @fn_emit(ptr @.str1136) %t144 = load ptr, ptr %t2 call void @fn_emit(ptr %t144) - call void @fn_emit(ptr @.str1130) + call void @fn_emit(ptr @.str1137) %t145 = load ptr, ptr %t114 %t146 = getelementptr inbounds %Str_Node, ptr %t145, i32 0, i32 1 %t147 = load ptr, ptr %t146 call void @fn_emit(ptr %t147) - call void @fn_emit(ptr @.str1131) + call void @fn_emit(ptr @.str1138) %t148 = load ptr, ptr %t71 call void @fn_emit(ptr %t148) - call void @fn_emit(ptr @.str1132) + call void @fn_emit(ptr @.str1139) %t149 = load ptr, ptr %t142 - %t150 = call ptr @fn_sconcat(ptr @.str1133, ptr %t149) + %t150 = call ptr @fn_sconcat(ptr @.str1140, ptr %t149) %t151 = call ptr @fn_emit_bind(ptr %t150) store ptr %t151, ptr %t152 %t153 = load ptr, ptr %t152 - %t154 = call ptr @fn_sconcat(ptr %t153, ptr @.str1135) - %t155 = call ptr @fn_sconcat(ptr @.str1134, ptr %t154) + %t154 = call ptr @fn_sconcat(ptr %t153, ptr @.str1142) + %t155 = call ptr @fn_sconcat(ptr @.str1141, ptr %t154) %t156 = call ptr @fn_emit_bind(ptr %t155) store ptr %t156, ptr %t120 br label %ifend10 ifend10: - %t157 = call ptr @fn_lbl(ptr @.str1136) + %t157 = call ptr @fn_lbl(ptr @.str1143) store ptr %t157, ptr %t158 - call void @fn_emit(ptr @.str1137) + call void @fn_emit(ptr @.str1144) %t159 = load ptr, ptr %t120 call void @fn_emit(ptr %t159) - call void @fn_emit(ptr @.str1138) + call void @fn_emit(ptr @.str1145) %t160 = load ptr, ptr %t158 call void @fn_emit(ptr %t160) - call void @fn_emit(ptr @.str1139) + call void @fn_emit(ptr @.str1146) %t161 = load ptr, ptr %t46 call void @fn_emit(ptr %t161) - call void @fn_emit(ptr @.str1140) + call void @fn_emit(ptr @.str1147) %t162 = load ptr, ptr %t158 call void @fn_emit(ptr %t162) - call void @fn_emit(ptr @.str1141) + call void @fn_emit(ptr @.str1148) %t163 = load i32, ptr %t96 %t164 = add i32 %t163, 1 store i32 %t164, ptr %t96 @@ -15756,35 +16111,35 @@ then16: then19: %t213 = call ptr @fn_nreg() store ptr %t213, ptr %t214 - call void @fn_emit(ptr @.str1142) + call void @fn_emit(ptr @.str1149) %t215 = load ptr, ptr %t214 call void @fn_emit(ptr %t215) - call void @fn_emit(ptr @.str1143) + call void @fn_emit(ptr @.str1150) %t216 = load ptr, ptr %t2 call void @fn_emit(ptr %t216) - call void @fn_emit(ptr @.str1144) + call void @fn_emit(ptr @.str1151) %t217 = load ptr, ptr %t185 %t218 = getelementptr inbounds %Str_Node, ptr %t217, i32 0, i32 1 %t219 = load ptr, ptr %t218 call void @fn_emit(ptr %t219) - call void @fn_emit(ptr @.str1145) + call void @fn_emit(ptr @.str1152) %t220 = load ptr, ptr %t185 %t221 = getelementptr inbounds %Str_Node, ptr %t220, i32 0, i32 1 %t222 = load ptr, ptr %t221 call void @fn_emit(ptr %t222) - call void @fn_emit(ptr @.str1146) + call void @fn_emit(ptr @.str1153) %t223 = load ptr, ptr %t71 call void @fn_emit(ptr %t223) - call void @fn_emit(ptr @.str1147) - %t224 = call ptr @fn_emit_alloca(ptr @.str1148) + call void @fn_emit(ptr @.str1154) + %t224 = call ptr @fn_emit_alloca(ptr @.str1155) store ptr %t224, ptr %t225 - call void @fn_emit(ptr @.str1149) + call void @fn_emit(ptr @.str1156) %t226 = load ptr, ptr %t214 call void @fn_emit(ptr %t226) - call void @fn_emit(ptr @.str1150) + call void @fn_emit(ptr @.str1157) %t227 = load ptr, ptr %t225 call void @fn_emit(ptr %t227) - call void @fn_emit(ptr @.str1151) + call void @fn_emit(ptr @.str1158) %t228 = load ptr, ptr %t0 %t229 = getelementptr inbounds %Str_Node, ptr %t228, i32 0, i32 7 %t230 = load ptr, ptr %t229 @@ -15830,25 +16185,25 @@ then22: %t259 = load ptr, ptr %t258 %t260 = getelementptr inbounds %Str_Val, ptr %t259, i32 0, i32 0 %t261 = load ptr, ptr %t260 - %t262 = call ptr @fn_sconcat(ptr %t261, ptr @.str1153) - %t263 = call ptr @fn_sconcat(ptr @.str1152, ptr %t262) + %t262 = call ptr @fn_sconcat(ptr %t261, ptr @.str1160) + %t263 = call ptr @fn_sconcat(ptr @.str1159, ptr %t262) %t264 = call ptr @fn_emit_bind(ptr %t263) store ptr %t264, ptr %t265 - %t266 = call ptr @fn_lbl(ptr @.str1154) + %t266 = call ptr @fn_lbl(ptr @.str1161) store ptr %t266, ptr %t267 - call void @fn_emit(ptr @.str1155) + call void @fn_emit(ptr @.str1162) %t268 = load ptr, ptr %t265 call void @fn_emit(ptr %t268) - call void @fn_emit(ptr @.str1156) + call void @fn_emit(ptr @.str1163) %t269 = load ptr, ptr %t267 call void @fn_emit(ptr %t269) - call void @fn_emit(ptr @.str1157) + call void @fn_emit(ptr @.str1164) %t270 = load ptr, ptr %t46 call void @fn_emit(ptr %t270) - call void @fn_emit(ptr @.str1158) + call void @fn_emit(ptr @.str1165) %t271 = load ptr, ptr %t267 call void @fn_emit(ptr %t271) - call void @fn_emit(ptr @.str1159) + call void @fn_emit(ptr @.str1166) br label %ifend24 ifend24: %t272 = load ptr, ptr %t46 @@ -15867,34 +16222,34 @@ ifend24: %t281 = icmp ne i32 %t280, 0 br i1 %t281, label %then25, label %ifend27 then25: - call void @fn_emit(ptr @.str1160) + call void @fn_emit(ptr @.str1167) %t282 = load ptr, ptr %t46 call void @fn_emit(ptr %t282) - call void @fn_emit(ptr @.str1161) + call void @fn_emit(ptr @.str1168) br label %ifend27 ifend27: %t283 = load ptr, ptr %t46 call void @fn_emit(ptr %t283) - call void @fn_emit(ptr @.str1162) + call void @fn_emit(ptr @.str1169) %t284 = load ptr, ptr %t4 - %t285 = call ptr @fn_sconcat(ptr @.str1163, ptr %t284) + %t285 = call ptr @fn_sconcat(ptr @.str1170, ptr %t284) %t286 = call ptr @fn_emit_bind(ptr %t285) store ptr %t286, ptr %t287 %t288 = load ptr, ptr %t287 - %t289 = call ptr @fn_sconcat(ptr %t288, ptr @.str1165) - %t290 = call ptr @fn_sconcat(ptr @.str1164, ptr %t289) + %t289 = call ptr @fn_sconcat(ptr %t288, ptr @.str1172) + %t290 = call ptr @fn_sconcat(ptr @.str1171, ptr %t289) %t291 = call ptr @fn_emit_bind(ptr %t290) store ptr %t291, ptr %t292 %t293 = load ptr, ptr %t292 %t294 = load ptr, ptr %t4 - call void @fn_store_at(ptr @.str1166, ptr %t293, ptr %t294) - call void @fn_emit(ptr @.str1167) + call void @fn_store_at(ptr @.str1173, ptr %t293, ptr %t294) + call void @fn_emit(ptr @.str1174) %t295 = load ptr, ptr %t42 call void @fn_emit(ptr %t295) - call void @fn_emit(ptr @.str1168) + call void @fn_emit(ptr @.str1175) %t296 = load ptr, ptr %t48 call void @fn_emit(ptr %t296) - call void @fn_emit(ptr @.str1169) + call void @fn_emit(ptr @.str1176) store i32 0, ptr @g_g_term %t297 = load i32, ptr @g_nself %t298 = sub i32 %t297, 1 @@ -15939,47 +16294,47 @@ entry: br i1 %t11, label %then0, label %ifend2 then0: %t12 = load ptr, ptr %t1 - %t13 = call ptr @fn_sconcat(ptr @.str1170, ptr %t12) + %t13 = call ptr @fn_sconcat(ptr @.str1177, ptr %t12) call void @fn_perr(ptr %t13) br label %ifend2 ifend2: %t14 = call ptr @fn_nreg() store ptr %t14, ptr %t15 - call void @fn_emit(ptr @.str1171) + call void @fn_emit(ptr @.str1178) %t16 = load ptr, ptr %t15 call void @fn_emit(ptr %t16) - call void @fn_emit(ptr @.str1172) + call void @fn_emit(ptr @.str1179) %t17 = load ptr, ptr %t4 call void @fn_emit(ptr %t17) - call void @fn_emit(ptr @.str1173) + call void @fn_emit(ptr @.str1180) %t18 = load ptr, ptr %t1 call void @fn_emit(ptr %t18) - call void @fn_emit(ptr @.str1174) + call void @fn_emit(ptr @.str1181) %t19 = load ptr, ptr %t0 call void @fn_emit(ptr %t19) - call void @fn_emit(ptr @.str1175) - call void @fn_emit(ptr @.str1176) + call void @fn_emit(ptr @.str1182) + call void @fn_emit(ptr @.str1183) %t20 = load ptr, ptr %t15 call void @fn_emit(ptr %t20) - call void @fn_emit(ptr @.str1177) + call void @fn_emit(ptr @.str1184) %t21 = call ptr @fn_nreg() store ptr %t21, ptr %t22 - call void @fn_emit(ptr @.str1178) + call void @fn_emit(ptr @.str1185) %t23 = load ptr, ptr %t22 call void @fn_emit(ptr %t23) - call void @fn_emit(ptr @.str1179) + call void @fn_emit(ptr @.str1186) %t24 = load ptr, ptr %t4 call void @fn_emit(ptr %t24) - call void @fn_emit(ptr @.str1180) + call void @fn_emit(ptr @.str1187) %t25 = load ptr, ptr %t1 call void @fn_emit(ptr %t25) - call void @fn_emit(ptr @.str1181) + call void @fn_emit(ptr @.str1188) %t26 = load ptr, ptr %t1 call void @fn_emit(ptr %t26) - call void @fn_emit(ptr @.str1182) + call void @fn_emit(ptr @.str1189) %t27 = load ptr, ptr %t0 call void @fn_emit(ptr %t27) - call void @fn_emit(ptr @.str1183) + call void @fn_emit(ptr @.str1190) store i32 0, ptr %t28 br label %wcond3 wcond3: @@ -16005,32 +16360,32 @@ wbody4: store ptr %t45, ptr %t46 %t47 = call ptr @fn_nreg() store ptr %t47, ptr %t48 - call void @fn_emit(ptr @.str1184) + call void @fn_emit(ptr @.str1191) %t49 = load ptr, ptr %t48 call void @fn_emit(ptr %t49) - call void @fn_emit(ptr @.str1185) + call void @fn_emit(ptr @.str1192) %t50 = load ptr, ptr %t1 call void @fn_emit(ptr %t50) - call void @fn_emit(ptr @.str1186) + call void @fn_emit(ptr @.str1193) %t51 = load ptr, ptr %t22 call void @fn_emit(ptr %t51) - call void @fn_emit(ptr @.str1187) + call void @fn_emit(ptr @.str1194) %t52 = load i32, ptr %t28 %t53 = call ptr @fn_itoa(i32 %t52) call void @fn_emit(ptr %t53) - call void @fn_emit(ptr @.str1188) + call void @fn_emit(ptr @.str1195) %t54 = load ptr, ptr %t46 %t55 = getelementptr inbounds %Str_Node, ptr %t54, i32 0, i32 3 %t56 = load ptr, ptr %t55 %t57 = call ptr @fn_llty(ptr %t56) store ptr %t57, ptr %t58 - store ptr @.str1189, ptr %t59 + store ptr @.str1196, ptr %t59 %t60 = load ptr, ptr %t58 - %t61 = call i32 @fn_streq(ptr %t60, ptr @.str1190) + %t61 = call i32 @fn_streq(ptr %t60, ptr @.str1197) %t62 = icmp ne i32 %t61, 0 br i1 %t62, label %then6, label %ifend8 then6: - store ptr @.str1191, ptr %t59 + store ptr @.str1198, ptr %t59 br label %ifend8 ifend8: %t63 = load ptr, ptr %t46 @@ -16054,16 +16409,16 @@ then9: store ptr %t78, ptr %t59 br label %ifend11 ifend11: - call void @fn_emit(ptr @.str1192) + call void @fn_emit(ptr @.str1199) %t79 = load ptr, ptr %t58 call void @fn_emit(ptr %t79) - call void @fn_emit(ptr @.str1193) + call void @fn_emit(ptr @.str1200) %t80 = load ptr, ptr %t59 call void @fn_emit(ptr %t80) - call void @fn_emit(ptr @.str1194) + call void @fn_emit(ptr @.str1201) %t81 = load ptr, ptr %t48 call void @fn_emit(ptr %t81) - call void @fn_emit(ptr @.str1195) + call void @fn_emit(ptr @.str1202) %t82 = load i32, ptr %t28 %t83 = add i32 %t82, 1 store i32 %t83, ptr %t28 @@ -16114,26 +16469,26 @@ wbody16: then18: %t119 = call ptr @fn_nreg() store ptr %t119, ptr %t120 - call void @fn_emit(ptr @.str1196) + call void @fn_emit(ptr @.str1203) %t121 = load ptr, ptr %t120 call void @fn_emit(ptr %t121) - call void @fn_emit(ptr @.str1197) + call void @fn_emit(ptr @.str1204) %t122 = load ptr, ptr %t1 call void @fn_emit(ptr %t122) - call void @fn_emit(ptr @.str1198) + call void @fn_emit(ptr @.str1205) %t123 = load ptr, ptr %t22 call void @fn_emit(ptr %t123) - call void @fn_emit(ptr @.str1199) + call void @fn_emit(ptr @.str1206) %t124 = load i32, ptr %t114 %t125 = call ptr @fn_itoa(i32 %t124) call void @fn_emit(ptr %t125) - call void @fn_emit(ptr @.str1200) + call void @fn_emit(ptr @.str1207) %t126 = load ptr, ptr %t108 %t127 = getelementptr inbounds %Str_Node, ptr %t126, i32 0, i32 4 %t128 = load ptr, ptr %t127 %t129 = call ptr @fn_emit_expr(ptr %t128) store ptr %t129, ptr %t130 - call void @fn_emit(ptr @.str1201) + call void @fn_emit(ptr @.str1208) %t131 = load ptr, ptr %t7 %t132 = load ptr, ptr %t108 %t133 = getelementptr inbounds %Str_Node, ptr %t132, i32 0, i32 1 @@ -16141,15 +16496,15 @@ then18: %t135 = call ptr @fn_field_type(ptr %t131, ptr %t134) %t136 = call ptr @fn_llty(ptr %t135) call void @fn_emit(ptr %t136) - call void @fn_emit(ptr @.str1202) + call void @fn_emit(ptr @.str1209) %t137 = load ptr, ptr %t130 %t138 = getelementptr inbounds %Str_Val, ptr %t137, i32 0, i32 0 %t139 = load ptr, ptr %t138 call void @fn_emit(ptr %t139) - call void @fn_emit(ptr @.str1203) + call void @fn_emit(ptr @.str1210) %t140 = load ptr, ptr %t120 call void @fn_emit(ptr %t140) - call void @fn_emit(ptr @.str1204) + call void @fn_emit(ptr @.str1211) br label %ifend20 ifend20: %t141 = load i32, ptr %t90 @@ -16178,7 +16533,7 @@ entry: %t49 = alloca i32 %t89 = alloca i32 store ptr %arg_st, ptr %t0 - %t1 = call ptr @fn_emit_bind(ptr @.str1205) + %t1 = call ptr @fn_emit_bind(ptr @.str1212) store ptr %t1, ptr %t2 %t3 = load ptr, ptr %t0 %t4 = getelementptr inbounds %Str_Node, ptr %t3, i32 0, i32 1 @@ -16195,24 +16550,24 @@ then0: store ptr %t12, ptr %t13 %t14 = call ptr @fn_nreg() store ptr %t14, ptr %t15 - call void @fn_emit(ptr @.str1206) + call void @fn_emit(ptr @.str1213) %t16 = load ptr, ptr %t15 call void @fn_emit(ptr %t16) - call void @fn_emit(ptr @.str1207) + call void @fn_emit(ptr @.str1214) %t17 = load ptr, ptr %t13 call void @fn_emit(ptr %t17) - call void @fn_emit(ptr @.str1208) + call void @fn_emit(ptr @.str1215) %t18 = load ptr, ptr %t2 call void @fn_emit(ptr %t18) - call void @fn_emit(ptr @.str1209) - call void @fn_emit(ptr @.str1210) + call void @fn_emit(ptr @.str1216) + call void @fn_emit(ptr @.str1217) %t19 = load i32, ptr %t7 %t20 = call ptr @fn_itoa(i32 %t19) call void @fn_emit(ptr %t20) - call void @fn_emit(ptr @.str1211) + call void @fn_emit(ptr @.str1218) %t21 = load ptr, ptr %t15 call void @fn_emit(ptr %t21) - call void @fn_emit(ptr @.str1212) + call void @fn_emit(ptr @.str1219) %t22 = load ptr, ptr %t0 %t23 = getelementptr inbounds %Str_Node, ptr %t22, i32 0, i32 1 %t24 = load ptr, ptr %t23 @@ -16360,12 +16715,12 @@ entry: %t3 = load ptr, ptr %t2 %t4 = call ptr @fn_emit_expr(ptr %t3) store ptr %t4, ptr %t5 - call void @fn_emit(ptr @.str1213) + call void @fn_emit(ptr @.str1220) %t6 = load ptr, ptr %t5 %t7 = getelementptr inbounds %Str_Val, ptr %t6, i32 0, i32 0 %t8 = load ptr, ptr %t7 call void @fn_emit(ptr %t8) - call void @fn_emit(ptr @.str1214) + call void @fn_emit(ptr @.str1221) br label %ret ret: ret void @@ -16383,7 +16738,7 @@ entry: call void @fn_loc_reset() store i32 0, ptr @g_nloop store i32 0, ptr @g_nself - store ptr @.str1215, ptr @g_ret_ty + store ptr @.str1222, ptr @g_ret_ty %t1 = call ptr @fn_buf_new() store ptr %t1, ptr %t2 %t3 = call ptr @fn_buf_new() @@ -16402,25 +16757,25 @@ entry: %t13 = icmp ne i32 %t12, 0 br i1 %t13, label %then0, label %ifend2 then0: - call void @fn_emit(ptr @.str1216) + call void @fn_emit(ptr @.str1223) br label %ifend2 ifend2: - call void @fn_emit(ptr @.str1217) + call void @fn_emit(ptr @.str1224) %t14 = load ptr, ptr %t5 store ptr %t14, ptr @g_code - call void @fn_emit(ptr @.str1218) + call void @fn_emit(ptr @.str1225) %t15 = load ptr, ptr %t0 %t16 = getelementptr inbounds %Str_Node, ptr %t15, i32 0, i32 1 %t17 = load ptr, ptr %t16 call void @fn_emit(ptr %t17) - call void @fn_emit(ptr @.str1219) + call void @fn_emit(ptr @.str1226) %t18 = load ptr, ptr @g_falloc %t19 = call ptr @fn_buf_str(ptr %t18) call void @fn_emit(ptr %t19) %t20 = load ptr, ptr %t2 %t21 = call ptr @fn_buf_str(ptr %t20) call void @fn_emit(ptr %t21) - call void @fn_emit(ptr @.str1220) + call void @fn_emit(ptr @.str1227) br label %ret ret: ret void @@ -16476,12 +16831,12 @@ scend4: %t32 = icmp ne i32 %t31, 0 br i1 %t32, label %then5, label %ifend7 then5: - call void @fn_emit(ptr @.str1221) + call void @fn_emit(ptr @.str1228) %t33 = load ptr, ptr %t15 %t34 = getelementptr inbounds %Str_Node, ptr %t33, i32 0, i32 1 %t35 = load ptr, ptr %t34 call void @fn_emit(ptr %t35) - call void @fn_emit(ptr @.str1222) + call void @fn_emit(ptr @.str1229) br label %ifend7 ifend7: %t36 = load i32, ptr %t1 @@ -16542,10 +16897,10 @@ ifend5: store i32 %t26, ptr %t0 br label %wcond0 wend2: - call void @fn_emit(ptr @.str1223) - call void @fn_emit(ptr @.str1224) - call void @fn_emit(ptr @.str1225) - %t27 = call ptr @fn_find_fn(ptr @.str1226) + call void @fn_emit(ptr @.str1230) + call void @fn_emit(ptr @.str1231) + call void @fn_emit(ptr @.str1232) + %t27 = call ptr @fn_find_fn(ptr @.str1233) %t28 = icmp eq ptr %t27, null %t29 = zext i1 %t28 to i32 %t30 = icmp eq i32 %t29, 0 @@ -16553,20 +16908,20 @@ wend2: %t32 = icmp ne i32 %t31, 0 br i1 %t32, label %then6, label %ifend8 then6: - call void @fn_emit(ptr @.str1227) + call void @fn_emit(ptr @.str1234) br label %ifend8 ifend8: - call void @fn_emit_calls_for_phase(ptr @.str1228) - call void @fn_emit(ptr @.str1229) - call void @fn_emit(ptr @.str1230) - %t33 = call ptr @fn_emit_bind(ptr @.str1231) + call void @fn_emit_calls_for_phase(ptr @.str1235) + call void @fn_emit(ptr @.str1236) + call void @fn_emit(ptr @.str1237) + %t33 = call ptr @fn_emit_bind(ptr @.str1238) store ptr %t33, ptr %t34 %t35 = load ptr, ptr %t34 - %t36 = call ptr @fn_sconcat(ptr %t35, ptr @.str1233) - %t37 = call ptr @fn_sconcat(ptr @.str1232, ptr %t36) + %t36 = call ptr @fn_sconcat(ptr %t35, ptr @.str1240) + %t37 = call ptr @fn_sconcat(ptr @.str1239, ptr %t36) %t38 = call ptr @fn_emit_bind(ptr %t37) store ptr %t38, ptr %t39 - %t40 = call ptr @fn_find_fn(ptr @.str1234) + %t40 = call ptr @fn_find_fn(ptr @.str1241) %t41 = icmp eq ptr %t40, null %t42 = zext i1 %t41 to i32 %t43 = icmp eq i32 %t42, 0 @@ -16574,34 +16929,34 @@ ifend8: %t45 = icmp ne i32 %t44, 0 br i1 %t45, label %then9, label %else10 then9: - %t46 = call ptr @fn_emit_bind(ptr @.str1235) + %t46 = call ptr @fn_emit_bind(ptr @.str1242) store ptr %t46, ptr %t47 %t48 = load ptr, ptr %t47 - %t49 = call ptr @fn_sconcat(ptr %t48, ptr @.str1237) - %t50 = call ptr @fn_sconcat(ptr @.str1236, ptr %t49) + %t49 = call ptr @fn_sconcat(ptr %t48, ptr @.str1244) + %t50 = call ptr @fn_sconcat(ptr @.str1243, ptr %t49) %t51 = call ptr @fn_emit_bind(ptr %t50) store ptr %t51, ptr %t52 %t53 = load ptr, ptr %t39 %t54 = load ptr, ptr %t52 - %t55 = call ptr @fn_sconcat(ptr @.str1239, ptr %t54) + %t55 = call ptr @fn_sconcat(ptr @.str1246, ptr %t54) %t56 = call ptr @fn_sconcat(ptr %t53, ptr %t55) - %t57 = call ptr @fn_sconcat(ptr @.str1238, ptr %t56) + %t57 = call ptr @fn_sconcat(ptr @.str1245, ptr %t56) %t58 = call ptr @fn_emit_bind(ptr %t57) store ptr %t58, ptr %t59 - call void @fn_emit(ptr @.str1240) + call void @fn_emit(ptr @.str1247) %t60 = load ptr, ptr %t59 call void @fn_emit(ptr %t60) - call void @fn_emit(ptr @.str1241) + call void @fn_emit(ptr @.str1248) br label %ifend11 else10: - call void @fn_emit(ptr @.str1242) + call void @fn_emit(ptr @.str1249) %t61 = load ptr, ptr %t39 call void @fn_emit(ptr %t61) - call void @fn_emit(ptr @.str1243) + call void @fn_emit(ptr @.str1250) br label %ifend11 ifend11: - call void @fn_emit(ptr @.str1244) - %t62 = call ptr @fn_find_fn(ptr @.str1245) + call void @fn_emit(ptr @.str1251) + %t62 = call ptr @fn_find_fn(ptr @.str1252) %t63 = icmp eq ptr %t62, null %t64 = zext i1 %t63 to i32 %t65 = icmp eq i32 %t64, 0 @@ -16609,22 +16964,22 @@ ifend11: %t67 = icmp ne i32 %t66, 0 br i1 %t67, label %then12, label %ifend14 then12: - %t68 = call ptr @fn_emit_bind(ptr @.str1246) + %t68 = call ptr @fn_emit_bind(ptr @.str1253) store ptr %t68, ptr %t69 - call void @fn_emit(ptr @.str1247) + call void @fn_emit(ptr @.str1254) %t70 = load ptr, ptr %t69 call void @fn_emit(ptr %t70) - call void @fn_emit(ptr @.str1248) + call void @fn_emit(ptr @.str1255) br label %ifend14 ifend14: - call void @fn_emit_calls_for_phase(ptr @.str1249) - call void @fn_emit_calls_for_phase(ptr @.str1250) - call void @fn_emit_calls_for_phase(ptr @.str1251) - call void @fn_emit_calls_for_phase(ptr @.str1252) - call void @fn_emit_calls_for_phase(ptr @.str1253) - call void @fn_emit(ptr @.str1254) - call void @fn_emit(ptr @.str1255) - %t71 = call ptr @fn_find_fn(ptr @.str1256) + call void @fn_emit_calls_for_phase(ptr @.str1256) + call void @fn_emit_calls_for_phase(ptr @.str1257) + call void @fn_emit_calls_for_phase(ptr @.str1258) + call void @fn_emit_calls_for_phase(ptr @.str1259) + call void @fn_emit_calls_for_phase(ptr @.str1260) + call void @fn_emit(ptr @.str1261) + call void @fn_emit(ptr @.str1262) + %t71 = call ptr @fn_find_fn(ptr @.str1263) %t72 = icmp eq ptr %t71, null %t73 = zext i1 %t72 to i32 %t74 = icmp eq i32 %t73, 0 @@ -16632,10 +16987,10 @@ ifend14: %t76 = icmp ne i32 %t75, 0 br i1 %t76, label %then15, label %ifend17 then15: - call void @fn_emit(ptr @.str1257) + call void @fn_emit(ptr @.str1264) br label %ifend17 ifend17: - call void @fn_emit(ptr @.str1258) + call void @fn_emit(ptr @.str1265) br label %ret ret: ret void @@ -16662,8 +17017,8 @@ entry: %t6 = load ptr, ptr %t5 %t7 = getelementptr inbounds %Str_Val, ptr %t6, i32 0, i32 0 %t8 = load ptr, ptr %t7 - %t9 = call ptr @fn_sconcat(ptr %t8, ptr @.str1260) - %t10 = call ptr @fn_sconcat(ptr @.str1259, ptr %t9) + %t9 = call ptr @fn_sconcat(ptr %t8, ptr @.str1267) + %t10 = call ptr @fn_sconcat(ptr @.str1266, ptr %t9) %t11 = call ptr @fn_emit_bind(ptr %t10) store ptr %t11, ptr %t12 %t13 = load i32, ptr @g_nmach @@ -16717,7 +17072,7 @@ ifend2: %t46 = load i32, ptr @g_nmach %t47 = add i32 %t46, 1 store i32 %t47, ptr @g_nmach - %t48 = call ptr @fn_lbl(ptr @.str1261) + %t48 = call ptr @fn_lbl(ptr @.str1268) store ptr %t48, ptr %t49 store i32 0, ptr %t50 br label %wcond5 @@ -16751,28 +17106,28 @@ wbody6: %t75 = load ptr, ptr %t73 %t76 = getelementptr inbounds %Str_Val, ptr %t75, i32 0, i32 0 %t77 = load ptr, ptr %t76 - %t78 = call ptr @fn_sconcat(ptr @.str1263, ptr %t77) + %t78 = call ptr @fn_sconcat(ptr @.str1270, ptr %t77) %t79 = call ptr @fn_sconcat(ptr %t74, ptr %t78) - %t80 = call ptr @fn_sconcat(ptr @.str1262, ptr %t79) + %t80 = call ptr @fn_sconcat(ptr @.str1269, ptr %t79) %t81 = call ptr @fn_emit_bind(ptr %t80) store ptr %t81, ptr %t82 - %t83 = call ptr @fn_lbl(ptr @.str1264) + %t83 = call ptr @fn_lbl(ptr @.str1271) store ptr %t83, ptr %t84 - %t85 = call ptr @fn_lbl(ptr @.str1265) + %t85 = call ptr @fn_lbl(ptr @.str1272) store ptr %t85, ptr %t86 - call void @fn_emit(ptr @.str1266) + call void @fn_emit(ptr @.str1273) %t87 = load ptr, ptr %t82 call void @fn_emit(ptr %t87) - call void @fn_emit(ptr @.str1267) + call void @fn_emit(ptr @.str1274) %t88 = load ptr, ptr %t84 call void @fn_emit(ptr %t88) - call void @fn_emit(ptr @.str1268) + call void @fn_emit(ptr @.str1275) %t89 = load ptr, ptr %t86 call void @fn_emit(ptr %t89) - call void @fn_emit(ptr @.str1269) + call void @fn_emit(ptr @.str1276) %t90 = load ptr, ptr %t84 call void @fn_emit(ptr %t90) - call void @fn_emit(ptr @.str1270) + call void @fn_emit(ptr @.str1277) store i32 0, ptr @g_g_term %t91 = load ptr, ptr %t68 %t92 = getelementptr inbounds %Str_Node, ptr %t91, i32 0, i32 4 @@ -16784,15 +17139,15 @@ wbody6: %t97 = icmp ne i32 %t96, 0 br i1 %t97, label %then8, label %ifend10 then8: - call void @fn_emit(ptr @.str1271) + call void @fn_emit(ptr @.str1278) %t98 = load ptr, ptr %t49 call void @fn_emit(ptr %t98) - call void @fn_emit(ptr @.str1272) + call void @fn_emit(ptr @.str1279) br label %ifend10 ifend10: %t99 = load ptr, ptr %t86 call void @fn_emit(ptr %t99) - call void @fn_emit(ptr @.str1273) + call void @fn_emit(ptr @.str1280) store i32 0, ptr @g_g_term %t100 = load i32, ptr %t50 %t101 = add i32 %t100, 1 @@ -16805,15 +17160,15 @@ wend7: %t105 = icmp ne i32 %t104, 0 br i1 %t105, label %then11, label %ifend13 then11: - call void @fn_emit(ptr @.str1274) + call void @fn_emit(ptr @.str1281) %t106 = load ptr, ptr %t49 call void @fn_emit(ptr %t106) - call void @fn_emit(ptr @.str1275) + call void @fn_emit(ptr @.str1282) br label %ifend13 ifend13: %t107 = load ptr, ptr %t49 call void @fn_emit(ptr %t107) - call void @fn_emit(ptr @.str1276) + call void @fn_emit(ptr @.str1283) store i32 0, ptr @g_g_term %t108 = load i32, ptr @g_nmach %t109 = sub i32 %t108, 1 @@ -16838,7 +17193,7 @@ entry: %t4 = icmp ne i32 %t3, 0 br i1 %t4, label %then0, label %ifend2 then0: - call void @fn_perr(ptr @.str1277) + call void @fn_perr(ptr @.str1284) br label %ifend2 ifend2: %t5 = load ptr, ptr @g_mach_stk @@ -16906,7 +17261,7 @@ then9: %t53 = load ptr, ptr %t0 %t54 = getelementptr inbounds %Str_Node, ptr %t53, i32 0, i32 1 %t55 = load ptr, ptr %t54 - %t56 = call ptr @fn_sconcat(ptr @.str1278, ptr %t55) + %t56 = call ptr @fn_sconcat(ptr @.str1285, ptr %t55) call void @fn_perr(ptr %t56) br label %ifend11 ifend11: @@ -16920,17 +17275,17 @@ ifend11: %t64 = load ptr, ptr %t63 %t65 = call ptr @fn_emit_expr(ptr %t64) store ptr %t65, ptr %t66 - call void @fn_emit(ptr @.str1279) + call void @fn_emit(ptr @.str1286) %t67 = load ptr, ptr %t61 %t68 = getelementptr inbounds %Str_Val, ptr %t67, i32 0, i32 0 %t69 = load ptr, ptr %t68 call void @fn_emit(ptr %t69) - call void @fn_emit(ptr @.str1280) + call void @fn_emit(ptr @.str1287) %t70 = load ptr, ptr %t66 %t71 = getelementptr inbounds %Str_Val, ptr %t70, i32 0, i32 0 %t72 = load ptr, ptr %t71 call void @fn_emit(ptr %t72) - call void @fn_emit(ptr @.str1281) + call void @fn_emit(ptr @.str1288) br label %ret ret: ret void @@ -16947,24 +17302,24 @@ entry: store ptr %arg_bytes, ptr %t2 %t3 = load i32, ptr @g_g_iok %t4 = call ptr @fn_itoa(i32 %t3) - %t5 = call ptr @fn_sconcat(ptr @.str1282, ptr %t4) + %t5 = call ptr @fn_sconcat(ptr @.str1289, ptr %t4) store ptr %t5, ptr %t6 %t7 = load i32, ptr @g_g_iok %t8 = add i32 %t7, 1 store i32 %t8, ptr @g_g_iok - call void @fn_emit(ptr @.str1283) + call void @fn_emit(ptr @.str1290) %t9 = load ptr, ptr %t6 call void @fn_emit(ptr %t9) - call void @fn_emit(ptr @.str1284) + call void @fn_emit(ptr @.str1291) %t10 = load ptr, ptr %t0 call void @fn_emit(ptr %t10) - call void @fn_emit(ptr @.str1285) + call void @fn_emit(ptr @.str1292) %t11 = load ptr, ptr %t1 call void @fn_emit(ptr %t11) - call void @fn_emit(ptr @.str1286) + call void @fn_emit(ptr @.str1293) %t12 = load ptr, ptr %t2 call void @fn_emit(ptr %t12) - call void @fn_emit(ptr @.str1287) + call void @fn_emit(ptr @.str1294) br label %ret ret: ret void @@ -16983,19 +17338,19 @@ entry: %t1 = call ptr @fn_itoa(i32 1024) store ptr %t1, ptr %t2 %t3 = load ptr, ptr %t0 - call void @fn_emit_io(ptr %t3, ptr @.str1288, ptr @.str1289) + call void @fn_emit_io(ptr %t3, ptr @.str1295, ptr @.str1296) %t4 = load ptr, ptr %t0 - call void @fn_emit_io(ptr %t4, ptr @.str1290, ptr @.str1291) - call void @fn_emit(ptr @.str1292) + call void @fn_emit_io(ptr %t4, ptr @.str1297, ptr @.str1298) + call void @fn_emit(ptr @.str1299) %t5 = load ptr, ptr %t2 call void @fn_emit(ptr %t5) - call void @fn_emit(ptr @.str1293) + call void @fn_emit(ptr @.str1300) %t6 = load ptr, ptr %t0 - call void @fn_emit_io(ptr %t6, ptr @.str1294, ptr @.str1295) + call void @fn_emit_io(ptr %t6, ptr @.str1301, ptr @.str1302) %t7 = load ptr, ptr %t0 - call void @fn_emit_io(ptr %t7, ptr @.str1296, ptr @.str1297) + call void @fn_emit_io(ptr %t7, ptr @.str1303, ptr @.str1304) %t8 = load ptr, ptr %t0 - call void @fn_emit_io(ptr %t8, ptr @.str1298, ptr @.str1299) + call void @fn_emit_io(ptr %t8, ptr @.str1305, ptr @.str1306) store i32 0, ptr %t9 br label %wcond0 wcond0: @@ -17030,8 +17385,8 @@ then3: %t34 = load ptr, ptr %t33 %t35 = getelementptr inbounds %Str_Node, ptr %t34, i32 0, i32 1 %t36 = load ptr, ptr %t35 - %t37 = call ptr @fn_sconcat(ptr @.str1300, ptr %t36) - call void @fn_emit_io(ptr %t28, ptr %t37, ptr @.str1301) + %t37 = call ptr @fn_sconcat(ptr @.str1307, ptr %t36) + call void @fn_emit_io(ptr %t28, ptr %t37, ptr @.str1308) br label %ifend5 ifend5: %t38 = load i32, ptr %t9 @@ -17076,26 +17431,26 @@ then9: store ptr %t66, ptr %t67 %t68 = load i32, ptr %t40 %t69 = call ptr @fn_itoa(i32 %t68) - %t70 = call ptr @fn_sconcat(ptr @.str1302, ptr %t69) + %t70 = call ptr @fn_sconcat(ptr @.str1309, ptr %t69) store ptr %t70, ptr %t71 - call void @fn_emit(ptr @.str1303) + call void @fn_emit(ptr @.str1310) %t72 = load ptr, ptr %t71 call void @fn_emit(ptr %t72) - call void @fn_emit(ptr @.str1304) + call void @fn_emit(ptr @.str1311) %t73 = load ptr, ptr %t67 call void @fn_emit(ptr %t73) - call void @fn_emit(ptr @.str1305) + call void @fn_emit(ptr @.str1312) %t74 = load ptr, ptr %t2 call void @fn_emit(ptr %t74) - call void @fn_emit(ptr @.str1306) + call void @fn_emit(ptr @.str1313) %t75 = load ptr, ptr %t0 %t76 = load ptr, ptr %t67 - %t77 = call ptr @fn_sconcat(ptr @.str1307, ptr %t76) + %t77 = call ptr @fn_sconcat(ptr @.str1314, ptr %t76) %t78 = load ptr, ptr %t71 call void @fn_emit_io(ptr %t75, ptr %t77, ptr %t78) %t79 = load ptr, ptr %t0 %t80 = load ptr, ptr %t67 - %t81 = call ptr @fn_sconcat(ptr @.str1308, ptr %t80) + %t81 = call ptr @fn_sconcat(ptr @.str1315, ptr %t80) %t82 = load ptr, ptr %t2 call void @fn_emit_io(ptr %t79, ptr %t81, ptr %t82) %t83 = load i32, ptr %t40 @@ -17117,47 +17472,47 @@ define void @fn_emit_snapshot() { entry: %t5 = alloca i32 %t11 = alloca i32 - call void @fn_emith(ptr @.str1309) - call void @fn_emith(ptr @.str1310) - call void @fn_emith(ptr @.str1311) - %t0 = call ptr @fn_find_fn(ptr @.str1312) + call void @fn_emith(ptr @.str1316) + call void @fn_emith(ptr @.str1317) + call void @fn_emith(ptr @.str1318) + %t0 = call ptr @fn_find_fn(ptr @.str1319) %t1 = icmp eq ptr %t0, null %t2 = zext i1 %t1 to i32 %t3 = icmp eq i32 %t2, 0 %t4 = zext i1 %t3 to i32 store i32 %t4, ptr %t5 - %t6 = call ptr @fn_find_fn(ptr @.str1313) + %t6 = call ptr @fn_find_fn(ptr @.str1320) %t7 = icmp eq ptr %t6, null %t8 = zext i1 %t7 to i32 %t9 = icmp eq i32 %t8, 0 %t10 = zext i1 %t9 to i32 store i32 %t10, ptr %t11 - call void @fn_emit(ptr @.str1314) - call void @fn_emit(ptr @.str1315) - call void @fn_emit(ptr @.str1316) - call void @fn_emit(ptr @.str1317) - call void @fn_emit_snapshot_blocks(ptr @.str1318) - %t12 = load i32, ptr %t5 - %t13 = icmp ne i32 %t12, 0 - br i1 %t13, label %then0, label %ifend2 -then0: - call void @fn_emit(ptr @.str1319) - br label %ifend2 -ifend2: - call void @fn_emit(ptr @.str1320) call void @fn_emit(ptr @.str1321) call void @fn_emit(ptr @.str1322) call void @fn_emit(ptr @.str1323) call void @fn_emit(ptr @.str1324) call void @fn_emit_snapshot_blocks(ptr @.str1325) + %t12 = load i32, ptr %t5 + %t13 = icmp ne i32 %t12, 0 + br i1 %t13, label %then0, label %ifend2 +then0: + call void @fn_emit(ptr @.str1326) + br label %ifend2 +ifend2: + call void @fn_emit(ptr @.str1327) + call void @fn_emit(ptr @.str1328) + call void @fn_emit(ptr @.str1329) + call void @fn_emit(ptr @.str1330) + call void @fn_emit(ptr @.str1331) + call void @fn_emit_snapshot_blocks(ptr @.str1332) %t14 = load i32, ptr %t11 %t15 = icmp ne i32 %t14, 0 br i1 %t15, label %then3, label %ifend5 then3: - call void @fn_emit(ptr @.str1326) + call void @fn_emit(ptr @.str1333) br label %ifend5 ifend5: - call void @fn_emit(ptr @.str1327) + call void @fn_emit(ptr @.str1334) br label %ret ret: ret void @@ -17174,7 +17529,7 @@ entry: %t3 = load ptr, ptr %t2 store ptr %t3, ptr %t4 %t5 = load ptr, ptr %t4 - %t6 = call i32 @fn_streq(ptr %t5, ptr @.str1328) + %t6 = call i32 @fn_streq(ptr %t5, ptr @.str1335) %t7 = icmp ne i32 %t6, 0 br i1 %t7, label %then0, label %ifend2 then0: @@ -17182,7 +17537,7 @@ then0: br label %ret ifend2: %t8 = load ptr, ptr %t4 - %t9 = call i32 @fn_streq(ptr %t8, ptr @.str1329) + %t9 = call i32 @fn_streq(ptr %t8, ptr @.str1336) %t10 = icmp ne i32 %t9, 0 br i1 %t10, label %then3, label %ifend5 then3: @@ -17190,7 +17545,7 @@ then3: br label %ret ifend5: %t11 = load ptr, ptr %t4 - %t12 = call i32 @fn_streq(ptr %t11, ptr @.str1330) + %t12 = call i32 @fn_streq(ptr %t11, ptr @.str1337) %t13 = icmp ne i32 %t12, 0 br i1 %t13, label %then6, label %ifend8 then6: @@ -17198,7 +17553,7 @@ then6: br label %ret ifend8: %t14 = load ptr, ptr %t4 - %t15 = call i32 @fn_streq(ptr %t14, ptr @.str1331) + %t15 = call i32 @fn_streq(ptr %t14, ptr @.str1338) %t16 = icmp ne i32 %t15, 0 br i1 %t16, label %then9, label %ifend11 then9: @@ -17206,7 +17561,7 @@ then9: br label %ret ifend11: %t17 = load ptr, ptr %t4 - %t18 = call i32 @fn_streq(ptr %t17, ptr @.str1332) + %t18 = call i32 @fn_streq(ptr %t17, ptr @.str1339) %t19 = icmp ne i32 %t18, 0 br i1 %t19, label %then12, label %ifend14 then12: @@ -17214,7 +17569,7 @@ then12: br label %ret ifend14: %t20 = load ptr, ptr %t4 - %t21 = call i32 @fn_streq(ptr %t20, ptr @.str1333) + %t21 = call i32 @fn_streq(ptr %t20, ptr @.str1340) %t22 = icmp ne i32 %t21, 0 br i1 %t22, label %then15, label %ifend17 then15: @@ -17222,7 +17577,7 @@ then15: br label %ret ifend17: %t23 = load ptr, ptr %t4 - %t24 = call i32 @fn_streq(ptr %t23, ptr @.str1334) + %t24 = call i32 @fn_streq(ptr %t23, ptr @.str1341) %t25 = icmp ne i32 %t24, 0 br i1 %t25, label %then18, label %ifend20 then18: @@ -17720,7 +18075,7 @@ wbody12: %t75 = load i32, ptr %t9 %t76 = getelementptr inbounds ptr, ptr %t74, i32 %t75 %t77 = load ptr, ptr %t76 - %t78 = call ptr @fn_ui_prop(ptr %t77, ptr @.str1335) + %t78 = call ptr @fn_ui_prop(ptr %t77, ptr @.str1342) store ptr %t78, ptr %t79 %t80 = load ptr, ptr %t79 %t81 = icmp eq ptr %t80, null @@ -17850,18 +18205,18 @@ entry: store i32 %arg_idx, ptr %t0 store i32 %arg_key, ptr %t1 store ptr %arg_val, ptr %t2 - call void @fn_emit(ptr @.str1336) + call void @fn_emit(ptr @.str1343) %t3 = load i32, ptr %t0 %t4 = call ptr @fn_itoa(i32 %t3) call void @fn_emit(ptr %t4) - call void @fn_emit(ptr @.str1337) + call void @fn_emit(ptr @.str1344) %t5 = load i32, ptr %t1 %t6 = call ptr @fn_itoa(i32 %t5) call void @fn_emit(ptr %t6) - call void @fn_emit(ptr @.str1338) + call void @fn_emit(ptr @.str1345) %t7 = load ptr, ptr %t2 call void @fn_emit(ptr %t7) - call void @fn_emit(ptr @.str1339) + call void @fn_emit(ptr @.str1346) br label %ret ret: ret void @@ -17873,7 +18228,7 @@ entry: %t0 = alloca ptr store ptr %arg_k, ptr %t0 %t1 = load ptr, ptr %t0 - %t2 = call i32 @fn_streq(ptr %t1, ptr @.str1340) + %t2 = call i32 @fn_streq(ptr %t1, ptr @.str1347) %t3 = icmp ne i32 %t2, 0 br i1 %t3, label %then0, label %ifend2 then0: @@ -17881,7 +18236,7 @@ then0: br label %ret ifend2: %t4 = load ptr, ptr %t0 - %t5 = call i32 @fn_streq(ptr %t4, ptr @.str1341) + %t5 = call i32 @fn_streq(ptr %t4, ptr @.str1348) %t6 = icmp ne i32 %t5, 0 br i1 %t6, label %then3, label %ifend5 then3: @@ -17889,7 +18244,7 @@ then3: br label %ret ifend5: %t7 = load ptr, ptr %t0 - %t8 = call i32 @fn_streq(ptr %t7, ptr @.str1342) + %t8 = call i32 @fn_streq(ptr %t7, ptr @.str1349) %t9 = icmp ne i32 %t8, 0 br i1 %t9, label %then6, label %ifend8 then6: @@ -17897,7 +18252,7 @@ then6: br label %ret ifend8: %t10 = load ptr, ptr %t0 - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str1343) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str1350) %t12 = icmp ne i32 %t11, 0 br i1 %t12, label %then9, label %ifend11 then9: @@ -17905,7 +18260,7 @@ then9: br label %ret ifend11: %t13 = load ptr, ptr %t0 - %t14 = call i32 @fn_streq(ptr %t13, ptr @.str1344) + %t14 = call i32 @fn_streq(ptr %t13, ptr @.str1351) %t15 = icmp ne i32 %t14, 0 br i1 %t15, label %then12, label %ifend14 then12: @@ -17913,7 +18268,7 @@ then12: br label %ret ifend14: %t16 = load ptr, ptr %t0 - %t17 = call i32 @fn_streq(ptr %t16, ptr @.str1345) + %t17 = call i32 @fn_streq(ptr %t16, ptr @.str1352) %t18 = icmp ne i32 %t17, 0 br i1 %t18, label %then15, label %ifend17 then15: @@ -17921,7 +18276,7 @@ then15: br label %ret ifend17: %t19 = load ptr, ptr %t0 - %t20 = call i32 @fn_streq(ptr %t19, ptr @.str1346) + %t20 = call i32 @fn_streq(ptr %t19, ptr @.str1353) %t21 = icmp ne i32 %t20, 0 br i1 %t21, label %then18, label %ifend20 then18: @@ -17929,7 +18284,7 @@ then18: br label %ret ifend20: %t22 = load ptr, ptr %t0 - %t23 = call i32 @fn_streq(ptr %t22, ptr @.str1347) + %t23 = call i32 @fn_streq(ptr %t22, ptr @.str1354) %t24 = icmp ne i32 %t23, 0 br i1 %t24, label %then21, label %ifend23 then21: @@ -17937,7 +18292,7 @@ then21: br label %ret ifend23: %t25 = load ptr, ptr %t0 - %t26 = call i32 @fn_streq(ptr %t25, ptr @.str1348) + %t26 = call i32 @fn_streq(ptr %t25, ptr @.str1355) %t27 = icmp ne i32 %t26, 0 br i1 %t27, label %then24, label %ifend26 then24: @@ -17945,7 +18300,7 @@ then24: br label %ret ifend26: %t28 = load ptr, ptr %t0 - %t29 = call i32 @fn_streq(ptr %t28, ptr @.str1349) + %t29 = call i32 @fn_streq(ptr %t28, ptr @.str1356) %t30 = icmp ne i32 %t29, 0 br i1 %t30, label %then27, label %ifend29 then27: @@ -17953,7 +18308,7 @@ then27: br label %ret ifend29: %t31 = load ptr, ptr %t0 - %t32 = call i32 @fn_streq(ptr %t31, ptr @.str1350) + %t32 = call i32 @fn_streq(ptr %t31, ptr @.str1357) %t33 = icmp ne i32 %t32, 0 br i1 %t33, label %then30, label %ifend32 then30: @@ -17961,7 +18316,7 @@ then30: br label %ret ifend32: %t34 = load ptr, ptr %t0 - %t35 = call i32 @fn_streq(ptr %t34, ptr @.str1351) + %t35 = call i32 @fn_streq(ptr %t34, ptr @.str1358) %t36 = icmp ne i32 %t35, 0 br i1 %t36, label %then33, label %ifend35 then33: @@ -17969,7 +18324,7 @@ then33: br label %ret ifend35: %t37 = load ptr, ptr %t0 - %t38 = call i32 @fn_streq(ptr %t37, ptr @.str1352) + %t38 = call i32 @fn_streq(ptr %t37, ptr @.str1359) %t39 = icmp ne i32 %t38, 0 br i1 %t39, label %then36, label %ifend38 then36: @@ -17977,7 +18332,7 @@ then36: br label %ret ifend38: %t40 = load ptr, ptr %t0 - %t41 = call i32 @fn_streq(ptr %t40, ptr @.str1353) + %t41 = call i32 @fn_streq(ptr %t40, ptr @.str1360) %t42 = icmp ne i32 %t41, 0 br i1 %t42, label %then39, label %ifend41 then39: @@ -18026,13 +18381,13 @@ entry: store ptr %t3, ptr %t4 %t5 = load ptr, ptr %t1 store ptr %t5, ptr @g_code - call void @fn_emit(ptr @.str1354) + call void @fn_emit(ptr @.str1361) %t6 = load ptr, ptr @g_uiw %t7 = getelementptr inbounds %LSlice, ptr %t6, i32 0, i32 1 %t8 = load i32, ptr %t7 %t9 = call ptr @fn_itoa(i32 %t8) call void @fn_emit(ptr %t9) - call void @fn_emit(ptr @.str1355) + call void @fn_emit(ptr @.str1362) store i32 0, ptr %t10 br label %wcond0 wcond0: @@ -18075,7 +18430,7 @@ wbody1: br i1 %t42, label %then3, label %ifend5 then3: %t43 = load i32, ptr %t10 - call void @fn_ll_ui_set(i32 %t43, i32 17, ptr @.str1356) + call void @fn_ll_ui_set(i32 %t43, i32 17, ptr @.str1363) br label %ifend5 ifend5: store i32 0, ptr %t44 @@ -18114,7 +18469,7 @@ wbody7: %t73 = load ptr, ptr %t72 store ptr %t73, ptr %t74 %t75 = load ptr, ptr %t70 - %t76 = call i32 @fn_streq(ptr %t75, ptr @.str1357) + %t76 = call i32 @fn_streq(ptr %t75, ptr @.str1364) %t77 = icmp ne i32 %t76, 0 br i1 %t77, label %then9, label %ifend11 then9: @@ -18124,34 +18479,34 @@ then9: br label %wcond6 ifend11: %t80 = load ptr, ptr %t70 - %t81 = call i32 @fn_streq(ptr %t80, ptr @.str1358) + %t81 = call i32 @fn_streq(ptr %t80, ptr @.str1365) %t82 = icmp ne i32 %t81, 0 br i1 %t82, label %then12, label %else13 then12: %t83 = load ptr, ptr %t74 %t84 = call ptr @fn_emit_expr(ptr %t83) store ptr %t84, ptr %t85 - call void @fn_emit(ptr @.str1359) + call void @fn_emit(ptr @.str1366) %t86 = load i32, ptr %t10 %t87 = call ptr @fn_itoa(i32 %t86) call void @fn_emit(ptr %t87) - call void @fn_emit(ptr @.str1360) + call void @fn_emit(ptr @.str1367) %t88 = load ptr, ptr %t85 %t89 = getelementptr inbounds %Str_Val, ptr %t88, i32 0, i32 0 %t90 = load ptr, ptr %t89 call void @fn_emit(ptr %t90) - call void @fn_emit(ptr @.str1361) + call void @fn_emit(ptr @.str1368) br label %ifend14 else13: %t92 = load ptr, ptr %t70 - %t93 = call i32 @fn_streq(ptr %t92, ptr @.str1362) + %t93 = call i32 @fn_streq(ptr %t92, ptr @.str1369) %t94 = icmp ne i32 %t93, 0 %t95 = zext i1 %t94 to i32 store i32 %t95, ptr %t91 br i1 %t94, label %scend16, label %sc15 sc15: %t96 = load ptr, ptr %t70 - %t97 = call i32 @fn_streq(ptr %t96, ptr @.str1363) + %t97 = call i32 @fn_streq(ptr %t96, ptr @.str1370) %t98 = icmp ne i32 %t97, 0 %t99 = zext i1 %t98 to i32 store i32 %t99, ptr %t91 @@ -18167,12 +18522,12 @@ then17: %t105 = load ptr, ptr %t104 %t106 = getelementptr inbounds %Str_Val, ptr %t105, i32 0, i32 0 %t107 = load ptr, ptr %t106 - %t108 = call ptr @fn_sconcat(ptr %t107, ptr @.str1365) - %t109 = call ptr @fn_sconcat(ptr @.str1364, ptr %t108) + %t108 = call ptr @fn_sconcat(ptr %t107, ptr @.str1372) + %t109 = call ptr @fn_sconcat(ptr @.str1371, ptr %t108) %t110 = call ptr @fn_emit_bind(ptr %t109) store ptr %t110, ptr %t111 %t112 = load ptr, ptr %t70 - %t113 = call i32 @fn_streq(ptr %t112, ptr @.str1366) + %t113 = call i32 @fn_streq(ptr %t112, ptr @.str1373) %t114 = icmp ne i32 %t113, 0 br i1 %t114, label %then20, label %else21 then20: @@ -18189,7 +18544,7 @@ ifend22: br label %ifend19 else18: %t119 = load ptr, ptr %t70 - %t120 = call i32 @fn_streq(ptr %t119, ptr @.str1367) + %t120 = call i32 @fn_streq(ptr %t119, ptr @.str1374) %t121 = icmp ne i32 %t120, 0 br i1 %t121, label %then23, label %else24 then23: @@ -18205,7 +18560,7 @@ then26: %t129 = load ptr, ptr %t74 %t130 = getelementptr inbounds %Str_Node, ptr %t129, i32 0, i32 1 %t131 = load ptr, ptr %t130 - %t132 = call i32 @fn_streq(ptr %t131, ptr @.str1368) + %t132 = call i32 @fn_streq(ptr %t131, ptr @.str1375) %t133 = icmp ne i32 %t132, 0 br i1 %t133, label %then29, label %ifend31 then29: @@ -18215,7 +18570,7 @@ ifend31: %t134 = load ptr, ptr %t74 %t135 = getelementptr inbounds %Str_Node, ptr %t134, i32 0, i32 1 %t136 = load ptr, ptr %t135 - %t137 = call i32 @fn_streq(ptr %t136, ptr @.str1369) + %t137 = call i32 @fn_streq(ptr %t136, ptr @.str1376) %t138 = icmp ne i32 %t137, 0 br i1 %t138, label %then32, label %ifend34 then32: @@ -18279,7 +18634,7 @@ scend39: br i1 %t176, label %then40, label %ifend42 then40: %t177 = load i32, ptr %t10 - call void @fn_ll_ui_set(i32 %t177, i32 6, ptr @.str1370) + call void @fn_ll_ui_set(i32 %t177, i32 6, ptr @.str1377) br label %ifend42 ifend42: br label %ifend37 @@ -18302,14 +18657,14 @@ wend8: wend2: %t182 = load ptr, ptr %t4 store ptr %t182, ptr @g_code - call void @fn_emit(ptr @.str1371) + call void @fn_emit(ptr @.str1378) %t183 = load ptr, ptr @g_falloc %t184 = call ptr @fn_buf_str(ptr %t183) call void @fn_emit(ptr %t184) %t185 = load ptr, ptr %t1 %t186 = call ptr @fn_buf_str(ptr %t185) call void @fn_emit(ptr %t186) - call void @fn_emit(ptr @.str1372) + call void @fn_emit(ptr @.str1379) br label %ret ret: ret void @@ -18340,7 +18695,7 @@ wbody1: %t14 = icmp ne i32 %t13, 0 br i1 %t14, label %then3, label %ifend5 then3: - call void @fn_emit(ptr @.str1373) + call void @fn_emit(ptr @.str1380) br label %ifend5 ifend5: %t15 = load ptr, ptr %t0 @@ -18355,7 +18710,7 @@ ifend5: %t24 = load ptr, ptr %t23 %t25 = call ptr @fn_llty(ptr %t24) call void @fn_emit(ptr %t25) - call void @fn_emit(ptr @.str1374) + call void @fn_emit(ptr @.str1381) %t26 = load ptr, ptr %t0 %t27 = getelementptr inbounds %Str_Node, ptr %t26, i32 0, i32 7 %t28 = load ptr, ptr %t27 @@ -18409,19 +18764,19 @@ entry: %t11 = call ptr @fn_llty(ptr %t10) store ptr %t11, ptr %t12 %t13 = load ptr, ptr %t12 - %t14 = call i32 @fn_streq(ptr %t13, ptr @.str1375) + %t14 = call i32 @fn_streq(ptr %t13, ptr @.str1382) %t15 = icmp eq i32 %t14, 0 %t16 = zext i1 %t15 to i32 %t17 = icmp ne i32 %t16, 0 br i1 %t17, label %then0, label %ifend2 then0: %t18 = load ptr, ptr @g_falloc - call void @fn_buf_puts(ptr %t18, ptr @.str1376) + call void @fn_buf_puts(ptr %t18, ptr @.str1383) %t19 = load ptr, ptr @g_falloc %t20 = load ptr, ptr %t12 call void @fn_buf_puts(ptr %t19, ptr %t20) %t21 = load ptr, ptr @g_falloc - call void @fn_buf_puts(ptr %t21, ptr @.str1377) + call void @fn_buf_puts(ptr %t21, ptr @.str1384) br label %ifend2 ifend2: store i32 0, ptr %t22 @@ -18453,21 +18808,21 @@ wbody4: %t44 = call ptr @fn_llty(ptr %t43) %t45 = call ptr @fn_emit_alloca(ptr %t44) store ptr %t45, ptr %t46 - call void @fn_emit(ptr @.str1378) + call void @fn_emit(ptr @.str1385) %t47 = load ptr, ptr %t40 %t48 = getelementptr inbounds %Str_Node, ptr %t47, i32 0, i32 3 %t49 = load ptr, ptr %t48 %t50 = call ptr @fn_llty(ptr %t49) call void @fn_emit(ptr %t50) - call void @fn_emit(ptr @.str1379) + call void @fn_emit(ptr @.str1386) %t51 = load ptr, ptr %t40 %t52 = getelementptr inbounds %Str_Node, ptr %t51, i32 0, i32 1 %t53 = load ptr, ptr %t52 call void @fn_emit(ptr %t53) - call void @fn_emit(ptr @.str1380) + call void @fn_emit(ptr @.str1387) %t54 = load ptr, ptr %t46 call void @fn_emit(ptr %t54) - call void @fn_emit(ptr @.str1381) + call void @fn_emit(ptr @.str1388) %t55 = load ptr, ptr %t40 %t56 = getelementptr inbounds %Str_Node, ptr %t55, i32 0, i32 1 %t57 = load ptr, ptr %t56 @@ -18491,53 +18846,53 @@ wend5: %t70 = icmp ne i32 %t69, 0 br i1 %t70, label %then6, label %ifend8 then6: - call void @fn_emit(ptr @.str1382) + call void @fn_emit(ptr @.str1389) br label %ifend8 ifend8: - call void @fn_emit(ptr @.str1383) + call void @fn_emit(ptr @.str1390) %t71 = load ptr, ptr %t12 - %t72 = call i32 @fn_streq(ptr %t71, ptr @.str1384) + %t72 = call i32 @fn_streq(ptr %t71, ptr @.str1391) %t73 = icmp ne i32 %t72, 0 br i1 %t73, label %then9, label %else10 then9: - call void @fn_emit(ptr @.str1385) + call void @fn_emit(ptr @.str1392) br label %ifend11 else10: %t74 = load ptr, ptr %t12 - %t75 = call ptr @fn_sconcat(ptr %t74, ptr @.str1387) - %t76 = call ptr @fn_sconcat(ptr @.str1386, ptr %t75) + %t75 = call ptr @fn_sconcat(ptr %t74, ptr @.str1394) + %t76 = call ptr @fn_sconcat(ptr @.str1393, ptr %t75) %t77 = call ptr @fn_emit_bind(ptr %t76) store ptr %t77, ptr %t78 - call void @fn_emit(ptr @.str1388) + call void @fn_emit(ptr @.str1395) %t79 = load ptr, ptr %t12 call void @fn_emit(ptr %t79) - call void @fn_emit(ptr @.str1389) + call void @fn_emit(ptr @.str1396) %t80 = load ptr, ptr %t78 call void @fn_emit(ptr %t80) - call void @fn_emit(ptr @.str1390) + call void @fn_emit(ptr @.str1397) br label %ifend11 ifend11: %t81 = load ptr, ptr %t8 store ptr %t81, ptr @g_code - call void @fn_emit(ptr @.str1391) + call void @fn_emit(ptr @.str1398) %t82 = load ptr, ptr %t12 call void @fn_emit(ptr %t82) - call void @fn_emit(ptr @.str1392) + call void @fn_emit(ptr @.str1399) %t83 = load ptr, ptr %t0 %t84 = getelementptr inbounds %Str_Node, ptr %t83, i32 0, i32 1 %t85 = load ptr, ptr %t84 call void @fn_emit(ptr %t85) - call void @fn_emit(ptr @.str1393) + call void @fn_emit(ptr @.str1400) %t86 = load ptr, ptr %t0 call void @fn_emit_params_sig(ptr %t86) - call void @fn_emit(ptr @.str1394) + call void @fn_emit(ptr @.str1401) %t87 = load ptr, ptr @g_falloc %t88 = call ptr @fn_buf_str(ptr %t87) call void @fn_emit(ptr %t88) %t89 = load ptr, ptr %t5 %t90 = call ptr @fn_buf_str(ptr %t89) call void @fn_emit(ptr %t90) - call void @fn_emit(ptr @.str1395) + call void @fn_emit(ptr @.str1402) br label %ret ret: ret void @@ -18555,7 +18910,7 @@ entry: store i32 0, ptr @g_g_term call void @fn_loc_reset() store i32 0, ptr @g_nloop - store ptr @.str1396, ptr @g_ret_ty + store ptr @.str1403, ptr @g_ret_ty %t1 = call ptr @fn_buf_new() store ptr %t1, ptr %t2 %t3 = call ptr @fn_buf_new() @@ -18565,10 +18920,10 @@ entry: %t6 = load ptr, ptr %t2 store ptr %t6, ptr @g_code %t7 = load ptr, ptr @g_falloc - call void @fn_buf_puts(ptr %t7, ptr @.str1397) - call void @fn_emit(ptr @.str1398) - call void @fn_emit(ptr @.str1399) - call void @fn_emit(ptr @.str1400) + call void @fn_buf_puts(ptr %t7, ptr @.str1404) + call void @fn_emit(ptr @.str1405) + call void @fn_emit(ptr @.str1406) + call void @fn_emit(ptr @.str1407) %t8 = load ptr, ptr %t0 %t9 = getelementptr inbounds %Str_Node, ptr %t8, i32 0, i32 4 %t10 = load ptr, ptr %t9 @@ -18579,26 +18934,26 @@ entry: %t14 = icmp ne i32 %t13, 0 br i1 %t14, label %then0, label %ifend2 then0: - call void @fn_emit(ptr @.str1401) + call void @fn_emit(ptr @.str1408) br label %ifend2 ifend2: - call void @fn_emit(ptr @.str1402) - %t15 = call ptr @fn_emit_bind(ptr @.str1403) + call void @fn_emit(ptr @.str1409) + %t15 = call ptr @fn_emit_bind(ptr @.str1410) store ptr %t15, ptr %t16 - call void @fn_emit(ptr @.str1404) + call void @fn_emit(ptr @.str1411) %t17 = load ptr, ptr %t16 call void @fn_emit(ptr %t17) - call void @fn_emit(ptr @.str1405) + call void @fn_emit(ptr @.str1412) %t18 = load ptr, ptr %t5 store ptr %t18, ptr @g_code - call void @fn_emit(ptr @.str1406) + call void @fn_emit(ptr @.str1413) %t19 = load ptr, ptr @g_falloc %t20 = call ptr @fn_buf_str(ptr %t19) call void @fn_emit(ptr %t20) %t21 = load ptr, ptr %t2 %t22 = call ptr @fn_buf_str(ptr %t21) call void @fn_emit(ptr %t22) - call void @fn_emit(ptr @.str1407) + call void @fn_emit(ptr @.str1414) br label %ret ret: ret void @@ -18824,7 +19179,7 @@ then0: br label %ret ifend2: %t13 = load ptr, ptr %t0 - %t14 = call ptr @fopen(ptr %t13, ptr @.str1408) + %t14 = call ptr @fopen(ptr %t13, ptr @.str1415) store ptr %t14, ptr %t15 %t16 = load ptr, ptr %t15 %t17 = icmp eq ptr %t16, null @@ -18933,7 +19288,7 @@ then0: %t9 = load i32, ptr %t3 %t10 = sub i32 %t9, 6 %t11 = call ptr @fn_substr(ptr %t8, i32 %t10, i32 6) - %t12 = call i32 @fn_streq(ptr %t11, ptr @.str1409) + %t12 = call i32 @fn_streq(ptr %t11, ptr @.str1416) %t13 = icmp ne i32 %t12, 0 br i1 %t13, label %then3, label %ifend5 then3: @@ -19018,7 +19373,7 @@ then3: br label %ret ifend5: %t19 = load ptr, ptr %t0 - %t20 = call ptr @fn_sconcat(ptr %t19, ptr @.str1410) + %t20 = call ptr @fn_sconcat(ptr %t19, ptr @.str1417) store ptr %t20, ptr %retval br label %ret ret: @@ -19083,7 +19438,7 @@ entry: %t8 = getelementptr ptr, ptr %t7, i32 0 %t9 = load ptr, ptr %t8 %t10 = call ptr @fn_base_name(ptr %t9) - %t11 = call i32 @fn_streq(ptr %t10, ptr @.str1411) + %t11 = call i32 @fn_streq(ptr %t10, ptr @.str1418) %t12 = icmp ne i32 %t11, 0 br i1 %t12, label %then0, label %ifend2 then0: @@ -19106,7 +19461,7 @@ wbody4: %t22 = load ptr, ptr %t21 store ptr %t22, ptr %t23 %t24 = load ptr, ptr %t23 - %t25 = call i32 @fn_streq(ptr %t24, ptr @.str1412) + %t25 = call i32 @fn_streq(ptr %t24, ptr @.str1419) %t26 = icmp ne i32 %t25, 0 br i1 %t26, label %then6, label %else7 then6: @@ -19114,7 +19469,7 @@ then6: br label %ifend8 else7: %t27 = load ptr, ptr %t23 - %t28 = call i32 @fn_streq(ptr %t27, ptr @.str1413) + %t28 = call i32 @fn_streq(ptr %t27, ptr @.str1420) %t29 = icmp ne i32 %t28, 0 br i1 %t29, label %then9, label %else10 then9: @@ -19122,7 +19477,7 @@ then9: br label %ifend11 else10: %t30 = load ptr, ptr %t23 - %t31 = call i32 @fn_streq(ptr %t30, ptr @.str1414) + %t31 = call i32 @fn_streq(ptr %t30, ptr @.str1421) %t32 = icmp ne i32 %t31, 0 br i1 %t32, label %then12, label %else13 then12: @@ -19130,7 +19485,7 @@ then12: br label %ifend14 else13: %t33 = load ptr, ptr %t23 - %t34 = call i32 @fn_streq(ptr %t33, ptr @.str1415) + %t34 = call i32 @fn_streq(ptr %t33, ptr @.str1422) %t35 = icmp ne i32 %t34, 0 br i1 %t35, label %then15, label %else16 then15: @@ -19138,7 +19493,7 @@ then15: br label %ifend17 else16: %t36 = load ptr, ptr %t23 - %t37 = call i32 @fn_streq(ptr %t36, ptr @.str1416) + %t37 = call i32 @fn_streq(ptr %t36, ptr @.str1423) %t38 = icmp ne i32 %t37, 0 br i1 %t38, label %then18, label %else19 then18: @@ -19146,7 +19501,7 @@ then18: br label %ifend20 else19: %t39 = load ptr, ptr %t23 - %t40 = call i32 @fn_streq(ptr %t39, ptr @.str1417) + %t40 = call i32 @fn_streq(ptr %t39, ptr @.str1424) %t41 = icmp ne i32 %t40, 0 br i1 %t41, label %then21, label %else22 then21: @@ -19154,7 +19509,7 @@ then21: br label %ifend23 else22: %t42 = load ptr, ptr %t23 - %t43 = call i32 @fn_streq(ptr %t42, ptr @.str1418) + %t43 = call i32 @fn_streq(ptr %t42, ptr @.str1425) %t44 = icmp ne i32 %t43, 0 br i1 %t44, label %then24, label %else25 then24: @@ -19187,8 +19542,8 @@ else25: br i1 %t62, label %then30, label %else31 then30: %t63 = load ptr, ptr %t23 - %t64 = call ptr @fn_sconcat(ptr %t63, ptr @.str1420) - %t65 = call ptr @fn_sconcat(ptr @.str1419, ptr %t64) + %t64 = call ptr @fn_sconcat(ptr %t63, ptr @.str1427) + %t65 = call ptr @fn_sconcat(ptr @.str1426, ptr %t64) store ptr %t65, ptr %t66 %t67 = load ptr, ptr @__stderrp %t68 = load ptr, ptr %t66 @@ -19228,7 +19583,7 @@ wend5: %t80 = icmp ne i32 %t79, 0 br i1 %t80, label %then33, label %ifend35 then33: - call void @fn_die(ptr @.str1421) + call void @fn_die(ptr @.str1428) br label %ifend35 ifend35: %t81 = load ptr, ptr %t0 @@ -19240,7 +19595,7 @@ ifend35: %t87 = icmp ne i32 %t86, 0 br i1 %t87, label %then36, label %ifend38 then36: - call void @fn_die(ptr @.str1422) + call void @fn_die(ptr @.str1429) br label %ifend38 ifend38: %t88 = load ptr, ptr %t0 @@ -19350,7 +19705,7 @@ then60: %t142 = load ptr, ptr %t0 %t143 = call ptr @fn_base_name(ptr %t142) %t144 = call ptr @fn_strip_ludic(ptr %t143) - %t145 = call ptr @fn_sconcat(ptr @.str1423, ptr %t144) + %t145 = call ptr @fn_sconcat(ptr @.str1430, ptr %t144) store ptr %t145, ptr %t1 br label %ifend62 ifend62: @@ -19365,12 +19720,12 @@ ifend62: br i1 %t153, label %then63, label %ifend65 then63: %t154 = load ptr, ptr %t148 - %t155 = call ptr @fn_sconcat(ptr @.str1424, ptr %t154) + %t155 = call ptr @fn_sconcat(ptr @.str1431, ptr %t154) %t156 = call i32 @system(ptr %t155) br label %ifend65 ifend65: %t157 = load ptr, ptr %t1 - %t158 = call ptr @fn_sconcat(ptr %t157, ptr @.str1425) + %t158 = call ptr @fn_sconcat(ptr %t157, ptr @.str1432) store ptr %t158, ptr %t159 %t160 = load ptr, ptr %t159 %t161 = call i32 @fn_ir_flush(ptr %t160) @@ -19379,21 +19734,21 @@ ifend65: %t164 = icmp ne i32 %t163, 0 br i1 %t164, label %then66, label %ifend68 then66: - call void @fn_die(ptr @.str1426) + call void @fn_die(ptr @.str1433) br label %ifend68 ifend68: - %t165 = call ptr @fn_getenv_or(ptr @.str1427, ptr @.str1428) + %t165 = call ptr @fn_getenv_or(ptr @.str1434, ptr @.str1435) store ptr %t165, ptr %t166 %t167 = load ptr, ptr @L_argv %t168 = getelementptr ptr, ptr %t167, i32 0 %t169 = load ptr, ptr %t168 %t170 = call ptr @fn_dir_of(ptr %t169) - %t171 = call ptr @fn_getenv_or(ptr @.str1429, ptr %t170) + %t171 = call ptr @fn_getenv_or(ptr @.str1436, ptr %t170) %t172 = call ptr @fn_ensure_slash(ptr %t171) store ptr %t172, ptr %t173 %t174 = load ptr, ptr %t166 %t175 = load ptr, ptr %t159 - %t176 = call ptr @fn_sconcat(ptr @.str1430, ptr %t175) + %t176 = call ptr @fn_sconcat(ptr @.str1437, ptr %t175) %t177 = call ptr @fn_sconcat(ptr %t174, ptr %t176) store ptr %t177, ptr %t178 %t179 = load i32, ptr @g_g_windowed @@ -19401,19 +19756,19 @@ ifend68: br i1 %t180, label %then69, label %ifend71 then69: %t181 = load ptr, ptr %t173 - %t182 = call ptr @fn_path_join(ptr %t181, ptr @.str1431) + %t182 = call ptr @fn_path_join(ptr %t181, ptr @.str1438) store ptr %t182, ptr %t183 %t184 = load ptr, ptr %t178 %t185 = load ptr, ptr %t183 - %t186 = call ptr @fn_sconcat(ptr %t185, ptr @.str1433) - %t187 = call ptr @fn_sconcat(ptr @.str1432, ptr %t186) + %t186 = call ptr @fn_sconcat(ptr %t185, ptr @.str1440) + %t187 = call ptr @fn_sconcat(ptr @.str1439, ptr %t186) %t188 = call ptr @fn_sconcat(ptr %t184, ptr %t187) store ptr %t188, ptr %t178 br label %ifend71 ifend71: %t189 = load ptr, ptr %t178 %t190 = load ptr, ptr %t1 - %t191 = call ptr @fn_sconcat(ptr @.str1434, ptr %t190) + %t191 = call ptr @fn_sconcat(ptr @.str1441, ptr %t190) %t192 = call ptr @fn_sconcat(ptr %t189, ptr %t191) store ptr %t192, ptr %t178 %t193 = load ptr, ptr %t178 @@ -19426,7 +19781,7 @@ ifend71: br i1 %t199, label %then72, label %ifend74 then72: %t200 = load ptr, ptr %t159 - %t201 = call ptr @fn_sconcat(ptr @.str1435, ptr %t200) + %t201 = call ptr @fn_sconcat(ptr @.str1442, ptr %t200) %t202 = call i32 @system(ptr %t201) br label %ifend74 ifend74: @@ -19436,7 +19791,7 @@ ifend74: %t206 = icmp ne i32 %t205, 0 br i1 %t206, label %then75, label %ifend77 then75: - call void @fn_die(ptr @.str1436) + call void @fn_die(ptr @.str1443) br label %ifend77 ifend77: %t207 = load i32, ptr %t6 diff --git a/selfhost/main.ludic b/selfhost/main.ludic index b0777322..2f0a1bab 100644 --- a/selfhost/main.ludic +++ b/selfhost/main.ludic @@ -18,7 +18,7 @@ fn base_name(path: ptr) -> ptr { let last = 0 - 1 let i = 0 - while peek8(path, i) != 0 { if peek8(path, i) == 47 { last = i } i = i + 1 } + while peek8(path, i) != 0 { if peek8(path, i) == 47 { last = i }; i = i + 1 } return substr(path, last + 1, i - (last + 1)) } @@ -72,7 +72,7 @@ main { else { if streq(a, "--fmt") { fmt = true } else { if streq(a, "--save-temps") { save = true } else { if streq(a, "--run") { run = true } - else { if streq(a, "-o") { ai = ai + 1 if ai < os_argc() { out = os_arg(ai) } } + else { if streq(a, "-o") { ai = ai + 1; if ai < os_argc() { out = os_arg(ai) } } else { # an unknown flag is ignored (with a note) rather than mistaken for the # input file — '-' is ASCII 45 @@ -112,8 +112,8 @@ main { emit_program() # --emit-llvm, or no binary target: emit IR and stop (stdout when out is null). - if emit_ir { ir_flush(out) return } - if not has_target { ir_flush(ptr_null()) return } + if emit_ir { ir_flush(out); return } + if not has_target { ir_flush(ptr_null()); return } # a run with no explicit -o lands in a temp file if run and ptr_is_null(out) { diff --git a/selfhost/parse.ludic b/selfhost/parse.ludic index 7bef78b4..aabb95bc 100644 --- a/selfhost/parse.ludic +++ b/selfhost/parse.ludic @@ -8,8 +8,8 @@ var g_game_name: ptr # the `game`/`module` name fn cur() -> Tok { return toks[pi] } fn pk(o: int) -> Tok { return toks[pi + o] } -fn is_op(v: ptr) -> bool { let t = toks[pi] return t.kind == TK_OP and streq(t.text, v) } -fn is_id(v: ptr) -> bool { let t = toks[pi] return t.kind == TK_ID and streq(t.text, v) } +fn is_op(v: ptr) -> bool { let t = toks[pi]; return t.kind == TK_OP and streq(t.text, v) } +fn is_id(v: ptr) -> bool { let t = toks[pi]; return t.kind == TK_ID and streq(t.text, v) } fn is_kw(v: ptr) -> bool { return is_id(v) } fn perr(msg: ptr) -> void { @@ -20,7 +20,7 @@ fn perr(msg: ptr) -> void { os_exit(1) } -fn eat_op(v: ptr) -> void { if not is_op(v) { perr(v) } pi = pi + 1 } +fn eat_op(v: ptr) -> void { if not is_op(v) { perr(v) }; pi = pi + 1 } fn eat_id() -> ptr { let t = toks[pi] if t.kind != TK_ID { perr("expected identifier") } @@ -36,9 +36,9 @@ fn ptype() -> ptr { eat_op("]") let el = ptype() let out = mem_alloc(slen(el) + 3) - poke8(out, 0, 91) poke8(out, 1, 93) # "[]" + poke8(out, 0, 91); poke8(out, 1, 93) # "[]" let i = 0 - while peek8(el, i) != 0 { poke8(out, 2 + i, peek8(el, i)) i = i + 1 } + while peek8(el, i) != 0 { poke8(out, 2 + i, peek8(el, i)); i = i + 1 } poke8(out, 2 + i, 0) return out } @@ -49,23 +49,23 @@ fn ptype() -> ptr { fn expr() -> Node { return p_or() } fn args_call(call: Node) -> void { - eat_op("(") skipnl() - while not is_op(")") { push(call.kids, expr()) skipnl() if is_op(",") { pi = pi + 1 skipnl() } } + eat_op("("); skipnl() + while not is_op(")") { push(call.kids, expr()); skipnl(); if is_op(",") { pi = pi + 1; skipnl() } } eat_op(")") } fn p_primary() -> Node { let t = toks[pi] - if t.kind == TK_INT { let n = node(E_INT) n.ival = t.ival pi = pi + 1 return n } - if t.kind == TK_FLOAT { let n = node(E_FLOAT) n.ival = t.ival pi = pi + 1 return n } - if t.kind == TK_STR { let n = node(E_STR) n.s = t.text pi = pi + 1 return n } + if t.kind == TK_INT { let n = node(E_INT); n.ival = t.ival; pi = pi + 1; return n } + if t.kind == TK_FLOAT { let n = node(E_FLOAT); n.ival = t.ival; pi = pi + 1; return n } + if t.kind == TK_STR { let n = node(E_STR); n.s = t.text; pi = pi + 1; return n } if t.kind == TK_ID { - if streq(t.text, "true") { let n = node(E_BOOL) n.ival = 1 pi = pi + 1 return n } - if streq(t.text, "false") { let n = node(E_BOOL) n.ival = 0 pi = pi + 1 return n } - if streq(t.text, "new") { pi = pi + 1 let n = node(E_NEW) n.s = ptype() return n } - let n = node(E_ID) n.s = t.text pi = pi + 1 return n + if streq(t.text, "true") { let n = node(E_BOOL); n.ival = 1; pi = pi + 1; return n } + if streq(t.text, "false") { let n = node(E_BOOL); n.ival = 0; pi = pi + 1; return n } + if streq(t.text, "new") { pi = pi + 1; let n = node(E_NEW); n.s = ptype(); return n } + let n = node(E_ID); n.s = t.text; pi = pi + 1; return n } - if is_op("(") { pi = pi + 1 skipnl() let e = expr() skipnl() eat_op(")") return e } + if is_op("(") { pi = pi + 1; skipnl(); let e = expr(); skipnl(); eat_op(")"); return e } perr("expected expression") return node(E_INT) } @@ -73,64 +73,78 @@ fn p_primary() -> Node { fn p_postfix() -> Node { let e = p_primary() while true { - if is_op(".") { pi = pi + 1 let m = node(E_MEMBER) m.a = e m.s = eat_id() e = m } - else { if is_op("[") { pi = pi + 1 let ix = node(E_INDEX) ix.a = e ix.b = expr() eat_op("]") e = ix } - else { if is_op("(") { let c = node(E_CALL) c.a = e args_call(c) e = c } else { break } } } + if is_op(".") { pi = pi + 1; let m = node(E_MEMBER); m.a = e; m.s = eat_id(); e = m } + else { if is_op("[") { pi = pi + 1; let ix = node(E_INDEX); ix.a = e; ix.b = expr(); eat_op("]"); e = ix } + else { if is_op("(") { let c = node(E_CALL); c.a = e; args_call(c); e = c } else { break } } } } return e } fn p_unary() -> Node { - if is_op("-") { pi = pi + 1 let n = node(E_UN) n.s = "-" n.a = p_unary() return n } - if is_id("not") { pi = pi + 1 let n = node(E_UN) n.s = "not" n.a = p_unary() return n } + if is_op("-") { pi = pi + 1; let n = node(E_UN); n.s = "-"; n.a = p_unary(); return n } + if is_id("not") { pi = pi + 1; let n = node(E_UN); n.s = "not"; n.a = p_unary(); return n } return p_postfix() } -fn mkbin(op: ptr, l: Node, r: Node) -> Node { let b = node(E_BIN) b.s = op b.a = l b.b = r return b } +fn mkbin(op: ptr, l: Node, r: Node) -> Node { let b = node(E_BIN); b.s = op; b.a = l; b.b = r; return b } fn p_mul() -> Node { let l = p_unary() - while is_op("*") or is_op("/") or is_op("%") { let op = toks[pi].text pi = pi + 1 l = mkbin(op, l, p_unary()) } + while is_op("*") or is_op("/") or is_op("%") { let op = toks[pi].text; pi = pi + 1; l = mkbin(op, l, p_unary()) } return l } fn p_add() -> Node { let l = p_mul() - while is_op("+") or is_op("-") { let op = toks[pi].text pi = pi + 1 l = mkbin(op, l, p_mul()) } + while is_op("+") or is_op("-") { let op = toks[pi].text; pi = pi + 1; l = mkbin(op, l, p_mul()) } return l } fn p_cmp() -> Node { let l = p_add() while is_op("<") or is_op("<=") or is_op(">") or is_op(">=") or is_op("==") or is_op("!=") { - let op = toks[pi].text pi = pi + 1 l = mkbin(op, l, p_add()) + let op = toks[pi].text; pi = pi + 1; l = mkbin(op, l, p_add()) } return l } fn p_and() -> Node { let l = p_cmp() - while is_id("and") { pi = pi + 1 l = mkbin("and", l, p_cmp()) } + while is_id("and") { pi = pi + 1; l = mkbin("and", l, p_cmp()) } return l } fn p_or() -> Node { let l = p_and() - while is_id("or") { pi = pi + 1 l = mkbin("or", l, p_and()) } + while is_id("or") { pi = pi + 1; l = mkbin("or", l, p_and()) } return l } -# a record literal `{ field = value, ... }` — used by spawn component inits +# a record literal `{ field: value, ... }` — used by spawn component inits. +# Rule A: a named part uses `:` (`=` is assignment/binding only). fn record() -> Node { eat_op("{") let r = node(E_REC) - while true { skipnl() if is_op("}") { break } - let fi = node(E_FINIT) fi.s = eat_id() eat_op("=") fi.a = expr() push(r.kids, fi) + while true { skipnl(); if is_op("}") { break } + let fi = node(E_FINIT); fi.s = eat_id(); eat_op(":"); fi.a = expr(); push(r.kids, fi) if is_op(",") { pi = pi + 1 } } - eat_op("}") return r + eat_op("}"); return r } # ---- statements ------------------------------------------------------------ fn block() -> Node { - skipnl() eat_op("{") + skipnl(); eat_op("{") let b = node(N_BLOCK) - while true { skipnl() if is_op("}") { break } push(b.kids, stmt()) } + while true { skipnl(); if is_op("}") { break } + push(b.kids, stmt()) + # Rule B: statements are separated by a newline or ';' (both lex to TK_NL). + # After a statement the next token must be that separator or the block's end — + # two statements may not sit adjacent with only spaces between them. + let sep = toks[pi].kind == TK_NL + if is_op("}") { sep = true } + if not sep { + let ez = file_stderr(); file_write(ez, "cur=", 4) + if not ptr_is_null(toks[pi].text) { file_write(ez, toks[pi].text, slen(toks[pi].text)) } + file_write(ez, "\n", 1); print_int(7770000 + toks[pi].line) + perr("expected newline or ';' between statements") + } + } eat_op("}") return b } @@ -139,106 +153,112 @@ fn stmt() -> Node { let t = toks[pi] if t.kind == TK_ID { if streq(t.text, "let") { - pi = pi + 1 let n = node(S_LET) n.s = eat_id() - if is_op(":") { pi = pi + 1 n.ty = ptype() } - if is_op("=") { pi = pi + 1 n.a = expr() } + pi = pi + 1; let n = node(S_LET); n.s = eat_id() + if is_op(":") { pi = pi + 1; n.ty = ptype() } + if is_op("=") { pi = pi + 1; n.a = expr() } return n } if streq(t.text, "return") { - pi = pi + 1 let n = node(S_RETURN) + pi = pi + 1; let n = node(S_RETURN) if toks[pi].kind != TK_NL and not is_op("}") { n.a = expr() } return n } if streq(t.text, "if") { - pi = pi + 1 let n = node(S_IF) n.a = expr() n.b = block() skipnl() - if is_id("else") { pi = pi + 1 skipnl() + pi = pi + 1; let n = node(S_IF); n.a = expr(); n.b = block() + let save = pi; skipnl() # peek past newlines for a trailing `else` + if is_id("else") { pi = pi + 1; skipnl() if is_id("if") { n.c = stmt() } else { n.c = block() } } + else { pi = save } # no else: keep the separator for block()'s Rule-B check return n } if streq(t.text, "when") { # `when c { }` — an if with no else - pi = pi + 1 let n = node(S_IF) n.a = expr() n.b = block() + pi = pi + 1; let n = node(S_IF); n.a = expr(); n.b = block() return n } - if streq(t.text, "while") { pi = pi + 1 let n = node(S_WHILE) n.a = expr() n.b = block() return n } + if streq(t.text, "while") { pi = pi + 1; let n = node(S_WHILE); n.a = expr(); n.b = block(); return n } if streq(t.text, "for") { pi = pi + 1 if is_op("(") { return parse_query_for() } - let n = node(S_FOR) n.s = eat_id() + let n = node(S_FOR); n.s = eat_id() let inkw = eat_id() # 'in' - n.a = expr() eat_op("..") n.b = expr() n.c = block() + n.a = expr(); eat_op(".."); n.b = expr(); n.c = block() return n } if streq(t.text, "spawn") { return parse_spawn() } if streq(t.text, "machine") { - pi = pi + 1 let n = node(S_MACHINE) n.a = expr() skipnl() eat_op("{") - while true { skipnl() if is_op("}") { break } + pi = pi + 1; let n = node(S_MACHINE); n.a = expr(); skipnl(); eat_op("{") + let sidx = 0 # states auto-number by declaration order + while true { skipnl(); if is_op("}") { break } let stkw = eat_id() # 'state' - let s = node(S_STATE) s.s = eat_id() eat_op("=") s.b = expr() skipnl() s.a = block() - push(n.kids, s) } - eat_op("}") return n + let s = node(S_STATE); s.s = eat_id() + if is_op("=") { pi = pi + 1; s.b = expr() } # explicit value (still allowed) + else { let iv = node(E_INT); iv.ival = sidx; s.b = iv } # else its ordinal + skipnl(); s.a = block() + push(n.kids, s); sidx = sidx + 1 } + eat_op("}"); return n } - if streq(t.text, "become") { pi = pi + 1 let n = node(S_BECOME) n.s = eat_id() return n } - if streq(t.text, "enter") { pi = pi + 1 let n = node(S_BECOME) n.s = eat_id() n.ival = 1 return n } - if streq(t.text, "despawn") { pi = pi + 1 let n = node(S_DESPAWN) n.a = expr() return n } - if streq(t.text, "break") { pi = pi + 1 return node(S_BREAK) } - if streq(t.text, "continue") { pi = pi + 1 return node(S_CONTINUE) } + if streq(t.text, "become") { pi = pi + 1; let n = node(S_BECOME); n.s = eat_id(); return n } + if streq(t.text, "enter") { pi = pi + 1; let n = node(S_BECOME); n.s = eat_id(); n.ival = 1; return n } + if streq(t.text, "despawn") { pi = pi + 1; let n = node(S_DESPAWN); n.a = expr(); return n } + if streq(t.text, "break") { pi = pi + 1; return node(S_BREAK) } + if streq(t.text, "continue") { pi = pi + 1; return node(S_CONTINUE) } if streq(t.text, "match") { - pi = pi + 1 let n = node(S_MATCH) n.a = expr() skipnl() eat_op("{") + pi = pi + 1; let n = node(S_MATCH); n.a = expr(); skipnl(); eat_op("{") while true { - skipnl() if is_op("}") { break } + skipnl(); if is_op("}") { break } let arm = node(S_MARM) - while true { push(arm.kids, expr()) if is_op(",") { pi = pi + 1 skipnl() continue } break } - eat_op("=>") skipnl() - if is_op("{") { arm.a = block() } else { let b = node(N_BLOCK) push(b.kids, stmt()) arm.a = b } + while true { push(arm.kids, expr()); if is_op(",") { pi = pi + 1; skipnl(); continue }; break } + eat_op("=>"); skipnl() + if is_op("{") { arm.a = block() } else { let b = node(N_BLOCK); push(b.kids, stmt()); arm.a = b } push(n.kids, arm) } - eat_op("}") return n + eat_op("}"); return n } } let e = expr() if is_op("=") or is_op("+=") or is_op("-=") or is_op("*=") or is_op("/=") { - let n = node(S_ASSIGN) n.s = toks[pi].text pi = pi + 1 n.a = e n.b = expr() return n + let n = node(S_ASSIGN); n.s = toks[pi].text; pi = pi + 1; n.a = e; n.b = expr(); return n } - let n = node(S_EXPR) n.a = e return n + let n = node(S_EXPR); n.a = e; return n } # ---- declarations ---------------------------------------------------------- fn parse_struct() -> Node { - pi = pi + 1 let n = node(N_STRUCT) n.s = eat_id() skipnl() eat_op("{") - while true { skipnl() if is_op("}") { break } - let f = node(N_FIELD) f.s = eat_id() eat_op(":") f.ty = ptype() - if is_op("=") { pi = pi + 1 f.a = expr() } - push(n.kids, f) if is_op(",") { pi = pi + 1 } } - eat_op("}") return n + pi = pi + 1; let n = node(N_STRUCT); n.s = eat_id(); skipnl(); eat_op("{") + while true { skipnl(); if is_op("}") { break } + let f = node(N_FIELD); f.s = eat_id(); eat_op(":"); f.ty = ptype() + if is_op("=") { pi = pi + 1; f.a = expr() } + push(n.kids, f); if is_op(",") { pi = pi + 1 } } + eat_op("}"); return n } fn parse_var() -> Node { - pi = pi + 1 let n = node(N_VAR) n.s = eat_id() eat_op(":") n.ty = ptype() - if is_op("=") { pi = pi + 1 n.a = expr() } + pi = pi + 1; let n = node(N_VAR); n.s = eat_id(); eat_op(":"); n.ty = ptype() + if is_op("=") { pi = pi + 1; n.a = expr() } return n } fn parse_const() -> Node { - pi = pi + 1 let n = node(N_CONST) n.s = eat_id() eat_op(":") n.ty = ptype() eat_op("=") n.a = expr() + pi = pi + 1; let n = node(N_CONST); n.s = eat_id(); eat_op(":"); n.ty = ptype(); eat_op("="); n.a = expr() return n } fn parse_fn() -> Node { - pi = pi + 1 let n = node(N_FN) n.s = eat_id() eat_op("(") + pi = pi + 1; let n = node(N_FN); n.s = eat_id(); eat_op("(") while not is_op(")") { - let p = node(N_PARAM) p.s = eat_id() eat_op(":") p.ty = ptype() push(n.kids, p) + let p = node(N_PARAM); p.s = eat_id(); eat_op(":"); p.ty = ptype(); push(n.kids, p) if is_op(",") { pi = pi + 1 } } eat_op(")") n.ty = "void" - if is_op("->") { pi = pi + 1 n.ty = ptype() } + if is_op("->") { pi = pi + 1; n.ty = ptype() } n.a = block() return n } -fn parse_main() -> Node { pi = pi + 1 let n = node(N_MAIN) n.a = block() return n } +fn parse_main() -> Node { pi = pi + 1; let n = node(N_MAIN); n.a = block(); return n } # directory part of a path, including the trailing '/', or "" if none fn dir_of(path: ptr) -> ptr { let last = 0 - 1 let i = 0 - while peek8(path, i) != 0 { if peek8(path, i) == 47 { last = i } i = i + 1 } + while peek8(path, i) != 0 { if peek8(path, i) == 47 { last = i }; i = i + 1 } if last < 0 { return "" } return substr(path, 0, last + 1) } @@ -252,30 +272,40 @@ var cur_dir: ptr fn already_loaded(full: ptr) -> bool { let i = 0 - while i < len(loaded_paths) { if streq(loaded_paths[i], full) { return true } i = i + 1 } + while i < len(loaded_paths) { if streq(loaded_paths[i], full) { return true }; i = i + 1 } return false } -# parse one top-level declaration (or resolve an import) into `prog` +# parse one top-level declaration (or resolve an import) into `prog`. +# Modifiers are `@annotations` in front of the declaration: `@export`, `@edge`, +# `@pure`, `@deterministic`, … — one channel, not a zoo of prefix keywords. fn parse_one_decl() -> void { + let is_export = false + while is_op("@") { + pi = pi + 1; let a = eat_id() # collect a leading @annotation + if streq(a, "export") { is_export = true } + if is_op("(") { let d = 0 # optional @anno(args) — skipped + while true { if is_op("(") { d = d + 1 }; if is_op(")") { d = d - 1 }; pi = pi + 1; if d == 0 { break } } } + skipnl() + } if is_id("import") { pi = pi + 1 let t = toks[pi] if t.kind != TK_STR { perr("expected \"path\" after import") } - let rel = t.text pi = pi + 1 + let rel = t.text; pi = pi + 1 do_import(rel) return } - if is_id("struct") { push(prog, parse_struct()) return } - if is_id("component") { push(prog, parse_component()) return } - if is_id("archetype") { push(prog, parse_archetype()) return } - if is_id("system") or is_id("edge") { push(prog, parse_system()) return } - if is_id("ui") { push(prog, parse_ui()) return } - if is_id("var") { push(prog, parse_var()) return } - if is_id("const") { push(prog, parse_const()) return } - if is_id("export") { pi = pi + 1 let f = parse_fn() f.ival = 1 push(prog, f) return } - if is_id("fn") or is_id("pure") { if is_id("pure") { pi = pi + 1 } push(prog, parse_fn()) return } - if is_id("extern") { push(prog, parse_extern()) return } - if is_id("main") { push(prog, parse_main()) return } + if is_id("struct") { push(prog, parse_struct()); return } + if is_id("enum") { push(prog, parse_enum()); return } + if is_id("component") { push(prog, parse_component()); return } + if is_id("archetype") { push(prog, parse_archetype()); return } + if is_id("system") { push(prog, parse_system()); return } + if is_id("ui") { push(prog, parse_ui()); return } + if is_id("var") { push(prog, parse_var()); return } + if is_id("const") { push(prog, parse_const()); return } + if is_id("fn") { let f = parse_fn(); if is_export { f.ival = 1 }; push(prog, f); return } + if is_id("extern") { push(prog, parse_extern()); return } + if is_id("main") { push(prog, parse_main()); return } perr("expected declaration") } @@ -286,13 +316,13 @@ fn do_import(rel: ptr) -> void { push(loaded_paths, full) let src = read_file(full) if ptr_is_null(src) { perr(sconcat("cannot open import ", full)) } - let saved_toks = toks let saved_pi = pi let saved_dir = cur_dir + let saved_toks = toks; let saved_pi = pi; let saved_dir = cur_dir cur_dir = dir_of(full) lex(src) # resets the global token stream pi = 0 skipnl() - while toks[pi].kind != TK_EOF { parse_one_decl() skipnl() } - toks = saved_toks pi = saved_pi cur_dir = saved_dir + while toks[pi].kind != TK_EOF { parse_one_decl(); skipnl() } + toks = saved_toks; pi = saved_pi; cur_dir = saved_dir } # a game (has systems/components) links the Ludic runtime; auto-splice it the @@ -311,8 +341,8 @@ fn parse_program() -> void { skipnl() g_game_name = "Ludic" # imports may precede the game block - while is_id("import") { pi = pi + 1 let t = toks[pi] let rel = t.text pi = pi + 1 do_import(rel) skipnl() } - if is_id("game") or is_id("module") { pi = pi + 1 g_game_name = eat_id() skipnl() eat_op("{") } + while is_id("import") { pi = pi + 1; let t = toks[pi]; let rel = t.text; pi = pi + 1; do_import(rel); skipnl() } + if is_id("game") or is_id("module") { pi = pi + 1; g_game_name = eat_id(); skipnl(); eat_op("{") } while true { skipnl() if toks[pi].kind == TK_EOF { break } diff --git a/selfhost/parse_game.ludic b/selfhost/parse_game.ludic index 13031389..98b31e46 100644 --- a/selfhost/parse_game.ludic +++ b/selfhost/parse_game.ludic @@ -3,25 +3,24 @@ # game-construct parsing in compiler/front/parse.c. fn parse_component() -> Node { - pi = pi + 1 let n = node(N_COMP) n.s = eat_id() skipnl() eat_op("{") - while true { skipnl() if is_op("}") { break } - let f = node(N_FIELD) f.s = eat_id() eat_op(":") f.ty = ptype() - if is_op("=") { pi = pi + 1 f.a = expr() } - push(n.kids, f) if is_op(",") { pi = pi + 1 } } - eat_op("}") return n + pi = pi + 1; let n = node(N_COMP); n.s = eat_id(); skipnl(); eat_op("{") + while true { skipnl(); if is_op("}") { break } + let f = node(N_FIELD); f.s = eat_id(); eat_op(":"); f.ty = ptype() + if is_op("=") { pi = pi + 1; f.a = expr() } + push(n.kids, f); if is_op(",") { pi = pi + 1 } } + eat_op("}"); return n } # skip an @annotation or a reads/writes/query/... clause we don't model yet fn skip_clause() -> void { if is_op("[") { let depth = 0 - while true { if is_op("[") { depth = depth + 1 } if is_op("]") { depth = depth - 1 } - pi = pi + 1 if depth == 0 { break } } + while true { if is_op("[") { depth = depth + 1 }; if is_op("]") { depth = depth - 1 } + pi = pi + 1; if depth == 0 { break } } } } fn parse_system() -> Node { - if is_id("edge") { pi = pi + 1 } # optional `edge` modifier before `system` - pi = pi + 1 let n = node(N_SYS) n.s = eat_id() n.ty = "Update" + pi = pi + 1; let n = node(N_SYS); n.s = eat_id(); n.ty = "Update" # clauses: @anno, phase X, reads/writes/needs/uses [..], query (..) [..] # A `query (vars) [terms] where c` clause desugars to a body wrapped in one # `for (vars) in query [terms] where c { ... }` — the same S_QUERY node the @@ -30,15 +29,15 @@ fn parse_system() -> Node { let qn = node(S_QUERY) while true { skipnl() # clauses may span several lines - if is_op("@") { pi = pi + 1 let a = eat_id() if is_op("(") { let d = 0 # @anno, one per turn so a - while true { if is_op("(") { d = d + 1 } if is_op(")") { d = d - 1 } pi = pi + 1 if d == 0 { break } } } + if is_op("@") { pi = pi + 1; let a = eat_id(); if is_op("(") { let d = 0 # @anno, one per turn so a + while true { if is_op("(") { d = d + 1 }; if is_op(")") { d = d - 1 }; pi = pi + 1; if d == 0 { break } } } continue } # newline-separated @anno re-skips at the loop top - if is_id("phase") { pi = pi + 1 n.ty = eat_id() continue } - if is_id("reads") or is_id("writes") or is_id("needs") or is_id("uses") { pi = pi + 1 skip_clause() continue } + if is_id("phase") { pi = pi + 1; n.ty = eat_id(); continue } + if is_id("reads") or is_id("writes") { pi = pi + 1; skip_clause(); continue } # `needs`/`uses` synonyms dropped (Rule A cleanup) if is_id("query") { - pi = pi + 1 has_q = true + pi = pi + 1; has_q = true if is_op("(") { eat_op("(") # optional (vars); omitted when nothing binds - while not is_op(")") { let v = node(E_ID) v.s = eat_id() push(qn.kids, v) if is_op(",") { pi = pi + 1 } } + while not is_op(")") { let v = node(E_ID); v.s = eat_id(); push(qn.kids, v); if is_op(",") { pi = pi + 1 } } eat_op(")") } qn.c = parse_query_tail() qn.b = qn.c.a # where-expr (or null) @@ -50,7 +49,7 @@ fn parse_system() -> Node { let body = block() if has_q { qn.a = body - let wrap = node(N_BLOCK) push(wrap.kids, qn) + let wrap = node(N_BLOCK); push(wrap.kids, qn) n.a = wrap } else { n.a = body } return n @@ -62,12 +61,12 @@ fn parse_query_tail() -> Node { eat_op("[") let q = node(N_BLOCK) while not is_op("]") { - if is_op("{") { pi = pi + 1 let t = node(E_ID) t.s = eat_id() t.ival = 1 push(q.kids, t) eat_op("}") } - else { let t = node(E_ID) t.s = eat_id() t.ival = 0 push(q.kids, t) } + if is_op("{") { pi = pi + 1; let t = node(E_ID); t.s = eat_id(); t.ival = 1; push(q.kids, t); eat_op("}") } + else { let t = node(E_ID); t.s = eat_id(); t.ival = 0; push(q.kids, t) } if is_op(",") { pi = pi + 1 } } eat_op("]") - if is_id("where") { pi = pi + 1 q.a = expr() } + if is_id("where") { pi = pi + 1; q.a = expr() } return q } @@ -75,7 +74,7 @@ fn parse_query_tail() -> Node { fn parse_query_for() -> Node { let n = node(S_QUERY) eat_op("(") - while not is_op(")") { let v = node(E_ID) v.s = eat_id() push(n.kids, v) if is_op(",") { pi = pi + 1 } } + while not is_op(")") { let v = node(E_ID); v.s = eat_id(); push(n.kids, v); if is_op(",") { pi = pi + 1 } } eat_op(")") let inkw = eat_id() # 'in' let qkw = eat_id() # 'query' @@ -86,59 +85,70 @@ fn parse_query_for() -> Node { } fn parse_spawn() -> Node { - pi = pi + 1 let n = node(S_SPAWN) n.s = eat_id() skipnl() eat_op("{") + pi = pi + 1; let n = node(S_SPAWN); n.s = eat_id(); skipnl(); eat_op("{") while true { - skipnl() if is_op("}") { break } - let ci = node(E_FINIT) ci.s = eat_id() eat_op("=") - ci.a = record() # { field = val, ... } + skipnl(); if is_op("}") { break } + let ci = node(E_FINIT); ci.s = eat_id() + ci.a = record() # Comp { field: val, ... } — no `=` before the record push(n.kids, ci) if is_op(",") { pi = pi + 1 } } - eat_op("}") return n + eat_op("}"); return n +} + +# enum Name { A, B, C } — named int constants; a variant's value is its index. +# Accessed as `Name.A` (a compile-time int), so it names magic-int value spaces +# (state ids, menu selections, mode registers) without a runtime cost. +fn parse_enum() -> Node { + pi = pi + 1; let n = node(N_ENUM); n.s = eat_id(); skipnl(); eat_op("{") + while true { skipnl(); if is_op("}") { break } + let v = node(E_ID); v.s = eat_id(); push(n.kids, v) + if is_op(",") { pi = pi + 1 }; skipnl() } + eat_op("}"); return n } # archetype Name { CompA, CompB } — a named entity kind (bundle of components) fn parse_archetype() -> Node { - pi = pi + 1 let n = node(N_ARCH) n.s = eat_id() skipnl() eat_op("{") - while true { skipnl() if is_op("}") { break } - let c = node(E_ID) c.s = eat_id() push(n.kids, c) - if is_op(",") { pi = pi + 1 } skipnl() } - eat_op("}") return n + pi = pi + 1; let n = node(N_ARCH); n.s = eat_id(); skipnl(); eat_op("{") + while true { skipnl(); if is_op("}") { break } + let c = node(E_ID); c.s = eat_id(); push(n.kids, c) + if is_op(",") { pi = pi + 1 }; skipnl() } + eat_op("}"); return n } # extern fn name(params) -> T = "symbol" fn parse_extern() -> Node { pi = pi + 1 # 'extern' let fnkw = eat_id() # 'fn' - let n = node(N_EXTERN) n.s = eat_id() eat_op("(") - while not is_op(")") { let p = node(N_PARAM) p.s = eat_id() eat_op(":") p.ty = ptype() push(n.kids, p) + let n = node(N_EXTERN); n.s = eat_id(); eat_op("(") + while not is_op(")") { let p = node(N_PARAM); p.s = eat_id(); eat_op(":"); p.ty = ptype(); push(n.kids, p) if is_op(",") { pi = pi + 1 } } eat_op(")") n.ty = "void" - if is_op("->") { pi = pi + 1 n.ty = ptype() } + if is_op("->") { pi = pi + 1; n.ty = ptype() } eat_op("=") let t = toks[pi] # "symbol" - n.a = node(E_STR) n.a.s = t.text pi = pi + 1 + n.a = node(E_STR); n.a.s = t.text; pi = pi + 1 return n } # ui Name { widget-tree } — parsed into a widget node tree (emitted later) fn parse_widget() -> Node { - let w = node(N_UI) w.s = eat_id() # widget type name + let w = node(N_UI); w.s = eat_id() # widget type name w.b = node(N_BLOCK) # b.kids = props (E_FINIT) - while toks[pi].kind == TK_ID and toks[pi + 1].kind == TK_OP and streq(toks[pi + 1].text, "=") { - let pr = node(E_FINIT) pr.s = eat_id() eat_op("=") pr.a = expr() push(w.b.kids, pr) + while toks[pi].kind == TK_ID and toks[pi + 1].kind == TK_OP and streq(toks[pi + 1].text, ":") { + let pr = node(E_FINIT); pr.s = eat_id(); eat_op(":"); pr.a = expr(); push(w.b.kids, pr) # widget prop `key: value` (Rule A) } skipnl() if is_op("{") { pi = pi + 1 - while true { skipnl() if is_op("}") { break } push(w.kids, parse_widget()) } + while true { skipnl(); if is_op("}") { break }; push(w.kids, parse_widget()) } eat_op("}") } return w } fn parse_ui() -> Node { - pi = pi + 1 let n = node(N_UI) n.s = eat_id() n.ival = 1 # ival=1 marks the top ui block - skipnl() eat_op("{") skipnl() + pi = pi + 1; let n = node(N_UI); n.s = eat_id(); n.ival = 1 # ival=1 marks the top ui block + skipnl(); eat_op("{"); skipnl() n.a = parse_widget() - skipnl() eat_op("}") + skipnl(); eat_op("}") return n } diff --git a/selfhost/str.ludic b/selfhost/str.ludic index 86124bb8..45189ffe 100644 --- a/selfhost/str.ludic +++ b/selfhost/str.ludic @@ -24,7 +24,7 @@ fn slen(s: ptr) -> int { fn substr(src: ptr, start: int, n: int) -> ptr { let b = mem_alloc(n + 1) let i = 0 - while i < n { poke8(b, i, peek8(src, start + i)) i = i + 1 } + while i < n { poke8(b, i, peek8(src, start + i)); i = i + 1 } poke8(b, n, 0) return b } @@ -39,20 +39,20 @@ fn char_is_alnum(c: int) -> bool { return char_is_alpha(c) or char_is_digit(c) } # integer -> fresh decimal string fn itoa(v: int) -> ptr { - if v == 0 { let z = mem_alloc(2) poke8(z, 0, 48) poke8(z, 1, 0) return z } + if v == 0 { let z = mem_alloc(2); poke8(z, 0, 48); poke8(z, 1, 0); return z } let neg = false let x = v - if x < 0 { neg = true x = 0 - x } + if x < 0 { neg = true; x = 0 - x } let tmp = mem_alloc(16) let n = 0 - while x > 0 { poke8(tmp, n, 48 + x % 10) x = x / 10 n = n + 1 } + while x > 0 { poke8(tmp, n, 48 + x % 10); x = x / 10; n = n + 1 } let total = n if neg { total = total + 1 } let out = mem_alloc(total + 1) let k = 0 - if neg { poke8(out, 0, 45) k = 1 } + if neg { poke8(out, 0, 45); k = 1 } let i = 0 - while i < n { poke8(out, k + i, peek8(tmp, n - 1 - i)) i = i + 1 } + while i < n { poke8(out, k + i, peek8(tmp, n - 1 - i)); i = i + 1 } poke8(out, total, 0) return out } diff --git a/selfhost/tests/control.ludic b/selfhost/tests/control.ludic index 467ae44e..54ac9a05 100644 --- a/selfhost/tests/control.ludic +++ b/selfhost/tests/control.ludic @@ -1,12 +1,12 @@ game T { - fn fib(n: int) -> int { if n < 2 { return n } return fib(n-1) + fib(n-2) } + fn fib(n: int) -> int { if n < 2 { return n }; return fib(n-1) + fib(n-2) } main { print_int(fib(10)) # 55 let s = 0 - for i in 0 .. 10 { if i == 5 { break } if i % 2 == 0 { continue } s = s + i } + for i in 0 .. 10 { if i == 5 { break }; if i % 2 == 0 { continue }; s = s + i } print_int(s) # 1+3 = 4 - let i = 0 let t = 0 - while true { i = i + 1 if i > 5 { break } t = t + i } + let i = 0; let t = 0 + while true { i = i + 1; if i > 5 { break }; t = t + i } print_int(t) # 15 if false and (1/0 == 0) { print_int(999) } else { print_int(1) } # short-circuit: no div by zero } diff --git a/selfhost/tests/match_bits.ludic b/selfhost/tests/match_bits.ludic index 2cce18aa..d37b782a 100644 --- a/selfhost/tests/match_bits.ludic +++ b/selfhost/tests/match_bits.ludic @@ -1,6 +1,6 @@ game T { fn classify(c: int) -> int { - match c { 65, 66 => { return 1 } 67 => { return 2 } _ => { return 9 } } + match c { 65, 66 => { return 1 }; 67 => { return 2 }; _ => { return 9 } } return 0 } main { diff --git a/tools/check-vocabulary.py b/tools/check-vocabulary.py index 15c452e9..501449fb 100755 --- a/tools/check-vocabulary.py +++ b/tools/check-vocabulary.py @@ -142,6 +142,35 @@ kpath = ["repository", "keyword", "patterns"] compare("phases", h_phases, grammar_alternation(grammar, kpath, "FixedUpdate"), "ludic.tmLanguage.json") compare("primitive types", h_types, grammar_alternation(grammar, kpath, "fixed"), "ludic.tmLanguage.json") +# --- against the actual self-hosted parser --------------------------------- +# The compiler moved to Ludic, so the old C cross-check (above) is dark. This +# replaces it: a declaration or clause keyword the highlighter colours must be +# one the parser actually dispatches on, or nobody notices when a keyword is +# highlighted but silently unparsed (exactly what happened to `scene`, `edge`, +# `needs`, …). RESERVED is the escape hatch for documented, not-yet-implemented +# keywords — and it is checked too, so a reserved word that gets implemented +# must be promoted out of it. +def parser_keywords(): + kws = set() + for name in ("parse.ludic", "parse_game.ludic"): + text = open(os.path.join(ROOT, "selfhost", name), encoding="utf-8").read() + kws |= set(re.findall(r'is_id\("([a-z]+)"\)', text)) + kws |= set(re.findall(r'streq\(t\.text,\s*"([a-z]+)"\)', text)) + return kws + +pkw = parser_keywords() +h_reserved = c_string_list(syntax_h, "LUDIC_KW_RESERVED") +if not pkw: + problems.append("could not extract any keywords from selfhost/parse*.ludic") +else: + for label, kws in (("declaration keywords", h_decl), ("clause keywords", h_clause)): + unparsed = (kws - pkw) - h_reserved + if unparsed: + problems.append(f"ludic_syntax.h lists {label} the selfhost parser never dispatches on: {', '.join(sorted(unparsed))}") + promoted = h_reserved & pkw + if promoted: + problems.append(f"LUDIC_KW_RESERVED lists keywords the parser now accepts — promote them into the highlighted vocabulary: {', '.join(sorted(promoted))}") + if problems: print("vocabulary drift:", file=sys.stderr) for p in problems: diff --git a/tools/editors/emacs/ludic-mode.el b/tools/editors/emacs/ludic-mode.el index fa9b8b94..f23bcf80 100644 --- a/tools/editors/emacs/ludic-mode.el +++ b/tools/editors/emacs/ludic-mode.el @@ -11,12 +11,11 @@ ;;; Code: (defconst ludic--declaration-keywords - '("game" "module" "import" "component" "archetype" "ui" "scene" "layer" - "const" "var" "export" "fn" "pure" "extern" "system" "edge" "start" "on")) + '("game" "module" "import" "component" "struct" "archetype" "enum" "ui" + "const" "var" "fn" "extern" "system" "main")) (defconst ludic--clause-keywords - '("phase" "query" "reads" "writes" "needs" "uses" - "requires" "ensures" "invariant" "effects")) + '("phase" "query" "reads" "writes")) (defconst ludic--statement-keywords '("let" "return" "if" "else" "when" "while" "for" "in" "spawn" "despawn" diff --git a/tools/editors/jetbrains/src/main/kotlin/io/ludic/ide/LudicTokens.kt b/tools/editors/jetbrains/src/main/kotlin/io/ludic/ide/LudicTokens.kt index 268db1ab..71dbcf88 100644 --- a/tools/editors/jetbrains/src/main/kotlin/io/ludic/ide/LudicTokens.kt +++ b/tools/editors/jetbrains/src/main/kotlin/io/ludic/ide/LudicTokens.kt @@ -41,12 +41,11 @@ object LudicTokens { */ object LudicVocabulary { val DECL = setOf( - "game", "module", "import", "component", "struct", "archetype", "ui", "scene", "layer", - "const", "var", "export", "fn", "pure", "extern", "system", "edge", "start", "on" + "game", "module", "import", "component", "struct", "archetype", "enum", "ui", + "const", "var", "fn", "extern", "system", "main" ) val CLAUSE = setOf( - "phase", "query", "reads", "writes", "needs", "uses", - "requires", "ensures", "invariant", "effects" + "phase", "query", "reads", "writes" ) val STMT = setOf( "let", "return", "if", "else", "when", "while", "for", "in", "spawn", "despawn", diff --git a/tools/editors/shared/ludic.tmLanguage.json b/tools/editors/shared/ludic.tmLanguage.json index 8b99e208..22b20a5f 100644 --- a/tools/editors/shared/ludic.tmLanguage.json +++ b/tools/editors/shared/ludic.tmLanguage.json @@ -75,35 +75,25 @@ } }, { - "match": "\\b(scene)\\s+([A-Za-z_][A-Za-z0-9_]*)(\\s+start)?", - "captures": { - "1": { "name": "storage.type.scene.ludic" }, - "2": { "name": "entity.name.type.scene.ludic" }, - "3": { "name": "keyword.other.start.ludic" } - } - }, - { - "match": "\\b(layer|ui)\\s+([A-Za-z_][A-Za-z0-9_]*)", + "match": "\\b(ui)\\s+([A-Za-z_][A-Za-z0-9_]*)", "captures": { "1": { "name": "storage.type.ludic" }, "2": { "name": "entity.name.type.ludic" } } }, { - "match": "\\b(edge\\s+)?(system)\\s+([A-Za-z_][A-Za-z0-9_]*)", + "match": "\\b(system)\\s+([A-Za-z_][A-Za-z0-9_]*)", "captures": { - "1": { "name": "storage.modifier.edge.ludic" }, - "2": { "name": "storage.type.system.ludic" }, - "3": { "name": "entity.name.function.system.ludic" } + "1": { "name": "storage.type.system.ludic" }, + "2": { "name": "entity.name.function.system.ludic" } } }, { - "match": "\\b(export\\s+|pure\\s+)?(extern\\s+)?(fn)\\s+([A-Za-z_][A-Za-z0-9_]*)", + "match": "\\b(extern\\s+)?(fn)\\s+([A-Za-z_][A-Za-z0-9_]*)", "captures": { - "1": { "name": "storage.modifier.ludic" }, - "2": { "name": "storage.modifier.extern.ludic" }, - "3": { "name": "storage.type.function.ludic" }, - "4": { "name": "entity.name.function.ludic" } + "1": { "name": "storage.modifier.extern.ludic" }, + "2": { "name": "storage.type.function.ludic" }, + "3": { "name": "entity.name.function.ludic" } } }, { @@ -173,9 +163,9 @@ "patterns": [ { "name": "keyword.control.ludic", "match": "\\b(if|else|when|while|for|in|match|machine|become|enter|return|spawn|despawn|where|break|continue|new)\\b" }, { "name": "keyword.operator.logical.ludic", "match": "\\b(and|or|not)\\b" }, - { "name": "keyword.other.clause.ludic", "match": "\\b(phase|query|reads|writes|needs|uses|requires|ensures|invariant|effects|on)\\b" }, - { "name": "keyword.other.ludic", "match": "\\b(import|export|pure|extern|start|edge)\\b" }, - { "name": "storage.type.ludic", "match": "\\b(game|module|component|archetype|ui|scene|layer|const|var|let|fn|system|state)\\b" }, + { "name": "keyword.other.clause.ludic", "match": "\\b(phase|query|reads|writes)\\b" }, + { "name": "keyword.other.ludic", "match": "\\b(import|extern)\\b" }, + { "name": "storage.type.ludic", "match": "\\b(game|module|component|struct|archetype|enum|ui|const|var|let|fn|system|main|state)\\b" }, { "name": "support.type.primitive.ludic", "match": "\\b(int|fixed|bool|entity|str|ptr|void)\\b" }, { "name": "constant.language.boolean.ludic", "match": "\\b(true|false)\\b" }, { "name": "constant.language.phase.ludic", "match": "\\b(Start|Input|FixedUpdate|Update|LateUpdate|Render)\\b" } diff --git a/tools/editors/vscode/syntaxes/ludic.tmLanguage.json b/tools/editors/vscode/syntaxes/ludic.tmLanguage.json index 8b99e208..22b20a5f 100644 --- a/tools/editors/vscode/syntaxes/ludic.tmLanguage.json +++ b/tools/editors/vscode/syntaxes/ludic.tmLanguage.json @@ -75,35 +75,25 @@ } }, { - "match": "\\b(scene)\\s+([A-Za-z_][A-Za-z0-9_]*)(\\s+start)?", - "captures": { - "1": { "name": "storage.type.scene.ludic" }, - "2": { "name": "entity.name.type.scene.ludic" }, - "3": { "name": "keyword.other.start.ludic" } - } - }, - { - "match": "\\b(layer|ui)\\s+([A-Za-z_][A-Za-z0-9_]*)", + "match": "\\b(ui)\\s+([A-Za-z_][A-Za-z0-9_]*)", "captures": { "1": { "name": "storage.type.ludic" }, "2": { "name": "entity.name.type.ludic" } } }, { - "match": "\\b(edge\\s+)?(system)\\s+([A-Za-z_][A-Za-z0-9_]*)", + "match": "\\b(system)\\s+([A-Za-z_][A-Za-z0-9_]*)", "captures": { - "1": { "name": "storage.modifier.edge.ludic" }, - "2": { "name": "storage.type.system.ludic" }, - "3": { "name": "entity.name.function.system.ludic" } + "1": { "name": "storage.type.system.ludic" }, + "2": { "name": "entity.name.function.system.ludic" } } }, { - "match": "\\b(export\\s+|pure\\s+)?(extern\\s+)?(fn)\\s+([A-Za-z_][A-Za-z0-9_]*)", + "match": "\\b(extern\\s+)?(fn)\\s+([A-Za-z_][A-Za-z0-9_]*)", "captures": { - "1": { "name": "storage.modifier.ludic" }, - "2": { "name": "storage.modifier.extern.ludic" }, - "3": { "name": "storage.type.function.ludic" }, - "4": { "name": "entity.name.function.ludic" } + "1": { "name": "storage.modifier.extern.ludic" }, + "2": { "name": "storage.type.function.ludic" }, + "3": { "name": "entity.name.function.ludic" } } }, { @@ -173,9 +163,9 @@ "patterns": [ { "name": "keyword.control.ludic", "match": "\\b(if|else|when|while|for|in|match|machine|become|enter|return|spawn|despawn|where|break|continue|new)\\b" }, { "name": "keyword.operator.logical.ludic", "match": "\\b(and|or|not)\\b" }, - { "name": "keyword.other.clause.ludic", "match": "\\b(phase|query|reads|writes|needs|uses|requires|ensures|invariant|effects|on)\\b" }, - { "name": "keyword.other.ludic", "match": "\\b(import|export|pure|extern|start|edge)\\b" }, - { "name": "storage.type.ludic", "match": "\\b(game|module|component|archetype|ui|scene|layer|const|var|let|fn|system|state)\\b" }, + { "name": "keyword.other.clause.ludic", "match": "\\b(phase|query|reads|writes)\\b" }, + { "name": "keyword.other.ludic", "match": "\\b(import|extern)\\b" }, + { "name": "storage.type.ludic", "match": "\\b(game|module|component|struct|archetype|enum|ui|const|var|let|fn|system|main|state)\\b" }, { "name": "support.type.primitive.ludic", "match": "\\b(int|fixed|bool|entity|str|ptr|void)\\b" }, { "name": "constant.language.boolean.ludic", "match": "\\b(true|false)\\b" }, { "name": "constant.language.phase.ludic", "match": "\\b(Start|Input|FixedUpdate|Update|LateUpdate|Render)\\b" } diff --git a/tools/ludic-tools/ludic_syntax.h b/tools/ludic-tools/ludic_syntax.h index df1fa73f..bf2a3fc4 100644 --- a/tools/ludic-tools/ludic_syntax.h +++ b/tools/ludic-tools/ludic_syntax.h @@ -52,12 +52,18 @@ typedef struct { * mirror the compiler's parser: anything parse_decl() dispatches on is a * declaration keyword, anything stmt() dispatches on is a statement keyword. */ static const char* LUDIC_KW_DECL[] = { - "game","module","import","component","struct","archetype","ui","scene","layer", - "const","var","export","fn","pure","extern","system","edge","start","on", 0 + "game","module","import","component","struct","archetype","enum","ui", + "const","var","fn","extern","system","main", 0 }; static const char* LUDIC_KW_CLAUSE[] = { - "phase","query","reads","writes","needs","uses", - "requires","ensures","invariant","effects", 0 + "phase","query","reads","writes", 0 +}; +/* Documented design targets the self-hosted parser does not accept yet. Kept + * out of the highlighted vocabulary (they would read as working keywords) until + * they are implemented; check-vocabulary.py verifies the lists above are a + * subset of what selfhost/parse*.ludic actually dispatches on. */ +static const char* LUDIC_KW_RESERVED[] = { + "scene","layer","on","start", 0 }; static const char* LUDIC_KW_STMT[] = { "let","return","if","else","when","while","for","in","spawn","despawn", diff --git a/tools/ludic-tools/ludic_syntax.h.tmp b/tools/ludic-tools/ludic_syntax.h.tmp new file mode 100644 index 00000000..bf2a3fc4 --- /dev/null +++ b/tools/ludic-tools/ludic_syntax.h.tmp @@ -0,0 +1,327 @@ +/* ============================================================================ + * ludic_syntax.h — the lexical layer shared by every Ludic editor tool. + * + * One lexer, one vocabulary. `ludic-fmt`, `ludic-lsp` and the generated + * TextMate grammar all read their keyword/builtin/type tables from here, so an + * addition to the language shows up in every editor at once instead of drifting + * across six hand-maintained copies. + * + * Unlike the compiler's lexer (compiler/ludicc.c) this one is written for + * editors: it keeps comments, keeps newlines, records byte spans for every + * token, and never exits on bad input — a stray character becomes an LT_ERR + * token and lexing continues, because a file being typed into is malformed most + * of the time. + * ==========================================================================*/ +#ifndef LUDIC_SYNTAX_H +#define LUDIC_SYNTAX_H + +#include +#include +#include +#include + +/* ---------- token kinds ---------------------------------------------------*/ +enum { + LT_EOF, LT_NL, LT_COMMENT, + LT_ID, /* a plain identifier */ + LT_KW, /* a reserved word (see KEYWORDS) */ + LT_TYPE, /* a built-in type name: int fixed bool entity str ptr void */ + LT_PHASE, /* Start Input FixedUpdate Update LateUpdate Render */ + LT_BOOL, /* true false */ + LT_INT, LT_FLOAT, LT_STR, LT_CHAR, + LT_ANNO, /* @deterministic — the '@' and the name as one token */ + LT_OP, + LT_ERR +}; + +typedef struct { + int kind; + int start, end; /* byte offsets into the source buffer */ + int line; /* 0-based */ + int bad; /* set on an unterminated string / stray character */ +} LTok; + +typedef struct { + LTok* v; int n, cap; + const char* src; + int* linestart; int nline, caplin; +} LLex; + +/* ---------- the vocabulary ------------------------------------------------*/ +/* Reserved words, grouped so editors can colour them differently. The groups + * mirror the compiler's parser: anything parse_decl() dispatches on is a + * declaration keyword, anything stmt() dispatches on is a statement keyword. */ +static const char* LUDIC_KW_DECL[] = { + "game","module","import","component","struct","archetype","enum","ui", + "const","var","fn","extern","system","main", 0 +}; +static const char* LUDIC_KW_CLAUSE[] = { + "phase","query","reads","writes", 0 +}; +/* Documented design targets the self-hosted parser does not accept yet. Kept + * out of the highlighted vocabulary (they would read as working keywords) until + * they are implemented; check-vocabulary.py verifies the lists above are a + * subset of what selfhost/parse*.ludic actually dispatches on. */ +static const char* LUDIC_KW_RESERVED[] = { + "scene","layer","on","start", 0 +}; +static const char* LUDIC_KW_STMT[] = { + "let","return","if","else","when","while","for","in","spawn","despawn", + "match","machine","state","become","enter","where","and","or","not", + "break","continue","new", 0 +}; +static const char* LUDIC_TYPES[] = { + "int","fixed","bool","entity","str","ptr","void", 0 +}; +static const char* LUDIC_PHASES[] = { + "Start","Input","FixedUpdate","Update","LateUpdate","Render", 0 +}; +static const char* LUDIC_WIDGETS[] = { + "panel","col","row","label","button","image","spacer", 0 +}; +static const char* LUDIC_WIDGET_PROPS[] = { + "id","text","skin","image","align","w","h","pad","gap","size","font", + "inset","grow","bg","fg","border","focus","x","y", 0 +}; + +/* A builtin is a name the runtime provides (`clear(c)` -> rt_clear). An + * intrinsic is a name the compiler lowers directly to libc/OS. Editors treat + * both as "standard library", but the signatures differ, so they stay apart. */ +typedef struct { const char* name; const char* sig; const char* doc; } LBuiltin; + +static const LBuiltin LUDIC_BUILTINS[] = { + {"min","min(a: int, b: int) -> int","Smaller of two integers."}, + {"max","max(a: int, b: int) -> int","Larger of two integers."}, + {"abs","abs(a: int) -> int","Absolute value."}, + {"clamp","clamp(v: int, lo: int, hi: int) -> int","Constrain v to [lo, hi]."}, + {"seed","seed(i: int)","Seed the deterministic RNG."}, + {"rng_range","rng_range(lo: int, hi: int) -> int","Deterministic integer in [lo, hi]."}, + {"rng_chance","rng_chance(pct: int) -> bool","True pct% of the time, deterministically."}, + {"fx","fx(i: int) -> fixed","Widen an int to Q16.16 fixed-point."}, + {"flr","flr(f: fixed) -> int","Truncate a fixed-point value toward zero."}, + {"map_size","map_size(w: int, h: int)","Set the tilemap dimensions."}, + {"map_row","map_row(y: int, row: str)","Fill one tilemap row from a string."}, + {"tile","tile(x: int, y: int) -> int","Tile code at a map cell."}, + {"clear","clear(color: int)","Clear the framebuffer to a 0xRRGGBB colour."}, + {"present","present()","Push the framebuffer to the window (or out.ppm when headless)."}, + {"fill_rect","fill_rect(x: int, y: int, w: int, h: int, color: int)","Filled rectangle."}, + {"frame_rect","frame_rect(x: int, y: int, w: int, h: int, color: int)","One-pixel rectangle outline."}, + {"put_px","put_px(x: int, y: int, color: int)","Write a single pixel."}, + {"text","text(x: int, y: int, s: str, color: int, scale: int)","Draw text with the built-in 5x7 bitmap font."}, + {"text_int","text_int(x: int, y: int, n: int, color: int, scale: int)","Draw an integer with the 5x7 bitmap font."}, + {"font_load","font_load(path: str) -> int","Load a TrueType .ttf/.ttc; returns a font id."}, + {"text_ttf","text_ttf(font: int, x: int, y: int, utf8: str, color: int, px: int)","Draw UTF-8 text with a TrueType font."}, + {"text_w","text_w(font: int, utf8: str, px: int) -> int","Advance width of the string, in pixels."}, + {"text_h","text_h(font: int, px: int) -> int","Line height of the font, in pixels."}, + {"image_load","image_load(path: str) -> int","Decode a PNG into an image id."}, + {"draw_image","draw_image(id: int, x: int, y: int)","Blit an image at its natural size."}, + {"draw_image_scaled","draw_image_scaled(id: int, x: int, y: int, w: int, h: int)","Blit an image stretched to w x h."}, + {"draw_9slice","draw_9slice(id: int, x: int, y: int, w: int, h: int, inset: int)","Nine-slice an image across a w x h box."}, + {"load_png","load_png(path: str) -> int","Decode a PNG as a 16x16 sprite sheet; returns the first sprite id."}, + {"load_sprites","load_sprites(path: str)","Load the sprite sheet used by draw_sprite."}, + {"draw_sprite","draw_sprite(id: int, x: int, y: int)","Blit a sprite."}, + {"draw_sprite_scaled","draw_sprite_scaled(id: int, x: int, y: int, scale: int)","Blit a sprite at an integer scale."}, + {"ui_build","ui_build()","Construct every declared `ui` tree (loads skins and images)."}, + {"ui_open","ui_open(id: int)","Make a ui tree active and focus its first button."}, + {"ui_tick","ui_tick(key: int)","Feed a key to the UI: w/s move focus, space/enter activate."}, + {"ui_render","ui_render()","Lay out and draw the active ui tree."}, + {"ui_clicked","ui_clicked(id: int) -> bool","True on the frame a widget was activated."}, + {"ui_set_text","ui_set_text(id: int, s: str)","Replace a widget's text."}, + {"ui_set_int","ui_set_int(id: int, n: int)","Replace a widget's text with a number."}, + {"ui_focus","ui_focus(id: int)","Move keyboard focus to a widget."}, + {"ui_focused","ui_focused() -> int","Id of the focused widget."}, + {"ui_visible","ui_visible(id: int, on: bool)","Show or hide a widget subtree."}, + {"key","key() -> int","Key code pressed this frame, 0 if none."}, + {"reg","reg(i: int) -> int","Read one of the 64 integer resources shared by systems."}, + {"setreg","setreg(i: int, v: int)","Write one of the 64 integer resources."}, + {"self","self() -> entity","The entity of the innermost query loop."}, + {"save","save()","Write a binary snapshot of the whole ECS world."}, + {"load","load() -> bool","Restore the snapshot; false if there is none."}, + {"status","status(s: str)","Set the one-line status message."}, + {"print_int","print_int(i: int)","Print an integer to stdout."}, + {"quit","quit()","Stop the frame loop and exit."}, + {0,0,0} +}; + +static const LBuiltin LUDIC_INTRINSICS[] = { + {"mem_alloc","mem_alloc(n: int) -> ptr","Allocate n bytes (malloc)."}, + {"mem_realloc","mem_realloc(p: ptr, n: int) -> ptr","Resize a block to n bytes, preserving its contents (realloc)."}, + {"os_argc","os_argc() -> int","Number of command-line arguments, argv[0] included."}, + {"os_arg","os_arg(i: int) -> str","The i-th command-line argument."}, + {"file_stderr","file_stderr() -> ptr","The standard error stream, for file_write."}, + {"mem_free","mem_free(p: ptr)","Release an allocation."}, + {"mem_copy","mem_copy(dst: ptr, src: ptr, n: int)","memcpy."}, + {"mem_set","mem_set(p: ptr, byte: int, n: int)","memset."}, + {"peek8","peek8(p: ptr, off: int) -> int","Read one byte."}, + {"poke8","poke8(p: ptr, off: int, v: int)","Write one byte."}, + {"peek32","peek32(p: ptr, off: int) -> int","Read a 32-bit word."}, + {"poke32","poke32(p: ptr, off: int, v: int)","Write a 32-bit word."}, + {"peekp","peekp(p: ptr, off: int) -> ptr","Read a pointer-sized word."}, + {"pokep","pokep(p: ptr, off: int, v: ptr)","Write a pointer-sized word."}, + {"peekf","peekf(p: ptr, off: int) -> fixed","Read a fixed-point word."}, + {"pokef","pokef(p: ptr, off: int, v: fixed)","Write a fixed-point word."}, + {"ptr_add","ptr_add(p: ptr, off: int) -> ptr","Offset a pointer by bytes."}, + {"ptr_null","ptr_null() -> ptr","The null pointer."}, + {"ptr_is_null","ptr_is_null(p: ptr) -> bool","Null test."}, + {"as_fixed","as_fixed(i: int) -> fixed","Reinterpret an int as fixed (no conversion)."}, + {"as_int","as_int(f: fixed) -> int","Reinterpret a fixed as int (no conversion)."}, + {"file_open","file_open(path: str, mode: str) -> ptr","fopen."}, + {"file_read","file_read(f: ptr, buf: ptr, n: int) -> int","fread."}, + {"file_write","file_write(f: ptr, buf: ptr, n: int) -> int","fwrite."}, + {"file_seek","file_seek(f: ptr, off: int, whence: int) -> int","fseek."}, + {"file_tell","file_tell(f: ptr) -> int","ftell."}, + {"file_close","file_close(f: ptr)","fclose."}, + {"read_byte","read_byte() -> int","Read one byte from stdin, -1 at EOF."}, + {"write_byte","write_byte(b: int)","Write one byte to stdout."}, + {"print_str","print_str(s: str)","Write a string to stdout."}, + {"str_len","str_len(s: str) -> int","Length of a string in bytes."}, + {"shl","shl(v: int, n: int) -> int","Shift left."}, + {"shr","shr(v: int, n: int) -> int","Logical shift right."}, + {"band","band(a: int, b: int) -> int","Bitwise and."}, + {"bor","bor(a: int, b: int) -> int","Bitwise or."}, + {"bxor","bxor(a: int, b: int) -> int","Bitwise xor."}, + {"bnot","bnot(a: int) -> int","Bitwise not."}, + {"os_exit","os_exit(code: int)","Terminate the process."}, + {"os_time","os_time() -> int","Seconds since the epoch."}, + {"is_windowed","is_windowed() -> bool","True when the build has a window."}, + {"game_title","game_title() -> str","The name from the `game` declaration."}, + {"win_open","win_open(title: str, w: int, h: int, scale: int)","Open the platform window."}, + {"win_poll","win_poll() -> int","Pump the event queue; returns a key code."}, + {"win_present","win_present(px: ptr, w: int, h: int)","Blit a framebuffer to the window."}, + {"win_running","win_running() -> bool","False once the window has been closed."}, + {"win_close","win_close()","Close the platform window."}, + {0,0,0} +}; + +static int lud_in(const char** set, const char* s){ + for (int i = 0; set[i]; i++) if (!strcmp(set[i], s)) return 1; + return 0; +} +static const LBuiltin* lud_lookup(const LBuiltin* t, const char* s){ + for (int i = 0; t[i].name; i++) if (!strcmp(t[i].name, s)) return &t[i]; + return 0; +} +static int lud_is_keyword(const char* s){ + return lud_in(LUDIC_KW_DECL, s) || lud_in(LUDIC_KW_CLAUSE, s) || lud_in(LUDIC_KW_STMT, s); +} + +/* ---------- lexing --------------------------------------------------------*/ +static void ltok_push(LLex* L, int kind, int start, int end, int line, int bad){ + if (L->n >= L->cap){ L->cap = L->cap ? L->cap * 2 : 512; L->v = realloc(L->v, L->cap * sizeof(LTok)); } + L->v[L->n++] = (LTok){ kind, start, end, line, bad }; +} +static void lline_push(LLex* L, int off){ + if (L->nline >= L->caplin){ L->caplin = L->caplin ? L->caplin * 2 : 256; L->linestart = realloc(L->linestart, L->caplin * sizeof(int)); } + L->linestart[L->nline++] = off; +} + +static const char* LUDIC_OPS2[] = { "->","+=","-=","*=","/=","==","!=","<=",">=","&&","||","..","=>", 0 }; + +/* Lex the whole buffer. Comments and newlines are kept — the formatter needs + * both, and a highlighter needs the comments. */ +static void lud_lex(LLex* L, const char* src){ + memset(L, 0, sizeof(*L)); + L->src = src; + lline_push(L, 0); + int i = 0, line = 0; + while (src[i]){ + char c = src[i]; + if (c == '\n'){ ltok_push(L, LT_NL, i, i + 1, line, 0); i++; line++; lline_push(L, i); continue; } + if (c == ' ' || c == '\t' || c == '\r'){ i++; continue; } + if (c == '#'){ int s = i; while (src[i] && src[i] != '\n') i++; ltok_push(L, LT_COMMENT, s, i, line, 0); continue; } + if (c == '"'){ + int s = i; i++; int bad = 0; + while (src[i] && src[i] != '"' && src[i] != '\n'){ if (src[i] == '\\' && src[i+1]) i += 2; else i++; } + if (src[i] == '"') i++; else bad = 1; + ltok_push(L, LT_STR, s, i, line, bad); continue; + } + if (c == '\''){ + int s = i; i++; int bad = 0; + if (src[i] == '\\' && src[i+1]) i += 2; else if (src[i] && src[i] != '\n') i++; + if (src[i] == '\'') i++; else bad = 1; + ltok_push(L, LT_CHAR, s, i, line, bad); continue; + } + if (isdigit((unsigned char)c)){ + int s = i; + if (c == '0' && (src[i+1] == 'x' || src[i+1] == 'X')){ + i += 2; while (isxdigit((unsigned char)src[i])) i++; + ltok_push(L, LT_INT, s, i, line, 0); continue; + } + while (isdigit((unsigned char)src[i])) i++; + if (src[i] == '.' && isdigit((unsigned char)src[i+1])){ + i++; while (isdigit((unsigned char)src[i])) i++; + ltok_push(L, LT_FLOAT, s, i, line, 0); continue; + } + ltok_push(L, LT_INT, s, i, line, 0); continue; + } + /* @name is one token: an annotation reads as a unit, and the formatter + * must never put a space between the sigil and the name. */ + if (c == '@' && (isalpha((unsigned char)src[i+1]) || src[i+1] == '_')){ + int s = i; i++; while (isalnum((unsigned char)src[i]) || src[i] == '_') i++; + ltok_push(L, LT_ANNO, s, i, line, 0); continue; + } + if (isalpha((unsigned char)c) || c == '_'){ + int s = i; while (isalnum((unsigned char)src[i]) || src[i] == '_') i++; + int len = i - s; char w[128]; + if (len < (int)sizeof(w)){ memcpy(w, src + s, len); w[len] = 0; } else { w[0] = 0; } + int k = LT_ID; + if (!strcmp(w, "true") || !strcmp(w, "false")) k = LT_BOOL; + else if (lud_in(LUDIC_TYPES, w)) k = LT_TYPE; + else if (lud_in(LUDIC_PHASES, w)) k = LT_PHASE; + else if (lud_is_keyword(w)) k = LT_KW; + ltok_push(L, k, s, i, line, 0); continue; + } + { + int matched = 0; + for (int k = 0; LUDIC_OPS2[k]; k++) + if (src[i] == LUDIC_OPS2[k][0] && src[i+1] == LUDIC_OPS2[k][1]){ + ltok_push(L, LT_OP, i, i + 2, line, 0); i += 2; matched = 1; break; + } + if (matched) continue; + } + if (c == ';'){ ltok_push(L, LT_OP, i, i + 1, line, 0); i++; continue; } + if (strchr("+-*/%<>=(){}[],:.!@", c)){ ltok_push(L, LT_OP, i, i + 1, line, 0); i++; continue; } + /* Anything else is an error token — but a whole UTF-8 character's worth + * at a time. Splitting a multi-byte character into one token per byte + * would let a consumer that re-emits tokens (the formatter) put spaces + * inside it and corrupt the file. */ + { + unsigned char u = (unsigned char)c; + int len = u < 0x80 ? 1 : u < 0xE0 ? 2 : u < 0xF0 ? 3 : 4; + for (int k = 1; k < len; k++) if (!src[i + k] || ((unsigned char)src[i + k] & 0xC0) != 0x80){ len = k; break; } + ltok_push(L, LT_ERR, i, i + len, line, 1); i += len; + } + } + ltok_push(L, LT_EOF, i, i, line, 0); +} +static void lud_lex_free(LLex* L){ free(L->v); free(L->linestart); memset(L, 0, sizeof(*L)); } + +/* ---------- helpers over the token stream --------------------------------*/ +static int ltok_len(const LTok* t){ return t->end - t->start; } +static int ltok_is(const LLex* L, int i, const char* s){ + if (i < 0 || i >= L->n) return 0; + const LTok* t = &L->v[i]; int n = ltok_len(t); + return (int)strlen(s) == n && !strncmp(L->src + t->start, s, n); +} +/* Copy a token's text into a caller buffer; returns buf. */ +static char* ltok_text(const LLex* L, int i, char* buf, int cap){ + const LTok* t = &L->v[i]; int n = ltok_len(t); + if (n >= cap) n = cap - 1; + memcpy(buf, L->src + t->start, n); buf[n] = 0; return buf; +} +/* Index of the next token that is not a newline or comment, or -1. */ +static int ltok_next_sig(const LLex* L, int i){ + for (int j = i + 1; j < L->n; j++){ + int k = L->v[j].kind; + if (k != LT_NL && k != LT_COMMENT) return j; + } + return -1; +} +static int ltok_prev_sig(const LLex* L, int i){ + for (int j = i - 1; j >= 0; j--){ + int k = L->v[j].kind; + if (k != LT_NL && k != LT_COMMENT) return j; + } + return -1; +} +#endif /* LUDIC_SYNTAX_H */ diff --git a/tools/ludic-tools/migrate_records.c b/tools/ludic-tools/migrate_records.c new file mode 100644 index 00000000..db9ccc6e --- /dev/null +++ b/tools/ludic-tools/migrate_records.c @@ -0,0 +1,59 @@ +/* migrate_records.c — one-time migration for Rule A (named fields use ':'). + * Records appear ONLY inside `spawn` blocks, so we track spawn context and, for + * every single '=' inside one: + * - '=' followed by '{' is a component init `Comp = { … }` -> delete it (`Comp { … }`) + * - otherwise is a field binding `field = value` -> rewrite to ':' + * A '=' at a real boundary is a pure re-spelling; the driver's IR-identity check + * (migrated program compiles to the same IR) is the proof. + * usage: migrate_records -> migrated source to stdout + */ +#include +#include +#include +#include "ludic_syntax.h" + +int main(int argc, char** argv){ + if (argc < 2){ fprintf(stderr, "usage: migrate_records \n"); return 2; } + FILE* f = fopen(argv[1], "rb"); + if (!f){ fprintf(stderr, "cannot open %s\n", argv[1]); return 2; } + fseek(f, 0, SEEK_END); long n = ftell(f); fseek(f, 0, SEEK_SET); + char* src = malloc(n + 1); fread(src, 1, n, f); src[n] = 0; fclose(f); + + LLex L; lud_lex(&L, src); + char* rep = calloc(L.n, 1); /* '=' -> ':' */ + char* del = calloc(L.n, 1); /* drop the '=' (component init) */ + + int sp_stack[1024]; int bp = 0; int spawn_active = 0; int pendingSpawn = 0; + for (int i = 0; i < L.n; i++){ + int k = L.v[i].kind; if (k == LT_EOF) break; + if (k == LT_NL || k == LT_COMMENT) continue; + if (k == LT_KW && ltok_is(&L, i, "spawn")) pendingSpawn = 1; + int op1 = (k == LT_OP && ltok_len(&L.v[i]) == 1); + char c0 = L.src[L.v[i].start]; + if (op1 && c0 == '{'){ + if (bp < 1024){ sp_stack[bp] = (pendingSpawn || spawn_active > 0) ? 1 : 0; if (sp_stack[bp]) spawn_active++; bp++; } + pendingSpawn = 0; + } else if (op1 && c0 == '}'){ + if (bp > 0){ bp--; if (sp_stack[bp] && spawn_active > 0) spawn_active--; } + } else if (op1 && c0 == '='){ + if (spawn_active > 0){ + int nx = ltok_next_sig(&L, i); + if (nx >= 0 && L.v[nx].kind == LT_OP && ltok_len(&L.v[nx]) == 1 && L.src[L.v[nx].start] == '{') del[i] = 1; + else rep[i] = 1; + } + } + } + + /* map flags onto byte positions so the rebuild can peek one char ahead */ + char* repb = calloc(n + 1, 1); char* delb = calloc(n + 1, 1); + for (int i = 0; i < L.n; i++){ if (rep[i]) repb[L.v[i].start] = 1; if (del[i]) delb[L.v[i].start] = 1; } + for (int b = 0; b < n; ){ + if (repb[b]){ putchar(':'); b++; continue; } /* '=' -> ':' */ + if (delb[b]){ b++; if (b < n && src[b] == ' ') b++; continue; } /* drop '=' and one space */ + if (src[b] == ' ' && b + 1 < n && repb[b + 1]){ b++; continue; } /* drop the space before ':' -> `field: v` */ + putchar(src[b]); b++; + } + free(repb); free(delb); + lud_lex_free(&L); free(rep); free(del); free(src); + return 0; +} diff --git a/tools/ludic-tools/migrate_separators.c b/tools/ludic-tools/migrate_separators.c new file mode 100644 index 00000000..88bbd728 --- /dev/null +++ b/tools/ludic-tools/migrate_separators.c @@ -0,0 +1,119 @@ +/* sepfix.c — one-time migration for Rule B: insert `;` at statement boundaries + * that are currently spelled with only whitespace. Reuses the toolchain lexer. + * + * A boundary is inserted between two significant, same-line tokens prev,cur when + * - we are at paren/bracket depth 0 (not inside a call's args or an index), AND + * - we are NOT inside a `ui` block (widget props are `k=v`, space-separated, + * and the parser does not skip newlines between them), AND + * - prev can END an operand/statement, AND cur can START a statement. + * Inserting `;` (which the lexer maps to a newline token) at a REAL boundary is + * a semantic no-op under today's permissive parser — the IR-identity check in + * the driver is the proof. Wrong insertions change the IR and are rejected. + * + * usage: sepfix -> writes migrated source to stdout + */ +#include +#include +#include +#include "ludic_syntax.h" + +static const char* STMT_START[] = { + "let","return","if","when","while","for","spawn","despawn", + "match","machine","become","enter","break","continue", 0 +}; + +static int ender(const LLex* L, int i){ + const LTok* t = &L->v[i]; + switch (t->kind){ + case LT_ID: case LT_INT: case LT_FLOAT: case LT_STR: case LT_CHAR: + case LT_BOOL: case LT_TYPE: case LT_PHASE: return 1; + case LT_OP: { + if (ltok_len(t) != 1) return 0; + char c = L->src[t->start]; + if (c == ']'){ + /* `]` closing an empty `[]` is a slice-TYPE marker (`[]Node`), + * not an operand end — the type name that follows continues it. */ + int p = ltok_prev_sig(L, i); + if (p >= 0 && L->v[p].kind == LT_OP && ltok_len(&L->v[p]) == 1 && L->src[L->v[p].start] == '[') return 0; + return 1; + } + return (c == ')' || c == '}'); } + case LT_KW: { char b[32]; ltok_text(L, i, b, sizeof b); + return !strcmp(b, "break") || !strcmp(b, "continue"); } + default: return 0; + } +} +static int starter(const LLex* L, int i){ + const LTok* t = &L->v[i]; + if (t->kind == LT_ID || t->kind == LT_INT || t->kind == LT_FLOAT || + t->kind == LT_STR || t->kind == LT_CHAR || t->kind == LT_BOOL) return 1; + if (t->kind == LT_KW){ char b[32]; ltok_text(L, i, b, sizeof b); return lud_in(STMT_START, b); } + return 0; /* an operator never starts a statement here */ +} + +int main(int argc, char** argv){ + if (argc < 2){ fprintf(stderr, "usage: sepfix \n"); return 2; } + FILE* f = fopen(argv[1], "rb"); + if (!f){ fprintf(stderr, "sepfix: cannot open %s\n", argv[1]); return 2; } + fseek(f, 0, SEEK_END); long n = ftell(f); fseek(f, 0, SEEK_SET); + char* src = malloc(n + 1); fread(src, 1, n, f); src[n] = 0; fclose(f); + + LLex L; lud_lex(&L, src); + + /* insert[k] = 1 means: emit a ';' immediately after token k's bytes */ + char* insert = calloc(L.n, 1); + + int paren = 0; /* unclosed ( or [ */ + /* ui suppression: brace depth stack, marking which open braces are ui/widget */ + int ui_stack[512]; int bp = 0; int ui_active = 0; + int pendingUiOpen = 0; /* saw `ui` or a widget word; the next { is a ui brace */ + + int prev = -1; /* previous significant token index */ + for (int i = 0; i < L.n; i++){ + int k = L.v[i].kind; + if (k == LT_EOF) break; + if (k == LT_NL || k == LT_COMMENT) continue; + + char c0 = L.src[L.v[i].start]; + int op1 = (k == LT_OP && ltok_len(&L.v[i]) == 1); + + /* track ui context by the `ui` KEYWORD only — it brackets the whole + * widget tree via its root brace, so every nested widget brace is + * already inside ui_active. (Do NOT key off widget words like col/row/ + * image/label: those are also ordinary variable names, and matching them + * would wrongly suppress real statement boundaries.) */ + if (k == LT_KW && ltok_is(&L, i, "ui")) pendingUiOpen = 1; + + if (op1 && c0 == '{'){ + if (bp < 512){ ui_stack[bp] = pendingUiOpen; bp++; if (pendingUiOpen) ui_active++; } + pendingUiOpen = 0; + } else if (op1 && c0 == '}'){ + if (bp > 0){ bp--; if (ui_stack[bp]) { if (ui_active) ui_active--; } } + } else if (op1 && (c0 == '(' || c0 == '[')){ paren++; if (getenv("SEPFIX_TRACE")) fprintf(stderr, " L%d '%c' -> paren=%d\n", L.v[i].line + 1, c0, paren); } + else if (op1 && (c0 == ')' || c0 == ']')){ if (paren > 0) paren--; if (getenv("SEPFIX_TRACE")) fprintf(stderr, " L%d '%c' -> paren=%d\n", L.v[i].line + 1, c0, paren); } + + /* candidate boundary between prev and this token */ + if (prev >= 0 && paren == 0 && !ui_active && + L.v[prev].line == L.v[i].line && + ender(&L, prev) && starter(&L, i)){ + insert[prev] = 1; + } + prev = i; + } + + if (getenv("SEPFIX_DEBUG")) fprintf(stderr, "END STATE %s: paren=%d ui_active=%d bp=%d\n", argv[1], paren, ui_active, bp); + + /* rebuild: copy bytes, dropping in ';' right after any token flagged */ + for (int i = 0, t = 0; i < n; ){ + /* find if a token ends exactly at i and is flagged */ + putchar(src[i]); + i++; + /* emit ';' after the last byte of a flagged token */ + for (; t < L.n; t++){ + if (L.v[t].end == i && insert[t]){ putchar(';'); break; } + if (L.v[t].end > i) break; + } + } + lud_lex_free(&L); free(insert); free(src); + return 0; +} diff --git a/tools/ludic-tools/migrate_ui.c b/tools/ludic-tools/migrate_ui.c new file mode 100644 index 00000000..df8711aa --- /dev/null +++ b/tools/ludic-tools/migrate_ui.c @@ -0,0 +1,52 @@ +/* migrate_ui.c — one-time migration for Rule A in `ui` blocks: widget props go + * from `key=value` to `key: value`. Every '=' inside a `ui` block is a prop + * separator (values are expressions, never contain a top-level '='), so we track + * ui context (armed by the `ui` keyword's root brace) and rewrite each '=' to a + * ':' with canonical spacing (`id: Root`). The driver's IR-identity check proves + * it is a pure re-spelling (the parser builds the same E_FINIT nodes). + * usage: migrate_ui -> migrated source to stdout + */ +#include +#include +#include +#include "ludic_syntax.h" + +int main(int argc, char** argv){ + if (argc < 2){ fprintf(stderr, "usage: migrate_ui \n"); return 2; } + FILE* f = fopen(argv[1], "rb"); + if (!f){ fprintf(stderr, "cannot open %s\n", argv[1]); return 2; } + fseek(f, 0, SEEK_END); long n = ftell(f); fseek(f, 0, SEEK_SET); + char* src = malloc(n + 1); fread(src, 1, n, f); src[n] = 0; fclose(f); + + LLex L; lud_lex(&L, src); + char* repb = calloc(n + 1, 1); /* byte position of a '=' to rewrite as ':' */ + + int ui_stack[1024]; int bp = 0; int ui_active = 0; int pendingUi = 0; + for (int i = 0; i < L.n; i++){ + int k = L.v[i].kind; if (k == LT_EOF) break; + if (k == LT_NL || k == LT_COMMENT) continue; + if (k == LT_KW && ltok_is(&L, i, "ui")) pendingUi = 1; + int op1 = (k == LT_OP && ltok_len(&L.v[i]) == 1); + char c0 = L.src[L.v[i].start]; + if (op1 && c0 == '{'){ + if (bp < 1024){ ui_stack[bp] = (pendingUi || ui_active > 0) ? 1 : 0; if (ui_stack[bp]) ui_active++; bp++; } + pendingUi = 0; + } else if (op1 && c0 == '}'){ + if (bp > 0){ bp--; if (ui_stack[bp] && ui_active > 0) ui_active--; } + } else if (op1 && c0 == '=' && ui_active > 0){ + repb[L.v[i].start] = 1; + } + } + + for (int b = 0; b < n; ){ + if (repb[b]){ /* '=' -> ': ' with a single trailing space */ + putchar(':'); b++; + if (b < n && src[b] != ' ' && src[b] != '\n') putchar(' '); + continue; + } + if (src[b] == ' ' && b + 1 < n && repb[b + 1]){ b++; continue; } /* drop the space before ':' */ + putchar(src[b]); b++; + } + lud_lex_free(&L); free(repb); free(src); + return 0; +}