From ba4a3c5be70d473479e663be0400b798f88c113d Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Sun, 22 Aug 2021 21:38:22 -0700 Subject: [PATCH] start throwing error on labels too far for /disp8 While I'm doing this I might as well lay out a story I don't seem to have told before in this commit log. I translated Mu programs to Linux before I did so to bare metal like I do in the top-level these days. The translator programs still run from the linux/ directory. However they don't always have good error messages. As long as I was translating to Linux this wasn't a huge deal because I always translated Mu programs using the bootstrap translator in linux/bootstrap/ -- which has great error messages. However, linux/bootstrap/ can't build bare-metal programs because boot.subx uses real-mode instructions that aren't supported. As a hack I created a script called misc_checks that at least tries to run everything besides boot.subx -- even though translation can never succeed. If I run it and get to errors about unknown variables I know everything besides boot.subx raised no errors. Having labels too far in /disp8 args is is the single biggest reason we need the misc_checks hack. Hopefully it's now obsolete. --- linux/labels_baremetal | Bin 52042 -> 52290 bytes linux/labels_baremetal.subx | 70 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/linux/labels_baremetal b/linux/labels_baremetal index ce80777e11cb87b0e893b55248c51df0eabf6ecb..c1db3ad6f47935821254c38c6792c74bdf544fcb 100755 GIT binary patch literal 52290 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 diff --git a/linux/labels_baremetal.subx b/linux/labels_baremetal.subx index 54d45425..be1dc768 100644 --- a/linux/labels_baremetal.subx +++ b/linux/labels_baremetal.subx @@ -435,6 +435,10 @@ emit-output: # in: (addr stream byte), out: (addr buffered-file), labels: (addr # emit(out, *address, 4) # else if has-metadata?(word-slice, "disp8") # value = *address - address-of-next-instruction + # if value > 127 + # abort + # if value < -128 + # abort # emit(out, value, 1) # else if has-metadata?(word-slice, "disp32") # if far-jump-or-call? @@ -1013,6 +1017,12 @@ $emit-output:emit-disp8: # var value/eax: int = *address - address-of-next-instruction 8b/copy 0/mod/indirect 6/rm32/esi . . . 0/r32/eax . . # copy *esi to eax 29/subtract 3/mod/direct 0/rm32/eax . . . 3/r32/ebx . . # subtract ebx from eax + # if (value > 127) abort + 3d/compare-eax-and 0x7f/imm32 + 0f 8f/jump-if-> $emit-output:error-disp8-too-large/disp32 + # if (value < -128) abort + 3d/compare-eax-and -0x80/imm32 + 0f 8c/jump-if-< $emit-output:error-disp8-too-large/disp32 # emit-hex(out, value, 1) # . . push args 68/push 1/imm32 @@ -1139,6 +1149,66 @@ $emit-output:abort: e8/call syscall_exit/disp32 # never gets here +$emit-output:error-disp8-too-large: + # print(stderr, word-slice ": label too far below for /disp8; use /disp32") + # . write-slice-buffered(Stderr, word-slice) + # . . push args + 52/push-edx + 68/push Stderr/imm32 + # . . call + e8/call write-slice-buffered/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + # . flush(Stderr) + # . . push args + 68/push Stderr/imm32 + # . . call + e8/call flush/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + # . _write(2/stderr, msg) + # . . push args + 68/push ": label too far below for /disp8; use /disp32"/imm32 + 68/push 2/imm32/stderr + # . . call + e8/call _write/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + # . syscall_exit(1) + bb/copy-to-ebx 1/imm32 + e8/call syscall_exit/disp32 + # never gets here + +$emit-output:error-disp8-too-small: + # print(stderr, word-slice ": label too far above for /disp8; use /disp32") + # . write-slice-buffered(Stderr, word-slice) + # . . push args + 52/push-edx + 68/push Stderr/imm32 + # . . call + e8/call write-slice-buffered/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + # . flush(Stderr) + # . . push args + 68/push Stderr/imm32 + # . . call + e8/call flush/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp + # . _write(2/stderr, msg) + # . . push args + 68/push ": label too far above for /disp8; use /disp32"/imm32 + 68/push 2/imm32/stderr + # . . call + e8/call _write/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp + # . syscall_exit(1) + bb/copy-to-ebx 1/imm32 + e8/call syscall_exit/disp32 + # never gets here + test-emit-output-non-far-control-flow: # labels turn into absolute addresses if opcodes are not far jumps or calls #