-
Notifications
You must be signed in to change notification settings - Fork 1
/
MANIFEST
331 lines (263 loc) · 12.8 KB
/
MANIFEST
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
This file describes each file in the c-parser directory
Absyn-CType.ML, Absyn-Expr.ML, Absyn-StmtDecl.ML, Absyn.ML
Code implementing an "abstract syntax" for C programs, along with a
few functions for performing simple analyses of that syntax. For
example, there is a (polymorphic) type 'a ctype that corresponds to
the possible types in a C program. For example, Signed Int is a
ctype, as is Pointer Void. The ctype is polymorphic because the
result of parsing an array results in a constant expression being
used as the size of the array. For example
int array[1 << SOME_CONST];
The parser is not capable of calculating the value of this constant,
so the abstract syntax it produces is an expr ctype. Later, when
the technology is in place to evaluate constant expressions, the
expression will turn into a number, and the value will be of type
int ctype.
Absyn-Serial.ML
Serialisation for all of the AST types from the other Absyn*.
basics.ML
Some declarations of useful functions, mostly bound up in the
L4Basics structure. Some of these depend on the standard Isabelle
library. For this reason, the standalone-parser code has its own
version of this file.
Binaryset.ML
An implementation of an ordered set with a binary tree. Ultimately
from the SML/NJ library (via Moscow ML in this case).
calculate_state.ML
Responsible for making the Isabelle type declarations to set up the
program state in the Hoare environment. For example, if the C
program declares a struct-type, there has to be a corresponding type
available in the Hoare environment. Declaring such a type is
ultimately an operation on Isabelle theories. Additionally, all
non-basic types (arrays, and structs), have to be shown to be "mem
types" (our basic axiomatic type class). This module is responsible
for making the calls to the proof routines for doing this.
complit.ML
Code for analysing compound literal expressions and initialisors.
These are inordinately complicated because of the way it is
permitted to switch from "labelled" mode, where you write things
like
(struct foo){.fld = 3, ...}
into specifying things in order of layout. Thus:
(struct foo){.fld = 3, 4, 5, 6}
will stick 4, 5 and 6 into the fields following fld. This doesn't
respect hierarchical boundaries either, so that if you have
struct foo { int fld1, fld2; };
struct bar { char c; struct foo f; int z; };
It's legitimate to write
struct bar b = {.f.fld2 = 3, 4};
with the result being that b's z field gets value 4.
CProof.thy
The first Isabelle theory with a connection to the c-parser. Some
print translations, some theorems, and declarations of the
"exception" (Break, Return and Continue) and "guard" (Div_0,
ArrayBounds etc) types.
CTranslation.thy
The master theory for the c-parser. Uses all the necessary ML code,
references the appropriate ancestor theories, including CProof.
Includes a couple of random theorems.
doc/
Contains an as-yet incomplete detailed description of the
translation process.
expression_translation.ML
Code handling the translation of expressions in the C abstract
syntax into Isabelle expressions. These expressions are encapsulated in
the expr_info (for which see the comment at the top of the file).
C expressions have to turn into Isabelle terms of type ``:state ->
value_type``, where value_types depend on the form of the
expression.
expression_typing.ML
Code to assign types to C expressions. Most uses go via the
cse_typing function of the ProgramAnalysis module.
Feedback.ML
Simple routines for emitting feedback to the user as translation is
performed. There is a reference variable verbosity_level, which
controls the degree to which output is produced. This use of a
reference is bad style, and will probably get fixed.
FunctionalRecordUpdate.ML
Implementation, from the mlton.org website, of a method for
generating functional record updates within core SML. Works well,
even though it's completely incomprehensible.
General.ML
Adjusts the standard "top-level" Isabelle/ML environment to look a
little more like the Basis-specified SML top-level.
globalmakevars
For inclusion in Makefiles. This file specifies defaults for some
standard Make variables.
heapstatetype.ML
Code that proves a record of global variables is indeed an instance
of the typeclass SepFrame.heap_state_type
Simpl/
Directory containing a version of Norbert Schirmer's SIMPL-based VCG
environment. We use record-based states rather than Schirmer's
statespace approach.
HPInter.ML
Code controlling the translation of a series of functions into the
VCG environment. This code sets up the various locales and calls
the translation function in stmt_translation. It also manages the
automatic proofs that functions only modify certain elements of the
global state.
hp_termstypes.ML
ML bindings for creating and taking apart Isabelle terms and types.
This module includes terms and types that are specific to Schirmer's
"Hoare Package", hence the "hp" prefix.
INSTALL
Installation instructions, mainly on how to invoke isabelle make.
IsaMakefile
The top-level IsaMakefile for this code. It recursively includes
makefiles for building versions of ml-yacc and ml-lex, as well as
the L4 word extensions.
isar_install.ML
The top-level SML code, implementing the Isar command
"install_C_file" with its various options, and coordinating the
calls to the lower level functions. The basic flow is
1. parse C file (StrictCParser.ML)
2. do "program analysis" (program_analysis.ML)
3. Isabelle declarations for file's types (calculate_state.ML)
4. make declarations for functions (HPInter.ML)
isa_termstypes.ML
ML bindings for creating and taking apart Isabelle terms and types.
This module includes terms and types for core Isabelle.
StrictC.grm
ml-yacc grammar for our subset of C. ml-yacc generates
StrictC.grm.{desc,sig,sml} files when run on this.
StrictC.lex
ml-lex file for C tokens. ml-lex generates StrictC.lex.sml. There is
considerable complexity in handling the standard ambiguity between
type-names (as introduced by typedef) and normal identifiers. This
is more complicated than usual because of the desire to keep the
ml-yacc grammar side-effect free in its effects. This enables the
%pure annotation in StrictC.grm, and nice error reports for parse
errors.
StrictCParser.ML
This includes the standard functor-heavy ml-lex/ml-yacc boilerplate
for producing a parser out of the products of ml-lex and ml-yacc.
recursive_records/
A directory containing a bare-bones implementation of a record
package suitable for modelling C structs. In particular, C structs
can be mutually recursive (as long as the recursion is via a pointer
type of course). The standard Isabelle record package does not
allow this, so we use this package instead.
MANIFEST
This file. Recursion, whee!
MemoryModelExtras.ML
The standard instantiation of the signature in
MemoryModelExtras-sig.ML. This instantiation sets up new types in
accordance with the Isabelle theories in the umm_heap directory.
MemoryModelExtras-sig.ML
A specification of the interface that a memory model implementation
must provide. The translation process is supposed to be agnostic
about the way in which values are laid out in the heap, rather
making calls to appropriate functions as necessary. The comments in
this file detail the necessary functionality.
MLton-LICENSE
A copy of the MLton source-code license (BSDish). We use MLton
derived source code in Region.ML, SourceFile.ML and SourcePos.ML
modifies_proofs.ML
Code for automatically proving that functions do only modify the
globals that the ProgramAnalysis claims.
name_generation.ML
Code designed to collect up all those places where translation has
to generate names for various forms of entity. For example,
translation has to create Isabelle types corresponding to structs.
This module embodies the decision that such types should have the
same name with a _C appended.
openUnsynch.ML
A source file that does "open Unsynchronized" at the top-level.
This gives subsequent Isabelle/ML code access to the reference type
constructor "ref", which is otherwise inaccessible.
PackedTypes.thy
A theory about "packed types", i.e. those structs that do not have
any padding.
PrettyProgs.thy
Isabelle syntax to make C/SIMPL programs print prettily.
program_analysis.ML
A module for performing the most important analyses over C source
code. The results of most of these are stored in the csenv ("C
state environment") type. A value of this type is produced through
the call process_decls. It can then be queried in a number of
different ways.
Region.ML
Code from the MLton compiler for representing regions of text in a
source-file. Important for the production of good error messages.
RegionExtras.ML
Some extra code for combining region/position information with
abstract syntax trees.
smlnj-license.ML
A copy of the (BSD-ish) copyright notice for SML/NJ code. SML/NJ is
the source of the Binaryset.ML code.
SourceFile.ML, SourcePos.ML
Files from the MLton compiler implementing the notion of positions
within source-files. Used by Region.ML
standalone-parser/
Directory containing code implementing a "standalone" parser for our
C subset. In its default mode, the parser just checks that code is
syntactically OK. It can also be asked to report on various of the
analyses performed by program_analysis.ML. This parser uses a
substantial amount of code from the c-parser directory, pretty well
all that which is not Isabelle specific.
static-fun.ML, StaticFun.thy
Used to create a balanced binary tree mapping function identifiers
to their bodies. This is used in HPInter.ML to create the
characterisation of the \<Gamma> variable that is part of the
standard VCG environment locale.
stmt_translation.ML
Used to turn C statement values (of type Absyn.stmt) into statements
of Schirmer's Hoare package. Calls out to the
expression_translation.ML code as necessary. Function calls are
handled here because they are statement forms in our dialect.
syntax_transforms.ML
Implementation of two important transformations on abstract syntax:
expansion of typedefs and removal of embedded function calls.
Handling embedded function calls is more complicated because it can
call for the creation of new (local) variables in which to store the
results of function calls.
Target-ARM32.ML
Implementation numbers (principally type sizes, but also the
signedness of the char type) for 32-bit ARM targets (char is unsigned;
chars are 8 bits wide, shorts are 16 bit, ints and longs are 32 bit,
and long longs are 64 bits. Strictly speaking this is not just a
function of the architecture but the compiler as well.
Target-generic32.ML
Implementation numbers for a "generic" 32 bit architecture. For the
moment, this is the same as ARM32 except that char is signed.
TargetNumbers-sig.ML
A signature specifying the values that a Target file should provide
to describe an architecture's important values.
termstypes.ML
ML bindings for creating and taking apart Isabelle terms and types.
This module combines other termstypes modules
(isa_termstypes and hp_termstypes), and adds in code that is core to
the translation, such as manipulations for creating terms of UMM
pointer types. It also includes an IntInfo substructure for
dealing with Isabelle-analogues of C's various integral types. This
latter builds on numbers in the appropriate TargetNumbers module.
(This dependency could be expressed with a functor, but isn't.)
termstypes-sig.ML
Specifies the interface that termstypes.ML must export.
testfiles/
Lots of regression tests. Most just check that an install_C_file
call succeeds. A theory file foo.thy checks that install_C_file
"foo.c" succeeds, and may also perform other tests, such as proving
simple theorems.
tools/
Implementations of ml-lex and ml-yacc that build into standalone
executables when using either Poly/ML or MLton.
topo_sort.ML
An implementation of Tarjan's algorithm for finding strongly
connected components, which also provides a topological sort of the
given graph.
umm_heap/
This directory contains the theories implementing the "unified
memory model". Most of this work is described in fair detail by
Harvey Tuch's PhD.
UMM_Proofs.ML
Code implementing automatic proofs that types (arrays, and structs)
are indeed in the relevant typeclasses.
UMM_termstypes.ML
ML bindings for creating and taking apart Isabelle terms and types.
The terms and types here are those specific to details of the code
in UMM_Proofs.ML and heapstatetype.ML
use.ML
The little ML script that arranges for CTranslation.thy to be loaded
when the vcg heap is built.