dex_instruction.cc revision e4c1ce498f7933b91696caa4a527e6556128a8e2
112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro// Copyright 2011 Google Inc. All Rights Reserved. 212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#include "src/dex_instruction.h" 412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapironamespace art { 612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 7e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroconst char* const Instruction::kInstructionNames[] = { 8e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_NAME(o, c, pname, f, r, i, a) pname, 9e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#include "src/dex_instruction_list.h" 10e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro DEX_INSTRUCTION_LIST(INSTRUCTION_NAME) 11e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST 12e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_NAME 13e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro}; 14e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro 15e4c1ce498f7933b91696caa4a527e6556128a8e2Carl ShapiroInstruction::InstructionFormat const Instruction::kInstructionFormats[] = { 16e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_FORMAT(o, c, p, format, r, i, a) format, 17e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#include "src/dex_instruction_list.h" 18e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro DEX_INSTRUCTION_LIST(INSTRUCTION_FORMAT) 19e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST 20e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FORMAT 21e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro}; 22e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro 23e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroint const Instruction::kInstructionFlags[] = { 24e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_FLAGS(o, c, p, f, r, i, flags) flags, 25e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#include "src/dex_instruction_list.h" 26e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro DEX_INSTRUCTION_LIST(INSTRUCTION_FLAGS) 27e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef DEX_INSTRUCTION_LIST 28e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#undef INSTRUCTION_FLAGS 29e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro}; 30e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro 31e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapirosize_t Instruction::Size() const { 3212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro const uint16_t* insns = reinterpret_cast<const uint16_t*>(this); 33e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size_t size = 0; 34e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro if (*insns == kPackedSwitchSignature) { 35e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size = 4 + insns[1] * 2; 36e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro } else if (*insns == kSparseSwitchSignature) { 37e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size = 2 + insns[1] * 4; 38e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro } else if (*insns == kArrayDataSignature) { 39e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro uint16_t element_size = insns[1]; 40e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro uint32_t length = insns[2] | (((uint32_t)insns[3]) << 16); 41e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro // The plus 1 is to round up for odd size and width. 42e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro return 4 + (element_size * length + 1) / 2; 43e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro } else { 44e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro switch (Format()) { 45e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k10x: 46e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k12x: 47e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k11n: 48e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k11x: 49e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k10t: 50e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size = 1; 51e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro break; 52e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k20t: 53e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k22x: 54e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k21t: 55e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k21s: 56e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k21h: 57e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k21c: 58e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k23x: 59e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k22b: 60e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k22t: 61e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k22s: 62e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k22c: 63e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size = 2; 64e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro break; 65e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k32x: 66e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k30t: 67e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k31t: 68e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k31i: 69e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k31c: 70e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k35c: 71e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k3rc: 72e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size = 3; 73e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro break; 74e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro case k51l: 75e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size = 5; 76e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro break; 77e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro default: 78e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro LOG(FATAL) << "Unreachable"; 79e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro } 80e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro } 81e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro size *= sizeof(uint16_t); 82e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro return size; 8312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro} 8412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 85e4c1ce498f7933b91696caa4a527e6556128a8e2Carl ShapiroInstruction::Code Instruction::Opcode() const { 8612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro const uint16_t* insns = reinterpret_cast<const uint16_t*>(this); 87e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro int opcode = *insns & 0xFF; 88e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro return static_cast<Code>(opcode); 8912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro} 9012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 91e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiroconst Instruction* Instruction::Next() const { 9212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro size_t current_size = Size(); 9312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro const uint8_t* ptr = reinterpret_cast<const uint8_t*>(this); 9412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro return reinterpret_cast<const Instruction*>(ptr + current_size); 9512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro} 9612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro 9712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro} // namespace art 98