1// Copyright 2013 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package pointer 6 7// This file defines the internal (context-sensitive) call graph. 8 9import ( 10 "fmt" 11 "go/token" 12 13 "llvm.org/llgo/third_party/gotools/go/ssa" 14) 15 16type cgnode struct { 17 fn *ssa.Function 18 obj nodeid // start of this contour's object block 19 sites []*callsite // ordered list of callsites within this function 20 callersite *callsite // where called from, if known; nil for shared contours 21} 22 23// contour returns a description of this node's contour. 24func (n *cgnode) contour() string { 25 if n.callersite == nil { 26 return "shared contour" 27 } 28 if n.callersite.instr != nil { 29 return fmt.Sprintf("as called from %s", n.callersite.instr.Parent()) 30 } 31 return fmt.Sprintf("as called from intrinsic (targets=n%d)", n.callersite.targets) 32} 33 34func (n *cgnode) String() string { 35 return fmt.Sprintf("cg%d:%s", n.obj, n.fn) 36} 37 38// A callsite represents a single call site within a cgnode; 39// it is implicitly context-sensitive. 40// callsites never represent calls to built-ins; 41// they are handled as intrinsics. 42// 43type callsite struct { 44 targets nodeid // pts(·) contains objects for dynamically called functions 45 instr ssa.CallInstruction // the call instruction; nil for synthetic/intrinsic 46} 47 48func (c *callsite) String() string { 49 if c.instr != nil { 50 return c.instr.Common().Description() 51 } 52 return "synthetic function call" 53} 54 55// pos returns the source position of this callsite, or token.NoPos if implicit. 56func (c *callsite) pos() token.Pos { 57 if c.instr != nil { 58 return c.instr.Pos() 59 } 60 return token.NoPos 61} 62