| 232 | |
| 233 | |
| 234 | static 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: |
no test coverage detected