Added support for debugger, de-linted somewhat

This commit is contained in:
ceriel
1990-10-01 15:28:28 +00:00
parent 955353cb59
commit 568c87f5ba
17 changed files with 541 additions and 32 deletions

View File

@@ -7,7 +7,8 @@
#include "lint.h"
#include "debug.h"
#include <em.h>
#include "dbsymtab.h"
#include <em_code.h>
#include "botch_free.h"
#include <alloc.h>
#include "dataflow.h"
@@ -34,6 +35,9 @@
#ifdef LINT
#include "l_lint.h"
#endif LINT
#ifdef DBSYMTAB
#include <stb.h>
#endif /* DBSYMTAB */
label lab_count = 1;
label datlab_count = 1;
@@ -53,6 +57,7 @@ static int pro_id;
extern char options[];
extern char *symbol2str();
extern char *source;
#ifndef LINT
init_code(dst_file)
@@ -66,6 +71,23 @@ init_code(dst_file)
fatal("cannot write to %s\n", dst_file);
C_magic();
C_ms_emx(word_size, pointer_size);
#ifdef DBSYMTAB
if (options['g']) {
C_ms_std(source, N_SO, 0);
stb_typedef(int_type, "int");
stb_typedef(schar_type, "char");
stb_typedef(long_type, "long");
stb_typedef(short_type, "short");
stb_typedef(uchar_type, "unsigned char");
stb_typedef(ushort_type, "unsigned short");
stb_typedef(ulong_type, "unsigned long");
stb_typedef(uint_type, "unsigned int");
stb_typedef(float_type, "float");
stb_typedef(double_type, "double");
stb_typedef(lngdbl_type, "long double");
stb_typedef(void_type, "void");
}
#endif /* DBSYMTAB */
#ifdef USE_TMP
#ifdef PREPEND_SCOPES
C_insertpart(tmp_id = C_getid());
@@ -139,11 +161,10 @@ prepend_scopes()
C_beginpart(tmp_id);
#endif USE_TMP
while (se != 0) {
register struct idf *id = se->se_idf;
register struct def *df = id->id_def;
register struct def *df = se->se_idf->id_def;
if (df && (df->df_initialized || df->df_used || df->df_alloc)) {
code_scope(id->id_text, df);
code_scope(se->se_idf->id_text, df);
}
se = se->next;
}
@@ -272,6 +293,14 @@ begin_proc(ds, idf) /* to be called when entering a procedure */
C_fil_dlb(file_name_label, (arith)0);
C_lin((arith)LineNumber);
}
#ifdef DBSYMTAB
if (options['g']) {
stb_string(def, FUNCTION, name);
if (! strcmp(name, "main")) {
C_ms_stb_cst(name, N_MAIN, 0, (arith) 0);
}
}
#endif
}
end_proc(fbytes)
@@ -403,8 +432,14 @@ code_declaration(idf, expr, lvl, sc)
int fund = def->df_type->tp_fund;
int def_sc = def->df_sc;
if (def_sc == TYPEDEF) /* no code for typedefs */
if (def_sc == TYPEDEF) { /* no code for typedefs */
#ifdef DBSYMTAB
if (options['g']) {
stb_typedef(def->df_type, idf->id_text);
}
#endif /* DBSYMTAB */
return;
}
if (lvl == L_GLOBAL) { /* global variable */
/* is this an allocating declaration? */
if ( (sc == 0 || sc == STATIC)
@@ -421,6 +456,11 @@ code_declaration(idf, expr, lvl, sc)
code_scope(idf->id_text, def);
#endif PREPEND_SCOPES
def->df_alloc = ALLOC_DONE;
#ifdef DBSYMTAB
if (options['g']) {
stb_string(def, sc, idf->id_text);
}
#endif /* DBSYMTAB */
C_df_dnam(idf->id_text);
}
}
@@ -436,6 +476,11 @@ code_declaration(idf, expr, lvl, sc)
/* they are handled on the spot and get an
integer label in EM.
*/
#ifdef DBSYMTAB
if (options['g']) {
stb_string(def, sc, idf->id_text);
}
#endif /* DBSYMTAB */
C_df_dlb((label)def->df_address);
if (expr) { /* there is an initialisation */
}
@@ -457,6 +502,11 @@ code_declaration(idf, expr, lvl, sc)
break;
case AUTO:
case REGISTER:
#ifdef DBSYMTAB
if (options['g']) {
stb_string(def, sc, idf->id_text);
}
#endif /* DBSYMTAB */
if (expr)
loc_init(expr, idf);
else if ((fund == ARRAY)
@@ -474,32 +524,33 @@ code_declaration(idf, expr, lvl, sc)
loc_init(expr, id)
struct expr *expr;
register struct idf *id;
struct idf *id;
{
/* loc_init() generates code for the assignment of
expression expr to the local variable described by id.
It frees the expression afterwards.
*/
register struct expr *e = expr;
register struct type *tp = id->id_def->df_type;
register struct def *df = id->id_def;
register struct type *tp = df->df_type;
static arith tmpoffset = 0;
static arith unknownsize = 0;
ASSERT(id->id_def->df_sc != STATIC);
ASSERT(df->df_sc != STATIC);
switch (tp->tp_fund) {
case ARRAY:
if (id->id_def->df_type->tp_size == (arith) -1)
if (tp->tp_size == (arith) -1)
unknownsize = 1;
case STRUCT:
case UNION:
if (expr != (struct expr *) 0) {
if (e != (struct expr *) 0) {
break; /* switch */
} else if (!tmpoffset) {/* first time for this variable */
tmpoffset = id->id_def->df_address;
id->id_def->df_address = data_label();
C_df_dlb((label)id->id_def->df_address);
tmpoffset = df->df_address;
df->df_address = data_label();
C_df_dlb((label)df->df_address);
} else {
C_lae_dlb((label)id->id_def->df_address, (arith)0);
C_lae_dlb((label)df->df_address, (arith)0);
load_block(tp->tp_size, 1);
if (unknownsize) {
/* tmpoffset += tp->tp_size; */
@@ -508,13 +559,19 @@ loc_init(expr, id)
tmpoffset = NewLocal(tp->tp_size
, tp->tp_align
, regtype(tp)
, id->id_def->df_sc);
, df->df_sc);
}
C_lal(tmpoffset);
store_block(tp->tp_size, 1);
id->id_def->df_address = tmpoffset;
df->df_address = tmpoffset;
tmpoffset = 0;
}
#ifdef DBSYMTAB
if (options['g']) {
stb_string(df, AUTO, id->id_text);
}
#endif /* DBSYMTAB */
return;
}
if (ISCOMMA(e)) { /* embraced: int i = {12}; */
@@ -536,7 +593,7 @@ loc_init(expr, id)
store_val(&vl, tp);
}
#else LINT
id->id_def->df_set = 1;
df->df_set = 1;
#endif LINT
free_expression(expr);
}
@@ -547,12 +604,18 @@ bss(idf)
{
/* bss() allocates bss space for the global idf.
*/
register struct def *df = idf->id_def;
#ifndef PREPEND_SCOPES
code_scope(idf->id_text, idf->id_def);
code_scope(idf->id_text, df);
#endif PREPEND_SCOPES
#ifdef DBSYMTAB
if (options['g']) {
stb_string(df, df->df_sc, idf->id_text);
}
#endif /* DBSYMTAB */
C_df_dnam(idf->id_text);
C_bss_cst(ATW(idf->id_def->df_type->tp_size), (arith)0, 1);
C_bss_cst(ATW(df->df_type->tp_size), (arith)0, 1);
}
formal_cvt(hasproto,df)
@@ -596,6 +659,9 @@ code_expr(expr, val, code, tlbl, flbl)
#ifndef LINT
if (! options['L']) /* profiling */
C_lin((arith)(expr->ex_line));
#ifdef DBSYMTAB
if (options['g']) db_line(expr->ex_file, (int)expr->ex_line);
#endif
EVAL(expr, val, code, tlbl, flbl);
#else LINT
@@ -690,3 +756,19 @@ prc_exit()
C_asp(pointer_size);
}
}
#ifdef DBSYMTAB
db_line(file, line)
char *file;
int line;
{
static int oldline;
static char *oldfile;
if (file != oldfile || line != oldline) {
C_ms_std((char *) 0, N_SLINE, line);
oldline = line;
oldfile = file;
}
}
#endif