GoPLS Viewer

Home|gopls/go/ssa/doc.go
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
5// Package ssa defines a representation of the elements of Go programs
6// (packages, types, functions, variables and constants) using a
7// static single-assignment (SSA) form intermediate representation
8// (IR) for the bodies of functions.
9//
10// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
11//
12// For an introduction to SSA form, see
13// http://en.wikipedia.org/wiki/Static_single_assignment_form.
14// This page provides a broader reading list:
15// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
16//
17// The level of abstraction of the SSA form is intentionally close to
18// the source language to facilitate construction of source analysis
19// tools.  It is not intended for machine code generation.
20//
21// All looping, branching and switching constructs are replaced with
22// unstructured control flow.  Higher-level control flow constructs
23// such as multi-way branch can be reconstructed as needed; see
24// ssautil.Switches() for an example.
25//
26// The simplest way to create the SSA representation of a package is
27// to load typed syntax trees using golang.org/x/tools/go/packages, then
28// invoke the ssautil.Packages helper function. See Example_loadPackages
29// and Example_loadWholeProgram for examples.
30// The resulting ssa.Program contains all the packages and their
31// members, but SSA code is not created for function bodies until a
32// subsequent call to (*Package).Build or (*Program).Build.
33//
34// The builder initially builds a naive SSA form in which all local
35// variables are addresses of stack locations with explicit loads and
36// stores.  Registerisation of eligible locals and φ-node insertion
37// using dominance and dataflow are then performed as a second pass
38// called "lifting" to improve the accuracy and performance of
39// subsequent analyses; this pass can be skipped by setting the
40// NaiveForm builder flag.
41//
42// The primary interfaces of this package are:
43//
44//   - Member: a named member of a Go package.
45//   - Value: an expression that yields a value.
46//   - Instruction: a statement that consumes values and performs computation.
47//   - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
48//
49// A computation that yields a result implements both the Value and
50// Instruction interfaces.  The following table shows for each
51// concrete type which of these interfaces it implements.
52//
53//                       Value?          Instruction?      Member?
54//    *Alloc                ✔               ✔
55//    *BinOp                ✔               ✔
56//    *Builtin              ✔
57//    *Call                 ✔               ✔
58//    *ChangeInterface      ✔               ✔
59//    *ChangeType           ✔               ✔
60//    *Const                ✔
61//    *Convert              ✔               ✔
62//    *DebugRef                             ✔
63//    *Defer                                ✔
64//    *Extract              ✔               ✔
65//    *Field                ✔               ✔
66//    *FieldAddr            ✔               ✔
67//    *FreeVar              ✔
68//    *Function             ✔                               ✔ (func)
69//    *Global               ✔                               ✔ (var)
70//    *Go                                   ✔
71//    *If                                   ✔
72//    *Index                ✔               ✔
73//    *IndexAddr            ✔               ✔
74//    *Jump                                 ✔
75//    *Lookup               ✔               ✔
76//    *MakeChan             ✔               ✔
77//    *MakeClosure          ✔               ✔
78//    *MakeInterface        ✔               ✔
79//    *MakeMap              ✔               ✔
80//    *MakeSlice            ✔               ✔
81//    *MapUpdate                            ✔
82//    *NamedConst                                           ✔ (const)
83//    *Next                 ✔               ✔
84//    *Panic                                ✔
85//    *Parameter            ✔
86//    *Phi                  ✔               ✔
87//    *Range                ✔               ✔
88//    *Return                               ✔
89//    *RunDefers                            ✔
90//    *Select               ✔               ✔
91//    *Send                                 ✔
92//    *Slice                ✔               ✔
93//    *SliceToArrayPointer  ✔               ✔
94//    *Store                                ✔
95//    *Type                                                 ✔ (type)
96//    *TypeAssert           ✔               ✔
97//    *UnOp                 ✔               ✔
98//
99// Other key types in this package include: Program, Package, Function
100// and BasicBlock.
101//
102// The program representation constructed by this package is fully
103// resolved internally, i.e. it does not rely on the names of Values,
104// Packages, Functions, Types or BasicBlocks for the correct
105// interpretation of the program.  Only the identities of objects and
106// the topology of the SSA and type graphs are semantically
107// significant.  (There is one exception: Ids, used to identify field
108// and method names, contain strings.)  Avoidance of name-based
109// operations simplifies the implementation of subsequent passes and
110// can make them very efficient.  Many objects are nonetheless named
111// to aid in debugging, but it is not essential that the names be
112// either accurate or unambiguous.  The public API exposes a number of
113// name-based maps for client convenience.
114//
115// The ssa/ssautil package provides various utilities that depend only
116// on the public API of this package.
117//
118// TODO(adonovan): Consider the exceptional control-flow implications
119// of defer and recover().
120//
121// TODO(adonovan): write a how-to document for all the various cases
122// of trying to determine corresponding elements across the four
123// domains of source locations, ast.Nodes, types.Objects,
124// ssa.Values/Instructions.
125package ssa // import "golang.org/x/tools/go/ssa"
126
MembersX
Members
X