always check for null in 'get' instructions
This commit is contained in:
parent
540fd66473
commit
e74050ade4
|
@ -57,3 +57,6 @@ __check-mu-array-bounds:overflow:
|
||||||
eb/jump loop/disp8
|
eb/jump loop/disp8
|
||||||
}
|
}
|
||||||
# never gets here
|
# never gets here
|
||||||
|
|
||||||
|
__mu-abort-null-get-base-address:
|
||||||
|
(abort "null address in 'get'")
|
||||||
|
|
|
@ -84,3 +84,11 @@ __check-mu-array-bounds:overflow:
|
||||||
# "81 0/subop/add %esp 4/imm32" # drop function name
|
# "81 0/subop/add %esp 4/imm32" # drop function name
|
||||||
# # actually save the index addr in reg
|
# # actually save the index addr in reg
|
||||||
# "8d/copy-address *(" rega "+" regi "<<" log2(size-of(T)) "+4) " reg "/r32"
|
# "8d/copy-address *(" rega "+" regi "<<" log2(size-of(T)) "+4) " reg "/r32"
|
||||||
|
|
||||||
|
__mu-abort-null-get-base-address:
|
||||||
|
(write-buffered Stderr "null address in 'get'\n")
|
||||||
|
(flush Stderr)
|
||||||
|
# exit(1)
|
||||||
|
bb/copy-to-ebx 1/imm32
|
||||||
|
e8/call syscall_exit/disp32
|
||||||
|
# never gets here
|
||||||
|
|
|
@ -6879,16 +6879,20 @@ test-convert-function-and-type-definition:
|
||||||
(check-next-stream-line-equal _test-output-stream " ff 6/subop/push %eax" "F - test-convert-function-and-type-definition/6")
|
(check-next-stream-line-equal _test-output-stream " ff 6/subop/push %eax" "F - test-convert-function-and-type-definition/6")
|
||||||
(check-next-stream-line-equal _test-output-stream " 8b/-> *(ebp+0x00000008) 0x00000000/r32" "F - test-convert-function-and-type-definition/7")
|
(check-next-stream-line-equal _test-output-stream " 8b/-> *(ebp+0x00000008) 0x00000000/r32" "F - test-convert-function-and-type-definition/7")
|
||||||
(check-next-stream-line-equal _test-output-stream " ff 6/subop/push %ecx" "F - test-convert-function-and-type-definition/8")
|
(check-next-stream-line-equal _test-output-stream " ff 6/subop/push %ecx" "F - test-convert-function-and-type-definition/8")
|
||||||
(check-next-stream-line-equal _test-output-stream " 8d/copy-address *(eax + 0x00000000) 0x00000001/r32" "F - test-convert-function-and-type-definition/9")
|
(check-next-stream-line-equal _test-output-stream " 81 7/subop/compare %eax 0/imm32" "F - test-convert-function-and-type-definition/9")
|
||||||
(check-next-stream-line-equal _test-output-stream " 8d/copy-address *(eax + 0x00000004) 0x00000001/r32" "F - test-convert-function-and-type-definition/11")
|
(check-next-stream-line-equal _test-output-stream " 0f 84/jump-if-= __mu-abort-null-get-base-address/disp32" "F - test-convert-function-and-type-definition/10")
|
||||||
(check-next-stream-line-equal _test-output-stream " 8f 0/subop/pop %ecx" "F - test-convert-function-and-type-definition/13")
|
(check-next-stream-line-equal _test-output-stream " 8d/copy-address *(eax + 0x00000000) 0x00000001/r32" "F - test-convert-function-and-type-definition/11")
|
||||||
(check-next-stream-line-equal _test-output-stream " 8f 0/subop/pop %eax" "F - test-convert-function-and-type-definition/14")
|
(check-next-stream-line-equal _test-output-stream " 81 7/subop/compare %eax 0/imm32" "F - test-convert-function-and-type-definition/12")
|
||||||
(check-next-stream-line-equal _test-output-stream " }" "F - test-convert-function-and-type-definition/15")
|
(check-next-stream-line-equal _test-output-stream " 0f 84/jump-if-= __mu-abort-null-get-base-address/disp32" "F - test-convert-function-and-type-definition/13")
|
||||||
(check-next-stream-line-equal _test-output-stream "$foo:0x00000001:break:" "F - test-convert-function-and-type-definition/16")
|
(check-next-stream-line-equal _test-output-stream " 8d/copy-address *(eax + 0x00000004) 0x00000001/r32" "F - test-convert-function-and-type-definition/14")
|
||||||
(check-next-stream-line-equal _test-output-stream " # . epilogue" "F - test-convert-function-and-type-definition/17")
|
(check-next-stream-line-equal _test-output-stream " 8f 0/subop/pop %ecx" "F - test-convert-function-and-type-definition/15")
|
||||||
(check-next-stream-line-equal _test-output-stream " 89/<- %esp 5/r32/ebp" "F - test-convert-function-and-type-definition/18")
|
(check-next-stream-line-equal _test-output-stream " 8f 0/subop/pop %eax" "F - test-convert-function-and-type-definition/16")
|
||||||
(check-next-stream-line-equal _test-output-stream " 5d/pop-to-ebp" "F - test-convert-function-and-type-definition/19")
|
(check-next-stream-line-equal _test-output-stream " }" "F - test-convert-function-and-type-definition/17")
|
||||||
(check-next-stream-line-equal _test-output-stream " c3/return" "F - test-convert-function-and-type-definition/20")
|
(check-next-stream-line-equal _test-output-stream "$foo:0x00000001:break:" "F - test-convert-function-and-type-definition/18")
|
||||||
|
(check-next-stream-line-equal _test-output-stream " # . epilogue" "F - test-convert-function-and-type-definition/19")
|
||||||
|
(check-next-stream-line-equal _test-output-stream " 89/<- %esp 5/r32/ebp" "F - test-convert-function-and-type-definition/20")
|
||||||
|
(check-next-stream-line-equal _test-output-stream " 5d/pop-to-ebp" "F - test-convert-function-and-type-definition/21")
|
||||||
|
(check-next-stream-line-equal _test-output-stream " c3/return" "F - test-convert-function-and-type-definition/22")
|
||||||
# . epilogue
|
# . epilogue
|
||||||
89/<- %esp 5/r32/ebp
|
89/<- %esp 5/r32/ebp
|
||||||
5d/pop-to-ebp
|
5d/pop-to-ebp
|
||||||
|
@ -29754,17 +29758,35 @@ translate-mu-get-stmt: # out: (addr buffered-file), stmt: (addr stmt)
|
||||||
50/push-eax
|
50/push-eax
|
||||||
51/push-ecx
|
51/push-ecx
|
||||||
52/push-edx
|
52/push-edx
|
||||||
#
|
|
||||||
(emit-indent *(ebp+8) *Curr-block-depth)
|
|
||||||
(write-buffered *(ebp+8) "8d/copy-address ")
|
|
||||||
# ecx = stmt
|
# ecx = stmt
|
||||||
8b/-> *(ebp+0xc) 1/r32/ecx
|
8b/-> *(ebp+0xc) 1/r32/ecx
|
||||||
|
# var base/eax: (addr var) = stmt->inouts->value
|
||||||
|
(lookup *(ecx+0xc) *(ecx+0x10)) # Stmt1-inouts Stmt1-inouts => eax
|
||||||
|
(lookup *eax *(eax+4)) # Stmt-var-value Stmt-var-value => eax
|
||||||
|
# if base is in a register, insert a null check
|
||||||
|
81 7/subop/compare *(eax+0x18) 0/imm32 # Var-register
|
||||||
|
{
|
||||||
|
0f 84/jump-if-= break/disp32
|
||||||
|
$translate-mu-get-stmt:emit-null-check-for-register-input:
|
||||||
|
# emit "81 7/subop/compare %" base->register " 0/imm32\n"
|
||||||
|
(emit-indent *(ebp+8) *Curr-block-depth)
|
||||||
|
(write-buffered *(ebp+8) "81 7/subop/compare %")
|
||||||
|
(lookup *(eax+0x18) *(eax+0x1c)) # Var-register Var-register => eax
|
||||||
|
(write-buffered *(ebp+8) %eax)
|
||||||
|
(write-buffered *(ebp+8) " 0/imm32\n")
|
||||||
|
#
|
||||||
|
(emit-indent *(ebp+8) *Curr-block-depth)
|
||||||
|
(write-buffered *(ebp+8) "0f 84/jump-if-= __mu-abort-null-get-base-address/disp32\n")
|
||||||
|
}
|
||||||
# var offset/edx: int = get offset of stmt
|
# var offset/edx: int = get offset of stmt
|
||||||
(mu-get-offset %ecx) # => eax
|
(mu-get-offset %ecx) # => eax
|
||||||
89/<- %edx 0/r32/eax
|
89/<- %edx 0/r32/eax
|
||||||
# var base/eax: (addr var) = stmt->inouts->value
|
# var base/eax: (addr var) = stmt->inouts->value
|
||||||
(lookup *(ecx+0xc) *(ecx+0x10)) # Stmt1-inouts Stmt1-inouts => eax
|
(lookup *(ecx+0xc) *(ecx+0x10)) # Stmt1-inouts Stmt1-inouts => eax
|
||||||
(lookup *eax *(eax+4)) # Stmt-var-value Stmt-var-value => eax
|
(lookup *eax *(eax+4)) # Stmt-var-value Stmt-var-value => eax
|
||||||
|
#
|
||||||
|
(emit-indent *(ebp+8) *Curr-block-depth)
|
||||||
|
(write-buffered *(ebp+8) "8d/copy-address ")
|
||||||
# if base is in a register
|
# if base is in a register
|
||||||
81 7/subop/compare *(eax+0x18) 0/imm32 # Var-register
|
81 7/subop/compare *(eax+0x18) 0/imm32 # Var-register
|
||||||
{
|
{
|
||||||
|
|
|
@ -374,10 +374,14 @@ If a record (product) type T was defined to have elements a, b, c, ... of
|
||||||
types T_a, T_b, T_c, ..., then accessing one of those elements f of type T_f:
|
types T_a, T_b, T_c, ..., then accessing one of those elements f of type T_f:
|
||||||
|
|
||||||
var/reg: (addr T_f) <- get var2/reg2: (addr T), f
|
var/reg: (addr T_f) <- get var2/reg2: (addr T), f
|
||||||
=> "8d/copy-address *(" reg2 "+" offset(f) ") " reg "/r32"
|
=> "81 7/subop/compare %" reg2 " 0/imm32"
|
||||||
|
"0f 84/jump-if-= __mu-abort-null-get-base-address/disp32"
|
||||||
|
"8d/copy-address *(" reg2 "+" offset(f) ") " reg "/r32"
|
||||||
var/reg: (addr T_f) <- get var2: T, f
|
var/reg: (addr T_f) <- get var2: T, f
|
||||||
=> "8d/copy-address *(ebp+" var2.stack-offset "+" offset(f) ") " reg "/r32"
|
=> "8d/copy-address *(ebp+" var2.stack-offset "+" offset(f) ") " reg "/r32"
|
||||||
|
|
||||||
|
When the base is an address we perform a null check.
|
||||||
|
|
||||||
# Allocating memory
|
# Allocating memory
|
||||||
|
|
||||||
allocate in: (addr handle T)
|
allocate in: (addr handle T)
|
||||||
|
|
Loading…
Reference in New Issue