RPA Toolkit
Modified the public API of rvm_relocmap_t to add support for multiple relocation...
authorMartin Stoilov <martin@rpasearch.com>
Sun, 29 May 2011 00:35:17 +0000 (17:35 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Sun, 29 May 2011 00:35:17 +0000 (17:35 -0700)
rvm/rvmcodegen.c
rvm/rvmrelocmap.c
rvm/rvmrelocmap.h
tests/testmisc/asm-bl.c

index ab3c1ce..83da388 100644 (file)
@@ -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);
 }
 
index b38a1d7..40036aa 100644 (file)
@@ -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;
index c774a43..adb883a 100644 (file)
@@ -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);
index f5b1fff..56d3703 100644 (file)
@@ -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);