From 571236543f222e9fcb8ddfaa3151505a7de4d6f0 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 1 Nov 2018 14:34:21 -0400 Subject: [PATCH] debug/gosym: use "go build" instead of hand-running asm and link Currently, TestPCLine manually invokes asm and link on its test data. Once we introduce symbol ABIs this is going to become problematic because the test program defines main.main and main.init in assembly so they use ABI0, but the runtime expects to find them with the internal ABI. There are various ways we could solve this. This CL moves main.main and main.init into Go code and switches to using "go build" to compile and link the test binary. This has the added advantage of simplifying this test. For #27539. Change-Id: I4c0cf6467f7a39e6b1500eca6ad2620b5ef2b73c Reviewed-on: https://go-review.googlesource.com/c/146857 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/debug/gosym/pclntab_test.go | 38 ++++--------------- src/debug/gosym/testdata/main.go | 10 +++++ src/debug/gosym/{ => testdata}/pclinetest.h | 0 .../{pclinetest.asm => testdata/pclinetest.s} | 14 +------ 4 files changed, 19 insertions(+), 43 deletions(-) create mode 100644 src/debug/gosym/testdata/main.go rename src/debug/gosym/{ => testdata}/pclinetest.h (100%) rename src/debug/gosym/{pclinetest.asm => testdata/pclinetest.s} (96%) diff --git a/src/debug/gosym/pclntab_test.go b/src/debug/gosym/pclntab_test.go index 7e7cee67934..d21f0e24a83 100644 --- a/src/debug/gosym/pclntab_test.go +++ b/src/debug/gosym/pclntab_test.go @@ -5,7 +5,6 @@ package gosym import ( - "bytes" "debug/elf" "internal/testenv" "io/ioutil" @@ -33,33 +32,10 @@ func dotest(t *testing.T) { if err != nil { t.Fatal(err) } - // This command builds pclinetest from pclinetest.asm; - // the resulting binary looks like it was built from pclinetest.s, - // but we have renamed it to keep it away from the go tool. pclinetestBinary = filepath.Join(pclineTempDir, "pclinetest") - cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", pclinetestBinary+".o", "pclinetest.asm") - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - t.Fatal(err) - } - - // stamp .o file as being 'package main' so that go tool link will accept it - data, err := ioutil.ReadFile(pclinetestBinary + ".o") - if err != nil { - t.Fatal(err) - } - i := bytes.IndexByte(data, '\n') - if i < 0 { - t.Fatal("bad binary") - } - data = append(append(data[:i:i], "\nmain"...), data[i:]...) - if err := ioutil.WriteFile(pclinetestBinary+".o", data, 0666); err != nil { - t.Fatal(err) - } - - cmd = exec.Command(testenv.GoToolPath(t), "tool", "link", "-H", "linux", - "-o", pclinetestBinary, pclinetestBinary+".o") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", pclinetestBinary) + cmd.Dir = "testdata" + cmd.Env = append(os.Environ(), "GOOS=linux") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { @@ -232,7 +208,7 @@ func TestPCLine(t *testing.T) { } // Test PCToLine - sym := tab.LookupFunc("linefrompc") + sym := tab.LookupFunc("main.linefrompc") wantLine := 0 for pc := sym.Entry; pc < sym.End; pc++ { off := pc - text.Addr // TODO(rsc): should not need off; bug in 8g @@ -244,13 +220,13 @@ func TestPCLine(t *testing.T) { file, line, fn := tab.PCToLine(pc) if fn == nil { t.Errorf("failed to get line of PC %#x", pc) - } else if !strings.HasSuffix(file, "pclinetest.asm") || line != wantLine || fn != sym { - t.Errorf("PCToLine(%#x) = %s:%d (%s), want %s:%d (%s)", pc, file, line, fn.Name, "pclinetest.asm", wantLine, sym.Name) + } else if !strings.HasSuffix(file, "pclinetest.s") || line != wantLine || fn != sym { + t.Errorf("PCToLine(%#x) = %s:%d (%s), want %s:%d (%s)", pc, file, line, fn.Name, "pclinetest.s", wantLine, sym.Name) } } // Test LineToPC - sym = tab.LookupFunc("pcfromline") + sym = tab.LookupFunc("main.pcfromline") lookupline := -1 wantLine = 0 off := uint64(0) // TODO(rsc): should not need off; bug in 8g diff --git a/src/debug/gosym/testdata/main.go b/src/debug/gosym/testdata/main.go new file mode 100644 index 00000000000..b7702184cde --- /dev/null +++ b/src/debug/gosym/testdata/main.go @@ -0,0 +1,10 @@ +package main + +func linefrompc() +func pcfromline() + +func main() { + // Prevent GC of our test symbols + linefrompc() + pcfromline() +} diff --git a/src/debug/gosym/pclinetest.h b/src/debug/gosym/testdata/pclinetest.h similarity index 100% rename from src/debug/gosym/pclinetest.h rename to src/debug/gosym/testdata/pclinetest.h diff --git a/src/debug/gosym/pclinetest.asm b/src/debug/gosym/testdata/pclinetest.s similarity index 96% rename from src/debug/gosym/pclinetest.asm rename to src/debug/gosym/testdata/pclinetest.s index b9ee9c0a504..53461cdfc1a 100644 --- a/src/debug/gosym/pclinetest.asm +++ b/src/debug/gosym/testdata/pclinetest.s @@ -1,4 +1,4 @@ -TEXT linefrompc(SB),4,$0 // Each byte stores its line delta +TEXT ·linefrompc(SB),4,$0 // Each byte stores its line delta BYTE $2; BYTE $1; BYTE $1; BYTE $0; @@ -28,7 +28,7 @@ BYTE $2; BYTE $2; BYTE $255; -TEXT pcfromline(SB),4,$0 // Each record stores its line delta, then n, then n more bytes +TEXT ·pcfromline(SB),4,$0 // Each record stores its line delta, then n, then n more bytes BYTE $32; BYTE $0; BYTE $1; BYTE $1; BYTE $0; BYTE $1; BYTE $0; @@ -46,13 +46,3 @@ BYTE $3; BYTE $3; BYTE $0; BYTE $0; BYTE $0; BYTE $4; BYTE $3; BYTE $0; BYTE $0; BYTE $0; BYTE $255; - -// Keep the linker happy -TEXT main·main(SB),4,$0 - RET - -TEXT main·init(SB),4,$0 - // Prevent GC of our test symbols - CALL linefrompc(SB) - CALL pcfromline(SB) - RET