MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / ReadILOperand

Function ReadILOperand

arch/armv7/il.cpp:273–333  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

271
272
273static ExprId ReadILOperand(LowLevelILFunction& il, InstructionOperand& op, size_t addr, bool isPointer=false)
274{
275 switch (op.cls)
276 {
277
278 case IMM64:
279 if (isPointer)
280 return il.ConstPointer(8, op.imm);
281 return il.Const(8, op.imm);
282 case IMM:
283 case LABEL:
284 if (isPointer)
285 return il.ConstPointer(4, op.imm);
286 return il.Const(4, op.imm);
287 case REG:
288 if (op.shift == SHIFT_NONE)
289 return ReadRegisterOrPointer(il, op, addr);
290 else if (op.flags.offsetRegUsed == 1 && op.imm != 0)
291 {
292 return GetShiftedOffset(il, op);
293 }
294 else
295 {
296 return GetShiftedRegister(il, op);
297 }
298 break;
299 case MEM_IMM:
300 if (op.shift == SHIFT_NONE)
301 {
302 if (op.flags.offsetRegUsed == 1)
303 {
304 return op.flags.add?
305 il.Add(4, ReadRegisterOrPointer(il, op, addr), il.Register(get_register_size(op.reg), op.offset)):
306 il.Sub(4, ReadRegisterOrPointer(il, op, addr), il.Register(get_register_size(op.reg), op.offset));
307 }
308 else
309 {
310 if (op.imm == 0)
311 {
312 return ReadRegisterOrPointer(il, op, addr);
313 }
314 return op.flags.add?
315 il.Add(4, ReadRegisterOrPointer(il, op, addr), il.Const(4, op.imm)):
316 il.Sub(4, ReadRegisterOrPointer(il, op, addr), il.Const(4, op.imm));
317 }
318 }
319 else
320 return op.flags.add?
321 il.Add(4, ReadRegisterOrPointer(il, op, addr), GetShiftedOffset(il, op)):
322 il.Sub(4, ReadRegisterOrPointer(il, op, addr), GetShiftedOffset(il, op));
323 case MEM_PRE_IDX:
324 case MEM_POST_IDX:
325 return GetShiftedRegister(il, op);
326 case FIMM32:
327 case NONE:
328 default:
329 il.AddInstruction(il.Unimplemented());
330 break;

Callers 1

Calls 11

ReadRegisterOrPointerFunction · 0.85
GetShiftedOffsetFunction · 0.85
GetShiftedRegisterFunction · 0.70
get_register_sizeFunction · 0.50
ConstPointerMethod · 0.45
ConstMethod · 0.45
AddMethod · 0.45
RegisterMethod · 0.45
SubMethod · 0.45
AddInstructionMethod · 0.45
UnimplementedMethod · 0.45

Tested by

no test coverage detected