Commit 57123654 authored by Austin Clements's avatar Austin Clements

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 <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent af1bfe0a
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package gosym package gosym
import ( import (
"bytes"
"debug/elf" "debug/elf"
"internal/testenv" "internal/testenv"
"io/ioutil" "io/ioutil"
...@@ -33,33 +32,10 @@ func dotest(t *testing.T) { ...@@ -33,33 +32,10 @@ func dotest(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) 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") pclinetestBinary = filepath.Join(pclineTempDir, "pclinetest")
cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", pclinetestBinary+".o", "pclinetest.asm") cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", pclinetestBinary)
cmd.Stdout = os.Stdout cmd.Dir = "testdata"
cmd.Stderr = os.Stderr cmd.Env = append(os.Environ(), "GOOS=linux")
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.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil { if err := cmd.Run(); err != nil {
...@@ -232,7 +208,7 @@ func TestPCLine(t *testing.T) { ...@@ -232,7 +208,7 @@ func TestPCLine(t *testing.T) {
} }
// Test PCToLine // Test PCToLine
sym := tab.LookupFunc("linefrompc") sym := tab.LookupFunc("main.linefrompc")
wantLine := 0 wantLine := 0
for pc := sym.Entry; pc < sym.End; pc++ { for pc := sym.Entry; pc < sym.End; pc++ {
off := pc - text.Addr // TODO(rsc): should not need off; bug in 8g off := pc - text.Addr // TODO(rsc): should not need off; bug in 8g
...@@ -244,13 +220,13 @@ func TestPCLine(t *testing.T) { ...@@ -244,13 +220,13 @@ func TestPCLine(t *testing.T) {
file, line, fn := tab.PCToLine(pc) file, line, fn := tab.PCToLine(pc)
if fn == nil { if fn == nil {
t.Errorf("failed to get line of PC %#x", pc) t.Errorf("failed to get line of PC %#x", pc)
} else if !strings.HasSuffix(file, "pclinetest.asm") || line != wantLine || fn != sym { } 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.asm", wantLine, sym.Name) t.Errorf("PCToLine(%#x) = %s:%d (%s), want %s:%d (%s)", pc, file, line, fn.Name, "pclinetest.s", wantLine, sym.Name)
} }
} }
// Test LineToPC // Test LineToPC
sym = tab.LookupFunc("pcfromline") sym = tab.LookupFunc("main.pcfromline")
lookupline := -1 lookupline := -1
wantLine = 0 wantLine = 0
off := uint64(0) // TODO(rsc): should not need off; bug in 8g off := uint64(0) // TODO(rsc): should not need off; bug in 8g
......
package main
func linefrompc()
func pcfromline()
func main() {
// Prevent GC of our test symbols
linefrompc()
pcfromline()
}
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 $2;
BYTE $1; BYTE $1;
BYTE $1; BYTE $0; BYTE $1; BYTE $0;
...@@ -28,7 +28,7 @@ BYTE $2; ...@@ -28,7 +28,7 @@ BYTE $2;
BYTE $2; BYTE $2;
BYTE $255; 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 $32; BYTE $0;
BYTE $1; BYTE $1; BYTE $0; BYTE $1; BYTE $1; BYTE $0;
BYTE $1; BYTE $0; BYTE $1; BYTE $0;
...@@ -46,13 +46,3 @@ BYTE $3; BYTE $3; BYTE $0; BYTE $0; 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 $4; BYTE $3; BYTE $0; BYTE $0; BYTE $0;
BYTE $255; 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
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