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

Function GetOperandIndexForOperandUsages

lowlevelilinstruction.cpp:234–307  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

232
233
234static unordered_map<BNLowLevelILOperation, unordered_map<LowLevelILOperandUsage, size_t>>
235 GetOperandIndexForOperandUsages()
236{
237 unordered_map<BNLowLevelILOperation, unordered_map<LowLevelILOperandUsage, size_t>> result;
238 result.reserve(LowLevelILInstructionBase::operationOperandUsage.size());
239 for (auto& operation : LowLevelILInstructionBase::operationOperandUsage)
240 {
241 result[operation.first] = unordered_map<LowLevelILOperandUsage, size_t>();
242
243 size_t operand = 0;
244 result[operation.first].reserve(operation.second.size());
245 for (auto usage : operation.second)
246 {
247 result[operation.first][usage] = operand;
248 switch (usage)
249 {
250 case HighSSARegisterLowLevelOperandUsage:
251 case LowSSARegisterLowLevelOperandUsage:
252 case PartialSSARegisterStackSourceLowLevelOperandUsage:
253 case TopSSARegisterLowLevelOperandUsage:
254 // Represented as subexpression, so only takes one slot even though it is an SSA register
255 operand++;
256 break;
257 case ParameterExprsLowLevelOperandUsage:
258 if (operand == 0)
259 {
260 // Represented as a counted list
261 operand += 2;
262 }
263 else
264 {
265 // Represented as subexpression, so only takes one slot even though it is a list
266 operand++;
267 }
268 break;
269 case OutputSSARegistersLowLevelOperandUsage:
270 // OutputMemoryVersionLowLevelOperandUsage follows at same operand
271 break;
272 case StackSSARegisterLowLevelOperandUsage:
273 // StackMemoryVersionLowLevelOperandUsage follows at same operand
274 break;
275 case DestSSARegisterStackLowLevelOperandUsage:
276 // PartialSSARegisterStackSourceLowLevelOperandUsage follows at same operand
277 break;
278 case OutputMemoryIntrinsicLowLevelOperandUsage:
279 // OutputMemoryVersionLowLevelOperandUsage follows at same operand
280 break;
281 default:
282 switch (LowLevelILInstructionBase::operandTypeForUsage[usage])
283 {
284 case SSARegisterLowLevelOperand:
285 case SSARegisterStackLowLevelOperand:
286 case SSAFlagLowLevelOperand:
287 case IndexListLowLevelOperand:
288 case IndexMapLowLevelOperand:
289 case SSARegisterListLowLevelOperand:
290 case SSARegisterStackListLowLevelOperand:
291 case SSAFlagListLowLevelOperand:

Callers 1

Calls 1

sizeMethod · 0.45

Tested by

no test coverage detected