More compiler work; literal table fixes, relocation fix

slava 2006-08-09 21:19:33 +00:00
parent 3b2d14c4c0
commit 525687bc2b
2 changed files with 25 additions and 16 deletions

View File

@ -104,6 +104,7 @@
+ misc: + misc:
- UDP
- faster I/O - faster I/O
- buffer-ptr should be an alien - buffer-ptr should be an alien
- faster Unix stream-read# - faster Unix stream-read#

View File

@ -98,10 +98,16 @@ INLINE void reloc_set_2_2(CELL cell, CELL value)
put(cell,((get(cell) & ~0xffff) | (value & 0xffff))); put(cell,((get(cell) & ~0xffff) | (value & 0xffff)));
} }
INLINE void reloc_set_masked(CELL cell, CELL value, CELL mask)
{
u32 original = *(u32*)cell;
original &= ~mask;
*(u32*)cell = (original | (value & mask));
}
void apply_relocation(F_REL *rel, CELL code_start, CELL literal_start, void apply_relocation(F_REL *rel, CELL code_start, CELL literal_start,
F_VECTOR *labels) F_VECTOR *labels)
{ {
CELL original;
CELL absolute_value; CELL absolute_value;
CELL relative_value; CELL relative_value;
CELL offset = rel->offset + code_start; CELL offset = rel->offset + code_start;
@ -129,14 +135,10 @@ void apply_relocation(F_REL *rel, CELL code_start, CELL literal_start,
reloc_set_2_2(offset,relative_value); reloc_set_2_2(offset,relative_value);
break; break;
case REL_RELATIVE_2: case REL_RELATIVE_2:
original = *(u32*)offset; reloc_set_masked(offset,relative_value,REL_RELATIVE_2_MASK);
original &= ~REL_RELATIVE_2_MASK;
*(u32*)offset = (original | relative_value);
break; break;
case REL_RELATIVE_3: case REL_RELATIVE_3:
original = *(u32*)offset; reloc_set_masked(offset,relative_value,REL_RELATIVE_3_MASK);
original &= ~REL_RELATIVE_3_MASK;
*(u32*)offset = (original | relative_value);
break; break;
default: default:
critical_error("Unsupported rel class",REL_CLASS(rel)); critical_error("Unsupported rel class",REL_CLASS(rel));
@ -179,7 +181,7 @@ void init_compiler(CELL size)
last_flush = compiling.base; last_flush = compiling.base;
} }
void deposit_vector(F_VECTOR *vector, CELL format) void deposit_integers(F_VECTOR *vector, CELL format)
{ {
CELL count = untag_fixnum_fast(vector->top); CELL count = untag_fixnum_fast(vector->top);
F_ARRAY *array = untag_array_fast(vector->array); F_ARRAY *array = untag_array_fast(vector->array);
@ -202,8 +204,12 @@ void deposit_vector(F_VECTOR *vector, CELL format)
} }
else else
fatal_error("Bad format param to deposit_vector()",format); fatal_error("Bad format param to deposit_vector()",format);
}
compiling.here += count * format;
void deposit_objects(F_VECTOR *vector, CELL literal_length)
{
F_ARRAY *array = untag_array_fast(vector->array);
memcpy((void*)compiling.here,array + 1,literal_length);
} }
void fixup_labels(F_VECTOR *label_rel, CELL code_start, CELL literal_start, void fixup_labels(F_VECTOR *label_rel, CELL code_start, CELL literal_start,
@ -226,27 +232,29 @@ void add_compiled_block(CELL code_format, F_VECTOR *code, F_VECTOR *label_rel,
F_VECTOR *labels, F_VECTOR *literals, F_VECTOR *rel) F_VECTOR *labels, F_VECTOR *literals, F_VECTOR *rel)
{ {
CELL start = compiling.here; CELL start = compiling.here;
CELL code_length = untag_fixnum_fast(code->top) * code_format; CELL code_length = align8(untag_fixnum_fast(code->top) * code_format);
CELL rel_length = untag_fixnum_fast(rel->top) * CELLS; CELL rel_length = untag_fixnum_fast(rel->top) * CELLS;
CELL literal_length = untag_fixnum_fast(literals->top) * CELLS; CELL literal_length = untag_fixnum_fast(literals->top) * CELLS;
/* compiled header */ /* compiled header */
F_COMPILED header; F_COMPILED header;
header.code_length = align8(code_length); header.code_length = code_length;
header.reloc_length = rel_length; header.reloc_length = rel_length;
header.literal_length = literal_length; header.literal_length = literal_length;
memcpy((void*)compiling.here,&header,sizeof(F_COMPILED)); memcpy((void*)compiling.here,&header,sizeof(F_COMPILED));
compiling.here += sizeof(F_COMPILED); compiling.here += sizeof(F_COMPILED);
/* code */ /* code */
deposit_vector(code,code_format); deposit_integers(code,code_format);
compiling.here = align8(compiling.here); compiling.here += code_length;
/* relation info */ /* relation info */
deposit_vector(rel,CELLS); deposit_integers(rel,CELLS);
compiling.here += rel_length;
/* literals */ /* literals */
deposit_vector(literals,CELLS); deposit_objects(literals,literal_length);
compiling.here += literal_length;
/* labels */ /* labels */
fixup_labels(label_rel,start + sizeof(F_COMPILED),0,labels); fixup_labels(label_rel,start + sizeof(F_COMPILED),0,labels);