Commit 21bf37b5 authored by Jeremy Faller's avatar Jeremy Faller

cmd/compile: update object file format for DWARF file table

In CL 188317, we generate the debug_lines in the compiler, and created a
new symbol to hold the line table. Here we modify the object file format
to output the file table.

Change-Id: Ibee192e80b86ff6af36467a0b1c26ee747dfee37
Reviewed-on: https://go-review.googlesource.com/c/go/+/191167Reviewed-by: default avatarAustin Clements <austin@google.com>
Reviewed-by: default avatarThan McIntosh <thanm@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent efb97392
...@@ -136,6 +136,7 @@ type Package struct { ...@@ -136,6 +136,7 @@ type Package struct {
MaxVersion int64 // maximum Version in any SymID in Syms MaxVersion int64 // maximum Version in any SymID in Syms
Arch string // architecture Arch string // architecture
Native []*NativeReader // native object data (e.g. ELF) Native []*NativeReader // native object data (e.g. ELF)
DWARFFileList []string // List of files for the DWARF .debug_lines section
} }
type NativeReader struct { type NativeReader struct {
...@@ -502,7 +503,7 @@ func (r *objReader) parseObject(prefix []byte) error { ...@@ -502,7 +503,7 @@ func (r *objReader) parseObject(prefix []byte) error {
// TODO: extract OS + build ID if/when we need it // TODO: extract OS + build ID if/when we need it
r.readFull(r.tmp[:8]) r.readFull(r.tmp[:8])
if !bytes.Equal(r.tmp[:8], []byte("\x00go112ld")) { if !bytes.Equal(r.tmp[:8], []byte("\x00go114ld")) {
return r.error(errCorruptObject) return r.error(errCorruptObject)
} }
...@@ -520,6 +521,12 @@ func (r *objReader) parseObject(prefix []byte) error { ...@@ -520,6 +521,12 @@ func (r *objReader) parseObject(prefix []byte) error {
r.p.Imports = append(r.p.Imports, s) r.p.Imports = append(r.p.Imports, s)
} }
// Read filenames for dwarf info.
count := r.readInt()
for i := int64(0); i < count; i++ {
r.p.DWARFFileList = append(r.p.DWARFFileList, r.readString())
}
r.p.SymRefs = []SymID{{"", 0}} r.p.SymRefs = []SymID{{"", 0}}
for { for {
if b := r.readByte(); b != 0xfe { if b := r.readByte(); b != 0xfe {
...@@ -619,7 +626,7 @@ func (r *objReader) parseObject(prefix []byte) error { ...@@ -619,7 +626,7 @@ func (r *objReader) parseObject(prefix []byte) error {
} }
r.readFull(r.tmp[:7]) r.readFull(r.tmp[:7])
if !bytes.Equal(r.tmp[:7], []byte("go112ld")) { if !bytes.Equal(r.tmp[:7], []byte("go114ld")) {
return r.error(errCorruptObject) return r.error(errCorruptObject)
} }
......
...@@ -235,15 +235,3 @@ func putpclcdelta(linkctxt *Link, dctxt dwCtxt, s *LSym, deltaPC uint64, deltaLC ...@@ -235,15 +235,3 @@ func putpclcdelta(linkctxt *Link, dctxt dwCtxt, s *LSym, deltaPC uint64, deltaLC
// Output the special opcode. // Output the special opcode.
dctxt.AddUint8(s, uint8(opcode)) dctxt.AddUint8(s, uint8(opcode))
} }
// createDebugLinesFileTable creates a new symbol holding the list of files
// in our package.
func (ctxt *Link) createDebugLinesFileTable() {
dctxt := dwCtxt{ctxt}
fileLUT := ctxt.PosTable.DebugLinesFileTable()
s := ctxt.dwarfFileTableSymbol()
for _, file := range fileLUT {
dctxt.AddString(s, file)
}
}
...@@ -86,7 +86,7 @@ func WriteObjFile(ctxt *Link, b *bufio.Writer, pkgpath string) { ...@@ -86,7 +86,7 @@ func WriteObjFile(ctxt *Link, b *bufio.Writer, pkgpath string) {
w := newObjWriter(ctxt, b, pkgpath) w := newObjWriter(ctxt, b, pkgpath)
// Magic header // Magic header
w.wr.WriteString("\x00go112ld") w.wr.WriteString("\x00go114ld")
// Version // Version
w.wr.WriteByte(1) w.wr.WriteByte(1)
...@@ -97,6 +97,13 @@ func WriteObjFile(ctxt *Link, b *bufio.Writer, pkgpath string) { ...@@ -97,6 +97,13 @@ func WriteObjFile(ctxt *Link, b *bufio.Writer, pkgpath string) {
} }
w.writeString("") w.writeString("")
// DWARF File Table
fileTable := ctxt.PosTable.DebugLinesFileTable()
w.writeInt(int64(len(fileTable)))
for _, str := range fileTable {
w.writeString(str)
}
// Symbol references // Symbol references
for _, s := range ctxt.Text { for _, s := range ctxt.Text {
w.writeRefs(s) w.writeRefs(s)
...@@ -161,7 +168,7 @@ func WriteObjFile(ctxt *Link, b *bufio.Writer, pkgpath string) { ...@@ -161,7 +168,7 @@ func WriteObjFile(ctxt *Link, b *bufio.Writer, pkgpath string) {
} }
// Magic footer // Magic footer
w.wr.WriteString("\xffgo112ld") w.wr.WriteString("\xffgo114ld")
} }
// Symbols are prefixed so their content doesn't get confused with the magic footer. // Symbols are prefixed so their content doesn't get confused with the magic footer.
...@@ -641,23 +648,6 @@ func (ctxt *Link) DwarfIntConst(myimportpath, name, typename string, val int64) ...@@ -641,23 +648,6 @@ func (ctxt *Link) DwarfIntConst(myimportpath, name, typename string, val int64)
dwarf.PutIntConst(dwCtxt{ctxt}, s, ctxt.Lookup(dwarf.InfoPrefix+typename), myimportpath+"."+name, val) dwarf.PutIntConst(dwCtxt{ctxt}, s, ctxt.Lookup(dwarf.InfoPrefix+typename), myimportpath+"."+name, val)
} }
// dwarfFileTableSymbol creates (or finds) the symbol for holding the line table for this package.
//
// The symbol WILL NOT be unique at the per package/archive level. For example,
// when writing a package archive, we'll write this symbol for the Go code, and
// one for each assembly file in the package. As such, we can't treat this
// symbol the same when we read in the object files in the linker. This symbol
// won't make it to the symbol table, and compilation units will keep track of
// it.
// TODO: Actually save this to the object file, and read it back in the linker.
func (ctxt *Link) dwarfFileTableSymbol() *LSym {
s := ctxt.LookupInit(dwarf.DebugLinesPrefix+".package", func(s *LSym) {
s.Type = objabi.SDWARFLINES
//ctxt.Data = append(ctxt.Data, s)
})
return s
}
func (ctxt *Link) DwarfAbstractFunc(curfn interface{}, s *LSym, myimportpath string) { func (ctxt *Link) DwarfAbstractFunc(curfn interface{}, s *LSym, myimportpath string) {
absfn := ctxt.DwFixups.AbsFuncDwarfSym(s) absfn := ctxt.DwFixups.AbsFuncDwarfSym(s)
if absfn.Size != 0 { if absfn.Size != 0 {
......
...@@ -22,10 +22,12 @@ ...@@ -22,10 +22,12 @@
// //
// The file format is: // The file format is:
// //
// - magic header: "\x00go112ld" // - magic header: "\x00go114ld"
// - byte 1 - version number // - byte 1 - version number
// - sequence of strings giving dependencies (imported packages) // - sequence of strings giving dependencies (imported packages)
// - empty string (marks end of sequence) // - empty string (marks end of sequence)
// - number of entries in the following sequence
// - sequence of filename strings to generate debug information
// - sequence of symbol references used by the defined symbols // - sequence of symbol references used by the defined symbols
// - byte 0xff (marks end of sequence) // - byte 0xff (marks end of sequence)
// - sequence of integer lengths: // - sequence of integer lengths:
...@@ -38,7 +40,7 @@ ...@@ -38,7 +40,7 @@
// - data, the content of the defined symbols // - data, the content of the defined symbols
// - sequence of defined symbols // - sequence of defined symbols
// - byte 0xff (marks end of sequence) // - byte 0xff (marks end of sequence)
// - magic footer: "\xffgo112ld" // - magic footer: "\xffgo114ld"
// //
// All integers are stored in a zigzag varint format. // All integers are stored in a zigzag varint format.
// See golang.org/s/go12symtab for a definition. // See golang.org/s/go12symtab for a definition.
......
...@@ -27,8 +27,8 @@ import ( ...@@ -27,8 +27,8 @@ import (
) )
const ( const (
startmagic = "\x00go112ld" startmagic = "\x00go114ld"
endmagic = "\xffgo112ld" endmagic = "\xffgo114ld"
) )
var emptyPkg = []byte(`"".`) var emptyPkg = []byte(`"".`)
...@@ -136,6 +136,14 @@ func (r *objReader) loadObjFile() { ...@@ -136,6 +136,14 @@ func (r *objReader) loadObjFile() {
r.lib.ImportStrings = append(r.lib.ImportStrings, lib) r.lib.ImportStrings = append(r.lib.ImportStrings, lib)
} }
// DWARF strings
count := r.readInt()
r.unit.DWARFFileTable = make([]string, count)
for i := 0; i < count; i++ {
// TODO: This should probably be a call to mkROString.
r.unit.DWARFFileTable[i] = r.readString()
}
// Symbol references // Symbol references
r.refs = []*sym.Symbol{nil} // zeroth ref is nil r.refs = []*sym.Symbol{nil} // zeroth ref is nil
for { for {
......
...@@ -19,4 +19,5 @@ type CompilationUnit struct { ...@@ -19,4 +19,5 @@ type CompilationUnit struct {
AbsFnDIEs []*Symbol // Abstract function DIE subtrees AbsFnDIEs []*Symbol // Abstract function DIE subtrees
RangeSyms []*Symbol // Symbols for debug_range RangeSyms []*Symbol // Symbols for debug_range
Textp []*Symbol // Text symbols in this CU Textp []*Symbol // Text symbols in this CU
DWARFFileTable []string // The file table used to generate the .debug_lines
} }
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