178 // If it's a non-conditional jump
179 if (i->getTerminator()->getNumSuccessors() == 1) {
180 // Get successor and delete terminator
181 BasicBlock *succ = i->getTerminator()->getSuccessor(0);
182 i->getTerminator()->eraseFromParent();
183
184 // Get next case
185 numCase = switchI->findCaseDest(succ);
186
187 // If next case == default case (switchDefault)
188 if (numCase == NULL) {
189 numCase = cast<ConstantInt>(
190 ConstantInt::get(switchI->getCondition()->getType(),
191 llvm::cryptoutils->scramble32(
192 switchI->getNumCases() - 1, scrambling_key)));
193 }
194
195 // Update switchVar and jump to the end of loop
196 new StoreInst(numCase, load->getPointerOperand(), i);
197 BranchInst::Create(loopEnd, i);
198 continue;
199 }
case中代码块有2个后续块,也就是一个条件跳转分支,看代码:
201 // If it's a conditional jump
202 if (i->getTerminator()->getNumSuccessors() == 2) {
203 // Get next cases
204 ConstantInt *numCaseTrue =
205 switchI->findCaseDest(i->getTerminator()->getSuccessor(0));
206 ConstantInt *numCaseFalse =
207 switchI->findCaseDest(i->getTerminator()->getSuccessor(1));
208
209 // Check if next case == default case (switchDefault)
210 if (numCaseTrue == NULL) {
211 numCaseTrue = cast<ConstantInt>(
212 ConstantInt::get(switchI->getCondition()->getType(),
213 llvm::cryptoutils->scramble32(
214 switchI->getNumCases() - 1, scrambling_key)));
215 }
216
217 if (numCaseFalse == NULL) {
218 numCaseFalse = cast<ConstantInt>(
219 ConstantInt::get(switchI->getCondition()->getType(),
220 llvm::cryptoutils->scramble32(
221 switchI->getNumCases() - 1, scrambling_key)));
222 }
223
224 // Create a SelectInst
225 BranchInst *br = cast<BranchInst>(i->getTerminator());
226 SelectInst *sel =
227 SelectInst::Create(br->getCondition(), numCaseTrue, numCaseFalse, "",
228 i->getTerminator());
229
230 // Erase terminator
231 i->getTerminator()->eraseFromParent();
232
233 // Update switchVar and jump to the end of loop
234 new StoreInst(sel, load->getPointerOperand(), i);
235 BranchInst::Create(loopEnd, i);
236 continue;
237 }
238 }