static char sccsid
[] = "@(#)prvar.c 4.2 %G%";
* Prints named variable, recursing once for each structure member or
* proc:var: variable name
* metaflag: set iff var contains metacharacters * or ?
* addr: partial address of variable, initally 0
* class: type class of variable
* subflag: number of levels of subscript indirection
* prnamep: pointer to end of partially formed print name of variable
* comblk: name of common block containing variable, if any
* Here and elsewhere we assume that -1 is an invalid address, and
* its is used to indicate error.
outvar(proc
, var
, fmt
, metaflag
, addr
, class, subflag
, prnamep
,
ADDR addr
; char *proc
, *var
, *fmt
, *prnamep
, *comblk
; int class; {
register ADDR newaddr
= -1, arrowaddr
;
register enum {INIT
, ARROW
, DOT
} typeflag
;
if (prvar
== 0) return(addr
);
if (comblk
[0] && !(eqstr(comblk
, "*")))
printf("%.8s:%.8s", comblk
, prname
);
printf("%s:%s", comblk
, prname
);
printf("%.8s:%.8s", proc
, prname
);
printf("%s:%s", proc
, prname
);
printit(metaflag
, prvar
, addr
, fmt
, class, sl_type
,
if (*var
== '\0' || *var
== ']') break;
newaddr
= getindir(class, addr
, sl_type
);
newaddr
+= typetosize(sl_type
, sl_size
) * readint(&p
);
return(outvar(proc
, var
+1, fmt
, metaflag
, newaddr
, N_GSYM
,
subflag
+1, prnamep
, comblk
, prvar
));
while (eqany(*var
, "->"))
arrowaddr
= getindir(class, addr
, sl_type
);
error("Not with a register variable");
soffset
= proc
[0] ? adrtostoffset(callpc
-1) : -1;
goffset
= proc
[0] ? -1 : findfile(curfile
)->stf_offset
;
soffset
= proc
[0] ? adrtostoffset(callpc
-1) : -1;
goffset
= findfile(curfile
)->stf_offset
;
while (!eqany(*p
, "->.[") && *p
!= '\0')
if ((soffset
= slooknext(var
, soffset
, typeflag
!=INIT
,
if ((goffset
= globallookup(var
, goffset
,
class = sl_class
& STABMASK
;
if (!varclass(class) || class == N_SSYM
)
newaddr
= (class == N_LSYM
) ? -sl_addr
: sl_addr
;
newaddr
= formaddr(class, newaddr
);
class = sl_class
& STABMASK
;
if (!varclass(class) || class != N_SSYM
)
newaddr
= arrowaddr
+ sl_addr
;
class = sl_class
& STABMASK
;
if (!varclass(class) || class != N_SSYM
)
newaddr
= addr
+ sl_addr
;
newaddr
= outvar(proc
, p
, fmt
, metaflag
, newaddr
,
class, subflag
, prnamep
, comblk
, prvar
);
/* Output external variables. Arguments as in outvar() */
extoutvar(var
, fmt
, metaflag
, prvar
)
offset
= extlookup(var
, offset
);
printit(metaflag
, prvar
, addr
, fmt
[0] ? fmt
: "d",
register struct proct
*procp
;
register struct filet
*filep
;
printf("extstart = %d\n", extstart
);
printf("firstdata = %d\n", firstdata
);
for(filep
=files
;filep
->sfilename
[0];filep
++)
printf("%s offs %d @ %d flag %d addr 0x%x\n", filep
->sfilename
, filep
->stf_offset
, filep
, filep
->lineflag
, filep
->faddr
);
for(procp
=procs
;procp
->pname
[0];procp
++) {
printf("%s addr 0x%x; offs %d; sfptr %d; line %d",
printf("%8.8s addr 0x%x; offs %d; sfptr %d; line %d",
procp
->pname
, procp
->paddr
, procp
->st_offset
,
procp
->sfptr
, procp
->lineno
);
if (procp
->entrypt
) printf(" entrypoint");
* display addr in data space using format desc or class s
* type == 1 => use addr for value to print
dispf(addr
, desc
, class, type
, size
, subflag
, space
)
char *desc
; short type
; ADDR addr
; {
dispx(addr
, desc
, class, type
, size
, subflag
, DSP
);
/* display addr in instruction space using format desc or class s */
/* returns -1 if bad address */
dispi(addr
, desc
, class, type
, size
, subflag
, space
)
char *desc
; short type
; ADDR addr
; {
i
= dispx(addr
, desc
, class, type
, size
, subflag
, ISP
);
dispx(addr
, desc
, class, type
, size
, subflag
, space
)
char *desc
; short type
; ADDR addr
; {
if (desc
[0] == '\0') desc
= typetodesc(type
, subflag
);
if (debug
) printf("dispx(addr=%d,desc=%s,class=%d,type=%d,size=%d,subflg=%d,space=%d)\n",
addr
, desc
, class, type
, size
, subflag
, space
);
for (p
= desc
; *p
; p
++) {
if (*p
>= '0' && *p
<'9') {
printf("Illegal descriptor: %c\n", *p
);
else if (class == N_RSYM
&& addr
< 16) {
if ((addr
> 0 && addr
< 6) || addr
> 11) {
printf("Bad register var %d\n", addr
);
value
= *(ADDR
*)(((ADDR
) &u
) + R0
+ (WORDSIZE
)*addr
);
value
= getval(addr
, dfmt
== 'g' ? 'd' : dfmt
, space
);
value
= (unsigned short) value
;
value
= (unsigned char) value
;
value
= (unsigned long) value
;
if (dfmt
== 'x' && (value
> 9 || value
< 0))
else if (dfmt
== 'o' && (value
> 7 || value
< 0))
dbl
.ww
.w2
= (class == (char) N_RSYM
) ?
*(ADDR
*)(((ADDR
) &u
)+R0
+(WORDSIZE
)*(addr
+1)) :
getval(addr
+WORDSIZE
, 'd', space
);
printf("%s:%d", adrtoprocp(value
)->pname
,
addr
= getindir(class, addr
, type
);
size
= 128; /* maximum length for s and a */
word
.w
= getval(addr
, 'd', space
);
for (i
=0; i
<WORDSIZE
; i
++) {
if (sflag
&& word
.c
[i
] == 0)
value
= chkget(dot
, space
);
printins(dfmt
, space
, value
);
/* print variable as in prvar */
printit(metaflag
, prvar
, addr
, desc
, class, type
, size
, subflag
, space
)
char *desc
; short type
; ADDR addr
; {
dispf(addr
, desc
, class, type
, size
,
dispf(addr
, desc
, 0, -1, 0, 0, DSP
);
printf("^%c", c
+ ('A' - 1));
else if ((c
& 0177) == 0177)
printf("%s\t`%s'\n",s
,(file
<0 ? "-" : (file
==fcor
? corfil
: symfil
)));
printf("b1 = 0x%-16x",amap
->b1
);
printf("e1 = 0x%-16x",amap
->e1
);
printf("f1 = 0x%-x",amap
->f1
);
printf("\nb2 = 0x%-16x",amap
->b2
);
printf("e2 = 0x%-16x",amap
->e2
);
printf("f2 = 0x%-x",amap
->f2
);
#define NUMREGS 24 /* number of hardware registers */
for (p
=reglist
; p
< ®list
[NUMREGS
/2]; p
++) {
printf("%4.4s/ ", p
->rname
);
prhex12(*(ADDR
*)(((ADDR
)&u
)+p
->roffs
));
printf(" %4.4s/ ",(p
+NUMREGS
/2)->rname
);
prhex(*(ADDR
*)(((ADDR
)&u
)+(p
+NUMREGS
/2)->roffs
));
dot
= *(ADDR
*)(((ADDR
)&u
)+PC
);
printins('i',ISP
,chkget(dot
,ISP
));
for (p
=reglist
; p
< ®list
[24]; p
++) {
if (eqstr(name
, p
->rname
)) {
printit(0, prvar
, *(ADDR
*)(((ADDR
)&u
)+p
->roffs
),
fmt
[0] ? fmt
: "d", N_GSYM
, -1, 0, 0, DSP
);
error("Unknown register variable");
/* Print symbolic location of dot */