Many changes, mostly for Solaris 2

This commit is contained in:
ceriel 1993-11-10 15:11:28 +00:00
parent 4539174f47
commit b95ae2fa70
22 changed files with 351 additions and 6 deletions

View file

@ -26,6 +26,7 @@ make.ops
make.tokcase
make.tokfile
message.h
misc.h
modula-2.c
operator.h
operators.ot

View file

@ -14,6 +14,7 @@
#include "expr.h"
#include "tree.h"
#include "operator.h"
#include "misc.h"
extern FILE *db_out, *db_in;

View file

@ -16,6 +16,7 @@
#include "langdep.h"
#include "token.h"
#include "expr.h"
#include "misc.h"
extern char *Salloc();
extern char *strindex();

View file

@ -16,6 +16,7 @@
#include "class.h"
#include "idf.h"
#include "rd.h"
#include "misc.h"
extern char *strindex();
extern long str2long();

View file

@ -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;

View file

@ -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");\

View file

@ -7,6 +7,7 @@
#include "position.h"
#include "tree.h"
#include "operator.h"
#include "misc.h"
extern FILE *db_out;
extern int db_ss;

View file

@ -7,6 +7,7 @@
#include "idf.h"
#include "file.h"
#include "symbol.h"
#include "misc.h"
static line_positions();
extern char *dirs[];

View file

@ -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
View file

@ -0,0 +1,7 @@
/* $Header$ */
#include <ansi.h>
_PROTOTYPE(void fatal, (char *, ...));
_PROTOTYPE(void error, (char *, ...));
_PROTOTYPE(void warning, (char *, ...));

View file

@ -15,6 +15,7 @@
#include "expr.h"
#include "tree.h"
#include "operator.h"
#include "misc.h"
extern FILE *db_out, *db_in;

View file

@ -16,6 +16,7 @@
#include "expr.h"
#include "tree.h"
#include "operator.h"
#include "misc.h"
extern FILE *db_out, *db_in;

View file

@ -11,6 +11,7 @@
#include "file.h"
#include "idf.h"
#include "symbol.h"
#include "misc.h"
extern FILE *db_out;

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -16,6 +16,7 @@
#include "scope.h"
#include "tree.h"
#include "operator.h"
#include "misc.h"
p_symbol currfile, listfile;

View file

@ -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

View file

@ -16,6 +16,7 @@
#include "langdep.h"
#include "type.h"
#include "expr.h"
#include "misc.h"
extern FILE *db_out;
t_lineno currline;

View file

@ -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;