mirror of
https://github.com/golang/go
synced 2024-11-12 07:10:22 -07:00
hack to find first instruction for decoding the pc/line table properly.
SVN=122792
This commit is contained in:
parent
34691ccd10
commit
1ad1044b2d
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,7 +1275,10 @@ pc2line(uvlong pc)
|
|||||||
if(pcline == 0)
|
if(pcline == 0)
|
||||||
return -1;
|
return -1;
|
||||||
currline = 0;
|
currline = 0;
|
||||||
currpc = txtstart-mach->pcquant;
|
if (firstinstr != 0)
|
||||||
|
currpc = firstinstr-mach->pcquant;
|
||||||
|
else
|
||||||
|
currpc = txtstart-mach->pcquant;
|
||||||
if(pc<currpc || pc>txtend)
|
if(pc<currpc || pc>txtend)
|
||||||
return ~0;
|
return ~0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user