Check in some design documents to centralize ideas around region store and the
analysis engine. llvm-svn: 67747
This commit is contained in:
parent
6568eef9f9
commit
2d44866316
|
|
@ -0,0 +1,53 @@
|
||||||
|
Symbolic Region
|
||||||
|
|
||||||
|
A symbolic region is a map of the concept of symbolic values into the domain of
|
||||||
|
regions. It is the way that we represent symbolic pointers. Whenever a symbolic
|
||||||
|
pointer value is needed, a symbolic region is created to represent it.
|
||||||
|
|
||||||
|
A symbolic region has no type. It wraps a SymbolData. But sometimes we have type
|
||||||
|
information associated with a symbolic region. For this case, a TypedViewRegion
|
||||||
|
is created to layer the type information on top of the symbolic region. The
|
||||||
|
reason we do not carry type information with the symbolic region is that
|
||||||
|
the symbolic regions can have no type. To be consistent, we don't let them to
|
||||||
|
carry type information.
|
||||||
|
|
||||||
|
Like a symbolic pointer, a symbolic region may be NULL, has unknown extent, and
|
||||||
|
represents a generic chunk of memory.
|
||||||
|
|
||||||
|
We plan not to use loc::SymbolVal in RegionStore and remove it gradually.
|
||||||
|
|
||||||
|
Pointer Casts
|
||||||
|
|
||||||
|
Pointer casts allow people to impose different 'views' onto a chunk of memory.
|
||||||
|
|
||||||
|
Usually we have two kinds of casts. One kind of casts cast down with in the type
|
||||||
|
hierarchy. It imposes more specific views onto more generic memory regions. The
|
||||||
|
other kind of casts cast up with in the type hierarchy. It strips away more
|
||||||
|
specific views on top of the more generic memory regions.
|
||||||
|
|
||||||
|
We simulate the down casts by layering another TypedViewRegion on top of the
|
||||||
|
original region. We simulate the up casts by striping away the top
|
||||||
|
TypedViewRegion. Down casts is usually simple. For up casts, if the there is no
|
||||||
|
TypedViewRegion to be stripped, we return the original region. If the underlying
|
||||||
|
region is of the different type than the cast-to type, we flag an error state.
|
||||||
|
|
||||||
|
For toll-free bridging casts, we return the original region.
|
||||||
|
|
||||||
|
Region Bindings
|
||||||
|
|
||||||
|
The following region kinds are boundable: VarRegion, CompoundLiteralRegion,
|
||||||
|
StringRegion, ElementRegion, FieldRegion, and ObjCIvarRegion.
|
||||||
|
|
||||||
|
When binding regions, we perform canonicalization on element regions and field
|
||||||
|
regions. This is because we can have different views on the same region, some of
|
||||||
|
which are essentially the same view with different sugar type names.
|
||||||
|
|
||||||
|
To canonicalize a region, we get the canonical types for all TypedViewRegions
|
||||||
|
along the way up to the root region, and make new TypedViewRegions with those
|
||||||
|
canonical types.
|
||||||
|
|
||||||
|
All bindings and retrievings are done on the canonicalized regions.
|
||||||
|
|
||||||
|
Canonicalization is transparent outside the region store manager, and more
|
||||||
|
specifically, unaware outside the Bind() and Retrieve() method. We don't need to
|
||||||
|
consider region canonicalization when doing pointer cast.
|
||||||
Loading…
Reference in New Issue