*** empty log message ***
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@1025 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
fd8effd6b5
commit
8628790f3c
7 changed files with 147 additions and 51 deletions
|
|
@ -39,10 +39,8 @@ extern "C" {
|
||||||
|
|
||||||
extern int wad_memory_init();
|
extern int wad_memory_init();
|
||||||
extern void *wad_malloc(int nbytes);
|
extern void *wad_malloc(int nbytes);
|
||||||
extern void *wad_pmalloc(int nbytes);
|
|
||||||
extern void wad_release_memory();
|
extern void wad_release_memory();
|
||||||
extern char *wad_strdup(const char *c);
|
extern char *wad_strdup(const char *c);
|
||||||
extern char *wad_pstrdup(const char *c);
|
|
||||||
|
|
||||||
/* --- I/O, Debugging --- */
|
/* --- I/O, Debugging --- */
|
||||||
|
|
||||||
|
|
@ -90,7 +88,7 @@ extern void wad_set_return_func(void (*f)(void));
|
||||||
typedef struct WadLocal {
|
typedef struct WadLocal {
|
||||||
char *name; /* Name of the local */
|
char *name; /* Name of the local */
|
||||||
void *ptr; /* Pointer to the actual data (if known) */
|
void *ptr; /* Pointer to the actual data (if known) */
|
||||||
int size; /* Size of the data */
|
int size; /* Size of the data (if known) */
|
||||||
int type; /* Data type */
|
int type; /* Data type */
|
||||||
|
|
||||||
/* Debugging information */
|
/* Debugging information */
|
||||||
|
|
|
||||||
|
|
@ -24,25 +24,34 @@ char *wad_arg_string(WadFrame *frame) {
|
||||||
WadLocal *wp;
|
WadLocal *wp;
|
||||||
long *stack;
|
long *stack;
|
||||||
long *nextstack;
|
long *nextstack;
|
||||||
|
long *prevstack;
|
||||||
int i;
|
int i;
|
||||||
WadFrame *nf;
|
WadFrame *nf;
|
||||||
|
WadFrame *pf;
|
||||||
|
|
||||||
nf = frame->next;
|
nf = frame->next;
|
||||||
if (nf)
|
if (nf)
|
||||||
nextstack = (long *) nf->stack;
|
nextstack = (long *) nf->stack;
|
||||||
else
|
else
|
||||||
nextstack = 0;
|
nextstack = 0;
|
||||||
|
|
||||||
|
pf = frame->prev;
|
||||||
|
if (pf)
|
||||||
|
prevstack = (long *) pf->stack;
|
||||||
|
else
|
||||||
|
prevstack = 0;
|
||||||
|
|
||||||
str[0] = 0;
|
str[0] = 0;
|
||||||
stack = (long *) frame->stack;
|
stack = (long *) frame->stack;
|
||||||
|
|
||||||
|
|
||||||
#ifdef WAD_LINUX
|
#ifdef WAD_LINUX
|
||||||
if (!nf) {
|
if (!nf) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (frame->debug_nargs < 0) {
|
if ((frame->debug_nargs < 0) || (0)){
|
||||||
/* No argument information is available. If we are on SPARC, we'll dump
|
/* No argument information is available. If we are on SPARC, we'll dump
|
||||||
the %in registers since these usually hold input parameters. On
|
the %in registers since these usually hold input parameters. On
|
||||||
Linux, we do nothing */
|
Linux, we do nothing */
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ static WadMemory *current = 0; /* Current memory block */
|
||||||
static WadMemory *persistent = 0; /* Persistent memory data */
|
static WadMemory *persistent = 0; /* Persistent memory data */
|
||||||
static int pagesize = 0; /* System page size */
|
static int pagesize = 0; /* System page size */
|
||||||
static int devzero = 0;
|
static int devzero = 0;
|
||||||
|
static int npalloc = 8; /* Number of pages per alloc */
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* wad_memory_init()
|
* wad_memory_init()
|
||||||
|
|
@ -72,14 +73,14 @@ void *wad_malloc(int nbytes) {
|
||||||
char *c;
|
char *c;
|
||||||
int npages;
|
int npages;
|
||||||
/* wad_printf("wad_malloc: %d\n", nbytes); */
|
/* wad_printf("wad_malloc: %d\n", nbytes); */
|
||||||
if (nbytes >= (pagesize >> 2)) {
|
if (nbytes >= ((npalloc*pagesize) >> 2)) {
|
||||||
/* Large allocation. */
|
/* Large allocation. */
|
||||||
npages = ((nbytes + sizeof(WadMemory))/pagesize) + 1;
|
npages = ((nbytes + sizeof(WadMemory))/pagesize) + 1;
|
||||||
ptr = wad_page_alloc(npages);
|
ptr = wad_page_alloc(npages);
|
||||||
if (!ptr) return 0;
|
if (!ptr) return 0;
|
||||||
wm = (WadMemory *)ptr;
|
wm = (WadMemory *)ptr;
|
||||||
wm->npages = npages;
|
wm->npages = npages;
|
||||||
wm->last = sizeof(WadMemory);
|
wm->last = sizeof(WadMemory) + 8;
|
||||||
wm->next = current;
|
wm->next = current;
|
||||||
current = wm;
|
current = wm;
|
||||||
c = (char *) current + (current->last);
|
c = (char *) current + (current->last);
|
||||||
|
|
@ -97,9 +98,9 @@ void *wad_malloc(int nbytes) {
|
||||||
}
|
}
|
||||||
if (!wm) {
|
if (!wm) {
|
||||||
/* wad_printf("wad_malloc: new page\n", nbytes);*/
|
/* wad_printf("wad_malloc: new page\n", nbytes);*/
|
||||||
wm = (WadMemory *) wad_page_alloc(1);
|
wm = (WadMemory *) wad_page_alloc(npalloc);
|
||||||
if (!wm) return 0;
|
if (!wm) return 0;
|
||||||
wm->npages = 1;
|
wm->npages = npalloc;
|
||||||
wm->last = sizeof(WadMemory);
|
wm->last = sizeof(WadMemory);
|
||||||
wm->next = current;
|
wm->next = current;
|
||||||
current = wm;
|
current = wm;
|
||||||
|
|
@ -109,33 +110,17 @@ void *wad_malloc(int nbytes) {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* wad_pmalloc()
|
|
||||||
*
|
|
||||||
* Persistent memory allocation. Allocates memory that will never be reclaimed.
|
|
||||||
* This is only really used to store information pertaining to object files.
|
|
||||||
* ----------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
void *wad_pmalloc(int nbytes) {
|
|
||||||
void *ptr;
|
|
||||||
WadMemory *tmp;
|
|
||||||
tmp = current;
|
|
||||||
current = persistent;
|
|
||||||
ptr = wad_malloc(nbytes);
|
|
||||||
persistent = current;
|
|
||||||
current = tmp;
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* wad_release_memory()
|
* wad_release_memory()
|
||||||
*
|
*
|
||||||
* Releases all memory previously allocated by wad_malloc()
|
* Releases all memory previously allocated by wad_malloc(). This is inherently
|
||||||
|
* dangerous.
|
||||||
* ----------------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void wad_release_memory() {
|
void wad_release_memory() {
|
||||||
WadMemory *wm, *next;
|
WadMemory *wm, *next;
|
||||||
|
|
||||||
|
return;
|
||||||
wm = current;
|
wm = current;
|
||||||
while (wm) {
|
while (wm) {
|
||||||
next = wm->next;
|
next = wm->next;
|
||||||
|
|
@ -159,11 +144,3 @@ char *wad_strdup(const char *c) {
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *wad_pstrdup(const char *c) {
|
|
||||||
char *t;
|
|
||||||
if (!c) c = "";
|
|
||||||
t = (char *) wad_pmalloc(strlen(c)+1);
|
|
||||||
strcpy(t,c);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,8 +54,8 @@ load_file(const char *path) {
|
||||||
return 0; /* Doesn't exist. Oh well */
|
return 0; /* Doesn't exist. Oh well */
|
||||||
}
|
}
|
||||||
if (wad_debug_mode & DEBUG_FILE) wad_printf("loaded.\n");
|
if (wad_debug_mode & DEBUG_FILE) wad_printf("loaded.\n");
|
||||||
wf = (WadFile *) wad_pmalloc(sizeof(WadFile));
|
wf = (WadFile *) wad_malloc(sizeof(WadFile));
|
||||||
wf->path = wad_pstrdup(path);
|
wf->path = wad_strdup(path);
|
||||||
|
|
||||||
/* Get file length */
|
/* Get file length */
|
||||||
wf->size = lseek(fd,0,SEEK_END);
|
wf->size = lseek(fd,0,SEEK_END);
|
||||||
|
|
@ -116,10 +116,18 @@ wad_object_load(const char *path) {
|
||||||
WadObjectFile *wad_arobject_load(const char *path, const char *name);
|
WadObjectFile *wad_arobject_load(const char *path, const char *name);
|
||||||
|
|
||||||
if (wad_debug_mode & DEBUG_OBJECT) {
|
if (wad_debug_mode & DEBUG_OBJECT) {
|
||||||
wad_printf("wad: Loading object '%s'\n", path);
|
wad_printf("wad: Loading object '%s'", path);
|
||||||
}
|
}
|
||||||
for (wo = wad_objects; wo; wo=wo->next) {
|
for (wo = wad_objects; wo; wo=wo->next) {
|
||||||
if (strcmp(wo->path,path) == 0) return wo;
|
if (strcmp(wo->path,path) == 0) {
|
||||||
|
if (wad_debug_mode & DEBUG_OBJECT) {
|
||||||
|
wad_printf(" (cached)\n");
|
||||||
|
}
|
||||||
|
return wo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wad_debug_mode & DEBUG_OBJECT) {
|
||||||
|
wad_printf("\n");
|
||||||
}
|
}
|
||||||
/* Didn't find it. Now we need to go load some files */
|
/* Didn't find it. Now we need to go load some files */
|
||||||
|
|
||||||
|
|
@ -142,7 +150,9 @@ wad_object_load(const char *path) {
|
||||||
wo = wad_arobject_load(realfile,objfile);
|
wo = wad_arobject_load(realfile,objfile);
|
||||||
if (wo) {
|
if (wo) {
|
||||||
/* Reset the path */
|
/* Reset the path */
|
||||||
wo->path = wad_pstrdup(path);
|
wo->path = wad_strdup(path);
|
||||||
|
wo->next = wad_objects;
|
||||||
|
wad_objects = wo;
|
||||||
return wo;
|
return wo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -150,10 +160,12 @@ wad_object_load(const char *path) {
|
||||||
wf = load_file(path);
|
wf = load_file(path);
|
||||||
if (!wf) return 0;
|
if (!wf) return 0;
|
||||||
|
|
||||||
wo = (WadObjectFile *) wad_pmalloc(sizeof(WadObjectFile));
|
wo = (WadObjectFile *) wad_malloc(sizeof(WadObjectFile));
|
||||||
wo->path = wad_pstrdup(path);
|
wo->path = wad_strdup(path);
|
||||||
wo->ptr = wf->addr;
|
wo->ptr = wf->addr;
|
||||||
wo->len = wf->size;
|
wo->len = wf->size;
|
||||||
|
wo->next = wad_objects;
|
||||||
|
wad_objects = wo;
|
||||||
return wo;
|
return wo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -235,7 +247,7 @@ wad_arobject_load(const char *arpath, const char *robjname) {
|
||||||
/* Compare the names */
|
/* Compare the names */
|
||||||
if (strncmp(mname,objname,sobjname) == 0) {
|
if (strncmp(mname,objname,sobjname) == 0) {
|
||||||
/* Found the archive */
|
/* Found the archive */
|
||||||
wo = (WadObjectFile *) wad_pmalloc(sizeof(WadObjectFile));
|
wo = (WadObjectFile *) wad_malloc(sizeof(WadObjectFile));
|
||||||
wo->ptr = (void *) (arptr + offset);
|
wo->ptr = (void *) (arptr + offset);
|
||||||
wo->len = msize;
|
wo->len = msize;
|
||||||
wo->path = 0;
|
wo->path = 0;
|
||||||
|
|
|
||||||
|
|
@ -255,9 +255,6 @@ void wad_signalhandler(int sig, siginfo_t *si, void *vcontext) {
|
||||||
char *retname = 0;
|
char *retname = 0;
|
||||||
unsigned long current_brk;
|
unsigned long current_brk;
|
||||||
|
|
||||||
|
|
||||||
wad_release_memory();
|
|
||||||
|
|
||||||
wad_nlr_func = 0;
|
wad_nlr_func = 0;
|
||||||
|
|
||||||
context = (ucontext_t *) vcontext;
|
context = (ucontext_t *) vcontext;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,75 @@ typedef struct Stab {
|
||||||
#define N_PSYM 0xa0 /* Parameter */
|
#define N_PSYM 0xa0 /* Parameter */
|
||||||
#define N_LBRAC 0xc0 /* Left brace */
|
#define N_LBRAC 0xc0 /* Left brace */
|
||||||
|
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* stabs type handler
|
||||||
|
*
|
||||||
|
* Type names are defined as N_LSYM types. We need to keep a hash table of
|
||||||
|
* logical type names and stabs type names.
|
||||||
|
*
|
||||||
|
* We also need to keep a hash table of stabs types.
|
||||||
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
typedef struct stabtype {
|
||||||
|
char *name;
|
||||||
|
char *value;
|
||||||
|
struct stabtype *next;
|
||||||
|
} stabtype;
|
||||||
|
|
||||||
|
#define HASH_SIZE 113
|
||||||
|
|
||||||
|
static int stab_type_init = 0;
|
||||||
|
static stabtype *lnames[HASH_SIZE]; /* Hash of local names */
|
||||||
|
|
||||||
|
/* Initialize the hash table */
|
||||||
|
|
||||||
|
static void init_hash() {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < HASH_SIZE; i++) {
|
||||||
|
lnames[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int thash(char *name) {
|
||||||
|
unsigned int h = 0;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 8 && (*name); i++, name++) {
|
||||||
|
h = ((h << 7) + *name) % HASH_SIZE;
|
||||||
|
}
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a symbol to the hash */
|
||||||
|
|
||||||
|
static void type_add(char *name, char *value) {
|
||||||
|
int h;
|
||||||
|
stabtype *s;
|
||||||
|
if (!stab_type_init) {
|
||||||
|
init_hash();
|
||||||
|
stab_type_init = 1;
|
||||||
|
}
|
||||||
|
h = thash(name);
|
||||||
|
s = lnames[h];
|
||||||
|
while (s) {
|
||||||
|
if (strcmp(s->name,name) == 0) {
|
||||||
|
if (strcmp(s->value,value) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s->value = (char *) wad_strdup(value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s = s->next;
|
||||||
|
}
|
||||||
|
s = (stabtype *) wad_malloc(sizeof(stabtype));
|
||||||
|
s->name = wad_strdup(name);
|
||||||
|
s->value = wad_strdup(value);
|
||||||
|
s->next = lnames[h];
|
||||||
|
lnames[h] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* match_stab_symbol()
|
* match_stab_symbol()
|
||||||
*
|
*
|
||||||
|
|
@ -63,15 +132,23 @@ stab_string_parm(char *str) {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
stab_symbol(Stab *s, char *stabstr) {
|
stab_symbol(Stab *s, char *stabstr) {
|
||||||
|
char *str;
|
||||||
char *pstr;
|
char *pstr;
|
||||||
|
char name[1024];
|
||||||
int a;
|
int a;
|
||||||
|
|
||||||
pstr = stab_string_parm(stabstr+s->n_strx);
|
str = stabstr+s->n_strx;
|
||||||
|
pstr = stab_string_parm(str);
|
||||||
if (!pstr) return;
|
if (!pstr) return;
|
||||||
|
|
||||||
|
strncpy(name,str, pstr-str);
|
||||||
|
name[(int)(pstr-str)] = 0;
|
||||||
if (pstr[1] == 't') {
|
if (pstr[1] == 't') {
|
||||||
|
/* A stabs type definition */
|
||||||
/* wad_printf("stab lsym: other=%d, desc=%d, value=%d, str='%s'\n", s->n_other,s->n_desc,s->n_value,
|
/* wad_printf("stab lsym: other=%d, desc=%d, value=%d, str='%s'\n", s->n_other,s->n_desc,s->n_value,
|
||||||
stabstr+s->n_strx); */
|
stabstr+s->n_strx); */
|
||||||
|
/* wad_printf("name = '%s', pstr='%s'\n", name, pstr+2); */
|
||||||
|
type_add(name,pstr+2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,20 +47,46 @@ void wad_build_vars(WadFrame *f) {
|
||||||
} else if (loc->stack < 0) {
|
} else if (loc->stack < 0) {
|
||||||
loc->ptr = (void *) (stack + f->stack_size + loc->stack);
|
loc->ptr = (void *) (stack + f->stack_size + loc->stack);
|
||||||
}
|
}
|
||||||
|
loc->size = sizeof(long);
|
||||||
}
|
}
|
||||||
|
if (loc->loc == PARM_REGISTER) {
|
||||||
|
/* Parameter is located in a register */
|
||||||
|
#ifdef WAD_SOLARIS
|
||||||
|
if ((loc->reg >= 24) && (loc->reg < 32)) {
|
||||||
|
/* Value is located in the %in registers. */
|
||||||
|
loc->ptr = (void *) (stack + (loc->reg - 16)*sizeof(int));
|
||||||
|
loc->size = sizeof(int);
|
||||||
|
} else if ((loc->reg >= 8) && (loc->reg < 16)) {
|
||||||
|
|
||||||
|
/* Value is located in the %on registers */
|
||||||
|
if (nstack) {
|
||||||
|
loc->ptr = (void *) (stack + (loc->reg)*sizeof(int));
|
||||||
|
loc->size = sizeof(int);
|
||||||
|
}
|
||||||
|
} else if ((loc->reg >= 16) && (loc->reg < 24)) {
|
||||||
|
/* Value has been placed in the %ln registers */
|
||||||
|
loc->ptr = (void *) (stack + (loc->reg - 16)*sizeof(int));
|
||||||
|
loc->size = sizeof(int);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef OLD
|
||||||
if (lastloc) {
|
if (lastloc) {
|
||||||
/* Figure out the size */
|
/* Figure out the size */
|
||||||
if (!lastloc->size)
|
if (!lastloc->size)
|
||||||
lastloc->size = abs(loc->stack - lastloc->stack);
|
lastloc->size = abs(loc->stack - lastloc->stack);
|
||||||
}
|
}
|
||||||
lastloc = loc;
|
lastloc = loc;
|
||||||
|
#endif
|
||||||
|
|
||||||
loc = loc->next;
|
loc = loc->next;
|
||||||
}
|
}
|
||||||
|
#ifdef OLD
|
||||||
/* If last size is not set. Assume that it is a word */
|
/* If last size is not set. Assume that it is a word */
|
||||||
if (lastloc && (!lastloc->size)) {
|
if (lastloc && (!lastloc->size)) {
|
||||||
lastloc->size = 4;
|
lastloc->size = 4;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue