As a follow-up to #5780, disassemble the regions identified by bb_starts, falling back on disassembling the whole buffer. This ensures that instructions like br_table that introduce a lot of constants don't throw off capstone for the remainder of the function. --------- Co-authored-by: Jamey Sharp <jamey@minilop.net>
324 lines
6.0 KiB
Plaintext
324 lines
6.0 KiB
Plaintext
test compile precise-output
|
|
target s390x
|
|
|
|
function %foo() {
|
|
block0:
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; block0:
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; br %r14
|
|
|
|
function %stack_limit_leaf_zero(i64 stack_limit) {
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; block0:
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; br %r14
|
|
|
|
function %stack_limit_gv_leaf_zero(i64 vmctx) {
|
|
gv0 = vmctx
|
|
gv1 = load.i64 notrap aligned gv0
|
|
gv2 = load.i64 notrap aligned gv1+4
|
|
stack_limit = gv2
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; block0:
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; br %r14
|
|
|
|
function %stack_limit_call_zero(i64 stack_limit) {
|
|
fn0 = %foo()
|
|
block0(v0: i64):
|
|
call fn0()
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; clgrtle %r15, %r2
|
|
; stmg %r14, %r15, 112(%r15)
|
|
; aghi %r15, -160
|
|
; virtual_sp_offset_adjust 160
|
|
; block0:
|
|
; bras %r1, 12 ; data %foo + 0 ; lg %r4, 0(%r1)
|
|
; basr %r14, %r4
|
|
; lmg %r14, %r15, 272(%r15)
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; clgrtle %r15, %r2 ; trap: stk_ovf
|
|
; stmg %r14, %r15, 0x70(%r15)
|
|
; aghi %r15, -0xa0
|
|
; block1: ; offset 0xe
|
|
; bras %r1, 0x1a
|
|
; .byte 0x00, 0x00 ; reloc_external Abs8 %foo 0
|
|
; .byte 0x00, 0x00
|
|
; .byte 0x00, 0x00
|
|
; .byte 0x00, 0x00
|
|
; lg %r4, 0(%r1)
|
|
; basr %r14, %r4
|
|
; lmg %r14, %r15, 0x110(%r15)
|
|
; br %r14
|
|
|
|
function %stack_limit_gv_call_zero(i64 vmctx) {
|
|
gv0 = vmctx
|
|
gv1 = load.i64 notrap aligned gv0
|
|
gv2 = load.i64 notrap aligned gv1+4
|
|
stack_limit = gv2
|
|
fn0 = %foo()
|
|
block0(v0: i64):
|
|
call fn0()
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; clgrtle %r15, %r1
|
|
; stmg %r14, %r15, 112(%r15)
|
|
; aghi %r15, -160
|
|
; virtual_sp_offset_adjust 160
|
|
; block0:
|
|
; bras %r1, 12 ; data %foo + 0 ; lg %r4, 0(%r1)
|
|
; basr %r14, %r4
|
|
; lmg %r14, %r15, 272(%r15)
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; stmg %r14, %r15, 0x70(%r15)
|
|
; aghi %r15, -0xa0
|
|
; block1: ; offset 0x1a
|
|
; bras %r1, 0x26
|
|
; .byte 0x00, 0x00 ; reloc_external Abs8 %foo 0
|
|
; .byte 0x00, 0x00
|
|
; .byte 0x00, 0x00
|
|
; .byte 0x00, 0x00
|
|
; lg %r4, 0(%r1)
|
|
; basr %r14, %r4
|
|
; lmg %r14, %r15, 0x110(%r15)
|
|
; br %r14
|
|
|
|
function %stack_limit(i64 stack_limit) {
|
|
ss0 = explicit_slot 168
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; la %r1, 168(%r2)
|
|
; clgrtle %r15, %r1
|
|
; aghi %r15, -168
|
|
; block0:
|
|
; aghi %r15, 168
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; la %r1, 0xa8(%r2)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; aghi %r15, -0xa8
|
|
; block1: ; offset 0xc
|
|
; aghi %r15, 0xa8
|
|
; br %r14
|
|
|
|
function %large_stack_limit(i64 stack_limit) {
|
|
ss0 = explicit_slot 400000
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; clgrtle %r15, %r2
|
|
; lay %r1, 400000(%r2)
|
|
; clgrtle %r15, %r1
|
|
; agfi %r15, -400000
|
|
; block0:
|
|
; agfi %r15, 400000
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; clgrtle %r15, %r2 ; trap: stk_ovf
|
|
; lay %r1, 0x61a80(%r2)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; agfi %r15, -0x61a80
|
|
; block1: ; offset 0x14
|
|
; agfi %r15, 0x61a80
|
|
; br %r14
|
|
|
|
function %huge_stack_limit(i64 stack_limit) {
|
|
ss0 = explicit_slot 4000000
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; clgrtle %r15, %r2
|
|
; lgr %r1, %r2
|
|
; algfi %r1, 4000000
|
|
; clgrtle %r15, %r1
|
|
; agfi %r15, -4000000
|
|
; block0:
|
|
; agfi %r15, 4000000
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; clgrtle %r15, %r2 ; trap: stk_ovf
|
|
; lgr %r1, %r2
|
|
; algfi %r1, 0x3d0900
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; agfi %r15, -0x3d0900
|
|
; block1: ; offset 0x18
|
|
; agfi %r15, 0x3d0900
|
|
; br %r14
|
|
|
|
function %limit_preamble(i64 vmctx) {
|
|
gv0 = vmctx
|
|
gv1 = load.i64 notrap aligned gv0
|
|
gv2 = load.i64 notrap aligned gv1+4
|
|
stack_limit = gv2
|
|
ss0 = explicit_slot 20
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; la %r1, 24(%r1)
|
|
; clgrtle %r15, %r1
|
|
; aghi %r15, -24
|
|
; block0:
|
|
; aghi %r15, 24
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; la %r1, 0x18(%r1)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; aghi %r15, -0x18
|
|
; block1: ; offset 0x18
|
|
; aghi %r15, 0x18
|
|
; br %r14
|
|
|
|
function %limit_preamble_large(i64 vmctx) {
|
|
gv0 = vmctx
|
|
gv1 = load.i64 notrap aligned gv0
|
|
gv2 = load.i64 notrap aligned gv1+4
|
|
stack_limit = gv2
|
|
ss0 = explicit_slot 400000
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; clgrtle %r15, %r1
|
|
; lay %r1, 400000(%r1)
|
|
; clgrtle %r15, %r1
|
|
; agfi %r15, -400000
|
|
; block0:
|
|
; agfi %r15, 400000
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; lay %r1, 0x61a80(%r1)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; agfi %r15, -0x61a80
|
|
; block1: ; offset 0x20
|
|
; agfi %r15, 0x61a80
|
|
; br %r14
|
|
|
|
function %limit_preamble_huge(i64 vmctx) {
|
|
gv0 = vmctx
|
|
gv1 = load.i64 notrap aligned gv0
|
|
gv2 = load.i64 notrap aligned gv1+4
|
|
stack_limit = gv2
|
|
ss0 = explicit_slot 4000000
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; clgrtle %r15, %r1
|
|
; algfi %r1, 4000000
|
|
; clgrtle %r15, %r1
|
|
; agfi %r15, -4000000
|
|
; block0:
|
|
; agfi %r15, 4000000
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; lg %r1, 0(%r2)
|
|
; lg %r1, 4(%r1)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; algfi %r1, 0x3d0900
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; agfi %r15, -0x3d0900
|
|
; block1: ; offset 0x20
|
|
; agfi %r15, 0x3d0900
|
|
; br %r14
|
|
|
|
function %limit_preamble_huge_offset(i64 vmctx) {
|
|
gv0 = vmctx
|
|
gv1 = load.i64 notrap aligned gv0+1000000
|
|
stack_limit = gv1
|
|
ss0 = explicit_slot 20
|
|
block0(v0: i64):
|
|
return
|
|
}
|
|
|
|
; VCode:
|
|
; lgfi %r1, 1000000 ; lg %r1, 0(%r1,%r2)
|
|
; la %r1, 24(%r1)
|
|
; clgrtle %r15, %r1
|
|
; aghi %r15, -24
|
|
; block0:
|
|
; aghi %r15, 24
|
|
; br %r14
|
|
;
|
|
; Disassembled:
|
|
; block0: ; offset 0x0
|
|
; lgfi %r1, 0xf4240
|
|
; lg %r1, 0(%r1, %r2)
|
|
; la %r1, 0x18(%r1)
|
|
; clgrtle %r15, %r1 ; trap: stk_ovf
|
|
; aghi %r15, -0x18
|
|
; block1: ; offset 0x18
|
|
; aghi %r15, 0x18
|
|
; br %r14
|
|
|