cfg

package
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 22, 2022 License: Apache-2.0 Imports: 16 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var GoroTermination = struct {
	EXIT_ROOT           _TERMINATION_CAUSE
	PERMANENTLY_BLOCKED _TERMINATION_CAUSE
	INFINITE_LOOP       _TERMINATION_CAUSE
}{
	EXIT_ROOT:           0,
	PERMANENTLY_BLOCKED: 1,
	INFINITE_LOOP:       2,
}
View Source
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

func CommunicationPrimitivesOf(node Node) (res []ssa.Value)

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 PrintCfg

func PrintCfg(G Cfg)

func PrintCfgFromNode

func PrintCfgFromNode(n Node)

func PrintNodePosition

func PrintNodePosition(n Node, fs *token.FileSet) bool

Print the position of the nearest node with a valid position

func SequentiallySelfReaching

func SequentiallySelfReaching(start Node) bool

func SetSuccessor

func SetSuccessor(from Node, to Node)

func Visualize

func Visualize(prog *ssa.Program, result *pointer.Result)

Creates a Dot Graph representing the program CFG

func VisualizeFunc

func VisualizeFunc(prog *ssa.Program, result *pointer.Result, fun string)

Creates a Dot Graph representing the program CFG

func VisualizeFunction

func VisualizeFunction(fun *ssa.Function)

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 (n *BaseNode) AddPredecessor(n2 Node)

func (*BaseNode) AddSuccessor

func (n *BaseNode) AddSuccessor(n2 Node)

func (*BaseNode) CallRelation

func (n *BaseNode) CallRelation() CallRelation

func (*BaseNode) CallRelationNode

func (n *BaseNode) CallRelationNode() Node

func (*BaseNode) Channel

func (n *BaseNode) Channel() ssa.Value

func (*BaseNode) Continuations

func (n *BaseNode) Continuations() (cont map[Node]struct{})
func (n *BaseNode) DeferLink() Node

func (*BaseNode) IsChannelOp

func (n *BaseNode) IsChannelOp() bool

func (*BaseNode) IsDeferred

func (n *BaseNode) IsDeferred() bool

func (*BaseNode) PanicCont

func (n *BaseNode) PanicCont() Node

func (*BaseNode) Panickers

func (n *BaseNode) Panickers() map[Node]struct{}

func (*BaseNode) Predecessor

func (n *BaseNode) Predecessor() Node

Returns the predecessor node. Panics if there is not strictly one predecessor.

func (*BaseNode) Predecessors

func (n *BaseNode) Predecessors() map[Node]struct{}

func (*BaseNode) RandPredecessor

func (n *BaseNode) RandPredecessor() Node

*

  • Returns a random predecessor

func (*BaseNode) RandSpawn

func (n *BaseNode) RandSpawn() Node

*

  • Returns a random spawn

func (*BaseNode) RandSuccessor

func (n *BaseNode) RandSuccessor() Node

*

  • Returns a random successor

func (*BaseNode) SSANode

func (n *BaseNode) SSANode() *SSANode

func (*BaseNode) Spawn

func (n *BaseNode) Spawn() Node

func (*BaseNode) Spawners

func (n *BaseNode) Spawners() map[Node]struct{}

func (*BaseNode) Spawns

func (n *BaseNode) Spawns() map[Node]struct{}

func (*BaseNode) Successor

func (n *BaseNode) Successor() Node

Returns the successor node. Panics if there is not strictly one successor.

func (*BaseNode) Successors

func (n *BaseNode) Successors() map[Node]struct{}

type BlockEntry

type BlockEntry struct{ Synthetic }

type BlockEntryDefer

type BlockEntryDefer struct{ Synthetic }

type BlockExit

type BlockExit struct{ Synthetic }

type BlockExitDefer

type BlockExitDefer struct{ Synthetic }

type BuiltinCall

type BuiltinCall struct {
	Synthetic
	Call ssa.CallInstruction
	// contains filtered or unexported fields
}

func (*BuiltinCall) Arg

func (n *BuiltinCall) Arg(i int) ssa.Value

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 CFG

func CFG() *Cfg

func GetCFG

func GetCFG(prog *ssa.Program, mains []*ssa.Package, results *pointer.Result) *Cfg

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

func (cfg *Cfg) AllFunctionsWithName(name string) map[*ssa.Function]struct{}

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

func (cfg *Cfg) CalleeCount() (count map[int]int)

Count for each number of occurrences, how many call sites exist

func (*Cfg) CallerCount

func (cfg *Cfg) CallerCount() (count map[int]int)

func (*Cfg) ChanOpsPointsToSets

func (cfg *Cfg) ChanOpsPointsToSets(pt *pointer.Result) (count map[int]int)

func (*Cfg) CheckImpreciseChanOps

func (cfg *Cfg) CheckImpreciseChanOps(pt *pointer.Result) (count map[int]int)

func (*Cfg) FileSet

func (cfg *Cfg) FileSet() *token.FileSet

func (*Cfg) FindAll

func (cfg *Cfg) FindAll(pred func(Node) bool) map[Node]struct{}

func (*Cfg) ForEach

func (cfg *Cfg) ForEach(do func(Node))

func (*Cfg) ForEachFrom

func (cfg *Cfg) ForEachFrom(n Node, do func(Node))

func (*Cfg) ForEachFromIf

func (cfg *Cfg) ForEachFromIf(n Node, do func(Node), pred func(Node) bool)

func (*Cfg) FunIO

func (cfg *Cfg) FunIO(f *ssa.Function) (entry Node, exit Node)

func (*Cfg) FunctionByName

func (cfg *Cfg) FunctionByName(name string) *ssa.Function

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) Functions

func (cfg *Cfg) Functions() map[*ssa.Function]struct{}

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) GetEntries

func (cfg *Cfg) GetEntries() (ret []Node)

Get all CFG entry points.

func (*Cfg) GetNode

func (cfg *Cfg) GetNode(i ssa.Instruction) Node

func (*Cfg) GetSynthetic

func (cfg *Cfg) GetSynthetic(config SynthConfig) Node

func (*Cfg) HasInsn

func (cfg *Cfg) HasInsn(i ssa.Instruction) bool

func (*Cfg) HasNode

func (cfg *Cfg) HasNode(n Node) bool

func (*Cfg) HasSynthetic

func (cfg *Cfg) HasSynthetic(config SynthConfig) bool

func (*Cfg) MaxCallees

func (cfg *Cfg) MaxCallees() (cs Node, maxCallees int)

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) CommaOk

func (n *CommRcv) CommaOk() bool

func (*CommRcv) Pos

func (n *CommRcv) Pos() token.Pos

func (*CommRcv) Receiver

func (n *CommRcv) Receiver() (ssa.Value, ssa.Value, bool)

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.

func (*CommRcv) String

func (n *CommRcv) String() string

type CommSend

type CommSend struct {
	Synthetic
	Loc loc.AddressableLocation
}

func (*CommSend) Payload

func (n *CommSend) Payload() ssa.Value

func (*CommSend) Pos

func (n *CommSend) Pos() token.Pos

func (*CommSend) String

func (n *CommSend) String() string

type CondBroadcast

type CondBroadcast struct {
	// contains filtered or unexported fields
}

func (*CondBroadcast) Cond

func (n *CondBroadcast) Cond() ssa.Value

type CondSignal

type CondSignal struct {
	// contains filtered or unexported fields
}

func (*CondSignal) Cond

func (n *CondSignal) Cond() ssa.Value

type CondWait

type CondWait struct {
	// contains filtered or unexported fields
}

func (*CondWait) Cond

func (n *CondWait) Cond() ssa.Value

type CondWaiting

type CondWaiting struct {
	// contains filtered or unexported fields
}

func (*CondWaiting) Cond

func (n *CondWaiting) Cond() ssa.Value

type CondWaking

type CondWaking struct {
	// contains filtered or unexported fields
}

func (*CondWaking) Cond

func (n *CondWaking) Cond() ssa.Value

type DeferCall

type DeferCall struct{ Synthetic }

func (*DeferCall) Channel

func (n *DeferCall) Channel() ssa.Value

func (*DeferCall) Cond

func (n *DeferCall) Cond() ssa.Value

func (*DeferCall) Instruction

func (n *DeferCall) Instruction() ssa.Instruction

func (*DeferCall) IsCommunicationNode

func (n *DeferCall) IsCommunicationNode() bool

func (*DeferCall) Locker

func (n *DeferCall) Locker() ssa.Value

func (*DeferCall) Mutex

func (n *DeferCall) Mutex() ssa.Value

func (*DeferCall) Pos

func (n *DeferCall) Pos() token.Pos

func (*DeferCall) RWMutex

func (n *DeferCall) RWMutex() ssa.Value

func (*DeferCall) String

func (n *DeferCall) String() string

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 MuLock

type MuLock struct {
	Synthetic
	Loc loc.Location
}

type MuUnlock

type MuUnlock struct {
	Synthetic
	Loc loc.Location
}

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 (n *PendingGo) CommTransitive() map[Node]struct{}

func (*PendingGo) IsCommunicationNode

func (n *PendingGo) IsCommunicationNode() bool

func (PendingGo) String

func (PendingGo) String() string

type PostCall

type PostCall struct{ Synthetic }

func (*PostCall) Pos

func (n *PostCall) Pos() token.Pos

func (PostCall) String

func (p PostCall) String() string

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 RWMuRLock

type RWMuRLock struct {
	Synthetic
	Loc loc.Location
}

type RWMuRUnlock

type RWMuRUnlock struct {
	Synthetic
	Loc loc.Location
}

type SSANode

type SSANode struct {
	BaseNode
	// contains filtered or unexported fields
}

func (*SSANode) Block

func (n *SSANode) Block() *ssa.BasicBlock

func (*SSANode) Channel

func (n *SSANode) Channel() ssa.Value

func (*SSANode) CommTransitive

func (n *SSANode) CommTransitive() map[Node]struct{}

func (*SSANode) Cond

func (n *SSANode) Cond() ssa.Value

func (*SSANode) Function

func (n *SSANode) Function() *ssa.Function

func (*SSANode) Instruction

func (n *SSANode) Instruction() ssa.Instruction

func (*SSANode) IsChannelOp

func (n *SSANode) IsChannelOp() bool

func (*SSANode) IsCommunicationNode

func (n *SSANode) IsCommunicationNode() bool

func (*SSANode) Locker

func (n *SSANode) Locker() ssa.Value

func (*SSANode) Mutex

func (n *SSANode) Mutex() ssa.Value

func (*SSANode) Payload

func (n *SSANode) Payload() ssa.Value

func (*SSANode) Pos

func (n *SSANode) Pos() token.Pos

func (*SSANode) RWMutex

func (n *SSANode) RWMutex() ssa.Value

func (*SSANode) SSANode

func (n *SSANode) SSANode() *SSANode

func (*SSANode) String

func (n *SSANode) String() string

type SYNTH_TYPE_ID

type SYNTH_TYPE_ID = int

type Select

type Select struct {
	Synthetic

	Insn *ssa.Select
	// contains filtered or unexported fields
}

func (*Select) Channel

func (n *Select) Channel() (ret ssa.Value)

func (*Select) CommTransitive

func (n *Select) CommTransitive() map[Node]struct{}

func (*Select) IsChannelOp

func (n *Select) IsChannelOp() bool

func (*Select) IsCommunicationNode

func (n *Select) IsCommunicationNode() bool

func (*Select) Ops

func (n *Select) Ops() []ChnSynthetic

func (*Select) Pos

func (n *Select) Pos() token.Pos

func (*Select) String

func (n *Select) String() string

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 SelectRcv

type SelectRcv struct {
	Val ssa.Value
	Ok  ssa.Value
	// contains filtered or unexported fields
}

func (*SelectRcv) CommTransitive

func (n *SelectRcv) CommTransitive() map[Node]struct{}

func (*SelectRcv) CommaOk

func (n *SelectRcv) CommaOk() bool

func (*SelectRcv) IsCommunicationNode

func (n *SelectRcv) IsCommunicationNode() bool

func (*SelectRcv) Pos

func (n *SelectRcv) Pos() token.Pos

func (*SelectRcv) String

func (n *SelectRcv) String() string

type SelectSend

type SelectSend struct {
	Val ssa.Value
	// contains filtered or unexported fields
}

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) Channel

func (n *Synthetic) Channel() ssa.Value

func (*Synthetic) CommTransitive

func (n *Synthetic) CommTransitive() map[Node]struct{}

func (*Synthetic) Cond

func (n *Synthetic) Cond() ssa.Value

func (*Synthetic) Function

func (n *Synthetic) Function() *ssa.Function

func (*Synthetic) Id

func (n *Synthetic) Id() string

func (*Synthetic) IsCommunicationNode

func (n *Synthetic) IsCommunicationNode() bool

func (*Synthetic) Locker

func (n *Synthetic) Locker() ssa.Value

func (*Synthetic) Mutex

func (n *Synthetic) Mutex() ssa.Value

func (Synthetic) Pos

func (Synthetic) Pos() token.Pos

func (*Synthetic) RWMutex

func (n *Synthetic) RWMutex() ssa.Value

func (*Synthetic) String

func (n *Synthetic) String() string

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 (n *Waiting) CommTransitive() map[Node]struct{}

func (*Waiting) Cond

func (n *Waiting) Cond() ssa.Value

func (*Waiting) Instruction

func (n *Waiting) Instruction() ssa.Instruction

func (*Waiting) IsCommunicationNode

func (n *Waiting) IsCommunicationNode() bool

func (*Waiting) Pos

func (n *Waiting) Pos() token.Pos

func (*Waiting) String

func (n *Waiting) String() string

type Waking

type Waking struct {
	Synthetic
	Call ssa.CallInstruction
}

func (*Waking) CallInstruction

func (n *Waking) CallInstruction() ssa.CallInstruction

func (*Waking) CommTransitive

func (n *Waking) CommTransitive() map[Node]struct{}

func (*Waking) Cond

func (n *Waking) Cond() ssa.Value

func (*Waking) Instruction

func (n *Waking) Instruction() ssa.Instruction

func (*Waking) IsCommunicationNode

func (n *Waking) IsCommunicationNode() bool

func (*Waking) Pos

func (n *Waking) Pos() token.Pos

func (*Waking) String

func (n *Waking) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL