author | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2014年10月21日 15:32:24 -0200 |
---|---|---|
committer | pcpa <paulo.cesar.pereira.de.andrade@gmail.com> | 2014年10月21日 15:32:24 -0200 |
commit | 9c5e2b511ec6f80a350d756d4464acfb10373ee4 (patch) | |
tree | 87ca5c4ad4dd7ea8075da3af0a97f5b1273477de | |
parent | a43fb630557358eaaa31697344b8f52d849f2eb4 (diff) | |
download | lightning-9c5e2b511ec6f80a350d756d4464acfb10373ee4.tar.gz |
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | include/lightning.h | 6 | ||||
-rw-r--r-- | lib/lightning.c | 18 |
@@ -1,3 +1,14 @@ +2014年10月21日 Paulo Andrade <pcpa@gnu.org> + + * 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 <pcpa@gnu.org> * check/range.ok, check/range.tst: New test case designed diff --git a/include/lightning.h b/include/lightning.h index 926d0f1..b495af8 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 20aa1bd..7240f6b 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) { |