RPA Toolkit
dev
authormstoilov <mstoilov@b0bb84a5-424d-4f98-af44-3ef3f117eb03>
Mon, 13 Sep 2010 07:17:14 +0000 (00:17 -0700)
committermstoilov <mstoilov@b0bb84a5-424d-4f98-af44-3ef3f117eb03>
Mon, 13 Sep 2010 07:17:14 +0000 (00:17 -0700)
git-svn-id: svn+ssh://svn.crossrain.com/svn/rpase/trunk/rtk@177 b0bb84a5-424d-4f98-af44-3ef3f117eb03

rlib/rarray.c
rvm/rvm.c
rvm/rvm.h
rvm/rvmcodemap.c
rvm/rvmcodemap.h
tests/codegen-test.c
tests/codemap-test.c

index 4db24d0..397f935 100644 (file)
@@ -1,7 +1,7 @@
 #include "rarray.h"
 #include "rmem.h"
 
-#define MIN_ARRAY_LEN 1024
+#define MIN_ARRAY_LEN 4
 
 #if 0
 
index e26e722..ba3ccc4 100644 (file)
--- a/rvm/rvm.c
+++ b/rvm/rvm.c
@@ -1022,7 +1022,21 @@ rvm_asmins_t rvm_asmr(rword opcode, rword op1, rword op2, rword op3, rpointer pR
        RVM_REGP(&a.data) = pReloc;
        RVM_REG_INFO(&a.data) = RVM_DTYPE_RELOCPTR;
        return a;
+}
+
 
+rvm_asmins_t rvm_asmx(rword opcode, rword op1, rword op2, rword op3, rpointer pReloc)
+{
+       rvm_asmins_t a;
+
+       r_memset(&a, 0, sizeof(a));
+       a.opcode = (unsigned char) opcode;
+       a.op1 = (unsigned char)op1;
+       a.op2 = (unsigned char)op2;
+       a.op3 = (unsigned char)op3;
+       RVM_REGP(&a.data) = pReloc;
+       RVM_REG_INFO(&a.data) = RVM_DTYPE_RELOCINDEX;
+       return a;
 }
 
 
@@ -1035,13 +1049,18 @@ rvm_asmins_t rvm_asm(rword opcode, rword op1, rword op2, rword op3, rword data)
 void rvm_relocate(rvm_asmins_t *code, rsize_t size)
 {
        rvm_asmins_t *reloc;
-       rword off;
+       rulong relocindex;
+       rulong off;
 
        for (off = 0; off < size; off++, code++) {
                if (RVM_REG_INFO(&code->data) == RVM_DTYPE_RELOCPTR) {
                        RVM_REG_INFO(&code->data) = 0;
                        reloc = *((rvm_asmins_t **)RVM_REGP(&code->data));
                        RVM_REGU(&code->data) = reloc - code;
+               } else if (RVM_REG_INFO(&code->data) == RVM_DTYPE_RELOCINDEX) {
+                       RVM_REG_INFO(&code->data) = 0;
+                       relocindex = *((rulong *)RVM_REGP(&code->data));
+                       RVM_REGU(&code->data) = relocindex - off;
                }
        }
 }
index 00d28c6..13cbd02 100644 (file)
--- a/rvm/rvm.h
+++ b/rvm/rvm.h
@@ -97,6 +97,7 @@ enum {
 #define RVM_DTYPE_STRING 3
 #define RVM_DTYPE_STRINGPTR 4
 #define RVM_DTYPE_RELOCPTR 5
+#define RVM_DTYPE_RELOCINDEX 7
 #define RVM_DTYPE_USER 64
 #define RVM_DTYPE_USERDEF(__n__) (RVM_DTYPE_USER + (__n__))
 
@@ -232,6 +233,7 @@ rvm_asmins_t rvm_asmi(rword opcode, rword op1, rword op2, rword op3, rint data);
 rvm_asmins_t rvm_asmu(rword opcode, rword op1, rword op2, rword op3, rword data);
 rvm_asmins_t rvm_asmp(rword opcode, rword op1, rword op2, rword op3, rpointer data);
 rvm_asmins_t rvm_asmr(rword opcode, rword op1, rword op2, rword op3, rpointer pReloc);
+rvm_asmins_t rvm_asmx(rword opcode, rword op1, rword op2, rword op3, rpointer pReloc);
 rvm_asmins_t rvm_asmd(rword opcode, rword op1, rword op2, rword op3, rdouble data);
 void rvm_asm_dump(rvm_asmins_t *pi, ruint count);
 
index ec8fff4..f978432 100644 (file)
@@ -35,23 +35,39 @@ void rvm_codemap_destroy(rvm_codemap_t *codemap)
 }
 
 
-void rvm_codemap_add(rvm_codemap_t *codemap, const rchar *name, ruint namesize, ruint index)
+void rvm_codemap_add(rvm_codemap_t *codemap, const rchar *name, ruint namesize, rulong index)
 {
-       rvm_codelabel_t *label = r_malloc(sizeof(*label));
+       rvm_codelabel_t *label;
 
-       label->name = r_stringdup(name, namesize);
+       label = rvm_codemap_lookup(codemap, name, namesize);
+       if (!label) {
+               label = r_malloc(sizeof(*label));
+               label->name = r_stringdup(name, namesize);
+               r_hash_insert(codemap->hash, label->name, label);
+               r_array_add(codemap->labels, &label);
+       }
        label->index = index;
-       r_array_add(codemap->labels, &label);
-       r_hash_insert(codemap->hash, label->name, label);
 }
 
 
-void rvm_codemap_add_str(rvm_codemap_t *codemap, const rchar *name, ruint index)
+void rvm_codemap_add_str(rvm_codemap_t *codemap, const rchar *name, rulong index)
 {
        rvm_codemap_add(codemap, name, r_strlen(name), index);
 }
 
 
+void rvm_codemap_invalid_add(rvm_codemap_t *codemap, const rchar *name, ruint namesize)
+{
+       rvm_codemap_add(codemap, name, namesize, RVM_CODELABEL_INVALID);
+}
+
+
+void rvm_codemap_invalid_add_str(rvm_codemap_t *codemap, const rchar *name)
+{
+       rvm_codemap_invalid_add(codemap, name, r_strlen(name));
+}
+
+
 rvm_codelabel_t *rvm_codemap_lookup(rvm_codemap_t *codemap, const rchar *name, ruint namesize)
 {
        rstring_t lookupstr = {(char*)name, namesize};
index 0c3b9b1..96ab8dc 100644 (file)
 extern "C" {
 #endif
 
+#define RVM_CODELABEL_INVALID ((rulong)-1)
 
 typedef struct rvm_codelabel_s {
        rstring_t *name;
-       ruint index;
+       rulong index;
 } rvm_codelabel_t;
 
 
@@ -26,8 +27,10 @@ typedef struct rvm_codemap_s {
 
 rvm_codemap_t *rvm_codemap_create();
 void rvm_codemap_destroy(rvm_codemap_t *codemap);
-void rvm_codemap_add(rvm_codemap_t *codemap, const rchar *name, ruint namesize, ruint index);
-void rvm_codemap_add_str(rvm_codemap_t *codemap, const rchar *name, ruint index);
+void rvm_codemap_invalid_add(rvm_codemap_t *codemap, const rchar *name, ruint namesize);
+void rvm_codemap_invalid_add_str(rvm_codemap_t *codemap, const rchar *name);
+void rvm_codemap_add(rvm_codemap_t *codemap, const rchar *name, ruint namesize, rulong index);
+void rvm_codemap_add_str(rvm_codemap_t *codemap, const rchar *name, rulong index);
 rvm_codelabel_t *rvm_codemap_lookup(rvm_codemap_t *codemap, const rchar *name, ruint namesize);
 rvm_codelabel_t *rvm_codemap_lookup_str(rvm_codemap_t *codemap, const rchar *name);
 
index 9714700..1668cac 100644 (file)
@@ -21,16 +21,14 @@ int main(int argc, char *argv[])
 {
        rvm_cpu_t *cpu;
        rvm_codegen_t *cg;
-       rvm_codelabel_t *label;
        ruint ntable;
 
        cg = rvm_codegen_create();
        cpu = rvm_cpu_create();
        ntable = rvm_cpu_switable_add(cpu, switable);
 
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
+       rvm_codemap_invalid_add_str(cg->codemap, "add2");
+       rvm_codemap_invalid_add_str(cg->codemap, "add3");
 
        rvm_codegen_addins(cg, rvm_asm(RVM_MOV, R0, DA, XX, 7));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 1 + RVM_CODEGEN_FUNCINITOFFSET));
@@ -38,12 +36,9 @@ int main(int argc, char *argv[])
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 2 + RVM_CODEGEN_FUNCINITOFFSET));
        rvm_codegen_addins(cg, rvm_asm(RVM_MOV, R0, DA, XX, 9));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 3 + RVM_CODEGEN_FUNCINITOFFSET));
-       rvm_codegen_addins(cg, rvm_asm(RVM_BL,  DA, XX, XX, 15));
+       rvm_codegen_addins(cg, rvm_asmx(RVM_BL,  DA, XX, XX, &rvm_codemap_lookup_str(cg->codemap, "add3")->index));
        rvm_codegen_addins(cg, rvm_asm(RVM_SWI, DA, XX, XX, RVM_SWI_ID(ntable, 0)));
        rvm_codegen_addins(cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
 
        rvm_codegen_funcstart_str(cg, "add2", 2);
        rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R0, FP, DA, 1));
@@ -51,29 +46,18 @@ int main(int argc, char *argv[])
        rvm_codegen_addins(cg, rvm_asm(RVM_ADD, R0, R0, R1, 0));
        rvm_codegen_funcend(cg);
 
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-       rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
-
        rvm_codegen_funcstart_str(cg, "add3", 3);
        rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R0, FP, DA, 1));
        rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R1, FP, DA, 2));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 1 + RVM_CODEGEN_FUNCINITOFFSET));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R1, SP, DA, 2 + RVM_CODEGEN_FUNCINITOFFSET));
-//     rvm_codegen_addins(cg, rvm_asm(RVM_BL,  DA, XX, XX, 8));
-       label = rvm_codemap_lookup_str(cg->codemap, "add2");
-       rvm_codegen_addins(cg, rvm_asmr(RVM_BL,  DA, XX, XX, &label->ins));
+       rvm_codegen_addins(cg, rvm_asmx(RVM_BL,  DA, XX, XX, &rvm_codemap_lookup_str(cg->codemap, "add2")->index));
 
 
        rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R1, FP, DA, 3));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 1 + RVM_CODEGEN_FUNCINITOFFSET));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R1, SP, DA, 2 + RVM_CODEGEN_FUNCINITOFFSET));
-//     rvm_codegen_addins(cg, rvm_asm(RVM_BL,  DA, XX, XX, 5));
-       label = rvm_codemap_lookup_str(cg->codemap, "add2");
-       rvm_codegen_addins(cg, rvm_asmr(RVM_BL,  DA, XX, XX, &label->ins));
+       rvm_codegen_addins(cg, rvm_asmx(RVM_BL,  DA, XX, XX, &rvm_codemap_lookup_str(cg->codemap, "add2")->index));
 
        rvm_codegen_funcend(cg);
 
index 3870a49..4d99575 100644 (file)
@@ -14,18 +14,17 @@ void codelabel_print_info(rvm_codemap_t *codemap, rchar* name)
        if (!label)
                fprintf(stdout, "%s (not found)\n", name);
        else
-               fprintf(stdout, "%s, asmins: 0x%p\n", label->name->str, label->ins);
+               fprintf(stdout, "%s, asmins: 0x%d\n", label->name->str, (ruint)label->index);
 }
 
 
 int main(int argc, char *argv[])
 {
-       rvm_asmins_t a[10];
        rvm_codemap_t *codemap = rvm_codemap_create();
 
-       rvm_codemap_add_str(codemap, "add2", &a[0]);
-       rvm_codemap_add_str(codemap, "add3", &a[3]);
-       rvm_codemap_add_str(codemap, "sub2", &a[7]);
+       rvm_codemap_add_str(codemap, "add2", 0);
+       rvm_codemap_add_str(codemap, "add3", 3);
+       rvm_codemap_add_str(codemap, "sub2", 7);
 
        codelabel_print_info(codemap, "add2");
        codelabel_print_info(codemap, "add7");