about summary refs log tree commit diff stats
path: root/subx/apps
Commit message (Collapse)AuthorAgeFilesLines
* 5444Kartik Agaram2019-07-221-0/+0
|
* 5443 - standard library is now self-hostedKartik Agaram2019-07-228-5/+17
| | | | | | | Translates 5k lines of input in 26 seconds. I'm not sure why I need to grow the label table. It was already 512 entries long, and I'm only using 373 so far.
* 5442Kartik Agaram2019-07-228-2/+74
| | | | | | | | | We can now translate layers 49-72 using the self-hosted translator. The translator has now demonstrated translation over 4k lines. Most verbose phase output is 325KB, even if the final binary is 15KB. Emulation is too slow now, so I'm back to debug by print on a Linux machine.
* 5438 - raise error on uppercase hexKartik Agaram2019-07-2110-0/+0
| | | | | | | | | | | | | | | | | | We can now translate layers 49-56 using the self-hosted translator (`translate` and `ntranslate`). As a follow-up to commit 5404, the self-hosted translator is a little more strict than the C++ translator in 3 places: a) All .subx files must define a data segment. b) All .subx files must define an `Entry` label. c) All numbers must be in *lowercase* hex. In all cases, where programs work with the C++ translator but violate the self-hosted translator's assumptions, we must make sure we raise errors rather than silently emit bad code.
* 5437Kartik Agaram2019-07-2110-0/+0
| | | | Break a dependency from `print-int32` to `from-hex-char`.
* 5436 - support newlines in dquotesKartik Agaram2019-07-214-8/+85
|
* 5435 - redo 5426Kartik Agaram2019-07-214-6/+99
| | | | | We can now translate layers 49-55 using translate and ntranslate. Next step is to support '\n' in dquotes.subx.
* 5434Kartik Agaram2019-07-216-2/+18
|
* 5433Kartik Agaram2019-07-216-2/+2
|
* 5432Kartik Agaram2019-07-211-0/+0
|
* 5430 - all examples passingKartik Agaram2019-07-203-4/+283
| | | | | We now have a new pass called 'tests' which code-generates a new function called 'run-tests', just like the C++ layer `tests.cc`.
* 5429Kartik Agaram2019-07-209-0/+0
| | | | Fix CI.
* 5426Kartik Agaram2019-07-208-19/+23
|
* 5422Kartik Agaram2019-07-196-12/+52
| | | | | Various buffer sizes needed to be grown for ex11. But the next bottleneck is that we need to code-generate run-tests.
* 5419Kartik Agaram2019-07-192-35/+547
| | | | | | | | | | | Bugfix fourteen: we need different address computation logic for code vs data labels. It's really about different categories of instructions having different address computation logic. This subtle distinction will make good error messages hard. But that's a problem for later. Now there's just one example program not translating.
* 5417Kartik Agaram2019-07-182-8/+8
| | | | Clean up.
* 5416Kartik Agaram2019-07-182-1/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Figured out what's going in with bug fourteen: displacement operands aren't always used relative to the PC. Does this mean I need to track instruction boundaries past pack? :'( No, I just need different logic for labels in code vs data segments. This was an interesting bug for reminding me of the difference between the emulator-level trace and the application-level trace. The former has 1.5 million lines, while the latter has a dozen. Luckily, just dumping the latter immediately made obvious what the issue was. Though this experience does suggest some further ideas for debugging tools: slice trace by line and phase slice trace by start and end label debug UI for SubX translator 2D layout: rows = lines of code; columns = translator phases each 'cell' in this layout contains a list of log lines shows what came in, what was emitted easily collapse any cell These are domain-specific tools. Special-cased to the SubX translator phases.
* 5415Kartik Agaram2019-07-172-2/+2
| | | | | | | | Bugfix thirteen: displacement calculations were wrong because current offset was not being updated properly as words were being read and emitted. Now 10/12 example programs are translated correctly.
* 5413Kartik Agaram2019-07-172-4/+104
| | | | | | | Bugfix twelve: ModR/M was being incorrectly computed. This is one of two problems with subx/examples/ex3, so no new passing examples.
* 5409Kartik Agaram2019-07-172-4/+6
| | | | | Bugfix eleven: segment flags were incorrectly computed. examples/ex1 now verified! Added to CI.
* 5408Kartik Agaram2019-07-1610-63/+81
| | | | | | | | | | | | Bugfix ten: type error in `convert`. I was calling `rewind-stream` on a `buffered-file`. examples/ex1 is now just one nibble off the canonical. I *have* found one missing feature in the self-hosted translator, though: dquotes doesn't support newlines in strings, even though the C++ version does. dquotes parses them right, but the value initialized in the data segment is wrong.
* 5407Kartik Agaram2019-07-152-0/+7
| | | | | | | Bugfix nine: flush(out) after translation is done. Still one remaining bug from comparing ELF binaries: emit-segments prints nothing for some reason.
* 5406Kartik Agaram2019-07-152-4/+4
| | | | | | | Bugfix eight: incorrect segment count in ELF header. The generated examples/ex1 is still not right. But it has the second segment now. Or almost all of it. Final byte is missing for some reason.
* 5404 - subx/examples/ex1 now translatingKartik Agaram2019-07-152-10/+44
| | | | | | | | | | | | | | | | | | | The result isn't an identical binary to before, and it segfaults when run. But it's bugfix seven. A couple of places where we make .subx files a little more strict: a) All .subx files must define a data segment. Even if they have no data. b) All .subx files must define an `Entry` label for the binary to start at. Earlier we used to default to the start of the code label. That's not too hard to add; we'd just need to: i) rename `get` to `get-or-abort` ii) clone a third variant of `get-or-insert` called `get` that returns null if the key is not found. iii) use `get` rather than `get-or-abort` when looking up the `Entry` label.
* .Kartik Agaram2019-07-131-1/+0
|
* .Kartik Agaram2019-07-132-132/+132
| | | | Clean up.
* .Kartik Agaram2019-07-133-0/+0
|
* survey.subx now passing all testsKartik Agaram2019-07-132-8/+34
|
* grow the output stream; test now completesKartik Agaram2019-07-131-2/+18
| | | | All assertions in `test-convert-computes-addresses` still failing.
* `test-convert-computes-addresses` bugfix sixKartik Agaram2019-07-132-72/+135
| | | | | | | | | | | | | | | map of how far we've gotten by now (functions with '*' independently tested): ✓ compute-offsets* ✓ compute-addresses* ✓ emit-output ✓ emit-headers ✓ emit-elf-header ✓ emit-hex-array* ✓ first emit-elf-program-header-entry ✓ emit-hex-array* ? second emit-elf-program-header-entry emit-hex-array* emit-segments*
* .Kartik Agaram2019-07-133-0/+0
|
* fixed fifth bug, hit sixthKartik Agaram2019-07-132-5/+6
|
* .Kartik Agaram2019-07-132-170/+0
| | | | Clean up.
* fixed fourth bug, hit fifthKartik Agaram2019-07-132-50/+289
|
* fixed third bug, hit fourthKartik Agaram2019-07-131-1/+1
|
* .Kartik Agaram2019-07-132-190/+0
| | | | Clean up.
* fixed second bug, hit thirdKartik Agaram2019-07-132-2/+290
|
* .Kartik Agaram2019-07-133-41/+39
|
* fixed one bug, hit anotherKartik Agaram2019-07-122-58/+87
| | | | | | | | | | I carefully logged the segment a label is declared in but forgot to actually save it in the table. This has been a theoretic concern for some time, but I've never seen it actually happen until now. SubX is just too low level. Now I get past the first two phases but code generation fails to find the 'Entry' label.
* .Kartik Agaram2019-07-121-2/+55
| | | | | | | | Snapshot at a random moment, showing a new debugging trick: hacking on the C++ level to dump memory contents on specific labels. For some reason label 'x' doesn't have a segment assigned by the time we get to compute-addresses.
* compute-offsets test now passingKartik Agaram2019-07-122-49/+97
| | | | The final integration test-convert-computes-addresses is still failing.
* the pseudocode is pretty long, so add an outlineKartik Agaram2019-07-121-2/+11
|
* rearrange compute-offsets casesKartik Agaram2019-07-121-73/+74
| | | | | Now they're in the order you expect to see them at runtime: first you see a segment header, then you see labels.
* .Kartik Agaram2019-07-121-26/+26
| | | | move trace dump to before checks
* .Kartik Agaram2019-07-111-1/+0
|
* one failure remaining in test-compute-offsetsKartik Agaram2019-07-112-123/+291
| | | | | | | | | 'curr-segment-name' is now a string, and it's stored in a register rather than a global. Paradoxically, this leaks *less* than before. Before, every call to `get-or-insert-slice` leaked memory. Now we leak one string for every new segment. Which is trivial.
* .Kartik Agaram2019-07-111-12/+12
|
* .Kartik Agaram2019-07-111-7/+5
| | | | | Pseudocode is a little more truthful now about what variables are on the stack.
* the problem: curr-segment-name is staleKartik Agaram2019-07-111-3/+126
| | | | | | | It's a slice into the 'line' stream. But we want to preserve the current segment name across lines. Let's leak some memory.
* .Kartik Agaram2019-07-111-14/+14
| | | | Make the trace a little more consistent.