}
-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;
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;
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);
/*
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);
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);