Skip to content

Commit 0342c4b

Browse files
committed
Update docs for goto-programs
1 parent dbd6988 commit 0342c4b

File tree

1 file changed

+16
-23
lines changed

1 file changed

+16
-23
lines changed

src/goto-programs/README.md

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,12 @@ digraph G {
124124
}
125125
\enddot
126126

127-
At this stage, CBMC constructs a goto-program from a symbol table. It
128-
does not use the parse tree or the source file at all for this step. This
127+
At this stage, CBMC constructs a goto-program from a symbol table.
128+
Each symbol in the symbol table with function type (that is, the symbol's `type`
129+
field contains a \ref code_typet) will be converted to a corresponding GOTO
130+
program.
131+
132+
It does not use the parse tree or the source file at all for this step. This
129133
may seem surprising, because the symbols are stored in a hash table and
130134
therefore have no intrinsic order; nevertheless, every \ref symbolt is
131135
associated with a \ref source_locationt, allowing CBMC to figure out the
@@ -282,18 +286,6 @@ This is not the final form of the goto-functions, since the lists of
282286
instructions will be 'normalized' in the next step (Instrumentation),
283287
which removes some instructions and adds targets to others.
284288

285-
Note that goto_programt and goto_functionst are each template
286-
instantiations; they are currently the *only* specialization of
287-
goto_program_templatet and goto_functions_templatet, respectively. This
288-
means that the generated Doxygen documentation can be somewhat obtuse
289-
about the actual types of things, and is unable to generate links to the
290-
correct classes. Note that the
291-
\ref goto_programt::instructiont::code "code" member of a
292-
goto_programt's instruction has type \ref codet (its type in the
293-
goto_program_templatet documentation is given as "codeT", as this is the
294-
name of the template's type parameter); similarly, the type of a guard
295-
of an instruction is \ref guardt.
296-
297289
---
298290
\section instrumentation Instrumentation
299291

@@ -324,8 +316,15 @@ previous stage:
324316
are littered with \ref code_skipt "skip" statements. The
325317
instrumentation stage removes the majority of these.
326318

327-
* Function pointers are removed. They are turned into switch statements
328-
(but see the next point; switch statements are further transformed).
319+
* Variable lifespan implied by \ref code_declt instructions and lexical scopes
320+
described by \ref code_blockt nodes is replaced by `DECL` and corresponding
321+
`DEAD` instructions. There are therefore no lexical scopes in GOTO programs
322+
(not even local variable death on function exit is enforced).
323+
324+
* Expressions with side-effects are explicitly ordered so that there is one
325+
effect per instruction (apart from function call instructions, which can
326+
still have many). For example, `y = f() + x++` will have become something like
327+
`tmp1 = f(); y = tmp1 + x; x = x + 1;`
329328

330329
* Compound blocks are eliminated. There are several subclasses of
331330
\ref codet that count as 'compound blocks;' therefore, later stages in
@@ -362,13 +361,7 @@ previous stage:
362361
* \ref code_returnt "return statements" are transformed into
363362
(unconditional) GOTOs whose target is the \ref END_FUNCTION
364363
instruction. Each goto_programt should have precisely one such
365-
instruction. Note the presence of \ref code_deadt, which has a
366-
\ref code_deadt::symbol() "symbol()" member. Deads mark symbols that
367-
have just gone out of scope; typically, a GOTO that jumps to an
368-
END_FUNCTION instruction is preceded by a series of deads. Deads also
369-
follow sequences of instructions that were part of the body of a
370-
block (loop, conditional etc.) if there were symbols declared in that
371-
block.
364+
instruction.
372365

373366
This stage concludes the *analysis-independent* program transformations.
374367

0 commit comments

Comments
 (0)