diff options
Diffstat (limited to 'vendor/github.com/google/gops/internal/obj/obj.go')
-rw-r--r-- | vendor/github.com/google/gops/internal/obj/obj.go | 306 |
1 files changed, 0 insertions, 306 deletions
diff --git a/vendor/github.com/google/gops/internal/obj/obj.go b/vendor/github.com/google/gops/internal/obj/obj.go deleted file mode 100644 index 566263d3..00000000 --- a/vendor/github.com/google/gops/internal/obj/obj.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package obj - -import ( - "fmt" - "path/filepath" - "sort" - "strings" -) - -// A LineHist records the history of the file input stack, which maps the virtual line number, -// an incrementing count of lines processed in any input file and typically named lineno, -// to a stack of file:line pairs showing the path of inclusions that led to that position. -// The first line directive (//line in Go, #line in assembly) is treated as pushing -// a new entry on the stack, so that errors can report both the actual and translated -// line number. -// -// In typical use, the virtual lineno begins at 1, and file line numbers also begin at 1, -// but the only requirements placed upon the numbers by this code are: -// - calls to Push, Update, and Pop must be monotonically increasing in lineno -// - except as specified by those methods, virtual and file line number increase -// together, so that given (only) calls Push(10, "x.go", 1) and Pop(15), -// virtual line 12 corresponds to x.go line 3. -type LineHist struct { - Top *LineStack // current top of stack - Ranges []LineRange // ranges for lookup - Dir string // directory to qualify relative paths - TrimPathPrefix string // remove leading TrimPath from recorded file names - PrintFilenameOnly bool // ignore path when pretty-printing a line; internal use only - GOROOT string // current GOROOT -} - -// A LineStack is an entry in the recorded line history. -// Although the history at any given line number is a stack, -// the record for all line processed forms a tree, with common -// stack prefixes acting as parents. -type LineStack struct { - Parent *LineStack // parent in inclusion stack - Lineno int // virtual line number where this entry takes effect - File string // file name used to open source file, for error messages - AbsFile string // absolute file name, for pcln tables - FileLine int // line number in file at Lineno - Directive bool - Sym *LSym // for linkgetline - TODO(rsc): remove -} - -func (stk *LineStack) fileLineAt(lineno int) int { - return stk.FileLine + lineno - stk.Lineno -} - -// The span of valid linenos in the recorded line history can be broken -// into a set of ranges, each with a particular stack. -// A LineRange records one such range. -type LineRange struct { - Start int // starting lineno - Stack *LineStack // top of stack for this range -} - -// startRange starts a new range with the given top of stack. -func (h *LineHist) startRange(lineno int, top *LineStack) { - h.Top = top - h.Ranges = append(h.Ranges, LineRange{top.Lineno, top}) -} - -// setFile sets stk.File = file and also derives stk.AbsFile. -func (h *LineHist) setFile(stk *LineStack, file string) { - // Note: The exclusion of stk.Directive may be wrong but matches what we've done before. - // The check for < avoids putting a path prefix on "<autogenerated>". - abs := file - if h.Dir != "" && !filepath.IsAbs(file) && !strings.HasPrefix(file, "<") && !stk.Directive { - abs = filepath.Join(h.Dir, file) - } - - // Remove leading TrimPathPrefix, or else rewrite $GOROOT to literal $GOROOT. - if h.TrimPathPrefix != "" && hasPathPrefix(abs, h.TrimPathPrefix) { - if abs == h.TrimPathPrefix { - abs = "" - } else { - abs = abs[len(h.TrimPathPrefix)+1:] - } - } else if hasPathPrefix(abs, h.GOROOT) { - abs = "$GOROOT" + abs[len(h.GOROOT):] - } - if abs == "" { - abs = "??" - } - abs = filepath.Clean(abs) - stk.AbsFile = abs - - if file == "" { - file = "??" - } - stk.File = file -} - -// Does s have t as a path prefix? -// That is, does s == t or does s begin with t followed by a slash? -// For portability, we allow ASCII case folding, so that hasPathPrefix("a/b/c", "A/B") is true. -// Similarly, we allow slash folding, so that hasPathPrefix("a/b/c", "a\\b") is true. -// We do not allow full Unicode case folding, for fear of causing more confusion -// or harm than good. (For an example of the kinds of things that can go wrong, -// see http://article.gmane.org/gmane.linux.kernel/1853266.) -func hasPathPrefix(s string, t string) bool { - if len(t) > len(s) { - return false - } - var i int - for i = 0; i < len(t); i++ { - cs := int(s[i]) - ct := int(t[i]) - if 'A' <= cs && cs <= 'Z' { - cs += 'a' - 'A' - } - if 'A' <= ct && ct <= 'Z' { - ct += 'a' - 'A' - } - if cs == '\\' { - cs = '/' - } - if ct == '\\' { - ct = '/' - } - if cs != ct { - return false - } - } - return i >= len(s) || s[i] == '/' || s[i] == '\\' -} - -// Push records that at that lineno a new file with the given name was pushed onto the input stack. -func (h *LineHist) Push(lineno int, file string) { - stk := &LineStack{ - Parent: h.Top, - Lineno: lineno, - FileLine: 1, - } - h.setFile(stk, file) - h.startRange(lineno, stk) -} - -// Pop records that at lineno the current file was popped from the input stack. -func (h *LineHist) Pop(lineno int) { - top := h.Top - if top == nil { - return - } - if top.Directive && top.Parent != nil { // pop #line level too - top = top.Parent - } - next := top.Parent - if next == nil { - h.Top = nil - h.Ranges = append(h.Ranges, LineRange{lineno, nil}) - return - } - - // Popping included file. Update parent offset to account for - // the virtual line number range taken by the included file. - // Cannot modify the LineStack directly, or else lookups - // for the earlier line numbers will get the wrong answers, - // so make a new one. - stk := new(LineStack) - *stk = *next - stk.Lineno = lineno - stk.FileLine = next.fileLineAt(top.Lineno) - h.startRange(lineno, stk) -} - -// Update records that at lineno the file name and line number were changed using -// a line directive (//line in Go, #line in assembly). -func (h *LineHist) Update(lineno int, file string, line int) { - top := h.Top - if top == nil { - return // shouldn't happen - } - var stk *LineStack - if top.Directive { - // Update existing entry, except make copy to avoid changing earlier history. - stk = new(LineStack) - *stk = *top - } else { - // Push new entry. - stk = &LineStack{ - Parent: top, - Directive: true, - } - } - stk.Lineno = lineno - if stk.File != file { - h.setFile(stk, file) // only retain string if needed - } - stk.FileLine = line - h.startRange(lineno, stk) -} - -// AddImport adds a package to the list of imported packages. -func (ctxt *Link) AddImport(pkg string) { - ctxt.Imports = append(ctxt.Imports, pkg) -} - -// At returns the input stack in effect at lineno. -func (h *LineHist) At(lineno int) *LineStack { - i := sort.Search(len(h.Ranges), func(i int) bool { - return h.Ranges[i].Start > lineno - }) - // Found first entry beyond lineno. - if i == 0 { - return nil - } - return h.Ranges[i-1].Stack -} - -// LineString returns a string giving the file and line number -// corresponding to lineno, for use in error messages. -func (h *LineHist) LineString(lineno int) string { - stk := h.At(lineno) - if stk == nil { - return "<unknown line number>" - } - - filename := stk.File - if h.PrintFilenameOnly { - filename = filepath.Base(filename) - } - text := fmt.Sprintf("%s:%d", filename, stk.fileLineAt(lineno)) - if stk.Directive && stk.Parent != nil { - stk = stk.Parent - filename = stk.File - if h.PrintFilenameOnly { - filename = filepath.Base(filename) - } - text += fmt.Sprintf("[%s:%d]", filename, stk.fileLineAt(lineno)) - } - const showFullStack = false // was used by old C compilers - if showFullStack { - for stk.Parent != nil { - lineno = stk.Lineno - 1 - stk = stk.Parent - text += fmt.Sprintf(" %s:%d", filename, stk.fileLineAt(lineno)) - if stk.Directive && stk.Parent != nil { - stk = stk.Parent - text += fmt.Sprintf("[%s:%d]", filename, stk.fileLineAt(lineno)) - } - } - } - return text -} - -// FileLine returns the file name and line number -// at the top of the stack for the given lineno. -func (h *LineHist) FileLine(lineno int) (file string, line int) { - stk := h.At(lineno) - if stk == nil { - return "??", 0 - } - return stk.File, stk.fileLineAt(lineno) -} - -// AbsFileLine returns the absolute file name and line number -// at the top of the stack for the given lineno. -func (h *LineHist) AbsFileLine(lineno int) (file string, line int) { - stk := h.At(lineno) - if stk == nil { - return "??", 0 - } - return stk.AbsFile, stk.fileLineAt(lineno) -} - -// This is a simplified copy of linklinefmt above. -// It doesn't allow printing the full stack, and it returns the file name and line number separately. -// TODO: Unify with linklinefmt somehow. -func linkgetline(ctxt *Link, lineno int32) (f *LSym, l int32) { - stk := ctxt.LineHist.At(int(lineno)) - if stk == nil || stk.AbsFile == "" { - return Linklookup(ctxt, "??", HistVersion), 0 - } - if stk.Sym == nil { - stk.Sym = Linklookup(ctxt, stk.AbsFile, HistVersion) - } - return stk.Sym, int32(stk.fileLineAt(int(lineno))) -} - -func Linkprfile(ctxt *Link, line int) { - fmt.Printf("%s ", ctxt.LineHist.LineString(line)) -} - -func fieldtrack(ctxt *Link, cursym *LSym) { - p := cursym.Text - if p == nil || p.Link == nil { // handle external functions and ELF section symbols - return - } - ctxt.Cursym = cursym - - for ; p != nil; p = p.Link { - if p.As == AUSEFIELD { - r := Addrel(ctxt.Cursym) - r.Off = 0 - r.Siz = 0 - r.Sym = p.From.Sym - r.Type = R_USEFIELD - } - } -} |