From 1ad1044b2db590236fd7c22cb0b0bab8328207f3 Mon Sep 17 00:00:00 2001
From: Rob Pike <r@golang.org>
Date: Fri, 13 Jun 2008 18:15:30 -0700
Subject: [PATCH] hack to find first instruction for decoding the pc/line table
 properly.

SVN=122792
---
 src/libmach_amd64/sym.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/libmach_amd64/sym.c b/src/libmach_amd64/sym.c
index 22baa59b26..9468e19576 100644
--- a/src/libmach_amd64/sym.c
+++ b/src/libmach_amd64/sym.c
@@ -83,6 +83,7 @@ static	Sym	*symbols;		/* symbol table */
 static	Txtsym	*txt;			/* Base of text symbol table */
 static	uvlong	txtstart;		/* start 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 long	decodename(Biobuf*, Sym*);
@@ -385,6 +386,7 @@ buildtbls(void)
 		return 1;
 	isbuilt = 1;
 			/* allocate the tables */
+	firstinstr = 0;
 	if(nglob) {
 		globals = malloc(nglob*sizeof(*globals));
 		if(!globals) {
@@ -428,6 +430,7 @@ buildtbls(void)
 	hp = hist;
 	ap = autos;
 	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) {
 		case 'D':
 		case 'd':
@@ -474,6 +477,8 @@ buildtbls(void)
 			tp->locals = ap;
 			if(debug)
 				print("TEXT: %s at %llux\n", p->name, p->value);
+			if (firstinstr == 0 || p->value < firstinstr)
+				firstinstr = p->value;
 			if(f && !f->sym) {			/* first  */
 				f->sym = p;
 				f->addr = p->value;
@@ -1045,6 +1050,7 @@ fileline(char *str, int n, uvlong dot)
 			bot = mid;
 		else {
 			line = pc2line(dot);
+			print("line %d\n", line);
 			if(line > 0 && fline(str, n, line, f->hist, 0) >= 0)
 				return 1;
 			break;
@@ -1269,7 +1275,10 @@ pc2line(uvlong pc)
 	if(pcline == 0)
 		return -1;
 	currline = 0;
-	currpc = txtstart-mach->pcquant;
+	if (firstinstr != 0)
+		currpc = firstinstr-mach->pcquant;
+	else
+		currpc = txtstart-mach->pcquant;
 	if(pc<currpc || pc>txtend)
 		return ~0;
 
-- 
2.30.9