This uncovers a problem in il/il_aux.c: it passes 3 arguments to getlines(), but the function expects 4 arguments. I add FALSE as the 4th argument. TRUE would fill in the list of mesregs. IL uses mesregs during phase 1, but this call to getlines() is in phase 2. TRUE would leak memory unless I added a call to Ldeleteset(mesregs). So I pass FALSE. Functions passed to go() now have a `void *` parameter because no_action() now takes a `void *`.
150 lines
2.4 KiB
C
150 lines
2.4 KiB
C
/* $Id$ */
|
|
/*
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
*/
|
|
/* S H A R E D F I L E
|
|
*
|
|
* D E B U G . C
|
|
*/
|
|
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <em_spec.h>
|
|
#include "types.h"
|
|
#include "def.h"
|
|
#include "debug.h"
|
|
#include "global.h"
|
|
|
|
|
|
|
|
int linecount; /* # lines in this file */
|
|
bool verbose_flag = FALSE; /* generate verbose output ? */
|
|
|
|
/* VARARGS1 */
|
|
void error(const char *s, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, s);
|
|
fprintf(stderr,"error on line %u",linecount);
|
|
if (filename != (char *) 0) {
|
|
fprintf(stderr," file %s",filename);
|
|
}
|
|
fprintf(stderr,": ");
|
|
vfprintf(stderr,s,ap);
|
|
fprintf(stderr,"\n");
|
|
abort();
|
|
exit(-1);
|
|
}
|
|
|
|
#ifdef TRACE
|
|
/* VARARGS1 */
|
|
void OUTTRACE(const char *s, int n)
|
|
{
|
|
fprintf(stderr,"> ");
|
|
vfprintf(stderr,s,n);
|
|
fprintf(stderr,"\n");
|
|
}
|
|
#endif
|
|
|
|
#ifdef VERBOSE
|
|
/* VARARGS1 */
|
|
void OUTVERBOSE(const char *s, int n1, int n2)
|
|
{
|
|
if (verbose_flag) {
|
|
fprintf(stderr,"optimization: ");
|
|
fprintf(stderr,s,n1,n2);
|
|
fprintf(stderr,"\n");
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
badassertion(file,line) char *file; unsigned line; {
|
|
|
|
fprintf(stderr,"assertion failed file %s, line %u\n",file,line);
|
|
error("assertion");
|
|
}
|
|
/* Valid Address */
|
|
|
|
void VA(short *a) {
|
|
if (a == (short *) 0) error("VA: 0 argument");
|
|
if ( ((unsigned) a & 01) == 01) {
|
|
/* MACHINE DEPENDENT TEST */
|
|
error("VA: odd argument");
|
|
}
|
|
}
|
|
|
|
|
|
/* Valid Instruction code */
|
|
|
|
void VI(short i) {
|
|
if (i > ps_last) error("VI: illegal instr: %d", i);
|
|
}
|
|
|
|
|
|
/* Valid Line */
|
|
|
|
void VL(line_p l) {
|
|
byte instr, optype;
|
|
|
|
VA((short *) l);
|
|
instr = l->l_instr;
|
|
VI(instr);
|
|
optype = TYPE(l);
|
|
if (optype < OP_FIRST || optype > OP_LAST) {
|
|
error("VL: illegal optype: %d", optype);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Valid Data block */
|
|
|
|
void VD(dblock_p d) {
|
|
byte pseudo;
|
|
|
|
VA((short *) d);
|
|
pseudo = d->d_pseudo;
|
|
if (pseudo < D_FIRST || pseudo > D_LAST) {
|
|
error("VD: illegal pseudo: %d",pseudo);
|
|
}
|
|
}
|
|
|
|
|
|
/* Valid Object */
|
|
|
|
void VO(obj_p o) {
|
|
offset off;
|
|
|
|
VA((short *) o);
|
|
off = o->o_off;
|
|
if (off < 0 || off > 10000) {
|
|
error("VO: unlikely offset: %d", off);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Valid Proc */
|
|
|
|
void VP(proc_p p) {
|
|
proc_id pid;
|
|
int nrlabs;
|
|
|
|
VA((short *) p);
|
|
pid = p->p_id;
|
|
if (pid <0 || pid > 1000) {
|
|
error("VP: unlikely proc_id: %d", (int) pid);
|
|
}
|
|
nrlabs = p->p_nrlabels;
|
|
if (nrlabs < 0 || nrlabs > 500) {
|
|
error("VP: unlikely p_nrlabels: %d", nrlabs);
|
|
}
|
|
}
|
|
#endif
|