Many changes, mostly for Solaris 2
This commit is contained in:
parent
4539174f47
commit
b95ae2fa70
22 changed files with 351 additions and 6 deletions
|
@ -26,6 +26,7 @@ make.ops
|
|||
make.tokcase
|
||||
make.tokfile
|
||||
message.h
|
||||
misc.h
|
||||
modula-2.c
|
||||
operator.h
|
||||
operators.ot
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "expr.h"
|
||||
#include "tree.h"
|
||||
#include "operator.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out, *db_in;
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "langdep.h"
|
||||
#include "token.h"
|
||||
#include "expr.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern char *Salloc();
|
||||
extern char *strindex();
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "class.h"
|
||||
#include "idf.h"
|
||||
#include "rd.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern char *strindex();
|
||||
extern long str2long();
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "symbol.h"
|
||||
#include "scope.h"
|
||||
#include "file.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out;
|
||||
extern t_lineno listline, currline;
|
||||
|
|
|
@ -52,12 +52,14 @@
|
|||
#include "langdep.h"
|
||||
#include "scope.h"
|
||||
#include "idf.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out;
|
||||
extern int stack_offset;
|
||||
extern char *strcpy();
|
||||
extern t_addr *get_EM_regs();
|
||||
extern char *memcpy();
|
||||
extern char *malloc(), *realloc();
|
||||
|
||||
#define malloc_succeeded(p) if (! (p)) {\
|
||||
error("could not allocate enough memory");\
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "position.h"
|
||||
#include "tree.h"
|
||||
#include "operator.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out;
|
||||
extern int db_ss;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "idf.h"
|
||||
#include "file.h"
|
||||
#include "symbol.h"
|
||||
#include "misc.h"
|
||||
|
||||
static line_positions();
|
||||
extern char *dirs[];
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
/* $Header$ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <varargs.h>
|
||||
#include <signal.h>
|
||||
#if __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
#include "tokenname.h"
|
||||
#include "position.h"
|
||||
|
@ -12,6 +16,7 @@
|
|||
#include "Lpars.h"
|
||||
#include "type.h"
|
||||
#include "langdep.h"
|
||||
#include "misc.h"
|
||||
|
||||
static char *usage = "Usage: %s [<ack.out>] [<a.out>]";
|
||||
char *progname;
|
||||
|
@ -114,7 +119,58 @@ prompt()
|
|||
}
|
||||
}
|
||||
|
||||
extern int errorgiven;
|
||||
|
||||
#if __STDC__
|
||||
void
|
||||
fatal(char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
{
|
||||
fprintf(db_out, "%s: ", progname);
|
||||
vfprintf(db_out, fmt, ap);
|
||||
fprintf(db_out, "\n");
|
||||
}
|
||||
va_end(ap);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
error(char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (! interrupted) {
|
||||
va_start(ap, fmt);
|
||||
{
|
||||
fprintf(db_out, "%s: ", progname);
|
||||
vfprintf(db_out, fmt, ap);
|
||||
fprintf(db_out, "\n");
|
||||
}
|
||||
va_end(ap);
|
||||
}
|
||||
errorgiven = 1;
|
||||
}
|
||||
|
||||
void
|
||||
warning(char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
{
|
||||
fprintf(db_out, "%s: ", progname);
|
||||
vfprintf(db_out, fmt, ap);
|
||||
fprintf(db_out, "\n");
|
||||
}
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
#else
|
||||
/*VARARGS*/
|
||||
void
|
||||
fatal(va_alist)
|
||||
va_dcl
|
||||
{
|
||||
|
@ -132,9 +188,8 @@ fatal(va_alist)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
extern int errorgiven;
|
||||
|
||||
/*VARARGS*/
|
||||
void
|
||||
error(va_alist)
|
||||
va_dcl
|
||||
{
|
||||
|
@ -155,6 +210,7 @@ error(va_alist)
|
|||
}
|
||||
|
||||
/*VARARGS*/
|
||||
void
|
||||
warning(va_alist)
|
||||
va_dcl
|
||||
{
|
||||
|
@ -170,12 +226,15 @@ warning(va_alist)
|
|||
}
|
||||
va_end(ap);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
rd_fatal()
|
||||
{
|
||||
fatal("read error in %s", AckObj);
|
||||
}
|
||||
|
||||
void
|
||||
No_Mem()
|
||||
{
|
||||
fatal("out of memory");
|
||||
|
|
7
util/grind/misc.h
Normal file
7
util/grind/misc.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
/* $Header$ */
|
||||
|
||||
#include <ansi.h>
|
||||
|
||||
_PROTOTYPE(void fatal, (char *, ...));
|
||||
_PROTOTYPE(void error, (char *, ...));
|
||||
_PROTOTYPE(void warning, (char *, ...));
|
|
@ -15,6 +15,7 @@
|
|||
#include "expr.h"
|
||||
#include "tree.h"
|
||||
#include "operator.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out, *db_in;
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "expr.h"
|
||||
#include "tree.h"
|
||||
#include "operator.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out, *db_in;
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "file.h"
|
||||
#include "idf.h"
|
||||
#include "symbol.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out;
|
||||
|
||||
|
|
|
@ -11,9 +11,11 @@
|
|||
#include "position.h"
|
||||
#include "idf.h"
|
||||
#include "expr.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out;
|
||||
extern char *strindex();
|
||||
extern char *malloc();
|
||||
|
||||
static
|
||||
print_unsigned(tp, v, format)
|
||||
|
|
|
@ -22,7 +22,7 @@ MODLIB = \
|
|||
$(LIBDIR)/libstring.$(LIBSUF) \
|
||||
$(LIBDIR)/libsystem.$(LIBSUF)
|
||||
|
||||
LIBS = $(MODLIB)
|
||||
LIBS = $(EXTRALIB) $(MODLIB)
|
||||
|
||||
LINTLIBS = \
|
||||
$(LINTLIBDIR)/$(LINTPREF)assert.$(LINTSUF) \
|
||||
|
@ -33,7 +33,7 @@ LINTLIBS = \
|
|||
|
||||
PROFILE =
|
||||
INCLUDES = -I. -I$(SRC_DIR) -I$(TARGET_HOME)/modules/h -I$(TARGET_HOME)/h -I$(TARGET_HOME)/modules/pkg
|
||||
CFLAGS = $(PROFILE) $(INCLUDES) $(COPTIONS)
|
||||
CFLAGS = $(PROFILE) $(INCLUDES) $(COPTIONS) -DNDEBUG
|
||||
LINTFLAGS = $(INCLUDES) $(LINTOPTIONS)
|
||||
LDFLAGS = $(PROFILE) $(LDOPTIONS)
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ UTIL_BIN = $(UTIL_HOME)/bin
|
|||
TABGEN= $(UTIL_BIN)/tabgen
|
||||
LLGEN = $(UTIL_BIN)/LLgen
|
||||
LLGENOPTIONS = -v
|
||||
EXTRALIB =
|
||||
|
||||
SRC_G1 = $(SRC_DIR)/commands.g
|
||||
GEN_G1 = tokenfile.g
|
||||
|
@ -64,7 +65,7 @@ NEXTFILES = $(SRC_DIR)/file.hh \
|
|||
$(SRC_DIR)/langdep.cc
|
||||
|
||||
all: make.main
|
||||
make -f make.main grind
|
||||
make -f make.main "EXTRALIB="$(EXTRALIB) grind
|
||||
|
||||
install: all
|
||||
cp grind $(TARGET_HOME)/bin/grind
|
||||
|
|
258
util/grind/rd.c
258
util/grind/rd.c
|
@ -3,10 +3,15 @@
|
|||
/* a.out file reading ... */
|
||||
|
||||
#include "rd.h"
|
||||
#include "misc.h"
|
||||
#include <assert.h>
|
||||
#include <alloc.h>
|
||||
|
||||
#if defined(__sun)
|
||||
#if ! defined(sun)
|
||||
#define sun
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__i386)
|
||||
#define i386
|
||||
|
@ -17,13 +22,20 @@
|
|||
#endif
|
||||
|
||||
#if defined(__sparc)
|
||||
#if ! defined(sparc)
|
||||
#define sparc
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__vax)
|
||||
#define vax
|
||||
#endif
|
||||
|
||||
#if defined(__solaris) || defined(__solaris__)
|
||||
#define solaris
|
||||
#endif
|
||||
|
||||
#if ! defined(solaris)
|
||||
#if defined(sun) || defined(vax)
|
||||
|
||||
struct exec {
|
||||
|
@ -215,6 +227,7 @@ rd_close()
|
|||
fclose(inf);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(i386)
|
||||
|
@ -380,3 +393,248 @@ rd_close()
|
|||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(solaris)
|
||||
#include <libelf.h>
|
||||
#include <sys/elf_M32.h>
|
||||
#include <stb.h>
|
||||
|
||||
struct nlist {
|
||||
union {
|
||||
char *n_name;
|
||||
long n_strx;
|
||||
} n_un;
|
||||
unsigned char n_type;
|
||||
char n_other;
|
||||
short n_desc;
|
||||
unsigned long n_value;
|
||||
};
|
||||
|
||||
static int fildes;
|
||||
static Elf *elf;
|
||||
static Elf32_Ehdr *ehdr;
|
||||
static struct nlist *dbtab;
|
||||
static char *dbstringtab;
|
||||
static Elf32_Sym *tab;
|
||||
static char *stringtab;
|
||||
static struct outhead hh;
|
||||
static struct nlist *maxdn;
|
||||
|
||||
#define N_STAB 0xe0
|
||||
|
||||
int
|
||||
rd_open(f)
|
||||
char *f;
|
||||
{
|
||||
if ((fildes = open(f, 0)) < 0) return 0;
|
||||
elf_version(EV_CURRENT);
|
||||
if ((elf = elf_begin(fildes, ELF_C_READ, (Elf *) 0)) == 0) {
|
||||
close(fildes);
|
||||
return 0;
|
||||
}
|
||||
if ((ehdr = elf32_getehdr(elf)) == NULL) {
|
||||
elf_end(elf);
|
||||
close(fildes);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
rd_ohead(h)
|
||||
struct outhead *h;
|
||||
{
|
||||
Elf_Scn *scn = 0;
|
||||
Elf32_Shdr *shdr;
|
||||
Elf_Data *sectnames;
|
||||
Elf_Data *dt;
|
||||
register struct nlist *dn;
|
||||
register Elf32_Sym *n;
|
||||
long text_offset, data_offset, bss_offset, fun_offset;
|
||||
int fixnamoff = 0, newfixnamoff = 0;
|
||||
|
||||
h->oh_magic = O_CONVERTED;
|
||||
h->oh_stamp = 0;
|
||||
h->oh_nsect = 4;
|
||||
h->oh_nrelo = 0;
|
||||
h->oh_flags = 0;
|
||||
h->oh_nemit = 0;
|
||||
h->oh_nname = 0;
|
||||
|
||||
scn = elf_getscn(elf, (size_t) ehdr->e_shstrndx);
|
||||
sectnames = elf_getdata(scn, (Elf_Data *) 0);
|
||||
|
||||
scn = 0;
|
||||
while ((scn = elf_nextscn(elf, scn)) != 0) {
|
||||
shdr = elf32_getshdr(scn);
|
||||
switch(shdr->sh_type) {
|
||||
case SHT_PROGBITS:
|
||||
/* Get stab symbol table. Elf does not know about it,
|
||||
and, unfortunately, no relocation is done on it.
|
||||
*/
|
||||
h->oh_nemit += shdr->sh_size;
|
||||
if (! strcmp(".stab", (char *)(sectnames->d_buf)+shdr->sh_name)) {
|
||||
dt = elf_getdata(scn, (Elf_Data *) 0);
|
||||
if (dt->d_size == 0) {
|
||||
fatal("(part of) symbol table is missing");
|
||||
}
|
||||
dbtab = (struct nlist *) Malloc(dt->d_size);
|
||||
memcpy((char *) dbtab, (char *) dt->d_buf, dt->d_size);
|
||||
maxdn = (struct nlist *)((char *)dbtab+dt->d_size);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SHT_STRTAB:
|
||||
/* Get the stab string table, as well as the usual string
|
||||
table.
|
||||
*/
|
||||
if (! strcmp(".stabstr", (char *)(sectnames->d_buf)+shdr->sh_name)) {
|
||||
dt = elf_getdata(scn, (Elf_Data *) 0);
|
||||
if (dt->d_size == 0) {
|
||||
fatal("(part of) symbol table is missing");
|
||||
}
|
||||
dbstringtab = dt->d_buf;
|
||||
h->oh_nchar = dt->d_size;
|
||||
break;
|
||||
}
|
||||
if (! strcmp(".strtab", (char *)(sectnames->d_buf)+shdr->sh_name)) {
|
||||
dt = elf_getdata(scn, (Elf_Data *) 0);
|
||||
if (dt->d_size == 0) {
|
||||
fatal("(part of) symbol table is missing");
|
||||
}
|
||||
stringtab = dt->d_buf;
|
||||
}
|
||||
break;
|
||||
|
||||
case SHT_SYMTAB:
|
||||
/* Get the symbol table. */
|
||||
if (! strcmp(".symtab", (char *)(sectnames->d_buf)+shdr->sh_name)) {
|
||||
dt = elf_getdata(scn, (Elf_Data *) 0);
|
||||
if (dt->d_size == 0) {
|
||||
fatal("(part of) symbol table is missing");
|
||||
}
|
||||
tab = dt->d_buf;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Convert offsets in stab symbol table. */
|
||||
n = tab;
|
||||
dn = dbtab;
|
||||
while (dn < maxdn) {
|
||||
int i;
|
||||
|
||||
if (dn->n_un.n_strx) {
|
||||
dn->n_un.n_strx += fixnamoff;
|
||||
}
|
||||
switch(dn->n_type) {
|
||||
case 0:
|
||||
fixnamoff = newfixnamoff;
|
||||
newfixnamoff += dn->n_value;
|
||||
break;
|
||||
|
||||
case N_SO:
|
||||
h->oh_nname++;
|
||||
i = 0;
|
||||
while (i < 3) {
|
||||
while (stringtab[n->st_name] != 'B') n++;
|
||||
if (! strcmp("Btext.text", &(stringtab[n->st_name]))) {
|
||||
text_offset = n->st_value; i++;
|
||||
}
|
||||
else if (! strcmp("Bdata.data", &(stringtab[n->st_name]))) {
|
||||
data_offset = n->st_value; i++;
|
||||
}
|
||||
else if (! strcmp("Bbss.bss", &(stringtab[n->st_name]))) {
|
||||
bss_offset = n->st_value; i++;
|
||||
}
|
||||
n++;
|
||||
}
|
||||
break;
|
||||
|
||||
case N_GSYM:
|
||||
h->oh_nname++;
|
||||
/* Fortunately, we don't use this in ACK, so we don't
|
||||
have to handle it here. The problem is that we don't know
|
||||
which segment it comes from.
|
||||
*/
|
||||
break;
|
||||
|
||||
case N_STSYM:
|
||||
h->oh_nname++;
|
||||
dn->n_value += data_offset;
|
||||
break;
|
||||
|
||||
case N_LCSYM:
|
||||
h->oh_nname++;
|
||||
dn->n_value += bss_offset;
|
||||
break;
|
||||
|
||||
case N_FUN:
|
||||
h->oh_nname++;
|
||||
dn->n_value += text_offset;
|
||||
fun_offset = dn->n_value;
|
||||
break;
|
||||
|
||||
case N_MAIN:
|
||||
dn->n_value += text_offset;
|
||||
break;
|
||||
|
||||
case N_LBRAC:
|
||||
case N_RBRAC:
|
||||
case N_SLINE:
|
||||
h->oh_nname++;
|
||||
dn->n_value += fun_offset;
|
||||
break;
|
||||
|
||||
case N_SOL:
|
||||
case N_EINCL:
|
||||
case N_BINCL:
|
||||
case N_PSYM:
|
||||
case N_SSYM:
|
||||
case N_SCOPE:
|
||||
case N_RSYM:
|
||||
case N_LSYM:
|
||||
h->oh_nname++;
|
||||
/* Nothing to be done. */
|
||||
break;
|
||||
}
|
||||
dn++;
|
||||
}
|
||||
hh = *h;
|
||||
}
|
||||
|
||||
rd_name(nm, count)
|
||||
struct outname *nm;
|
||||
unsigned int count;
|
||||
{
|
||||
register struct nlist *dn = dbtab;
|
||||
register struct outname *n = nm;
|
||||
while (dn < maxdn) {
|
||||
if (dn->n_type & N_STAB) {
|
||||
n->on_type = dn->n_type << 8;
|
||||
n->on_valu = dn->n_value;
|
||||
n->on_desc = dn->n_desc;
|
||||
if (dn->n_un.n_strx == 0) n->on_foff = 0;
|
||||
else n->on_foff = OFF_CHAR(hh) + dn->n_un.n_strx;
|
||||
n++;
|
||||
}
|
||||
dn++;
|
||||
}
|
||||
free(dbtab);
|
||||
}
|
||||
|
||||
rd_string(nm, count)
|
||||
char *nm;
|
||||
long count;
|
||||
{
|
||||
memcpy(nm, dbstringtab, count);
|
||||
}
|
||||
|
||||
rd_close()
|
||||
{
|
||||
elf_end(elf);
|
||||
close(fildes);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -18,10 +18,12 @@
|
|||
#include "scope.h"
|
||||
#include "type.h"
|
||||
#include "expr.h"
|
||||
#include "misc.h"
|
||||
|
||||
#define MAXARG 128
|
||||
|
||||
extern char *strncpy();
|
||||
extern char *malloc();
|
||||
extern struct idf *str2idf();
|
||||
|
||||
extern char *AObj;
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "scope.h"
|
||||
#include "tree.h"
|
||||
#include "operator.h"
|
||||
#include "misc.h"
|
||||
|
||||
p_symbol currfile, listfile;
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "position.h"
|
||||
#include "file.h"
|
||||
#include "idf.h"
|
||||
#include "misc.h"
|
||||
|
||||
/* To centralize the declaration of %tokens, their presence in this
|
||||
file is taken as their declaration. The Makefile will produce
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "langdep.h"
|
||||
#include "type.h"
|
||||
#include "expr.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern FILE *db_out;
|
||||
t_lineno currline;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "scope.h"
|
||||
#include "langdep.h"
|
||||
#include "expr.h"
|
||||
#include "misc.h"
|
||||
|
||||
p_type int_type, char_type, short_type, long_type, bool_type;
|
||||
p_type uint_type, uchar_type, ushort_type, ulong_type;
|
||||
|
|
Loading…
Reference in a new issue