Documentation ¶
Index ¶
- Variables
- func CommunicationPrimitivesOf(node Node) (res []ssa.Value)
- func PrintCfg(G Cfg)
- func PrintCfgFromNode(n Node)
- func PrintNodePosition(n Node, fs *token.FileSet) bool
- func SequentiallySelfReaching(start Node) bool
- func SetSuccessor(from Node, to Node)
- func Visualize(prog *ssa.Program, result *pointer.Result)
- func VisualizeFunc(prog *ssa.Program, result *pointer.Result, fun string)
- func VisualizeFunction(fun *ssa.Function)
- type APIConcBuiltinCall
- func (n *APIConcBuiltinCall) CallInstruction() ssa.CallInstruction
- func (n *APIConcBuiltinCall) CommTransitive() map[Node]struct{}
- func (n *APIConcBuiltinCall) Cond() ssa.Value
- func (n *APIConcBuiltinCall) Instruction() ssa.Instruction
- func (n *APIConcBuiltinCall) IsCommunicationNode() bool
- func (n *APIConcBuiltinCall) Locker() ssa.Value
- func (n *APIConcBuiltinCall) Pos() token.Pos
- func (n *APIConcBuiltinCall) String() string
- type AnySynthetic
- type BaseNode
- func (n *BaseNode) AddPredecessor(n2 Node)
- func (n *BaseNode) AddSuccessor(n2 Node)
- func (n *BaseNode) CallRelation() CallRelation
- func (n *BaseNode) CallRelationNode() Node
- func (n *BaseNode) Channel() ssa.Value
- func (n *BaseNode) Continuations() (cont map[Node]struct{})
- func (n *BaseNode) DeferLink() Node
- func (n *BaseNode) IsChannelOp() bool
- func (n *BaseNode) IsDeferred() bool
- func (n *BaseNode) PanicCont() Node
- func (n *BaseNode) Panickers() map[Node]struct{}
- func (n *BaseNode) Predecessor() Node
- func (n *BaseNode) Predecessors() map[Node]struct{}
- func (n *BaseNode) RandPredecessor() Node
- func (n *BaseNode) RandSpawn() Node
- func (n *BaseNode) RandSuccessor() Node
- func (n *BaseNode) SSANode() *SSANode
- func (n *BaseNode) Spawn() Node
- func (n *BaseNode) Spawners() map[Node]struct{}
- func (n *BaseNode) Spawns() map[Node]struct{}
- func (n *BaseNode) Successor() Node
- func (n *BaseNode) Successors() map[Node]struct{}
- type BlockEntry
- type BlockEntryDefer
- type BlockExit
- type BlockExitDefer
- type BuiltinCall
- func (n *BuiltinCall) Arg(i int) ssa.Value
- func (n *BuiltinCall) Args() []ssa.Value
- func (n *BuiltinCall) Builtin() *ssa.Builtin
- func (n *BuiltinCall) Channel() ssa.Value
- func (n *BuiltinCall) CommTransitive() map[Node]struct{}
- func (n *BuiltinCall) IsCommunicationNode() bool
- func (n *BuiltinCall) Pos() token.Pos
- func (n *BuiltinCall) String() string
- type CallNodeRelation
- type CallRelation
- type Cfg
- func (cfg *Cfg) AllFunctionsWithName(name string) map[*ssa.Function]struct{}
- func (cfg *Cfg) CalleeCount() (count map[int]int)
- func (cfg *Cfg) CallerCount() (count map[int]int)
- func (cfg *Cfg) ChanOpsPointsToSets(pt *pointer.Result) (count map[int]int)
- func (cfg *Cfg) CheckImpreciseChanOps(pt *pointer.Result) (count map[int]int)
- func (cfg *Cfg) FileSet() *token.FileSet
- func (cfg *Cfg) FindAll(pred func(Node) bool) map[Node]struct{}
- func (cfg *Cfg) ForEach(do func(Node))
- func (cfg *Cfg) ForEachFrom(n Node, do func(Node))
- func (cfg *Cfg) ForEachFromIf(n Node, do func(Node), pred func(Node) bool)
- func (cfg *Cfg) FunIO(f *ssa.Function) (entry Node, exit Node)
- func (cfg *Cfg) FunctionByName(name string) *ssa.Function
- func (cfg *Cfg) Functions() map[*ssa.Function]struct{}
- func (g *Cfg) GetAllChans() (res map[ssa.Instruction]struct{})
- func (g *Cfg) GetAllConcurrencyOps() (res map[ssa.Instruction]struct{})
- func (g *Cfg) GetAllGos() (res map[ssa.Instruction]struct{})
- func (cfg *Cfg) GetEntries() (ret []Node)
- func (cfg *Cfg) GetNode(i ssa.Instruction) Node
- func (cfg *Cfg) GetSynthetic(config SynthConfig) Node
- func (cfg *Cfg) HasInsn(i ssa.Instruction) bool
- func (cfg *Cfg) HasNode(n Node) bool
- func (cfg *Cfg) HasSynthetic(config SynthConfig) bool
- func (cfg *Cfg) MaxCallees() (cs Node, maxCallees int)
- type ChnSynthetic
- type CommRcv
- type CommSend
- type CondBroadcast
- type CondSignal
- type CondWait
- type CondWaiting
- type CondWaking
- type DeferCall
- func (n *DeferCall) Channel() ssa.Value
- func (n *DeferCall) Cond() ssa.Value
- func (n *DeferCall) Instruction() ssa.Instruction
- func (n *DeferCall) IsCommunicationNode() bool
- func (n *DeferCall) Locker() ssa.Value
- func (n *DeferCall) Mutex() ssa.Value
- func (n *DeferCall) Pos() token.Pos
- func (n *DeferCall) RWMutex() ssa.Value
- func (n *DeferCall) String() string
- type FunctionEntry
- type FunctionExit
- type MuLock
- type MuUnlock
- type Node
- type PendingGo
- type PostCall
- type PostCallRelation
- type PostDeferCall
- type RWMuRLock
- type RWMuRUnlock
- type SSANode
- func (n *SSANode) Block() *ssa.BasicBlock
- func (n *SSANode) Channel() ssa.Value
- func (n *SSANode) CommTransitive() map[Node]struct{}
- func (n *SSANode) Cond() ssa.Value
- func (n *SSANode) Function() *ssa.Function
- func (n *SSANode) Instruction() ssa.Instruction
- func (n *SSANode) IsChannelOp() bool
- func (n *SSANode) IsCommunicationNode() bool
- func (n *SSANode) Locker() ssa.Value
- func (n *SSANode) Mutex() ssa.Value
- func (n *SSANode) Payload() ssa.Value
- func (n *SSANode) Pos() token.Pos
- func (n *SSANode) RWMutex() ssa.Value
- func (n *SSANode) SSANode() *SSANode
- func (n *SSANode) String() string
- type SYNTH_TYPE_ID
- type Select
- type SelectDefault
- type SelectDefer
- type SelectRcv
- type SelectSend
- type SynthConfig
- type Synthetic
- func (n *Synthetic) Block() *ssa.BasicBlock
- func (n *Synthetic) Channel() ssa.Value
- func (n *Synthetic) CommTransitive() map[Node]struct{}
- func (n *Synthetic) Cond() ssa.Value
- func (n *Synthetic) Function() *ssa.Function
- func (n *Synthetic) Id() string
- func (n *Synthetic) IsCommunicationNode() bool
- func (n *Synthetic) Locker() ssa.Value
- func (n *Synthetic) Mutex() ssa.Value
- func (Synthetic) Pos() token.Pos
- func (n *Synthetic) RWMutex() ssa.Value
- func (n *Synthetic) String() string
- type TerminateGoro
- type Waiting
- func (n *Waiting) CallInstruction() ssa.CallInstruction
- func (n *Waiting) CommTransitive() map[Node]struct{}
- func (n *Waiting) Cond() ssa.Value
- func (n *Waiting) Instruction() ssa.Instruction
- func (n *Waiting) IsCommunicationNode() bool
- func (n *Waiting) Pos() token.Pos
- func (n *Waiting) String() string
- type Waking
Constants ¶
This section is empty.
Variables ¶
var GoroTermination = struct {
EXIT_ROOT _TERMINATION_CAUSE
PERMANENTLY_BLOCKED _TERMINATION_CAUSE
INFINITE_LOOP _TERMINATION_CAUSE
}{
EXIT_ROOT: 0,
PERMANENTLY_BLOCKED: 1,
INFINITE_LOOP: 2,
}
var SynthTypes = struct { BLOCK_ENTRY SYNTH_TYPE_ID BLOCK_EXIT SYNTH_TYPE_ID BLOCK_ENTRY_DEFER SYNTH_TYPE_ID BLOCK_EXIT_DEFER SYNTH_TYPE_ID FUNCTION_ENTRY SYNTH_TYPE_ID FUNCTION_EXIT SYNTH_TYPE_ID TERMINATE_GORO SYNTH_TYPE_ID COMM_SEND SYNTH_TYPE_ID COMM_RCV SYNTH_TYPE_ID DEFER_CALL SYNTH_TYPE_ID POST_DEFER_CALL SYNTH_TYPE_ID POST_CALL SYNTH_TYPE_ID SELECT_SEND SYNTH_TYPE_ID SELECT_RCV SYNTH_TYPE_ID SELECT_DEFAULT SYNTH_TYPE_ID SELECT SYNTH_TYPE_ID SELECT_DEFER SYNTH_TYPE_ID BUILTIN_CALL SYNTH_TYPE_ID PENDING_GO SYNTH_TYPE_ID LOCK SYNTH_TYPE_ID UNLOCK SYNTH_TYPE_ID RWMU_RLOCK SYNTH_TYPE_ID RWMU_RUNLOCK SYNTH_TYPE_ID WAITING SYNTH_TYPE_ID WAKING SYNTH_TYPE_ID COND_WAIT SYNTH_TYPE_ID COND_WAITING SYNTH_TYPE_ID COND_WAKING SYNTH_TYPE_ID COND_SIGNAL SYNTH_TYPE_ID COND_BROADCAST SYNTH_TYPE_ID API_CONC_BUILTIN SYNTH_TYPE_ID }{ BLOCK_ENTRY: 0, BLOCK_EXIT: 1, BLOCK_ENTRY_DEFER: 2, BLOCK_EXIT_DEFER: 3, FUNCTION_ENTRY: 4, FUNCTION_EXIT: 5, TERMINATE_GORO: 6, COMM_SEND: 7, COMM_RCV: 8, DEFER_CALL: 9, POST_DEFER_CALL: 10, POST_CALL: 11, SELECT_SEND: 12, SELECT_RCV: 13, SELECT_DEFAULT: 14, SELECT: 15, SELECT_DEFER: 16, BUILTIN_CALL: 17, PENDING_GO: 18, LOCK: 19, UNLOCK: 20, RWMU_RLOCK: 23, RWMU_RUNLOCK: 24, WAITING: 25, WAKING: 26, COND_WAIT: 27, COND_WAITING: 28, COND_WAKING: 29, COND_SIGNAL: 30, COND_BROADCAST: 31, API_CONC_BUILTIN: 32, }
Collection of IDs for synthetic node types. Wrapped in a struct to avoid excessively polluting the namespace.
Functions ¶
func CommunicationPrimitivesOf ¶
Returns a list of communication primitives used in the node. The only (supposed) case where there may be multiple primitives is for cfg.Select nodes.
func PrintCfgFromNode ¶
func PrintCfgFromNode(n Node)
func PrintNodePosition ¶
Print the position of the nearest node with a valid position
func SetSuccessor ¶
func VisualizeFunc ¶
Creates a Dot Graph representing the program CFG
func VisualizeFunction ¶
Types ¶
type APIConcBuiltinCall ¶
type APIConcBuiltinCall struct { Synthetic Call ssa.CallInstruction }
func (*APIConcBuiltinCall) CallInstruction ¶
func (n *APIConcBuiltinCall) CallInstruction() ssa.CallInstruction
func (*APIConcBuiltinCall) CommTransitive ¶
func (n *APIConcBuiltinCall) CommTransitive() map[Node]struct{}
func (*APIConcBuiltinCall) Cond ¶
func (n *APIConcBuiltinCall) Cond() ssa.Value
func (*APIConcBuiltinCall) Instruction ¶
func (n *APIConcBuiltinCall) Instruction() ssa.Instruction
func (*APIConcBuiltinCall) IsCommunicationNode ¶
func (n *APIConcBuiltinCall) IsCommunicationNode() bool
func (*APIConcBuiltinCall) Locker ¶
func (n *APIConcBuiltinCall) Locker() ssa.Value
func (*APIConcBuiltinCall) Pos ¶
func (n *APIConcBuiltinCall) Pos() token.Pos
func (*APIConcBuiltinCall) String ¶
func (n *APIConcBuiltinCall) String() string
type AnySynthetic ¶
type AnySynthetic interface { // Extends the universal Node interface Node // Synthetic node ID Id() string // Parent basic block Block() *ssa.BasicBlock // contains filtered or unexported methods }
All synthetic nodes must implement this interface
type BaseNode ¶
type BaseNode struct {
// contains filtered or unexported fields
}
func (*BaseNode) AddPredecessor ¶
func (*BaseNode) AddSuccessor ¶
func (*BaseNode) CallRelation ¶
func (n *BaseNode) CallRelation() CallRelation
func (*BaseNode) CallRelationNode ¶
func (*BaseNode) Continuations ¶
func (*BaseNode) IsChannelOp ¶
func (*BaseNode) IsDeferred ¶
func (*BaseNode) Predecessor ¶
Returns the predecessor node. Panics if there is not strictly one predecessor.
func (*BaseNode) Predecessors ¶
func (*BaseNode) Successor ¶
Returns the successor node. Panics if there is not strictly one successor.
func (*BaseNode) Successors ¶
type BlockEntry ¶
type BlockEntry struct{ Synthetic }
type BlockEntryDefer ¶
type BlockEntryDefer struct{ Synthetic }
type BlockExitDefer ¶
type BlockExitDefer struct{ Synthetic }
type BuiltinCall ¶
type BuiltinCall struct { Synthetic Call ssa.CallInstruction // contains filtered or unexported fields }
func (*BuiltinCall) Args ¶
func (n *BuiltinCall) Args() []ssa.Value
func (*BuiltinCall) Builtin ¶
func (n *BuiltinCall) Builtin() *ssa.Builtin
func (*BuiltinCall) Channel ¶
func (n *BuiltinCall) Channel() ssa.Value
func (*BuiltinCall) CommTransitive ¶
func (n *BuiltinCall) CommTransitive() map[Node]struct{}
func (*BuiltinCall) IsCommunicationNode ¶
func (n *BuiltinCall) IsCommunicationNode() bool
func (*BuiltinCall) Pos ¶
func (n *BuiltinCall) Pos() token.Pos
func (*BuiltinCall) String ¶
func (n *BuiltinCall) String() string
type CallNodeRelation ¶
type CallNodeRelation struct {
// contains filtered or unexported fields
}
type CallRelation ¶
type CallRelation interface{}
type Cfg ¶
type Cfg struct {
// contains filtered or unexported fields
}
func GetCFG ¶
Compute an analysis friendly CFG for the given program SSA IR, rewiring control flow for select statements. Also takes into account control-flow information, dynamic dispatch, as well as calls to defer. Requires points-to information.
func (*Cfg) AllFunctionsWithName ¶
Retrieve all SSA functions which have the provided name. There is no attempt to fully qualify the function name, based on the containing package.
func (*Cfg) CalleeCount ¶
Count for each number of occurrences, how many call sites exist
func (*Cfg) CallerCount ¶
func (*Cfg) ChanOpsPointsToSets ¶
func (*Cfg) CheckImpreciseChanOps ¶
func (*Cfg) ForEachFrom ¶
func (*Cfg) ForEachFromIf ¶
func (*Cfg) FunctionByName ¶
Retrieve SSA function by name. Will attempt a fully qualified match first then fall back on a looser search and return the first matched function.
func (*Cfg) GetAllChans ¶
func (g *Cfg) GetAllChans() (res map[ssa.Instruction]struct{})
func (*Cfg) GetAllConcurrencyOps ¶
func (g *Cfg) GetAllConcurrencyOps() (res map[ssa.Instruction]struct{})
func (*Cfg) GetAllGos ¶
func (g *Cfg) GetAllGos() (res map[ssa.Instruction]struct{})
func (*Cfg) GetSynthetic ¶
func (cfg *Cfg) GetSynthetic(config SynthConfig) Node
func (*Cfg) HasSynthetic ¶
func (cfg *Cfg) HasSynthetic(config SynthConfig) bool
func (*Cfg) MaxCallees ¶
type ChnSynthetic ¶
type ChnSynthetic interface { AnySynthetic Channel() ssa.Value }
Interface for synthetic nodes involving channel makechan SSA values.
type CommRcv ¶
type CommRcv struct { Synthetic Loc loc.AddressableLocation }
func (*CommRcv) Receiver ¶
Returns receiver of communication node. If the predecessor is a select receive node, it returns the receiver value, ok value, if present, and a boolean indicating the receiver has been split. If the predecessor is a regular receive, it returns the receiver value, which will be a tuple from which the result payload, and "ok" will be later extracted.
type CommSend ¶
type CommSend struct { Synthetic Loc loc.AddressableLocation }
type CondBroadcast ¶
type CondBroadcast struct {
// contains filtered or unexported fields
}
type CondSignal ¶
type CondSignal struct {
// contains filtered or unexported fields
}
type CondWaiting ¶
type CondWaiting struct {
// contains filtered or unexported fields
}
type CondWaking ¶
type CondWaking struct {
// contains filtered or unexported fields
}
type DeferCall ¶
type DeferCall struct{ Synthetic }
func (*DeferCall) Instruction ¶
func (n *DeferCall) Instruction() ssa.Instruction
func (*DeferCall) IsCommunicationNode ¶
type FunctionEntry ¶
type FunctionEntry struct{ Synthetic }
func (*FunctionEntry) Pos ¶
func (n *FunctionEntry) Pos() token.Pos
func (*FunctionEntry) String ¶
func (n *FunctionEntry) String() string
type FunctionExit ¶
type FunctionExit struct{ Synthetic }
func (*FunctionExit) Pos ¶
func (n *FunctionExit) Pos() token.Pos
func (*FunctionExit) String ¶
func (n *FunctionExit) String() string
type Node ¶
type Node interface { AddPredecessor(Node) AddSuccessor(Node) Successor() Node RandSuccessor() Node Successors() map[Node]struct{} Spawn() Node RandSpawn() Node Spawns() map[Node]struct{} Spawners() map[Node]struct{} Predecessor() Node RandPredecessor() Node Predecessors() map[Node]struct{} DeferLink() Node // Node that acts as a continuation in case of a run-time panic. PanicCont() Node // The continuations of a node. If any regular successors are present, return // them. If not, fallback on the defer link or panic continuation. If none of // these are present, return the nil map. Continuations() map[Node]struct{} // Which nodes have this node as a // continuation in case of runtime panic. Panickers() map[Node]struct{} IsDeferred() bool CallRelation() CallRelation CallRelationNode() Node // Book-keeping Function() *ssa.Function Block() *ssa.BasicBlock IsCommunicationNode() bool IsChannelOp() bool Channel() ssa.Value Mutex() ssa.Value RWMutex() ssa.Value Locker() ssa.Value Cond() ssa.Value // Retrieve nearest communication transitive successors of current node. // If the current node itself is a concurrency-relevant node, it is the // only one returned. Does not include artificial nodes, like goroutine termination // or communication leaves. CommTransitive() map[Node]struct{} // Type conversion API SSANode() *SSANode String() string Pos() token.Pos // contains filtered or unexported methods }
func AddSynthetic ¶
func AddSynthetic(config SynthConfig) Node
Public wrapper around addSynthetic. Like `CreateSynthetic` but does not generate a new node if a identical previous one exists.
func CreateSynthetic ¶
func CreateSynthetic(config SynthConfig) (n Node)
Public API for creating synthetic nodes. Useful for creating stand-alone nodes outside the globally computed CFG
type PendingGo ¶
type PendingGo struct{ Synthetic }
func (*PendingGo) CommTransitive ¶
func (*PendingGo) IsCommunicationNode ¶
type PostCallRelation ¶
type PostCallRelation struct {
// contains filtered or unexported fields
}
type PostDeferCall ¶
type PostDeferCall struct{ Synthetic }
func (*PostDeferCall) Pos ¶
func (n *PostDeferCall) Pos() token.Pos
func (PostDeferCall) String ¶
func (PostDeferCall) String() string
type RWMuRUnlock ¶
type SSANode ¶
type SSANode struct { BaseNode // contains filtered or unexported fields }
func (*SSANode) Block ¶
func (n *SSANode) Block() *ssa.BasicBlock
func (*SSANode) CommTransitive ¶
func (*SSANode) Instruction ¶
func (n *SSANode) Instruction() ssa.Instruction
func (*SSANode) IsChannelOp ¶
func (*SSANode) IsCommunicationNode ¶
type SYNTH_TYPE_ID ¶
type SYNTH_TYPE_ID = int
type Select ¶
func (*Select) CommTransitive ¶
func (*Select) IsChannelOp ¶
func (*Select) IsCommunicationNode ¶
func (*Select) Ops ¶
func (n *Select) Ops() []ChnSynthetic
type SelectDefault ¶
type SelectDefault struct {
// contains filtered or unexported fields
}
func (*SelectDefault) CommTransitive ¶
func (n *SelectDefault) CommTransitive() map[Node]struct{}
func (*SelectDefault) IsCommunicationNode ¶
func (n *SelectDefault) IsCommunicationNode() bool
func (*SelectDefault) Pos ¶
func (n *SelectDefault) Pos() token.Pos
func (*SelectDefault) String ¶
func (n *SelectDefault) String() string
type SelectDefer ¶
type SelectDefer struct{ Synthetic }
func (*SelectDefer) Pos ¶
func (n *SelectDefer) Pos() token.Pos
func (*SelectDefer) String ¶
func (n *SelectDefer) String() string
type SelectSend ¶
func (*SelectSend) CommTransitive ¶
func (n *SelectSend) CommTransitive() map[Node]struct{}
func (*SelectSend) IsCommunicationNode ¶
func (n *SelectSend) IsCommunicationNode() bool
func (*SelectSend) Payload ¶
func (n *SelectSend) Payload() ssa.Value
func (*SelectSend) Pos ¶
func (n *SelectSend) Pos() token.Pos
func (*SelectSend) String ¶
func (n *SelectSend) String() string
type SynthConfig ¶
type SynthConfig struct { // Mandatory: specifies the type of synthetic node. Type SYNTH_TYPE_ID // Parent function Function *ssa.Function // Parent basic block Block *ssa.BasicBlock // Associated instruction Insn ssa.Instruction // Used for nodes related to channel values Chn *ssa.MakeChan // Used for synthetic send/recv/mutex nodes in abstract successor computation Loc loc.Location // Other locations which might be used Call ssa.CallInstruction // Arbitrary list of values. // Different uses for different types of synthetic nodes // -- Builtin calls: // 0 - builtin function // -- Select send case nodes: // 0 - channel // 1 - sent value // -- Select receive case nodes: // 0 - channel // 1 - received value (if receive with assignment) // 2 - received ok (if receive with tuple assignment) Vals []ssa.Value // The index of case branch in a select statement SelectIndex int // All case branches of a synthetic select node SelectOps []ChnSynthetic // The parent select node of a select case branch node SelectParent *Select // The source position of the select branch Pos token.Pos // Cause of goroutine termination TerminationCause _TERMINATION_CAUSE // Optional suffixes IdSuffixes []string }
Universal implementation of synthetic node configuration. Used when creating synthetic nodes. When instantiating, only the necessary fields need to be specified, depending on the type of the defined node.
type Synthetic ¶
type Synthetic struct { BaseNode // contains filtered or unexported fields }
Basic synthetic node structure. All synthetic node types should embed it.
func (*Synthetic) Block ¶
func (n *Synthetic) Block() *ssa.BasicBlock
func (*Synthetic) CommTransitive ¶
func (*Synthetic) IsCommunicationNode ¶
type TerminateGoro ¶
type TerminateGoro struct { Synthetic // contains filtered or unexported fields }
func (*TerminateGoro) Cause ¶
func (n *TerminateGoro) Cause() _TERMINATION_CAUSE
func (*TerminateGoro) CommTransitive ¶
func (n *TerminateGoro) CommTransitive() map[Node]struct{}
func (*TerminateGoro) IsCommunicationNode ¶
func (n *TerminateGoro) IsCommunicationNode() bool
func (*TerminateGoro) Pos ¶
func (n *TerminateGoro) Pos() token.Pos
func (*TerminateGoro) String ¶
func (n *TerminateGoro) String() string
type Waiting ¶
type Waiting struct { Synthetic Call ssa.CallInstruction }
func (*Waiting) CallInstruction ¶
func (n *Waiting) CallInstruction() ssa.CallInstruction
func (*Waiting) CommTransitive ¶
func (*Waiting) Instruction ¶
func (n *Waiting) Instruction() ssa.Instruction
func (*Waiting) IsCommunicationNode ¶
type Waking ¶
type Waking struct { Synthetic Call ssa.CallInstruction }
func (*Waking) CallInstruction ¶
func (n *Waking) CallInstruction() ssa.CallInstruction
func (*Waking) CommTransitive ¶
func (*Waking) Instruction ¶
func (n *Waking) Instruction() ssa.Instruction