1 #include "rvmrelocmap.h"
4 rvm_relocmap_t *rvm_relocmap_create()
6 rvm_relocmap_t *relocmap;
8 relocmap = (rvm_relocmap_t*)r_zmalloc(sizeof(*relocmap));
11 relocmap->records = r_array_create(sizeof(rvm_relocrecord_t));
16 void rvm_relocmap_destroy(rvm_relocmap_t *relocmap)
18 r_object_destroy((robject_t*)relocmap->records);
23 void rvm_relocmap_clear(rvm_relocmap_t *relocmap)
25 r_array_setlength(relocmap->records, 0);
29 rlong rvm_relocmap_add(rvm_relocmap_t *relocmap, rvm_reloctype_t type, rulong offset, rulong label)
31 rvm_relocrecord_t record;
33 record.offset = offset;
36 return r_array_add(relocmap->records, &record);
40 rvm_relocrecord_t *rvm_relocmap_get(rvm_relocmap_t *relocmap, rulong index)
42 if (index >= r_array_length(relocmap->records))
44 return (rvm_relocrecord_t *)r_array_slot(relocmap->records, index);
48 rulong rvm_relocmap_length(rvm_relocmap_t *relocmap)
50 return r_array_length(relocmap->records);
54 rint rvm_relocmap_relocate(rvm_relocmap_t *relocmap, rvm_codemap_t *codemap, rvm_asmins_t *code, rvm_codelabel_t **err)
57 rvm_relocrecord_t *reloc;
60 for (index = 0; index < r_array_length(relocmap->records); index++) {
61 reloc = rvm_relocmap_get(relocmap, index);
62 value = rvm_codemap_resolve(codemap, reloc->label, err);
63 if (value == (rword)-1)
65 if (reloc->type == RVM_RELOC_BRANCH) {
66 code[reloc->offset].data.v.w = RVM_BYTE2CODE_OFFSET(value - (rword)&code[reloc->offset]);
67 } else if (reloc->type == RVM_RELOC_JUMP) {
68 code[reloc->offset].data.v.w = value - RVM_CODE2BYTE_OFFSET(1);
69 } else if (reloc->type == RVM_RELOC_STRING) {
70 code[reloc->offset].data.v.w = value;
71 code[reloc->offset].data.size = r_strlen((rchar*)value);
72 } else if (reloc->type == RVM_RELOC_BLOB) {
73 code[reloc->offset].data.v.w = value;
75 code[reloc->offset].data.v.w = value;