Commit 464c8c06 authored by Julian Kranz's avatar Julian Kranz

Gdrr

- Continued to implement gdrr
parent 5b4b0b63
......@@ -10,7 +10,7 @@
#include <dis.h>
typedef void gdrr_sem_id;
typedef void gdrr_sem_id_t;
typedef void gdrr_sem_address_t;
typedef void gdrr_sem_var_t;
typedef void gdrr_sem_linear_t;
......@@ -19,8 +19,18 @@ typedef void gdrr_sem_stmt_t;
typedef void gdrr_branch_hint;
typedef void gdrr_sem_stmts_t;
struct gdrr_sem_id_callbacks {
gdrr_sem_id_t *(*virt_eq)(void);
gdrr_sem_id_t *(*virt_neq)(void);
gdrr_sem_id_t *(*virt_les)(void);
gdrr_sem_id_t *(*virt_leu)(void);
gdrr_sem_id_t *(*virt_lts)(void);
gdrr_sem_id_t *(*virt_ltu)(void);
gdrr_sem_id_t *(*virt_t)(__word t);
};
struct gdrr_sem_var_callbacks {
gdrr_sem_var_t *(*sem_var)(gdrr_sem_id *id, __word offset);
gdrr_sem_var_t *(*sem_var)(gdrr_sem_id_t *id, __word offset);
};
struct gdrr_sem_op_callbacks {
......@@ -89,6 +99,7 @@ struct gdrr_sem_stmts_list_callbacks {
};
struct gdrr_callbacks {
struct gdrr_sem_id_callbacks sem_id;
struct gdrr_sem_var_callbacks sem_var;
struct gdrr_sem_op_callbacks sem_op;
struct gdrr_sem_stmt_callbacks sem_stmt;
......
......@@ -11,6 +11,45 @@
#include <dis.h>
#include "gdrr.h"
static gdrr_sem_id_t *gdrr_convert_sem_id(__obj sem_id_obj,
struct gdrr_callbacks *callbacks) {
gdrr_sem_id_t *sem_id = NULL;
switch(__CASETAGCON(sem_id_obj)) {
case __VIRT_EQ: {
sem_id = callbacks->sem_id.virt_eq();
break;
}
case __VIRT_NEQ: {
sem_id = callbacks->sem_id.virt_neq();
break;
}
case __VIRT_LES: {
sem_id = callbacks->sem_id.virt_les();
break;
}
case __VIRT_LEU: {
sem_id = callbacks->sem_id.virt_leu();
break;
}
case __VIRT_LTS: {
sem_id = callbacks->sem_id.virt_lts();
break;
}
case __VIRT_LTU: {
sem_id = callbacks->sem_id.virt_ltu();
break;
}
case __VIRT_T: {
__obj p = __DECON(sem_id_obj);
sem_id = callbacks->sem_id.virt_t(__CASETAGINT(p));
break;
}
}
return sem_id;
}
static gdrr_sem_var_t *gdrr_convert_sem_var(__obj sem_var_obj,
struct gdrr_callbacks *callbacks) {
__obj rec = __DECON(sem_var_obj);
......@@ -18,7 +57,8 @@ static gdrr_sem_var_t *gdrr_convert_sem_var(__obj sem_var_obj,
__obj id = __RECORD_SELECT(rec, ___id);
__obj offset = __RECORD_SELECT(rec, ___offset);
return callbacks->sem_var.sem_var(NULL, __CASETAGINT(offset));
return callbacks->sem_var.sem_var(gdrr_convert_sem_id(id, callbacks),
__CASETAGINT(offset));
}
static gdrr_sem_op_t *gdrr_convert_sem_op(__obj sem_op_obj,
......
......@@ -174,7 +174,43 @@ static gdrr_sem_op_t *sem_arb(__word size) {
return NULL;
}
static gdrr_sem_var_t *sem_var(gdrr_sem_id *id, __word offset) {
static gdrr_sem_id_t *virt_eq(void) {
printf("=> virt_eq\n");
return NULL;
}
static gdrr_sem_id_t *virt_neq(void) {
printf("=> virt_neq\n");
return NULL;
}
static gdrr_sem_id_t *virt_les(void) {
printf("=> virt_les\n");
return NULL;
}
static gdrr_sem_id_t *virt_leu(void) {
printf("=> virt_leu\n");
return NULL;
}
static gdrr_sem_id_t *virt_lts(void) {
printf("=> virt_lts\n");
return NULL;
}
static gdrr_sem_id_t *virt_ltu(void) {
printf("=> virt_ltu\n");
return NULL;
}
static gdrr_sem_id_t *virt_t(__word t) {
printf("=> id {t=%lu}\n", t);
return NULL;
}
static gdrr_sem_var_t *sem_var(gdrr_sem_id_t *id, __word offset) {
printf("=> var {offset=%lu}\n", offset);
return NULL;
......@@ -246,6 +282,14 @@ done:
callbacks.sem_op.sem_cmpltu = &sem_cmpltu;
callbacks.sem_op.sem_arb = &sem_arb;
callbacks.sem_id.virt_eq = &virt_eq;
callbacks.sem_id.virt_neq = &virt_neq;
callbacks.sem_id.virt_les = &virt_les;
callbacks.sem_id.virt_leu = &virt_leu;
callbacks.sem_id.virt_lts = &virt_lts;
callbacks.sem_id.virt_ltu = &virt_ltu;
callbacks.sem_id.virt_t = &virt_t;
callbacks.sem_var.sem_var = &sem_var;
gdrr_convert_list(r, &callbacks);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment