mirror of
https://github.com/open-simh/simtools.git
synced 2026-04-30 05:25:01 +00:00
Add a symbol and section table dump at the end of the listing.
This commit is contained in:
@@ -252,8 +252,10 @@ void migrate_implicit(
|
|||||||
|
|
||||||
for (isym = first_sym(&implicit_st, &iter); isym != NULL; isym = next_sym(&implicit_st, &iter)) {
|
for (isym = first_sym(&implicit_st, &iter); isym != NULL; isym = next_sym(&implicit_st, &iter)) {
|
||||||
sym = lookup_sym(isym->label, &symbol_st);
|
sym = lookup_sym(isym->label, &symbol_st);
|
||||||
if (sym)
|
if (sym) {
|
||||||
continue; // It's already in there. Great.
|
continue; // It's already in there. Great.
|
||||||
|
}
|
||||||
|
isym->flags |= SYMBOLFLAG_IMPLICIT_GLOBAL;
|
||||||
sym = add_sym(isym->label, isym->value, isym->flags, isym->section, &symbol_st);
|
sym = add_sym(isym->label, isym->value, isym->flags, isym->section, &symbol_st);
|
||||||
// Just one other thing - migrate the stmtno
|
// Just one other thing - migrate the stmtno
|
||||||
sym->stmtno = isym->stmtno;
|
sym->stmtno = isym->stmtno;
|
||||||
|
|||||||
@@ -388,6 +388,10 @@ int main(
|
|||||||
if (errcount > 0)
|
if (errcount > 0)
|
||||||
fprintf(stderr, "%d Errors\n", errcount);
|
fprintf(stderr, "%d Errors\n", errcount);
|
||||||
|
|
||||||
|
if (lstfile) {
|
||||||
|
list_symbol_table();
|
||||||
|
}
|
||||||
|
|
||||||
if (lstfile && strcmp(lstname, "-") != 0)
|
if (lstfile && strcmp(lstname, "-") != 0)
|
||||||
fclose(lstfile);
|
fclose(lstfile);
|
||||||
|
|
||||||
|
|||||||
119
symbols.c
119
symbols.c
@@ -9,6 +9,7 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "assemble_globals.h"
|
#include "assemble_globals.h"
|
||||||
#include "listing.h"
|
#include "listing.h"
|
||||||
|
#include "object.h"
|
||||||
|
|
||||||
/* GLOBALS */
|
/* GLOBALS */
|
||||||
int symbol_len = SYMMAX_DEFAULT; /* max. len of symbols. default = 6 */
|
int symbol_len = SYMMAX_DEFAULT; /* max. len of symbols. default = 6 */
|
||||||
@@ -29,6 +30,7 @@ SYMBOL_TABLE macro_st; /* Macros */
|
|||||||
SYMBOL_TABLE implicit_st; /* The symbols which may be implicit globals */
|
SYMBOL_TABLE implicit_st; /* The symbols which may be implicit globals */
|
||||||
|
|
||||||
|
|
||||||
|
void list_section(SECTION *sec);
|
||||||
|
|
||||||
/* hash_name hashes a name into a value from 0-HASH_SIZE */
|
/* hash_name hashes a name into a value from 0-HASH_SIZE */
|
||||||
|
|
||||||
@@ -476,3 +478,120 @@ static void sym_hist(
|
|||||||
fputc('\n', lstfile);
|
fputc('\n', lstfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int symbol_compar(
|
||||||
|
const void *a,
|
||||||
|
const void *b)
|
||||||
|
{
|
||||||
|
SYMBOL *sa = *(SYMBOL **)a;
|
||||||
|
SYMBOL *sb = *(SYMBOL **)b;
|
||||||
|
|
||||||
|
return strcmp(sa->label, sb->label);
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_symbol_table(
|
||||||
|
void)
|
||||||
|
{
|
||||||
|
SYMBOL_ITER iter;
|
||||||
|
SYMBOL *sym;
|
||||||
|
int skip_locals = 0;
|
||||||
|
|
||||||
|
fprintf(lstfile,"\n\nSymbol table\n\n");
|
||||||
|
|
||||||
|
/* Count the symbols in the table */
|
||||||
|
int nsyms = 0;
|
||||||
|
for (sym = first_sym(&symbol_st, &iter); sym != NULL; sym = next_sym(&symbol_st, &iter)) {
|
||||||
|
if (skip_locals && sym->flags & SYMBOLFLAG_LOCAL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
nsyms++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sort them by name */
|
||||||
|
SYMBOL **symbols = malloc(nsyms * sizeof (SYMBOL *));
|
||||||
|
SYMBOL **symbolp = symbols;
|
||||||
|
|
||||||
|
for (sym = first_sym(&symbol_st, &iter); sym != NULL; sym = next_sym(&symbol_st, &iter)) {
|
||||||
|
if (skip_locals && sym->flags & SYMBOLFLAG_LOCAL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*symbolp++ = sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort(symbols, nsyms, sizeof(SYMBOL *), symbol_compar);
|
||||||
|
|
||||||
|
symbolp = symbols;
|
||||||
|
|
||||||
|
/* Print the listing in NCOLS columns. */
|
||||||
|
#define NCOLS 5
|
||||||
|
|
||||||
|
int nlines = (nsyms + NCOLS - 1) / NCOLS;
|
||||||
|
int line;
|
||||||
|
/*
|
||||||
|
* DIRER$ 004562RGX 006
|
||||||
|
* ^ ^ ^ ^-- for R symbols: program segment number
|
||||||
|
* | | +-- Flags: R = relocatable
|
||||||
|
* | | G = global
|
||||||
|
* | | X = implicit global
|
||||||
|
* | | L = local
|
||||||
|
* | | W = weak
|
||||||
|
* | +- value, ****** for if it was not a definition
|
||||||
|
* +- label name
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (line = 0; line < nlines; line++) {
|
||||||
|
int i;
|
||||||
|
for (i = line; i < nsyms; i += nlines) {
|
||||||
|
sym = symbols[i];
|
||||||
|
|
||||||
|
fprintf(lstfile,"%-6s", sym->label);
|
||||||
|
fprintf(lstfile,"%c", (sym->section->flags & PSECT_REL) ? ' ' : '=');
|
||||||
|
if (!(sym->flags & SYMBOLFLAG_DEFINITION)) {
|
||||||
|
fprintf(lstfile," ******");
|
||||||
|
} else {
|
||||||
|
fprintf(lstfile," %06o", sym->value & 0177777);
|
||||||
|
}
|
||||||
|
fprintf(lstfile,"%c", (sym->section->flags & PSECT_REL) ? 'R' : ' ');
|
||||||
|
fprintf(lstfile,"%c", (sym->flags & SYMBOLFLAG_GLOBAL) ? 'G' : ' ');
|
||||||
|
fprintf(lstfile,"%c", (sym->flags & SYMBOLFLAG_IMPLICIT_GLOBAL) ? 'X' : ' ');
|
||||||
|
fprintf(lstfile,"%c", (sym->flags & SYMBOLFLAG_LOCAL) ? 'L' : ' ');
|
||||||
|
fprintf(lstfile,"%c", (sym->flags & SYMBOLFLAG_WEAK) ? 'W' : ' ');
|
||||||
|
if (sym->section->sector != 0) {
|
||||||
|
fprintf(lstfile," %03d ", sym->section->sector);
|
||||||
|
} else {
|
||||||
|
fprintf(lstfile," ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(lstfile,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* List sections */
|
||||||
|
|
||||||
|
fprintf(lstfile,"\n\nProgram sections:\n\n");
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < sector; i++) {
|
||||||
|
list_section(sections[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_section(
|
||||||
|
SECTION *sec)
|
||||||
|
{
|
||||||
|
if (sec == NULL) {
|
||||||
|
fprintf(lstfile, "(null)\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flags = sec->flags;
|
||||||
|
|
||||||
|
fprintf(lstfile, "%-6s %06o %03d ",
|
||||||
|
sec->label, sec->size, sec->sector);
|
||||||
|
fprintf(lstfile, "(%s,%s,%s,%s,%s,%s)\n",
|
||||||
|
(flags & PSECT_RO) ? "RO" : "RW",
|
||||||
|
(flags & PSECT_DATA) ? "D" : "I",
|
||||||
|
(flags & PSECT_GBL) ? "GBL" : "LCL",
|
||||||
|
(flags & PSECT_REL) ? "REL" : "ABS",
|
||||||
|
(flags & PSECT_COM) ? "OVR" : "CON",
|
||||||
|
(flags & PSECT_SAV) ? "SAV" : "NOSAV");
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ typedef struct symbol {
|
|||||||
#define SYMBOLFLAG_DEFINITION 8 /* Symbol is a global definition, not reference */
|
#define SYMBOLFLAG_DEFINITION 8 /* Symbol is a global definition, not reference */
|
||||||
#define SYMBOLFLAG_UNDEFINED 16 /* Symbol is a phony, undefined */
|
#define SYMBOLFLAG_UNDEFINED 16 /* Symbol is a phony, undefined */
|
||||||
#define SYMBOLFLAG_LOCAL 32 /* Set if this is a local label (i.e. 10$) */
|
#define SYMBOLFLAG_LOCAL 32 /* Set if this is a local label (i.e. 10$) */
|
||||||
|
#define SYMBOLFLAG_IMPLICIT_GLOBAL 64 /* If migrated from implicit global table to
|
||||||
|
* normal symbol table */
|
||||||
|
|
||||||
SECTION *section; /* Section in which this symbol is defined */
|
SECTION *section; /* Section in which this symbol is defined */
|
||||||
struct symbol *next; /* Next symbol with the same hash value */
|
struct symbol *next; /* Next symbol with the same hash value */
|
||||||
|
|||||||
Reference in New Issue
Block a user