size_t conut2
=
0
;
int
a
=
1
;
for
(vector<BasicBlock
*
>::iterator b
=
origBB.begin(); b !
=
origBB.end();
+
+
b,conut2
+
+
) {
BasicBlock
*
i
=
*
b;
ConstantInt
*
numCase
=
NULL;
/
/
Ret BB
if
(i
-
>getTerminator()
-
>getNumSuccessors()
=
=
0
) {
continue
;
}
/
/
If it's a non
-
conditional jump
if
(i
-
>getTerminator()
-
>getNumSuccessors()
=
=
1
) {
/
/
Get successor
and
delete terminator
BasicBlock
*
succ
=
i
-
>getTerminator()
-
>getSuccessor(
0
);
i
-
>getTerminator()
-
>eraseFromParent();
/
/
Get
next
case
if
(switch2
-
>findCaseDest(succ)!
=
nullptr)
{numCase
=
switch2
-
>findCaseDest(succ);}
else
{numCase
=
switch3
-
>findCaseDest(succ);}
/
/
If
next
case
=
=
default case (switchDefault)
if
(numCase
=
=
NULL) {
numCase
=
cast<ConstantInt>(
ConstantInt::get(switchI
-
>getCondition()
-
>getType(),
llvm::cryptoutils
-
>scramble32(
switchI
-
>getNumCases()
-
1
, scrambling_key)));
}
/
/
Update switchVar
and
jump to the end of loop
new StoreInst(numCase, load
-
>getPointerOperand(), i);
if
(a
=
=
1
){
BranchInst::Create(loopEnd, i);
a
=
0
;
}
else
{
BranchInst::Create(loopEnd2, i);
a
=
1
;
}
/
/
BranchInst::Create(loopEnd, i);
continue
;
}
/
/
If it's a conditional jump
if
(i
-
>getTerminator()
-
>getNumSuccessors()
=
=
2
) {
/
/
Get
next
cases
ConstantInt
*
numCaseTrue
=
nullptr;
ConstantInt
*
numCaseFalse
=
nullptr;
if
(switch2
-
>findCaseDest(i
-
>getTerminator()
-
>getSuccessor(
0
))!
=
nullptr)
{
numCaseTrue
=
switch2
-
>findCaseDest(i
-
>getTerminator()
-
>getSuccessor(
0
));
}
else
{
numCaseTrue
=
switch3
-
>findCaseDest(i
-
>getTerminator()
-
>getSuccessor(
0
));
}
if
(switch2
-
>findCaseDest(i
-
>getTerminator()
-
>getSuccessor(
1
))!
=
nullptr)
{
numCaseFalse
=
switch2
-
>findCaseDest(i
-
>getTerminator()
-
>getSuccessor(
1
));
}
else
{
numCaseFalse
=
switch3
-
>findCaseDest(i
-
>getTerminator()
-
>getSuccessor(
1
));
}
/
/
Check
if
next
case
=
=
default case (switchDefault)
if
(numCaseTrue
=
=
NULL) {
numCaseTrue
=
cast<ConstantInt>(
ConstantInt::get(switchI
-
>getCondition()
-
>getType(),
llvm::cryptoutils
-
>scramble32(
switchI
-
>getNumCases()
-
1
, scrambling_key)));
}
if
(numCaseFalse
=
=
NULL) {
numCaseFalse
=
cast<ConstantInt>(
ConstantInt::get(switchI
-
>getCondition()
-
>getType(),
llvm::cryptoutils
-
>scramble32(
switchI
-
>getNumCases()
-
1
, scrambling_key)));
}
/
/
Create a SelectInst
BranchInst
*
br
=
cast<BranchInst>(i
-
>getTerminator());
SelectInst
*
sel
=
SelectInst::Create(br
-
>getCondition(), numCaseTrue, numCaseFalse, "",
i
-
>getTerminator());
/
/
Erase terminator
i
-
>getTerminator()
-
>eraseFromParent();
/
/
Update switchVar
and
jump to the end of loop
new StoreInst(sel, load
-
>getPointerOperand(), i);
if
(a
=
=
1
){
BranchInst::Create(loopEnd, i);
a
=
0
;
}
else
{
BranchInst::Create(loopEnd2, i);
a
=
1
;
}
continue
;
}
}