From: Martin Stoilov Date: Sun, 29 May 2011 00:35:17 +0000 (-0700) Subject: Modified the public API of rvm_relocmap_t to add support for multiple relocation... X-Git-Url: http://rpatk.net/gitweb/?p=rpatk.git;a=commitdiff_plain;h=9b2c7b0ec8034d564ee58193cb410f5c79f800ed Modified the public API of rvm_relocmap_t to add support for multiple relocation targets. --- diff --git a/rvm/rvmcodegen.c b/rvm/rvmcodegen.c index ab3c1ce..83da388 100644 --- a/rvm/rvmcodegen.c +++ b/rvm/rvmcodegen.c @@ -168,7 +168,7 @@ rsize_t rvm_codegen_addlabelins_s(rvm_codegen_t *cg, const rchar* name, rvm_asmi rsize_t rvm_codegen_index_addrelocins(rvm_codegen_t *cg, rvm_reloctype_t type, rulong index, rvm_asmins_t ins) { - rvm_relocmap_add(cg->relocmap, type, rvm_codegen_getcodesize(cg), index); + rvm_relocmap_add(cg->relocmap, RVM_RELOC_CODE, type, rvm_codegen_getcodesize(cg), index); return rvm_codegen_addins(cg, ins); } diff --git a/rvm/rvmrelocmap.c b/rvm/rvmrelocmap.c index b38a1d7..40036aa 100644 --- a/rvm/rvmrelocmap.c +++ b/rvm/rvmrelocmap.c @@ -26,9 +26,10 @@ void rvm_relocmap_clear(rvm_relocmap_t *relocmap) } -rlong rvm_relocmap_add(rvm_relocmap_t *relocmap, rvm_reloctype_t type, rulong offset, rulong label) +rlong rvm_relocmap_add(rvm_relocmap_t *relocmap, rvm_reloctarget_t target, rvm_reloctype_t type, rulong offset, rulong label) { rvm_relocrecord_t record; + record.target = target; record.type = type; record.offset = offset; record.label = label; @@ -62,17 +63,23 @@ rint rvm_relocmap_relocate(rvm_relocmap_t *relocmap, rvm_codemap_t *codemap, rvm value = rvm_codemap_resolve(codemap, reloc->label, err); if (value == (rword)-1) return -1; - if (reloc->type == RVM_RELOC_BRANCH) { - code[reloc->offset].data.v.w = RVM_BYTE2CODE_OFFSET(value - (rword)&code[reloc->offset]); - } else if (reloc->type == RVM_RELOC_JUMP) { - code[reloc->offset].data.v.w = value - RVM_CODE2BYTE_OFFSET(1); - } else if (reloc->type == RVM_RELOC_STRING) { - code[reloc->offset].data.v.w = value; - code[reloc->offset].data.size = r_strlen((rchar*)value); - } else if (reloc->type == RVM_RELOC_BLOB) { - code[reloc->offset].data.v.w = value; - } else { - code[reloc->offset].data.v.w = value; + if (reloc->target == RVM_RELOC_CODE) { + if (reloc->type == RVM_RELOC_BRANCH) { + code[reloc->offset].data.v.w = RVM_BYTE2CODE_OFFSET(value - (rword)&code[reloc->offset]); + } else if (reloc->type == RVM_RELOC_JUMP) { + code[reloc->offset].data.v.w = value - RVM_CODE2BYTE_OFFSET(1); + } else if (reloc->type == RVM_RELOC_STRING) { + code[reloc->offset].data.v.w = value; + code[reloc->offset].data.size = r_strlen((rchar*)value); + } else if (reloc->type == RVM_RELOC_BLOB) { + code[reloc->offset].data.v.w = value; + } else { + code[reloc->offset].data.v.w = value; + } + } else if (reloc->target == RVM_RELOC_DATA){ + /* + * TBD: No support for data relocation yet. + */ } } return 0; diff --git a/rvm/rvmrelocmap.h b/rvm/rvmrelocmap.h index c774a43..adb883a 100644 --- a/rvm/rvmrelocmap.h +++ b/rvm/rvmrelocmap.h @@ -43,7 +43,7 @@ typedef struct rvm_relocmap_s { rvm_relocmap_t *rvm_relocmap_create(); void rvm_relocmap_destroy(rvm_relocmap_t *relocmap); void rvm_relocmap_clear(rvm_relocmap_t *relocmap); -rlong rvm_relocmap_add(rvm_relocmap_t *relocmap, rvm_reloctype_t type, rulong offset, rulong label); +rlong rvm_relocmap_add(rvm_relocmap_t *relocmap, rvm_reloctarget_t target, rvm_reloctype_t type, rulong offset, rulong label); rvm_relocrecord_t *rvm_relocmap_get(rvm_relocmap_t *relocmap, rulong index); rulong rvm_relocmap_length(rvm_relocmap_t *relocmap); rint rvm_relocmap_relocate(rvm_relocmap_t *relocmap, rvm_codemap_t *codemap, rvm_asmins_t *code, rvm_codelabel_t **err); diff --git a/tests/testmisc/asm-bl.c b/tests/testmisc/asm-bl.c index f5b1fff..56d3703 100644 --- a/tests/testmisc/asm-bl.c +++ b/tests/testmisc/asm-bl.c @@ -17,7 +17,7 @@ int main(int argc, char *argv[]) rvm_cpu_addswitable(vm, "common_table", common_calltable); - rvm_relocmap_add(relocmap, RVM_RELOC_BRANCH, off, rvm_codemap_lookupadd_s(codemap, "l_main")); + rvm_relocmap_add(relocmap, RVM_RELOC_CODE, RVM_RELOC_BRANCH, off, rvm_codemap_lookupadd_s(codemap, "l_main")); vmcode[off++] = rvm_asm(RVM_B, DA, XX, XX, 0); /* @@ -34,10 +34,10 @@ int main(int argc, char *argv[]) rvm_codemap_addoffset_s(codemap, "l_add3", rvm_codemap_lookupadd_s(codemap, ".code"), RVM_CODE2BYTE_OFFSET(off)); vmcode[off++] = rvm_asm(RVM_PUSHM,DA, XX, XX, BIT(R7)|BIT(R8)|BIT(SP)|BIT(LR)); vmcode[off++] = rvm_asm(RVM_PUSH, R2, XX, XX, 0); - rvm_relocmap_add(relocmap, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add2")); + rvm_relocmap_add(relocmap, RVM_RELOC_CODE, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add2")); vmcode[off++] = rvm_asm(RVM_BXL, DA, XX, XX, 0); vmcode[off++] = rvm_asm(RVM_POP, R1, XX, XX, 0); - rvm_relocmap_add(relocmap, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add2")); + rvm_relocmap_add(relocmap, RVM_RELOC_CODE, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add2")); vmcode[off++] = rvm_asm(RVM_BXL, DA, XX, XX, 0); vmcode[off++] = rvm_asm(RVM_POPM, DA, XX, XX, BIT(R7)|BIT(R8)|BIT(SP)|BIT(LR)); vmcode[off++] = rvm_asm(RVM_RET, XX, XX, XX, 0); @@ -51,13 +51,13 @@ int main(int argc, char *argv[]) rvm_codemap_addoffset_s(codemap, "l_main", rvm_codemap_lookupadd_s(codemap, ".code"), RVM_CODE2BYTE_OFFSET(off)); vmcode[off++] = rvm_asm(RVM_MOV, R0, DA, XX, 1); vmcode[off++] = rvm_asm(RVM_MOV, R1, DA, XX, 2); - rvm_relocmap_add(relocmap, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add2")); + rvm_relocmap_add(relocmap, RVM_RELOC_CODE, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add2")); vmcode[off++] = rvm_asm(RVM_BXL, DA, XX, XX, 0); VMTEST_REG(vmcode, off, 0, 3, "BL/RET"); vmcode[off++] = rvm_asm(RVM_MOV, R0, DA, XX, 1); vmcode[off++] = rvm_asm(RVM_MOV, R1, DA, XX, 2); vmcode[off++] = rvm_asm(RVM_MOV, R2, DA, XX, 4); - rvm_relocmap_add(relocmap, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add3")); + rvm_relocmap_add(relocmap, RVM_RELOC_CODE, RVM_RELOC_JUMP, off, rvm_codemap_lookupadd_s(codemap, "l_add3")); vmcode[off++] = rvm_asm(RVM_BXL, DA, XX, XX, 0); VMTEST_REG(vmcode, off, 0, 7, "BL/RET"); vmcode[off++] = rvm_asm(RVM_EXT, R0, XX, XX, 0);