Explicitly walk pointer types

In a previous draft these could use getBaseType*
This commit is contained in:
Chris Smowton
2021-03-16 22:01:51 +00:00
committed by Owen Mansel-Chan
parent 660ba4e31c
commit 9a427931b7
3 changed files with 18 additions and 7 deletions

View File

@@ -379,7 +379,10 @@ class StructType extends @structtype, CompositeType {
* hasEmbeddedField holds if there is an embedded field at int `depth`, with either type `tp` or `tp`'s pointer type.
*/
private predicate hasEmbeddedField(Type tp, int depth) {
exists(Field f | this.hasFieldCand(_, f, depth, true) | tp = f.getType().getBaseType*())
exists(Field f | this.hasFieldCand(_, f, depth, true) |
tp = f.getType() or
tp = f.getType().(PointerType).getBaseType()
)
}
/**
@@ -389,8 +392,10 @@ class StructType extends @structtype, CompositeType {
// embeddedParent is a field of 'this' at depth 'depth - 1'
this.hasFieldCand(_, embeddedParent, depth - 1, true) and
// embeddedParent's type has the result field
exists(StructType embeddedType |
embeddedType = embeddedParent.getType().getBaseType*().getUnderlyingType()
exists(StructType embeddedType, Type fieldType |
fieldType = embeddedParent.getType().getUnderlyingType() and
pragma[only_bind_into](embeddedType) =
[fieldType, fieldType.(PointerType).getBaseType().getUnderlyingType()]
|
result = embeddedType.getOwnField(name, isEmbedded)
)

View File

@@ -48,8 +48,11 @@ private predicate isCond(Expr e) {
e = any(ParenExpr par | isCond(par)).getExpr()
}
private Type getSelectedStructType(PromotedFieldSelector e) {
pragma[only_bind_into](result) = e.getBase().getType().getBaseType*().getUnderlyingType()
private StructType getSelectedStructType(PromotedFieldSelector e) {
exists(Type baseType | baseType = e.getBase().getType().getUnderlyingType() |
pragma[only_bind_into](result) =
[baseType, baseType.(PointerType).getBaseType().getUnderlyingType()]
)
}
private predicate implicitFieldSelection(PromotedFieldSelector e, int i, Field implicitField) {

View File

@@ -279,8 +279,11 @@ module IR {
PromotedFieldSelector() { this.refersTo(any(PromotedField f)) }
}
private Type getSelectedStructType(PromotedFieldSelector e) {
pragma[only_bind_into](result) = e.getBase().getType().getBaseType*().getUnderlyingType()
private StructType getSelectedStructType(PromotedFieldSelector e) {
exists(Type baseType | baseType = e.getBase().getType().getUnderlyingType() |
pragma[only_bind_into](result) =
[baseType, baseType.(PointerType).getBaseType().getUnderlyingType()]
)
}
private Instruction promotedFieldSelectorBase(PromotedFieldSelector se, Field field) {