@@ -225,10 +225,16 @@ abstract class DefImpl extends TDefImpl {
225
225
)
226
226
}
227
227
228
+ /**
229
+ * Holds if this definition is guaranteed to totally overwrite the
230
+ * destination buffer.
231
+ */
228
232
abstract predicate isCertain ( ) ;
229
233
234
+ /** Gets the value written to the destination variable by this definition. */
230
235
abstract Node0Impl getValue ( ) ;
231
236
237
+ /** Gets the operand that represents the address of this definition, if any. */
232
238
Operand getAddressOperand ( ) { none ( ) }
233
239
}
234
240
@@ -691,8 +697,10 @@ predicate outNodeHasAddressAndIndex(
691
697
*
692
698
* Holds if `node` is the node that corresponds to the definition of `def`.
693
699
*/
694
- predicate defToNode ( Node node , Def def , SourceVariable sv , IRBlock bb , int i , boolean uncertain ) {
695
- def .hasIndexInBlock ( bb , i , sv ) and
700
+ predicate defToNode (
701
+ Node node , DefinitionExt def , SourceVariable sv , IRBlock bb , int i , boolean uncertain
702
+ ) {
703
+ def .definesAt ( sv , bb , i , _) and
696
704
(
697
705
nodeHasOperand ( node , def .getValue ( ) .asOperand ( ) , def .getIndirectionIndex ( ) )
698
706
or
@@ -1057,7 +1065,7 @@ module SsaCached {
1057
1065
}
1058
1066
1059
1067
cached
1060
- Definition phiHasInputFromBlockExt ( PhiNode phi , IRBlock bb ) {
1068
+ DefinitionExt phiHasInputFromBlockExt ( PhiNode phi , IRBlock bb ) {
1061
1069
SsaImpl:: phiHasInputFromBlockExt ( phi , result , bb )
1062
1070
}
1063
1071
@@ -1071,157 +1079,24 @@ module SsaCached {
1071
1079
predicate variableWrite = SsaInput:: variableWrite / 4 ;
1072
1080
}
1073
1081
1074
- cached
1075
- private newtype TSsaDef =
1076
- TDef ( DefinitionExt def ) or
1077
- TPhi ( PhiNode phi )
1078
-
1079
- abstract private class SsaDef extends TSsaDef {
1080
- /** Gets a textual representation of this element. */
1081
- string toString ( ) { none ( ) }
1082
-
1083
- /** Gets the underlying non-phi definition or use. */
1084
- DefinitionExt asDef ( ) { none ( ) }
1085
-
1086
- /** Gets the underlying phi node. */
1087
- PhiNode asPhi ( ) { none ( ) }
1088
-
1089
- /** Gets the location of this element. */
1090
- abstract Location getLocation ( ) ;
1091
- }
1092
-
1093
- abstract class Def extends SsaDef , TDef {
1094
- DefinitionExt def ;
1095
-
1096
- Def ( ) { this = TDef ( def ) }
1097
-
1098
- final override DefinitionExt asDef ( ) { result = def }
1099
-
1100
- /** Gets the source variable underlying this SSA definition. */
1101
- final SourceVariable getSourceVariable ( ) { result = def .getSourceVariable ( ) }
1102
-
1103
- override string toString ( ) { result = def .toString ( ) }
1104
-
1105
- /**
1106
- * Holds if this definition (or use) has index `index` in block `block`,
1107
- * and is a definition (or use) of the variable `sv`.
1108
- */
1109
- predicate hasIndexInBlock ( IRBlock block , int index , SourceVariable sv ) {
1110
- def .definesAt ( sv , block , index , _)
1111
- }
1112
-
1113
- /** Gets the value written by this definition, if any. */
1114
- Node0Impl getValue ( ) { none ( ) }
1115
-
1116
- /**
1117
- * Holds if this definition is guaranteed to overwrite the entire
1118
- * destination's allocation.
1119
- */
1120
- abstract predicate isCertain ( ) ;
1121
-
1122
- /** Gets the address operand written to by this definition. */
1123
- Operand getAddressOperand ( ) { none ( ) }
1124
-
1125
- /** Gets the address written to by this definition. */
1126
- final Instruction getAddress ( ) { result = this .getAddressOperand ( ) .getDef ( ) }
1127
-
1128
- /** Gets the indirection index of this definition. */
1129
- abstract int getIndirectionIndex ( ) ;
1130
-
1131
- /**
1132
- * Gets the indirection level that this definition is writing to.
1133
- * For instance, `x = y` is a definition of `x` at indirection level 1 and
1134
- * `*x = y` is a definition of `x` at indirection level 2.
1135
- */
1136
- abstract int getIndirection ( ) ;
1137
-
1138
- /**
1139
- * Gets a definition that ultimately defines this SSA definition and is not
1140
- * itself a phi node.
1141
- */
1142
- Def getAnUltimateDefinition ( ) { result .asDef ( ) = def .getAnUltimateDefinition ( ) }
1143
- }
1144
-
1145
- private predicate isGlobal ( DefinitionExt def , GlobalDefImpl global ) {
1082
+ /** Gets the `DefImpl` corresponding to `def`. */
1083
+ private DefImpl getDefImpl ( SsaImpl:: DefinitionExt def ) {
1146
1084
exists ( SourceVariable sv , IRBlock bb , int i |
1147
1085
def .definesAt ( sv , bb , i , _) and
1148
- global .hasIndexInBlock ( bb , i , sv )
1086
+ result .hasIndexInBlock ( bb , i , sv )
1149
1087
)
1150
1088
}
1151
1089
1152
- private class NonGlobalDef extends Def {
1153
- NonGlobalDef ( ) { not isGlobal ( def , _) }
1154
-
1155
- final override Location getLocation ( ) { result = this .getImpl ( ) .getLocation ( ) }
1156
-
1157
- private DefImpl getImpl ( ) {
1158
- exists ( SourceVariable sv , IRBlock bb , int i |
1159
- this .hasIndexInBlock ( bb , i , sv ) and
1160
- result .hasIndexInBlock ( bb , i , sv )
1161
- )
1162
- }
1163
-
1164
- override Node0Impl getValue ( ) { result = this .getImpl ( ) .getValue ( ) }
1165
-
1166
- override predicate isCertain ( ) { this .getImpl ( ) .isCertain ( ) }
1090
+ class GlobalDef extends DefinitionExt {
1091
+ GlobalDefImpl impl ;
1167
1092
1168
- override Operand getAddressOperand ( ) { result = this .getImpl ( ) .getAddressOperand ( ) }
1169
-
1170
- override int getIndirectionIndex ( ) { result = this .getImpl ( ) .getIndirectionIndex ( ) }
1171
-
1172
- override int getIndirection ( ) { result = this .getImpl ( ) .getIndirection ( ) }
1173
- }
1174
-
1175
- class GlobalDef extends Def {
1176
- GlobalDefImpl global ;
1177
-
1178
- GlobalDef ( ) { isGlobal ( def , global ) }
1179
-
1180
- /** Gets a textual representation of this definition. */
1181
- override string toString ( ) { result = global .toString ( ) }
1182
-
1183
- final override Location getLocation ( ) { result = global .getLocation ( ) }
1184
-
1185
- /**
1186
- * Gets the type of this definition after specifiers have been deeply stripped
1187
- * and typedefs have been resolved.
1188
- */
1189
- DataFlowType getUnspecifiedType ( ) { result = global .getUnspecifiedType ( ) }
1093
+ GlobalDef ( ) { impl = getDefImpl ( this ) }
1190
1094
1191
1095
/**
1192
- * Gets the type of this definition, after typedefs have been resolved.
1096
+ * Gets the global (or `static` local) variable written to by this SSA
1097
+ * definition.
1193
1098
*/
1194
- DataFlowType getUnderlyingType ( ) { result = global .getUnderlyingType ( ) }
1195
-
1196
- /** Gets the `IRFunction` whose body is evaluated after this definition. */
1197
- IRFunction getIRFunction ( ) { result = global .getIRFunction ( ) }
1198
-
1199
- /** Gets the global variable associated with this definition. */
1200
- GlobalLikeVariable getVariable ( ) { result = global .getVariable ( ) }
1201
-
1202
- override predicate isCertain ( ) { any ( ) }
1203
-
1204
- final override int getIndirectionIndex ( ) { result = global .getIndirectionIndex ( ) }
1205
-
1206
- final override int getIndirection ( ) { result = global .getIndirection ( ) }
1207
- }
1208
-
1209
- class Phi extends TPhi , SsaDef {
1210
- PhiNode phi ;
1211
-
1212
- Phi ( ) { this = TPhi ( phi ) }
1213
-
1214
- final override PhiNode asPhi ( ) { result = phi }
1215
-
1216
- final override Location getLocation ( ) { result = phi .getBasicBlock ( ) .getLocation ( ) }
1217
-
1218
- override string toString ( ) { result = phi .toString ( ) }
1219
-
1220
- SsaPhiInputNode getNode ( IRBlock block ) { result .getPhiNode ( ) = phi and result .getBlock ( ) = block }
1221
-
1222
- predicate hasInputFromBlock ( Definition inp , IRBlock bb ) { inp = phiHasInputFromBlockExt ( phi , bb ) }
1223
-
1224
- final Definition getAnInput ( ) { this .hasInputFromBlock ( result , _) }
1099
+ GlobalLikeVariable getVariable ( ) { result = impl .getVariable ( ) }
1225
1100
}
1226
1101
1227
1102
private module SsaImpl = SsaImplCommon:: Make< Location , SsaInput > ;
@@ -1259,12 +1134,12 @@ class PhiNode extends SsaImpl::DefinitionExt {
1259
1134
}
1260
1135
1261
1136
/** Gets a definition that is an input to this phi node. */
1262
- final Definition getAnInput ( ) { this .hasInputFromBlock ( result , _, _, _, _) }
1137
+ final DefinitionExt getAnInput ( ) { this .hasInputFromBlock ( result , _, _, _, _) }
1263
1138
}
1264
1139
1265
1140
/** An static single assignment (SSA) definition. */
1266
1141
class DefinitionExt extends SsaImpl:: DefinitionExt {
1267
- private Definition getAPhiInputOrPriorDefinition ( ) { result = this .( PhiNode ) .getAnInput ( ) }
1142
+ private DefinitionExt getAPhiInputOrPriorDefinition ( ) { result = this .( PhiNode ) .getAnInput ( ) }
1268
1143
1269
1144
/**
1270
1145
* Gets a definition that ultimately defines this SSA definition and is
@@ -1275,6 +1150,37 @@ class DefinitionExt extends SsaImpl::DefinitionExt {
1275
1150
not result instanceof PhiNode
1276
1151
}
1277
1152
1153
+ /**
1154
+ * INTERNAL: Do not use.
1155
+ */
1156
+ Node0Impl getValue ( ) { result = getDefImpl ( this ) .getValue ( ) }
1157
+
1158
+ /** Gets the indirection index of this definition. */
1159
+ int getIndirectionIndex ( ) { result = getDefImpl ( this ) .getIndirectionIndex ( ) }
1160
+
1161
+ /** Gets the indirection of this definition. */
1162
+ int getIndirection ( ) { result = getDefImpl ( this ) .getIndirection ( ) }
1163
+
1164
+ /**
1165
+ * Holds if this definition is guaranteed to totally overwrite the buffer
1166
+ * being written to.
1167
+ */
1168
+ predicate isCertain ( ) { getDefImpl ( this ) .isCertain ( ) }
1169
+
1170
+ /**
1171
+ * Gets the enclosing declaration of this definition.
1172
+ *
1173
+ * Note that this may be a variable when this definition defines a global, or
1174
+ * a static local, variable.
1175
+ */
1176
+ Declaration getFunction ( ) { result = getDefImpl ( this ) .getBlock ( ) .getEnclosingFunction ( ) }
1177
+
1178
+ /** Gets the underlying type of the variable being defined by this definition. */
1179
+ Type getUnderlyingType ( ) { result = this .getSourceVariable ( ) .getType ( ) }
1180
+
1181
+ /** Gets the unspecified type of the variable being defined by this definition. */
1182
+ Type getUnspecifiedType ( ) { result = this .getUnderlyingType ( ) .getUnspecifiedType ( ) }
1183
+
1278
1184
/** Gets a node that represents a read of this SSA definition. */
1279
1185
pragma [ nomagic]
1280
1186
Node getARead ( ) {
@@ -1286,6 +1192,4 @@ class DefinitionExt extends SsaImpl::DefinitionExt {
1286
1192
}
1287
1193
}
1288
1194
1289
- class Definition = SsaImpl:: Definition ;
1290
-
1291
1195
import SsaCached
0 commit comments