|
|
1.1 root 1: this is a bit of a horror.
2:
3: the stab interface (to sdb and pi) has been hacked mercilessly until it works.
4: it's all pretty fragile, and probably somewhat buggy. things to beware
5: especially:
6:
7: f77 is a pcc1 compiler. c is a pcc2 compiler these days. over the years,
8: c has gained types, sort of; the pcc internal representation of types (which
9: is put out in the type field of the stab) has changed too. (and the printed
10: V8 manuals get it wrong, by the way; the online manual is correct.) f77,
11: being an old compiler, uses the old representation; it has to convert it
12: to the new one when it prints stabs.
13:
14: pcc1 used to put out symbols at the top of each block, followed by the
15: line number markers (N_SLINEs). f77 used some horrible hackery to make
16: that happen, as it didn't know enough about symbols until the end (think
17: about implicit declarations). pcc2 puts symbols after N_SLINEs. sdb now
18: wants things that way too. f77 has followed along.
19:
20: common and equivalence are nightmares. one would like to simply spit out
21: a stab for each piece of the common, pointing at the address of that piece;
22: unfortunately, offsets to commons don't work in the symbol table (it
23: requires the relocation info to make it work, and there's no relocation
24: data for symbols, logically enough). hence these monsters are put out as
25: crypto-structures, in the following format:
26: .stabs "cname",N_BCOMM,0,0,0
27: .stabs "element",N_SSYM,0,type,offset
28: ...
29: .stabs "cname",N_ECOMM,0,0,0
30: when a debugger wants the address of `element', having noted that it is
31: a N_SSYM within the BCOMM/ECOMM (or BCOMM/ECOML, see below) brackets, it
32: should pick up `cname' from the ECOMM, prepend an `_' to make an external
33: name of it, look that name up in the symbol table to find the address of
34: the common region, and add the offset.
35:
36: sometimes the endmarker isn't an ECOML, but is
37: .stabs "",N_ECOML,0,0,addr
38: e.g. when you've equivalenced two non-common variables together. this
39: means `element's address is addr+offset.
40:
41: enough. sdb works, sort of. pi works, but not on commons nor equivalences.
42: (tough.)
43:
44: it is probably impossible to make a pdp11 compiler without lots of work.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.