From cfaf3084a58841d7e6cab5c9cc2010f340a0c92b Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Wed, 24 Dec 2008 03:45:46 +0000 Subject: [PATCH] - gcc uses UD2 for __builtin_trap() - implemented ir_bk_debugbreak [r24885] --- include/libfirm/firm_types.h | 3 ++- ir/be/ia32/ia32_spec.pl | 13 +++++++++++++ ir/be/ia32/ia32_transform.c | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/include/libfirm/firm_types.h b/include/libfirm/firm_types.h index 70b449108..abdb85a5e 100644 --- a/include/libfirm/firm_types.h +++ b/include/libfirm/firm_types.h @@ -220,7 +220,8 @@ typedef struct { /** Supported libFirm builtins. */ /** Supported libFirm builtins. */ typedef enum { - ir_bk_trap, /**< GCC __builtin_trap(): insert debug break */ + ir_bk_trap, /**< GCC __builtin_trap(): insert trap */ + ir_bk_debugbreak, /**< MS __debugbreak(): insert debug break */ ir_bk_return_address, /**< GCC __builtin_return_address() */ ir_bk_frame_addess, /**< GCC __builtin_frame_address() */ ir_bk_prefetch, /**< GCC __builtin_prefetch() */ diff --git a/ir/be/ia32/ia32_spec.pl b/ir/be/ia32/ia32_spec.pl index 2ccf12d41..56850632a 100644 --- a/ir/be/ia32/ia32_spec.pl +++ b/ir/be/ia32/ia32_spec.pl @@ -1611,6 +1611,19 @@ Breakpoint => { mode => mode_M, }, +# +# Undefined Instruction on ALL x86 CPU's +# +UD2 => { + state => "pinned", + reg_req => { in => [ "none" ], out => [ "none" ] }, + ins => [ "mem" ], + latency => 0, + emit => ". .value 0x0b0f", + units => [ "GP" ], + mode => mode_M, +}, + # # Intel style prefetching # diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index 684d2503c..456aaf718 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -4526,6 +4526,17 @@ static ir_node *gen_trap(ir_node *node) { ir_node *block = be_transform_node(get_nodes_block(node)); ir_node *mem = be_transform_node(get_Builtin_mem(node)); + return new_bd_ia32_UD2(dbgi, block, mem); +} + +/** + * Transform Builtin debugbreak + */ +static ir_node *gen_debugbreak(ir_node *node) { + dbg_info *dbgi = get_irn_dbg_info(node); + ir_node *block = be_transform_node(get_nodes_block(node)); + ir_node *mem = be_transform_node(get_Builtin_mem(node)); + return new_bd_ia32_Breakpoint(dbgi, block, mem); } @@ -4993,6 +5004,8 @@ static ir_node *gen_Builtin(ir_node *node) { switch (kind) { case ir_bk_trap: return gen_trap(node); + case ir_bk_debugbreak: + return gen_debugbreak(node); case ir_bk_return_address: return gen_return_address(node); case ir_bk_frame_addess: @@ -5035,6 +5048,7 @@ static ir_node *gen_Proj_Builtin(ir_node *proj) { assert(get_Proj_proj(proj) == pn_Builtin_1_result); return new_node; case ir_bk_trap: + case ir_bk_debugbreak: case ir_bk_prefetch: assert(get_Proj_proj(proj) == pn_Builtin_M); return new_node; -- 2.20.1