1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 03:30:27 +02:00

Correct off by one label/note name and add align argument to jit_data

2013-01-14 Paulo Andrade <pcpa@gnu.org>

	* include/lightning.h, lib/lightning.c: Add an extra align
	argument to the jit_data call (that should be made private),
	so that it should not align strings at 8 bytes.
	  Correct the jit_note call to include the null ending byte
	when adding label/note names to the "jit data section".
This commit is contained in:
pcpa 2013-01-14 14:43:54 -02:00
parent a34410eee2
commit 39afbe1c40
3 changed files with 21 additions and 9 deletions

View file

@ -326,7 +326,8 @@ _jit_address(jit_state_t *_jit, jit_node_t *node)
}
jit_node_t *
_jit_data(jit_state_t *_jit, jit_pointer_t data, jit_word_t length)
_jit_data(jit_state_t *_jit, jit_pointer_t data,
jit_word_t length, jit_int32_t align)
{
jit_word_t key;
jit_node_t *node;
@ -361,7 +362,9 @@ _jit_data(jit_state_t *_jit, jit_pointer_t data, jit_word_t length)
if (!node) {
node = jit_new_node_no_link(jit_code_data);
switch (length) {
if (!align)
align = length;
switch (align) {
case 0: case 1:
break;
case 2:
@ -419,7 +422,7 @@ _jit_note(jit_state_t *_jit, char *name, int line)
node = new_node(jit_code_note);
if (name)
node->v.n = jit_data(name, strlen(name));
node->v.n = jit_data(name, strlen(name) + 1, 1);
else
node->v.p = NULL;
node->w.w = line;
@ -1112,19 +1115,19 @@ _jit_optimize(jit_state_t *_jit)
mask = jit_classify(node->code);
#if JIT_HASH_CONSTS
if (mask & jit_cc_a1_flt) {
node->v.p = jit_data(&node->v.f, sizeof(jit_float32_t));
node->v.p = jit_data(&node->v.f, sizeof(jit_float32_t), 4);
node->flag |= jit_flag_node | jit_flag_data;
}
else if (mask & jit_cc_a1_dbl) {
node->v.p = jit_data(&node->v.d, sizeof(jit_float64_t));
node->v.p = jit_data(&node->v.d, sizeof(jit_float64_t), 8);
node->flag |= jit_flag_node | jit_flag_data;
}
else if (mask & jit_cc_a2_flt) {
node->w.p = jit_data(&node->w.f, sizeof(jit_float32_t));
node->w.p = jit_data(&node->w.f, sizeof(jit_float32_t), 4);
node->flag |= jit_flag_node | jit_flag_data;
}
else if (mask & jit_cc_a2_dbl) {
node->w.p = jit_data(&node->w.d, sizeof(jit_float64_t));
node->w.p = jit_data(&node->w.d, sizeof(jit_float64_t), 8);
node->flag |= jit_flag_node | jit_flag_data;
}
#endif