diff --git a/cranelift/filetests/isa/x86/binary64.clif b/cranelift/filetests/isa/x86/binary64.clif index 1c43280cb2..e876cd59c0 100644 --- a/cranelift/filetests/isa/x86/binary64.clif +++ b/cranelift/filetests/isa/x86/binary64.clif @@ -784,6 +784,9 @@ ebb1: ; asm: jnbe .+4; ud2 trapif ule v11, user0 ; bin: 77 02 user0 0f 0b + ; Debug trap. + debugtrap ; bin: cc + ; Stack check. ; asm: cmpq %rsp, %rcx [-,%rflags] v40 = ifcmp_sp v1 ; bin: 48 39 e1 diff --git a/lib/codegen/meta-python/base/instructions.py b/lib/codegen/meta-python/base/instructions.py index 718bb33f45..53d1586abf 100644 --- a/lib/codegen/meta-python/base/instructions.py +++ b/lib/codegen/meta-python/base/instructions.py @@ -181,6 +181,10 @@ indirect_jump_table_br = Instruction( ins=(addr, JT), is_branch=True, is_indirect_branch=True, is_terminator=True) +debugtrap = Instruction('debugtrap', r""" + Encodes an assembly debug trap. + """, can_load=True, can_store=True, other_side_effects=True) + code = Operand('code', trapcode) trap = Instruction( 'trap', r""" diff --git a/lib/codegen/meta-python/isa/x86/encodings.py b/lib/codegen/meta-python/isa/x86/encodings.py index d07e003c3c..4ae37c48a2 100644 --- a/lib/codegen/meta-python/isa/x86/encodings.py +++ b/lib/codegen/meta-python/isa/x86/encodings.py @@ -521,12 +521,17 @@ X86_32.enc(base.jump_table_base.i32, *r.jt_base(0x8d)) enc_x86_64(base.indirect_jump_table_br.i64, r.indirect_jmp, 0xff, rrr=4) X86_32.enc(base.indirect_jump_table_br.i32, *r.indirect_jmp(0xff, rrr=4)) + # # Trap as ud2 # X86_32.enc(base.trap, *r.trap(0x0f, 0x0b)) X86_64.enc(base.trap, *r.trap(0x0f, 0x0b)) +# Debug trap as int3 +X86_32.enc(base.debugtrap, r.debugtrap, 0) +X86_64.enc(base.debugtrap, r.debugtrap, 0) + # Using a standard EncRecipe, not the TailRecipe. X86_32.enc(base.trapif, r.trapif, 0) X86_64.enc(base.trapif, r.trapif, 0) diff --git a/lib/codegen/meta-python/isa/x86/recipes.py b/lib/codegen/meta-python/isa/x86/recipes.py index 534804e0e2..484f61ee6f 100644 --- a/lib/codegen/meta-python/isa/x86/recipes.py +++ b/lib/codegen/meta-python/isa/x86/recipes.py @@ -295,6 +295,11 @@ def valid_scale(iform): # copies and no-op conversions. null = EncRecipe('null', Unary, base_size=0, ins=GPR, outs=0, emit='') +debugtrap = EncRecipe('debugtrap', NullAry, base_size=1, ins=(), outs=(), + emit=''' + sink.put1(0xcc); + ''') + # XX opcode, no ModR/M. trap = TailRecipe( 'trap', Trap, base_size=0, ins=(), outs=(),