fixed problem with multiple definitions going by undetected
This commit is contained in:
parent
2fbdc5447a
commit
8b63334d30
3 changed files with 71 additions and 11 deletions
|
@ -5,7 +5,7 @@ SHR=../share
|
||||||
LDFLAGS=-i
|
LDFLAGS=-i
|
||||||
CPPFLAGS=-DVERBOSE -DNOTCOMPACT
|
CPPFLAGS=-DVERBOSE -DNOTCOMPACT
|
||||||
CFLAGS=$(CPPFLAGS) -O
|
CFLAGS=$(CPPFLAGS) -O
|
||||||
LINTFLAGS=-hbac
|
LINTFLAGS=-hbu
|
||||||
|
|
||||||
CFILES=\
|
CFILES=\
|
||||||
ic.c ic_aux.c ic_lib.c ic_lookup.c ic_io.c
|
ic.c ic_aux.c ic_lib.c ic_lookup.c ic_io.c
|
||||||
|
|
|
@ -484,7 +484,7 @@ line_p inpseudo(n)
|
||||||
*/
|
*/
|
||||||
dblockdef(db,n,lnp);
|
dblockdef(db,n,lnp);
|
||||||
/* Fill in d_pseudo, d_size and d_values fields of db */
|
/* Fill in d_pseudo, d_size and d_values fields of db */
|
||||||
if (fragm_type != db->d_pseudo & BMASK) {
|
if (fragm_type != db->d_pseudo) {
|
||||||
/* Keep track of fragment numbers,
|
/* Keep track of fragment numbers,
|
||||||
* enter a new fragment.
|
* enter a new fragment.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -24,7 +24,7 @@ prc_p prochash[NPROCHASH];
|
||||||
num_p numhash[NNUMHASH];
|
num_p numhash[NNUMHASH];
|
||||||
char *lastname;
|
char *lastname;
|
||||||
|
|
||||||
|
extern char *strcpy();
|
||||||
|
|
||||||
#define newsym() (sym_p) newstruct(sym)
|
#define newsym() (sym_p) newstruct(sym)
|
||||||
#define newprc() (prc_p) newstruct(prc)
|
#define newprc() (prc_p) newstruct(prc)
|
||||||
|
@ -118,8 +118,9 @@ dblock_p symlookup(name, status)
|
||||||
* list.
|
* list.
|
||||||
*/
|
*/
|
||||||
if (strcmp((*spp)->sy_name, name) == 0) {
|
if (strcmp((*spp)->sy_name, name) == 0) {
|
||||||
if (status != DEFINING ||
|
if ((status != DEFINING
|
||||||
(*spp)->sy_dblock->d_pseudo == DUNKNOWN) {
|
&& ((*spp)->sy_dblock->d_flags1 & DF_EXTERNAL) == 0)
|
||||||
|
|| (*spp)->sy_dblock->d_pseudo == DUNKNOWN) {
|
||||||
/* found */
|
/* found */
|
||||||
lastname = (*spp)->sy_name;
|
lastname = (*spp)->sy_name;
|
||||||
return ((*spp)->sy_dblock);
|
return ((*spp)->sy_dblock);
|
||||||
|
@ -216,8 +217,9 @@ proc_p proclookup(name, status)
|
||||||
*/
|
*/
|
||||||
if (strcmp((*ppp)->pr_name, name) == 0) {
|
if (strcmp((*ppp)->pr_name, name) == 0) {
|
||||||
/* found */
|
/* found */
|
||||||
if (status != DEFINING ||
|
if ((status != DEFINING
|
||||||
! ((*ppp)->pr_proc->p_flags1 & PF_BODYSEEN)) {
|
&& ((*ppp)->pr_proc->p_flags1 & PF_EXTERNAL) == 0)
|
||||||
|
|| ! ((*ppp)->pr_proc->p_flags1 & PF_BODYSEEN)) {
|
||||||
return ((*ppp)->pr_proc);
|
return ((*ppp)->pr_proc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -298,7 +300,6 @@ dump_procnames(hash,n,f)
|
||||||
|
|
||||||
register prc_p *pp, ph;
|
register prc_p *pp, ph;
|
||||||
proc_p p;
|
proc_p p;
|
||||||
register int i;
|
|
||||||
|
|
||||||
#define PF_WRITTEN 01
|
#define PF_WRITTEN 01
|
||||||
|
|
||||||
|
@ -317,7 +318,34 @@ dump_procnames(hash,n,f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
extrefproc_superfluous(ph)
|
||||||
|
prc_p ph;
|
||||||
|
{
|
||||||
|
/* The problem is that when an EXP is found, we don't know yet
|
||||||
|
* to which definition it applies (although this only is a problem
|
||||||
|
* for erroneous input). Therefore, we create an entry in the
|
||||||
|
* procedure table, and at the end of the EM file remove it if it
|
||||||
|
* is superfluous. This routine checks for this superfluousness.
|
||||||
|
*/
|
||||||
|
prc_p next = ph->pr_next;
|
||||||
|
|
||||||
|
if (! (ph->pr_proc->p_flags1 & PF_BODYSEEN)) {
|
||||||
|
/* No body seen yet, but maybe there is another definition ...
|
||||||
|
*/
|
||||||
|
register prc_p nn = next;
|
||||||
|
|
||||||
|
while (nn) {
|
||||||
|
if ((nn->pr_proc->p_flags1 & (PF_BODYSEEN|PF_EXTERNAL))
|
||||||
|
== (PF_BODYSEEN|PF_EXTERNAL)
|
||||||
|
&& ! strcmp(nn->pr_name, ph->pr_name)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
nn = nn->pr_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* cleanprocs */
|
/* cleanprocs */
|
||||||
|
|
||||||
|
@ -346,7 +374,9 @@ cleanprocs(hash,n,mask)
|
||||||
* the list.
|
* the list.
|
||||||
*/
|
*/
|
||||||
next = ph->pr_next;
|
next = ph->pr_next;
|
||||||
if ((ph->pr_proc->p_flags1 & mask) == 0) {
|
if ((ph->pr_proc->p_flags1 & mask) == 0
|
||||||
|
|| (mask == PF_EXTERNAL
|
||||||
|
&& extrefproc_superfluous(ph))) {
|
||||||
if (x == (prc_p) 0) {
|
if (x == (prc_p) 0) {
|
||||||
*pp = next;
|
*pp = next;
|
||||||
} else {
|
} else {
|
||||||
|
@ -376,7 +406,6 @@ dump_dblocknames(hash,n,f)
|
||||||
|
|
||||||
register sym_p *sp, sh;
|
register sym_p *sp, sh;
|
||||||
dblock_p d;
|
dblock_p d;
|
||||||
register int i;
|
|
||||||
|
|
||||||
#define DF_WRITTEN 01
|
#define DF_WRITTEN 01
|
||||||
|
|
||||||
|
@ -396,6 +425,35 @@ dump_dblocknames(hash,n,f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
extrefdata_superfluous(ph)
|
||||||
|
sym_p ph;
|
||||||
|
{
|
||||||
|
/* The problem is that when an EXA is found, we don't know yet
|
||||||
|
* to which definition it applies (although this only is a problem
|
||||||
|
* for erroneous input). Therefore, we create an entry in the
|
||||||
|
* data table, and at the end of the EM file remove it if it
|
||||||
|
* is superfluous. This routine checks for this superfluousness.
|
||||||
|
*/
|
||||||
|
sym_p next = ph->sy_next;
|
||||||
|
|
||||||
|
if (ph->sy_dblock->d_pseudo == DUNKNOWN) {
|
||||||
|
/* No definition seen yet, but maybe there is another one ...
|
||||||
|
*/
|
||||||
|
register sym_p nn = next;
|
||||||
|
|
||||||
|
while (nn) {
|
||||||
|
if (nn->sy_dblock->d_pseudo != DUNKNOWN
|
||||||
|
&& (nn->sy_dblock->d_flags1 & DF_EXTERNAL)
|
||||||
|
&& ! strcmp(nn->sy_name, ph->sy_name)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
nn = nn->sy_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* cleandblocks */
|
/* cleandblocks */
|
||||||
|
|
||||||
|
@ -413,7 +471,9 @@ cleandblocks(hash,n,mask)
|
||||||
x = (sym_p) 0;
|
x = (sym_p) 0;
|
||||||
for (sh = *sp; sh != (sym_p) 0; sh = next) {
|
for (sh = *sp; sh != (sym_p) 0; sh = next) {
|
||||||
next = sh->sy_next;
|
next = sh->sy_next;
|
||||||
if ((sh->sy_dblock->d_flags1 & mask) == 0) {
|
if ((sh->sy_dblock->d_flags1 & mask) == 0
|
||||||
|
|| (mask == DF_EXTERNAL
|
||||||
|
&& extrefdata_superfluous(sh))) {
|
||||||
if (x == (sym_p) 0) {
|
if (x == (sym_p) 0) {
|
||||||
*sp = next;
|
*sp = next;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue