Commit 1ad1044b authored by Rob Pike's avatar Rob Pike

hack to find first instruction for decoding the pc/line table properly.

SVN=122792
parent 34691ccd
...@@ -83,6 +83,7 @@ static Sym *symbols; /* symbol table */ ...@@ -83,6 +83,7 @@ static Sym *symbols; /* symbol table */
static Txtsym *txt; /* Base of text symbol table */ static Txtsym *txt; /* Base of text symbol table */
static uvlong txtstart; /* start of text segment */ static uvlong txtstart; /* start of text segment */
static uvlong txtend; /* end of text segment */ static uvlong txtend; /* end of text segment */
static uvlong firstinstr; /* as found from symtab; needed for amd64 */
static void cleansyms(void); static void cleansyms(void);
static long decodename(Biobuf*, Sym*); static long decodename(Biobuf*, Sym*);
...@@ -385,6 +386,7 @@ buildtbls(void) ...@@ -385,6 +386,7 @@ buildtbls(void)
return 1; return 1;
isbuilt = 1; isbuilt = 1;
/* allocate the tables */ /* allocate the tables */
firstinstr = 0;
if(nglob) { if(nglob) {
globals = malloc(nglob*sizeof(*globals)); globals = malloc(nglob*sizeof(*globals));
if(!globals) { if(!globals) {
...@@ -428,6 +430,7 @@ buildtbls(void) ...@@ -428,6 +430,7 @@ buildtbls(void)
hp = hist; hp = hist;
ap = autos; ap = autos;
for(p = symbols; i-- > 0; p++) { for(p = symbols; i-- > 0; p++) {
//print("sym %d type %c name %s value %llux\n", p-symbols, p->type, p->name, p->value);
switch(p->type) { switch(p->type) {
case 'D': case 'D':
case 'd': case 'd':
...@@ -474,6 +477,8 @@ buildtbls(void) ...@@ -474,6 +477,8 @@ buildtbls(void)
tp->locals = ap; tp->locals = ap;
if(debug) if(debug)
print("TEXT: %s at %llux\n", p->name, p->value); print("TEXT: %s at %llux\n", p->name, p->value);
if (firstinstr == 0 || p->value < firstinstr)
firstinstr = p->value;
if(f && !f->sym) { /* first */ if(f && !f->sym) { /* first */
f->sym = p; f->sym = p;
f->addr = p->value; f->addr = p->value;
...@@ -1045,6 +1050,7 @@ fileline(char *str, int n, uvlong dot) ...@@ -1045,6 +1050,7 @@ fileline(char *str, int n, uvlong dot)
bot = mid; bot = mid;
else { else {
line = pc2line(dot); line = pc2line(dot);
print("line %d\n", line);
if(line > 0 && fline(str, n, line, f->hist, 0) >= 0) if(line > 0 && fline(str, n, line, f->hist, 0) >= 0)
return 1; return 1;
break; break;
...@@ -1269,6 +1275,9 @@ pc2line(uvlong pc) ...@@ -1269,6 +1275,9 @@ pc2line(uvlong pc)
if(pcline == 0) if(pcline == 0)
return -1; return -1;
currline = 0; currline = 0;
if (firstinstr != 0)
currpc = firstinstr-mach->pcquant;
else
currpc = txtstart-mach->pcquant; currpc = txtstart-mach->pcquant;
if(pc<currpc || pc>txtend) if(pc<currpc || pc>txtend)
return ~0; return ~0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment