From 9c5e2b511ec6f80a350d756d4464acfb10373ee4 Mon Sep 17 00:00:00 2001 From: pcpa Date: Tue, 21 Oct 2014 15:32:24 -0200 Subject: [PATCH] Add label predicates * include/lightning.h, lib/lightning.c: Add three predicates to query information about labels. jit_forward_p(label) will return non zero if the label is "forward", that is need a call to jit_link(label), jit_indirect_p(label) that returns non zero if the label was created with the jit_indirect() call, and jit_target_p(label) that will return non zero if there is at least one jump patched to land at that label. --- ChangeLog | 11 +++++++++++ include/lightning.h | 6 ++++++ lib/lightning.c | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/ChangeLog b/ChangeLog index e1988f794..85804e673 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2014-10-21 Paulo Andrade + + * include/lightning.h, lib/lightning.c: Add three predicates + to query information about labels. jit_forward_p(label) + will return non zero if the label is "forward", that is + need a call to jit_link(label), jit_indirect_p(label) + that returns non zero if the label was created with the + jit_indirect() call, and jit_target_p(label) that will + return non zero if there is at least one jump patched + to land at that label. + 2014-10-18 Paulo Andrade * check/range.ok, check/range.tst: New test case designed diff --git a/include/lightning.h b/include/lightning.h index 926d0f18c..b495af847 100644 --- a/include/lightning.h +++ b/include/lightning.h @@ -864,6 +864,12 @@ extern jit_node_t *_jit_label(jit_state_t*); extern jit_node_t *_jit_forward(jit_state_t*); extern jit_node_t *_jit_indirect(jit_state_t*); extern void _jit_link(jit_state_t*, jit_node_t*); +#define jit_forward_p(u) _jit_forward_p(_jit,u) +extern jit_bool_t _jit_forward_p(jit_state_t*,jit_node_t*); +#define jit_indirect_p(u) _jit_indirect_p(_jit,u) +extern jit_bool_t _jit_indirect_p(jit_state_t*,jit_node_t*); +#define jit_target_p(u) _jit_target_p(_jit,u) +extern jit_bool_t _jit_target_p(jit_state_t*,jit_node_t*); extern void _jit_prolog(jit_state_t*); diff --git a/lib/lightning.c b/lib/lightning.c index 20aa1bd74..7240f6bd4 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -1127,6 +1127,24 @@ _jit_link(jit_state_t *_jit, jit_node_t *node) ++_jitc->blocks.offset; } +jit_bool_t +_jit_forward_p(jit_state_t *_jit, jit_node_t *node) +{ + return (node->code == jit_code_label && !node->next && node != _jitc->tail); +} + +jit_bool_t +_jit_indirect_p(jit_state_t *_jit, jit_node_t *node) +{ + return (node->code == jit_code_label && !!(node->flag & jit_flag_use)); +} + +jit_bool_t +_jit_target_p(jit_state_t *_jit, jit_node_t *node) +{ + return (node->code == jit_code_label && !!node->link); +} + void _jit_prepare(jit_state_t *_jit) {