@@ -15,6 +15,7 @@ import lang::jimple::util::Stack;
1515import lang ::jimple ::toolkit ::FlowGraph ;
1616import lang ::jimple ::core ::Syntax ;
1717import lang ::jimple ::toolkit ::ssa ::DominanceTree ;
18+ import lang ::jimple ::toolkit ::ssa ::Helpers ;
1819
1920map [str , Stack [int ]] VARIABLE_VERSION_STACK = ();
2021map [str , int ] VARIABLE_ASSIGNMENT_COUNT = ();
@@ -50,8 +51,8 @@ public map[Node, list[Node]] replace(Node X) {
5051
5152 // Deal with all nodes that aren't assigments bug uses a variable in some way
5253 if (isNonAssignmentStatementToRename (X )) {
53- stmtNode ( statement ) = X ;
54- Node renamedStatement = stmtNode (replaceImmediateUse (statement ));
54+ statementBody = returnStmtNodeBody ( X ) ;
55+ Node renamedStatement = stmtNode (replaceImmediateUse (statementBody ));
5556 renameNodeOcurrecies (X , renamedStatement );
5657 X = renamedStatement ;
5758 };
@@ -60,7 +61,7 @@ public map[Node, list[Node]] replace(Node X) {
6061 if (isOrdinaryAssignment (X ) && !isRenamed (X )) {
6162
6263 // Replace right hand side variables
63- list [Immediate ] rightHandNodeImmediates = getRightHandSideImmediates (X );
64+ list [Immediate ] rightHandNodeImmediates = returnRightHandSideImmediates (X );
6465 for (rightHandSideImmediate <- rightHandNodeImmediates ) {
6566 newAssignStmt = replaceRightVariableVersion (ADJACENCIES_MATRIX , rightHandSideImmediate , X );
6667
@@ -71,7 +72,7 @@ public map[Node, list[Node]] replace(Node X) {
7172
7273 // Replace left hand side variables
7374 if (isLeftHandSideVariable (X )) {
74- Variable V = getStmtVariable (X );
75+ Variable V = returnStmtVariable (X );
7576 Immediate localVariableImmediate = local (V [0 ]);
7677
7778 int assingmentQuantity = returnAssignmentQuantity (localVariableImmediate );
@@ -101,7 +102,7 @@ public map[Node, list[Node]] replace(Node X) {
101102}
102103
103104public void findAndAddPhiFunctionArgs (Node oldNode , Node newNode ) {
104- Variable variable = getStmtVariable (oldNode );
105+ Variable variable = returnStmtVariable (oldNode );
105106 variableName = variable [0 ];
106107 dfsPhiFunctionLookupAndRename (newNode , newNode , variableName );
107108}
@@ -157,7 +158,7 @@ public map[Node, list[Node]] replaceNodeOcurrenciesInTrees(map[Node, list[Node]]
157158}
158159
159160public Statement replaceImmediateUse (Statement statement ) {
160- return return addEnclosingStmt (statement , replaceImmediateUse (statement [0 ]));
161+ return addEnclosingStmt (statement , replaceImmediateUse (statement [0 ]));
161162}
162163
163164public Statement addEnclosingStmt (Statement statement , Expression expression ) {
@@ -192,7 +193,7 @@ public Expression replaceImmediateUse(Expression expression) {
192193
193194public Name returnLastVariableVersion (str name ) {
194195 Immediate immediate = local (name );
195- variableName = getVariableImmediateName (immediate );
196+ variableName = returnVariableImmediateName (immediate );
196197
197198 int versionIndex = getVariableVersionStacked (immediate );
198199 str newVariableName = buildVersionName (variableName , versionIndex );
@@ -216,7 +217,7 @@ public bool isSkipableStatement(stmtArgument) {
216217}
217218
218219public Node replacePhiFunctionVersion (map [Node , list [Node ]] blockTree , Node variableNode ) {
219- stmtNode ( assignStatement ) = variableNode ;
220+ assignStatement = returnStmtNodeBody ( variableNode );
220221 assign (assignVariable , assignPhiFunction ) = assignStatement ;
221222 phiFunction (phiFunctionVariable , variableVersionList ) = assignPhiFunction ;
222223 variableName = phiFunctionVariable [0 ];
@@ -257,7 +258,7 @@ public Expression renameExpressionVariables(Expression expression, Immediate imm
257258 return arraySubscript (newVersionName , local (returnCurrentVersionName (local (localName ))));
258259 };
259260
260- list [Immediate ] immediates = getExpressionImmediates (expression );
261+ list [Immediate ] immediates = returnExpressionImmediates (expression );
261262 int index = indexOf (immediates , immediateToRename );
262263 expression [index ] = local (newVersionName );
263264
@@ -266,7 +267,7 @@ public Expression renameExpressionVariables(Expression expression, Immediate imm
266267
267268public String returnCurrentVersionName (Immediate immediate ) {
268269 int variableVersion = getVariableVersionStacked (immediate );
269- String variableOriginalName = getImmediateName (immediate );
270+ String variableOriginalName = returnImmediateName (immediate );
270271 return buildVersionName (variableOriginalName , variableVersion );
271272}
272273
@@ -285,18 +286,6 @@ public str buildVersionName(str variableOriginalName, int versionIndex) {
285286 return variableOriginalName + "_version-" + toString (versionIndex );
286287}
287288
288- public String getVariableName (Variable variable ) {
289- switch (variable [0 ]) {
290- case String variableName : return variableName ;
291- }
292- }
293-
294- public String getImmediateName (Immediate immediate ) {
295- switch (immediate [0 ]) {
296- case String immediateName : return immediateName ;
297- }
298- }
299-
300289public bool isLeftHandSideVariable (Node variableNode ) {
301290 switch (variableNode ) {
302291 case stmtNode (assign (localVariable (_), _)): return true ;
@@ -305,21 +294,6 @@ public bool isLeftHandSideVariable(Node variableNode) {
305294 }
306295}
307296
308- public list [Immediate ] getRightHandSideImmediates (Node variableNode ) {
309- rightHandSide = returnRightHandSideExpression (variableNode );
310- typeOfVariableArg = typeOf (rightHandSide );
311-
312- if (typeOfVariableArg .name != "Expression" ) return [];
313-
314- list [Immediate ] immediates = getExpressionImmediates (rightHandSide );
315- list [Immediate ] localVariableImmediates = [ immediate | immediate <- immediates , getVariableImmediateName (immediate ) != "" ];
316- int variablesCount = size (localVariableImmediates );
317-
318- if (variablesCount != 0 ) return localVariableImmediates ;
319-
320- return [];
321- }
322-
323297public bool ignoreNode (Node variableNode ) {
324298 switch (variableNode ) {
325299 case entryNode (): return true ;
@@ -357,15 +331,6 @@ public bool isPhiFunctionAssigment(Node variableNode) {
357331 }
358332}
359333
360- public Variable getStmtVariable (Node graphNode ) {
361- stmtNode (assignStatement ) = graphNode ;
362- variableArg = assignStatement [0 ];
363-
364- switch (variableArg ) {
365- case Variable variable : return variable ;
366- }
367- }
368-
369334public bool isVariable (Node graphNode ) {
370335 if (size (graphNode [..]) == 0 ) return false ;
371336
@@ -390,71 +355,12 @@ public bool isSameVariable(Node graphNode, Variable variable) {
390355 return variableArg == variable ;
391356}
392357
393- public list [Immediate ] getExpressionImmediates (Expression expression ) {
394- switch (expression ) {
395- case newInstance (Type instanceType ): return [];
396- case newArray (Type baseType , list [ArrayDescriptor ] dims ): return [];
397- case cast (Type toType , local (name )): return [];
398- case instanceOf (Type baseType , local (name )): return [local (name )];
399- case invokeExp (_): return [];
400- case arraySubscript (Name arrayName , _): return [local (arrayName )];
401- case stringSubscript (String stringName , local (name )): return [local (stringName )];
402- case localFieldRef (Name local , Name className , Type fieldType , Name fieldName ): return [];
403- case fieldRef (Name className , Type fieldType , Name fieldName ): return [];
404- case and (lhs , rhs ): return [lhs , rhs ];
405- case or (lhs , rhs ): return [lhs , rhs ];
406- case xor (lhs , rhs ): return [lhs , rhs ];
407- case reminder (lhs , rhs ): return [lhs , rhs ];
408- case isNull (variable ): return [variable ];
409- case isNotNull (variable ): return [variable ];
410- case cmp (lhs , rhs ): return [lhs , rhs ];
411- case cmpg (lhs , rhs ): return [lhs , rhs ];
412- case cmpl (lhs , rhs ): return [lhs , rhs ];
413- case cmpeq (lhs , rhs ): return [lhs , rhs ];
414- case cmpne (lhs , rhs ): return [lhs , rhs ];
415- case cmpgt (lhs , rhs ): return [lhs , rhs ];
416- case cmpge (lhs , rhs ): return [lhs , rhs ];
417- case cmplt (lhs , rhs ): return [lhs , rhs ];
418- case cmple (lhs , rhs ): return [lhs , rhs ];
419- case shl (lhs , rhs ): return [lhs , rhs ];
420- case shr (lhs , rhs ): return [lhs , rhs ];
421- case ushr (lhs , rhs ): return [lhs , rhs ];
422- case plus (lhs , rhs ): return [lhs , rhs ];
423- case minus (lhs , rhs ): return [lhs , rhs ];
424- case mult (lhs , rhs ): return [lhs , rhs ];
425- case div (lhs , rhs ): return [lhs , rhs ];
426- case lengthOf (local (name )): return [local (name )];
427- case neg (local (name )): return [local (name )];
428- case immediate (local (name )): return [local (name )];
429- default : return [];
430- }
431- }
432-
433- public Variable returnLeftHandSideVariable (Node stmtNode ) {
434- switch (stmtNode ) {
435- case stmtNode (assign (leftHandSide , _)): return leftHandSide ;
436- }
437- }
438-
439- public Expression returnRightHandSideExpression (Node stmtNode ) {
440- switch (stmtNode ) {
441- case stmtNode (assign (_, rightHandSide )): return rightHandSide ;
442- }
443- }
444-
445358public bool isNonAssignmentStatementToRename (Node graphNode ) {
446359 return !isReplaced (graphNode ) && !isOrdinaryAssignment (graphNode ) && !ignoreNode (graphNode ) && !isPhiFunctionAssigment (graphNode );
447360}
448361
449- public String getVariableImmediateName (Immediate immediate ) {
450- switch (immediate ) {
451- case local (String localName ): return localName ;
452- default : return "" ;
453- }
454- }
455-
456362public int returnAssignmentQuantity (Immediate immediate ) {
457- str name = getVariableImmediateName (immediate );
363+ str name = returnVariableImmediateName (immediate );
458364
459365 if (name in VARIABLE_ASSIGNMENT_COUNT ) return VARIABLE_ASSIGNMENT_COUNT [name ];
460366
@@ -463,23 +369,23 @@ public int returnAssignmentQuantity(Immediate immediate) {
463369}
464370
465371public int iterateAssignmentQuantity (Immediate immediate ) {
466- str name = getVariableImmediateName (immediate );
372+ str name = returnVariableImmediateName (immediate );
467373
468374 VARIABLE_ASSIGNMENT_COUNT [name ] = VARIABLE_ASSIGNMENT_COUNT [name ] + 1 ;
469375
470376 return VARIABLE_ASSIGNMENT_COUNT [name ];
471377}
472378
473379public str stackVariableVersion (Immediate immediate , int renameIndex ) {
474- str name = getVariableImmediateName (immediate );
380+ str name = returnVariableImmediateName (immediate );
475381
476382 VARIABLE_VERSION_STACK [name ] = name in VARIABLE_VERSION_STACK ? push (renameIndex , VARIABLE_VERSION_STACK [name ]) : push (0 , emptyStack ());
477383
478384 return name ;
479385}
480386
481387public int getVariableVersionStacked (Immediate immediate ) {
482- str name = getVariableImmediateName (immediate );
388+ str name = returnVariableImmediateName (immediate );
483389
484390 if (name in VARIABLE_VERSION_STACK ) return peekIntValue (VARIABLE_VERSION_STACK [name ]);
485391
@@ -488,10 +394,10 @@ public int getVariableVersionStacked(Immediate immediate) {
488394}
489395
490396public Stack [int ] popOldNode (Node oldNode ) {
491- Variable V = getStmtVariable (oldNode );
397+ Variable V = returnStmtVariable (oldNode );
492398 Immediate localVariableImmediate = local (V [0 ]);
493399
494- str name = getVariableImmediateName (localVariableImmediate );
400+ str name = returnVariableImmediateName (localVariableImmediate );
495401 newStackTuple = pop (VARIABLE_VERSION_STACK [name ])[1 ];
496402 VARIABLE_VERSION_STACK [name ] = newStackTuple ;
497403
0 commit comments