@@ -1071,157 +1071,12 @@ module SsaCached {
1071
1071
predicate variableWrite = SsaInput:: variableWrite / 4 ;
1072
1072
}
1073
1073
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 ) {
1146
- exists ( SourceVariable sv , IRBlock bb , int i |
1147
- def .definesAt ( sv , bb , i , _) and
1148
- global .hasIndexInBlock ( bb , i , sv )
1149
- )
1150
- }
1151
-
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 ( ) }
1167
-
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 ( ) }
1190
-
1191
- /**
1192
- * Gets the type of this definition, after typedefs have been resolved.
1193
- */
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 }
1074
+ class GlobalDef extends DefinitionExt {
1075
+ GlobalDefImpl impl ;
1221
1076
1222
- predicate hasInputFromBlock ( Definition inp , IRBlock bb ) { inp = phiHasInputFromBlockExt ( phi , bb ) }
1077
+ GlobalDef ( ) { impl = this . getImpl ( ) }
1223
1078
1224
- final Definition getAnInput ( ) { this . hasInputFromBlock ( result , _ ) }
1079
+ GlobalLikeVariable getVariable ( ) { result = impl . getVariable ( ) }
1225
1080
}
1226
1081
1227
1082
private module SsaImpl = SsaImplCommon:: Make< Location , SsaInput > ;
0 commit comments