94
94
import soot .dexpler .tags .DoubleOpTag ;
95
95
import soot .dexpler .tags .FloatOpTag ;
96
96
import soot .dexpler .typing .DalvikTyper ;
97
+ import soot .jimple .AddExpr ;
97
98
import soot .jimple .AssignStmt ;
98
99
import soot .jimple .BinopExpr ;
99
100
import soot .jimple .CastExpr ;
100
101
import soot .jimple .CaughtExceptionRef ;
101
102
import soot .jimple .ConditionExpr ;
102
103
import soot .jimple .Constant ;
103
104
import soot .jimple .DefinitionStmt ;
105
+ import soot .jimple .DivExpr ;
104
106
import soot .jimple .DoubleConstant ;
105
107
import soot .jimple .EqExpr ;
106
108
import soot .jimple .FloatConstant ;
109
111
import soot .jimple .Jimple ;
110
112
import soot .jimple .JimpleBody ;
111
113
import soot .jimple .LongConstant ;
114
+ import soot .jimple .MulExpr ;
112
115
import soot .jimple .NeExpr ;
113
116
import soot .jimple .NullConstant ;
114
117
import soot .jimple .NumericConstant ;
118
+ import soot .jimple .RemExpr ;
119
+ import soot .jimple .SubExpr ;
115
120
import soot .jimple .internal .JIdentityStmt ;
116
121
import soot .jimple .toolkits .base .Aggregator ;
117
122
import soot .jimple .toolkits .scalar .ConditionalBranchFolder ;
@@ -784,6 +789,8 @@ public Body jimplify(Body b, SootMethod m) {
784
789
UnconditionalBranchFolder .v ().transform (jBody );
785
790
}
786
791
DexFillArrayDataTransformer .v ().transform (jBody );
792
+ //SharedInitializationLocalSplitter destroys the inserted casts, so we have to reintroduce them
793
+ convertFloatsAndDoubles (b , jimple );
787
794
788
795
TypeAssigner .v ().transform (jBody );
789
796
@@ -1005,15 +1012,37 @@ public Body jimplify(Body b, SootMethod m) {
1005
1012
public void convertFloatsAndDoubles (Body b , final Jimple jimple ) {
1006
1013
UnitPatchingChain units = jBody .getUnits ();
1007
1014
Unit u = units .getFirst ();
1015
+ Local convResultFloat = null ;
1016
+ Local convResultDouble = null ;
1008
1017
Local [] convFloat = new Local [2 ], convDouble = new Local [2 ];
1009
-
1010
1018
while (u != null ) {
1011
1019
if (u instanceof AssignStmt ) {
1012
1020
AssignStmt def = (AssignStmt ) u ;
1013
1021
Value rop = def .getRightOp ();
1014
1022
if (rop instanceof BinopExpr ) {
1015
1023
boolean isDouble = u .hasTag (DoubleOpTag .NAME );
1016
1024
boolean isFloat = u .hasTag (FloatOpTag .NAME );
1025
+ if (rop instanceof AddExpr || rop instanceof SubExpr || rop instanceof MulExpr || rop instanceof DivExpr
1026
+ || rop instanceof RemExpr ) {
1027
+ if (isDouble ) {
1028
+ if (convResultDouble == null ) {
1029
+ convResultDouble = jimple .newLocal (freshLocalName ("lclConvToDouble" ), DoubleType .v ());
1030
+ b .getLocals ().add (convResultDouble );
1031
+ }
1032
+ Value prev = def .getLeftOp ();
1033
+ def .setLeftOp (convResultDouble );
1034
+ units .insertAfter (jimple .newAssignStmt (prev , jimple .newCastExpr (convResultDouble , DoubleType .v ())), u );
1035
+ }
1036
+ if (isFloat ) {
1037
+ if (convResultFloat == null ) {
1038
+ convResultFloat = jimple .newLocal (freshLocalName ("lclConvToFloat" ), FloatType .v ());
1039
+ b .getLocals ().add (convResultFloat );
1040
+ }
1041
+ Value prev = def .getLeftOp ();
1042
+ def .setLeftOp (convResultFloat );
1043
+ units .insertAfter (jimple .newAssignStmt (prev , jimple .newCastExpr (convResultFloat , FloatType .v ())), u );
1044
+ }
1045
+ }
1017
1046
BinopExpr bop = (BinopExpr ) rop ;
1018
1047
int idxConvVar = 0 ;
1019
1048
for (ValueBox cmp : bop .getUseBoxes ()) {
@@ -1032,7 +1061,7 @@ public void convertFloatsAndDoubles(Body b, final Jimple jimple) {
1032
1061
if (isDouble ) {
1033
1062
if (!(c .getType () instanceof DoubleType )) {
1034
1063
if (convDouble [idxConvVar ] == null ) {
1035
- convDouble [idxConvVar ] = jimple .newLocal ("lclConvToDouble" + idxConvVar , DoubleType .v ());
1064
+ convDouble [idxConvVar ] = jimple .newLocal (freshLocalName ( "lclConvToDouble" + idxConvVar ) , DoubleType .v ());
1036
1065
b .getLocals ().add (convDouble [idxConvVar ]);
1037
1066
}
1038
1067
units .insertBefore (
@@ -1043,7 +1072,7 @@ public void convertFloatsAndDoubles(Body b, final Jimple jimple) {
1043
1072
} else if (isFloat ) {
1044
1073
if (!(c .getType () instanceof FloatType )) {
1045
1074
if (convFloat [idxConvVar ] == null ) {
1046
- convFloat [idxConvVar ] = jimple .newLocal ("lclConvToFloat" + idxConvVar , FloatType .v ());
1075
+ convFloat [idxConvVar ] = jimple .newLocal (freshLocalName ( "lclConvToFloat" + idxConvVar ) , FloatType .v ());
1047
1076
b .getLocals ().add (convFloat [idxConvVar ]);
1048
1077
}
1049
1078
units .insertBefore (
0 commit comments