blob: f4887cd935e0b38760715f13c454877ce9a9edc0 [file] [log] [blame]
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.