This is symbols.c in view mode; [Download] [Up]
/* symbols.c - symbols (labels) printing and handling, NeXT disassembler.
Copyright (C) 1989 by Bill Spitzak
See Copyright notice in makefile
See also symtab.c for the routines which sort symbols.
*/
#include "dis.h"
/* Print an assembler directive that will produce an arbitrary symbol
table entry. This is printed when we don't know anything better
to do with a symbol. */
printstab(struct nlist *s) {
struct nte {unsigned char type; char *symbol;};
static struct nte nametable[] = {
{N_UNDF, "N_UNDF"},
{N_ABS, "N_ABS"},
{N_INDR, "N_INDR"},
{N_SECT, "N_SECT"},
{N_GSYM, "N_GSYM"},
{N_FNAME, "N_FNAME"},
{N_FUN, "N_FUN"},
{N_STSYM, "N_STSYM"},
{N_LCSYM, "N_LCSYM"},
{N_RSYM, "N_RSYM"},
{N_SLINE, "N_SLINE"},
{N_SSYM, "N_SSYM"},
{N_SO, "N_SO"},
{N_LSYM, "N_LSYM"},
{N_SOL, "N_SOL"},
{N_PSYM, "N_PSYM"},
{N_ENTRY, "N_ENTRY"},
{N_LBRAC, "N_LBRAC"},
{N_RBRAC, "N_RBRAC"},
{N_BCOMM, "N_BCOMM"},
{N_ECOMM, "N_ECOMM"},
{N_ECOML, "N_ECOML"},
{N_LENG, "N_LENG"},
{N_PC, "N_PC"},
{0,0}};
struct nte *n;
sprint(s->section ? ".stabd " : ".stabs ");
if (s->name) fprint("\"%s\",",s->name); else sprint("0,");
for (n=nametable; n->type != (s->type&-2) && n->symbol; n++);
if (n->symbol) {
sprint(n->symbol); if (s->type&1) sprint("+N_EXT");
}
else fprint("0x%2x",s->type);
fprint(",%d",s->desc);
if (!s->section) fprint(",%d",s->value);
}
/* Print a line containing a symbol. If the symbol could properly be
imbedded in a tab before disassembled code, return TRUE. Otherwise
return false to force the disassembler to start a new line after it.
*/
printsymbol(struct nlist *s) {
extern struct nlist *sourcesymtab;
extern char *symnametable;
extern flag noextern;
if (noextern && s->type==(N_UNDF|1) && !s->value) return(FALSE);
if (s->section) startline(s->value);
else startlinenoaddress();
switch (s->type&-2) {
case N_UNDF :
if (s->value) fprint(".comm %s, %d",s->name,s->value);
else fprint(".globl %s",s->name);
break;
case N_ABS :
if (s->type&1) sprint(".globl ");
fprint("%s = %x",s->name,s->value);
break;
case N_INDR:
if (s->type&1) {
fprint(".globl %s",s->name);
startlinenoaddress();
}
fprint("%s = %s",s->name,symnametable+s->value);
break;
case N_SECT:
if (s->type&1) {
fprint(".globl %s",s->name);
startline(s->value);
}
fprint(s->name ? s->name : "D%x", s->value);
cprint(':');
return(!s->name || strlen(s->name)<7);
break;
case N_SLINE:
fprint("| line %d",s->desc);
break;
case N_SO:
fprint("| source file \"%s\"",s->name);
break;
case N_SOL:
fprint("| include file \"%s\"",s->name);
break;
default:
printstab(s);
break;
}
return(FALSE);
}
/* This is the usual method to create a disassembly symbol. For
now it is unlikely we will produce any other types of symbols
than these static labels. Make sure the name is in static
storage! */
struct nlist *
createlabel(unsigned address,unsigned sn,unsigned type,char *name) {
struct nlist *s;
s = malloc(sizeof(struct nlist));
s->name = name;
s->type = N_SECT;
if (!sn) sn=1;
s->section = sn;
s->desc = type;
s->value = address;
addsymbol(s);
return(s);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.