diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2024-03-04 15:53:28 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2024-03-15 15:12:50 -0400 |
| commit | 7ba5163f45803debbbc496d2981343a5ffa8a172 (patch) | |
| tree | c251f4ebc5e58a8cc55382cb7a5afc1222e59d16 /arch | |
| parent | f0b152f29e3b0da7224ea18a0dfb9892a87660f6 (diff) | |
Separate local variable tokens in higher level ILs from stack variable tokens in lower levels, and improve token usage in disassembly
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm64/arch_arm64.cpp | 64 | ||||
| -rw-r--r-- | arch/armv7/arch_armv7.cpp | 116 | ||||
| -rw-r--r-- | arch/mips/arch_mips.cpp | 8 | ||||
| -rw-r--r-- | arch/powerpc/arch_ppc.cpp | 26 | ||||
| -rw-r--r-- | arch/riscv/src/lib.rs | 4 | ||||
| -rw-r--r-- | arch/x86/arch_x86.cpp | 142 |
6 files changed, 196 insertions, 164 deletions
diff --git a/arch/arm64/arch_arm64.cpp b/arch/arm64/arch_arm64.cpp index d0a4c38e..ffa05fe8 100644 --- a/arch/arm64/arch_arm64.cpp +++ b/arch/arm64/arch_arm64.cpp @@ -429,7 +429,7 @@ class Arm64Architecture : public Architecture { char buf[64] = {0}; snprintf(buf, sizeof(buf), "%#x", (uint32_t)operand->shiftValue); - result.emplace_back(TextToken, " #"); + result.emplace_back(OperationToken, " #"); result.emplace_back(IntegerToken, buf, operand->shiftValue); } } @@ -463,18 +463,18 @@ class Arm64Architecture : public Architecture } f; f.intValue = (uint32_t)operand->immediate; snprintf(buf, sizeof(buf), "%.08f", f.floatValue); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); result.emplace_back(FloatingPointToken, buf); break; } case IMM32: snprintf(buf, sizeof(buf), "%s%#x", sign, (uint32_t)imm); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); result.emplace_back(IntegerToken, buf, operand->immediate); break; case IMM64: snprintf(buf, sizeof(buf), "%s%#" PRIx64, sign, imm); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); result.emplace_back(IntegerToken, buf, operand->immediate); break; case LABEL: @@ -548,9 +548,9 @@ class Arm64Architecture : public Architecture if (operand->operandClass == REG && operand->laneUsed) { snprintf(buf, sizeof(buf), "%u", operand->lane); - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); result.emplace_back(IntegerToken, buf); - result.emplace_back(TextToken, "]"); + result.emplace_back(BraceToken, "]"); } return DISASM_SUCCESS; @@ -576,8 +576,9 @@ class Arm64Architecture : public Architecture imm = -imm; } const char* startToken = "["; - const char* endToken = "]"; - result.emplace_back(BeginMemoryOperandToken, startToken); + const char* endToken = ""; + result.emplace_back(BraceToken, startToken); + result.emplace_back(BeginMemoryOperandToken, ""); result.emplace_back(RegisterToken, reg0); result.emplace_back(TextToken, get_register_arrspec(operand->reg[0], operand)); @@ -586,9 +587,10 @@ class Arm64Architecture : public Architecture case MEM_REG: break; case MEM_PRE_IDX: - endToken = "]!"; + endToken = "!"; snprintf(immBuff, sizeof(immBuff), "%s%#" PRIx64, sign, (uint64_t)imm); - result.emplace_back(TextToken, ", #"); + result.emplace_back(TextToken, ", "); + result.emplace_back(OperationToken, "#"); result.emplace_back(IntegerToken, immBuff, operand->immediate); break; case MEM_POST_IDX: // [<reg>], <reg|imm> @@ -596,7 +598,10 @@ class Arm64Architecture : public Architecture if (operand->reg[1] == REG_NONE) { snprintf(paramBuff, sizeof(paramBuff), "%s%#" PRIx64, sign, (uint64_t)imm); - result.emplace_back(EndMemoryOperandToken, "], #"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); + result.emplace_back(TextToken, ", "); + result.emplace_back(OperationToken, "#"); result.emplace_back(IntegerToken, paramBuff, operand->immediate); } else @@ -604,7 +609,9 @@ class Arm64Architecture : public Architecture reg1 = get_register_name(operand->reg[1]); if (EMPTY(reg1)) return FAILED_TO_DISASSEMBLE_REGISTER; - result.emplace_back(EndMemoryOperandToken, "], "); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); + result.emplace_back(TextToken, ", "); result.emplace_back(RegisterToken, reg1); result.emplace_back(TextToken, get_register_arrspec(operand->reg[1], operand)); } @@ -613,7 +620,8 @@ class Arm64Architecture : public Architecture if (operand->immediate != 0) { snprintf(immBuff, sizeof(immBuff), "%s%#" PRIx64, sign, (uint64_t)imm); - result.emplace_back(TextToken, ", #"); + result.emplace_back(TextToken, ", "); + result.emplace_back(OperationToken, "#"); result.emplace_back(IntegerToken, immBuff, operand->immediate); if (operand->mul_vl) @@ -633,7 +641,11 @@ class Arm64Architecture : public Architecture return NOT_MEMORY_OPERAND; } if (endToken != NULL) - result.emplace_back(EndMemoryOperandToken, endToken); + { + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); + result.emplace_back(TextToken, endToken); + } return DISASM_SUCCESS; } @@ -657,10 +669,10 @@ class Arm64Architecture : public Architecture if (operand->laneUsed) { - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); snprintf(index, sizeof(index), "%d", operand->lane); result.emplace_back(IntegerToken, index, operand->lane); - result.emplace_back(TextToken, "]"); + result.emplace_back(BraceToken, "]"); } return DISASM_SUCCESS; } @@ -838,21 +850,21 @@ class Arm64Architecture : public Architecture break; case STR_IMM: /* eg: "mul #0xe" */ result.emplace_back(TextToken, instr.operands[i].name); - result.emplace_back(TextToken, " #"); + result.emplace_back(OperationToken, " #"); snprintf(buf, sizeof(buf), "0x%" PRIx64, instr.operands[i].immediate); result.emplace_back(IntegerToken, buf); tokenizeSuccess = true; break; case ACCUM_ARRAY: /* eg: "za[w12, #0x6]" */ result.emplace_back(TextToken, "ZA"); - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); snprintf(buf, sizeof(buf), "%s", get_register_name(operand->reg[0])); result.emplace_back(RegisterToken, buf); result.emplace_back(OperandSeparatorToken, ", "); - result.emplace_back(TextToken, " #"); + result.emplace_back(OperationToken, " #"); snprintf(buf, sizeof(buf), "0x%" PRIx64, operand->immediate); result.emplace_back(IntegerToken, buf); - result.emplace_back(TextToken, "]"); + result.emplace_back(BraceToken, "]"); tokenizeSuccess = true; break; case SME_TILE: /* eg: "z0v.b[w12, #0xb]" */ @@ -865,33 +877,33 @@ class Arm64Architecture : public Architecture result.emplace_back(TextToken, get_arrspec_str_truncated(operand->arrSpec)); if (operand->reg[0] != REG_NONE) { - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); snprintf(buf, sizeof(buf), "%s", get_register_name(operand->reg[0])); result.emplace_back(RegisterToken, buf); if (operand->arrSpec != ARRSPEC_FULL) { result.emplace_back(OperandSeparatorToken, ", "); - result.emplace_back(TextToken, " #"); + result.emplace_back(OperationToken, " #"); snprintf(buf, sizeof(buf), "0x%" PRIx64, instr.operands[i].immediate); result.emplace_back(IntegerToken, buf); } - result.emplace_back(TextToken, "]"); + result.emplace_back(BraceToken, "]"); } tokenizeSuccess = true; break; case INDEXED_ELEMENT: /* eg: "p12.d[w15, #0xf]" */ result.emplace_back(RegisterToken, get_register_name(operand->reg[0])); result.emplace_back(TextToken, get_arrspec_str_truncated(operand->arrSpec)); - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); result.emplace_back(RegisterToken, get_register_name(operand->reg[1])); if (operand->immediate) { result.emplace_back(OperandSeparatorToken, ", "); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); snprintf(buf, sizeof(buf), "0x%" PRIx64, operand->immediate); result.emplace_back(IntegerToken, buf); } - result.emplace_back(TextToken, "]"); + result.emplace_back(BraceToken, "]"); tokenizeSuccess = true; break; default: diff --git a/arch/armv7/arch_armv7.cpp b/arch/armv7/arch_armv7.cpp index aa983518..d14641d8 100644 --- a/arch/armv7/arch_armv7.cpp +++ b/arch/armv7/arch_armv7.cpp @@ -831,9 +831,9 @@ protected: return FAILED_TO_DISASSEMBLE_OPERAND; result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, shiftStr); + result.emplace_back(KeywordToken, shiftStr); snprintf(operand, sizeof(operand), "%#x", (uint32_t)op.imm); - result.emplace_back(TextToken, " #"); + result.emplace_back(OperationToken, " #"); result.emplace_back(IntegerToken, operand, op.imm); } return DISASM_SUCCESS; @@ -847,27 +847,23 @@ protected: { case FIMM16: case FIMM32: - { snprintf(operand, sizeof(operand), "%f", op.immf); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); result.emplace_back(FloatingPointToken, operand); break; - } case FIMM64: - { snprintf(operand, sizeof(operand), "%e", op.immd); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); result.emplace_back(FloatingPointToken, operand); break; - } case IMM: snprintf(operand, sizeof(operand), "%s%#x", sign, (uint32_t)op.imm); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); result.emplace_back(IntegerToken, operand, op.imm); break; case IMM64: snprintf(operand, sizeof(operand), "%s%#" PRIx64, sign, op.imm64); - result.emplace_back(TextToken, "#"); + result.emplace_back(OperationToken, "#"); result.emplace_back(IntegerToken, operand, op.imm64); break; case LABEL: @@ -1110,7 +1106,7 @@ public: { char operand[32]; snprintf(operand, sizeof(operand), "%#x", (uint32_t)op.imm); - result.emplace_back(TextToken, " #"); + result.emplace_back(OperationToken, " #"); result.emplace_back(IntegerToken, operand, op.imm); } @@ -1119,7 +1115,7 @@ public: char operand[32]; const char* neg[2] = {"-", ""}; snprintf(operand, sizeof(operand), "%s%#x", neg[op.flags.add == 1], (uint32_t)op.imm); - result.emplace_back(TextToken, " #"); + result.emplace_back(OperationToken, " #"); result.emplace_back(IntegerToken, operand, op.imm); } @@ -1175,22 +1171,22 @@ public: break; case REG: result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].reg)); - result.emplace_back(TextToken, wb[instr.operands[i].flags.wb]); + result.emplace_back(OperationToken, wb[instr.operands[i].flags.wb]); if (instr.operands[i].shift == SHIFT_NONE) { if (instr.operands[i].flags.hasElements == 1) { - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); snprintf(tmpOperand, sizeof(tmpOperand), "%d", instr.operands[i].imm); result.emplace_back(IntegerToken, tmpOperand, instr.operands[i].imm); - result.emplace_back(TextToken, "]"); + result.emplace_back(BraceToken, "]"); } } else if (instr.operands[i].flags.offsetRegUsed == 1) { //Register shifted by register result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(KeywordToken, get_shift(instr.operands[i].shift)); result.emplace_back(TextToken, " "); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); } @@ -1198,7 +1194,7 @@ public: { //Register shifted by constant result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(KeywordToken, get_shift(instr.operands[i].shift)); if (instr.operands[i].shift != SHIFT_RRX) { result.emplace_back(TextToken, " "); @@ -1210,7 +1206,7 @@ public: case REG_LIST_SINGLE: case REG_LIST_DOUBLE: { - result.emplace_back(TextToken, "{"); + result.emplace_back(BraceToken, "{"); first = true; uint32_t base = 0; if (instr.operands[i].cls == REG_LIST_SINGLE) @@ -1228,70 +1224,77 @@ public: first = false; } } - result.emplace_back(TextToken, "}"); - result.emplace_back(TextToken, crt[instr.operands[i].flags.wb]); + result.emplace_back(BraceToken, "}"); + result.emplace_back(OperationToken, crt[instr.operands[i].flags.wb]); } break; case REG_SPEC: - result.emplace_back(TextToken, get_spec_register_name(instr.operands[i].regs)); + result.emplace_back(RegisterToken, get_spec_register_name(instr.operands[i].regs)); break; case REG_BANKED: - result.emplace_back(TextToken, get_banked_register_name(instr.operands[i].regb)); + result.emplace_back(RegisterToken, get_banked_register_name(instr.operands[i].regb)); break; case REG_COPROCP: - result.emplace_back(TextToken, get_coproc_register_p_name(instr.operands[i].regp)); + result.emplace_back(RegisterToken, get_coproc_register_p_name(instr.operands[i].regp)); break; case REG_COPROCC: - result.emplace_back(TextToken, get_coproc_register_c_name(instr.operands[i].regc)); + result.emplace_back(RegisterToken, get_coproc_register_c_name(instr.operands[i].regc)); break; case IFLAGS: - result.emplace_back(TextToken, get_iflag(instr.operands[i].iflag)); + result.emplace_back(KeywordToken, get_iflag(instr.operands[i].iflag)); break; - case ENDIAN_SPEC: - result.emplace_back(TextToken, get_endian(instr.operands[i].endian)); + case ENDIAN_SPEC: + result.emplace_back(KeywordToken, get_endian(instr.operands[i].endian)); break; case DSB_OPTION: - result.emplace_back(TextToken, get_dsb_option(instr.operands[i].dsbOpt)); + result.emplace_back(KeywordToken, get_dsb_option(instr.operands[i].dsbOpt)); break; case MEM_ALIGNED: - result.emplace_back(BeginMemoryOperandToken, "["); + result.emplace_back(BraceToken, "["); + result.emplace_back(BeginMemoryOperandToken, ""); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].reg)); if (instr.operands[i].imm != 0) { - result.emplace_back(TextToken, ":0x"); - snprintf(tmpOperand, sizeof(tmpOperand), ":%#x", instr.operands[i].imm); + result.emplace_back(OperationToken, ":"); + snprintf(tmpOperand, sizeof(tmpOperand), "%#x", instr.operands[i].imm); result.emplace_back(IntegerToken, tmpOperand, instr.operands[i].imm); } - result.emplace_back(EndMemoryOperandToken, "]"); - result.emplace_back(TextToken, wb[instr.operands[i].flags.wb]); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); + result.emplace_back(OperationToken, wb[instr.operands[i].flags.wb]); break; case MEM_OPTION: - result.emplace_back(BeginMemoryOperandToken, "["); + result.emplace_back(BraceToken, "["); + result.emplace_back(BeginMemoryOperandToken, ""); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].reg)); - result.emplace_back(EndMemoryOperandToken, "], {"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); + result.emplace_back(TextToken, ", "); + result.emplace_back(BraceToken, "{"); GetImmToken(instr.operands[i], result); - result.emplace_back(TextToken, "}"); + result.emplace_back(BraceToken, "}"); break; case MEM_PRE_IDX: - result.emplace_back(BeginMemoryOperandToken, "["); + result.emplace_back(BraceToken, "["); + result.emplace_back(BeginMemoryOperandToken, ""); if (instr.operands[i].flags.offsetRegUsed == 1) { result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].reg)); result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, neg[instr.operands[i].flags.add == 1]); + result.emplace_back(OperationToken, neg[instr.operands[i].flags.add == 1]); if (instr.operands[i].imm == 0) result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); else if (instr.operands[i].shift == SHIFT_RRX) { result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(OperationToken, get_shift(instr.operands[i].shift)); } else { result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(OperationToken, get_shift(instr.operands[i].shift)); result.emplace_back(TextToken, " "); GetImmToken(instr.operands[i], result); } @@ -1302,29 +1305,34 @@ public: result.emplace_back(TextToken, ", "); GetSignedImmToken(instr.operands[i], result); } - result.emplace_back(EndMemoryOperandToken, "]!"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); + result.emplace_back(OperationToken, "!"); break; break; case MEM_POST_IDX: - result.emplace_back(BeginMemoryOperandToken, "["); + result.emplace_back(BraceToken, "["); + result.emplace_back(BeginMemoryOperandToken, ""); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].reg)); - result.emplace_back(EndMemoryOperandToken, "], "); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); + result.emplace_back(TextToken, ", "); if (instr.operands[i].flags.offsetRegUsed == 1) { - result.emplace_back(TextToken, neg[instr.operands[i].flags.add == 1]); + result.emplace_back(OperationToken, neg[instr.operands[i].flags.add == 1]); if (instr.operands[i].imm == 0) result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); else if (instr.operands[i].shift == SHIFT_RRX) { result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(OperationToken, get_shift(instr.operands[i].shift)); } else { result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(OperationToken, get_shift(instr.operands[i].shift)); result.emplace_back(TextToken, " "); GetImmToken(instr.operands[i], result); } @@ -1335,7 +1343,8 @@ public: } break; case MEM_IMM: - result.emplace_back(BeginMemoryOperandToken, "["); + result.emplace_back(BraceToken, "["); + result.emplace_back(BeginMemoryOperandToken, ""); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].reg)); switch (instr.operands[i].shift) { @@ -1343,7 +1352,7 @@ public: if (instr.operands[i].flags.offsetRegUsed == 1) { result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, neg[instr.operands[i].flags.add == 1]); + result.emplace_back(OperationToken, neg[instr.operands[i].flags.add == 1]); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); } else if (instr.operands[i].imm != 0)// || instr.operands[i].flags.add == 0) @@ -1354,21 +1363,22 @@ public: break; case SHIFT_RRX: result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, neg[instr.operands[i].flags.add == 1]); + result.emplace_back(OperationToken, neg[instr.operands[i].flags.add == 1]); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(OperationToken, get_shift(instr.operands[i].shift)); break; default: result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, neg[instr.operands[i].flags.add == 1]); + result.emplace_back(OperationToken, neg[instr.operands[i].flags.add == 1]); result.emplace_back(RegisterToken, GetRegisterName(instr.operands[i].offset)); result.emplace_back(TextToken, ", "); - result.emplace_back(TextToken, get_shift(instr.operands[i].shift)); + result.emplace_back(OperationToken, get_shift(instr.operands[i].shift)); result.emplace_back(TextToken, " "); GetImmToken(instr.operands[i], result); } - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; default: LogError("operandClass %d\n", instr.operands[i].cls); diff --git a/arch/mips/arch_mips.cpp b/arch/mips/arch_mips.cpp index 0d01862d..77de378f 100644 --- a/arch/mips/arch_mips.cpp +++ b/arch/mips/arch_mips.cpp @@ -763,12 +763,12 @@ public: } if (instr.operands[i].reg == REG_ZERO) break; - result.emplace_back(TextToken, "("); + result.emplace_back(BraceToken, "("); reg = get_register((Reg)instr.operands[i].reg); if (reg == NULL) return false; result.emplace_back(RegisterToken, reg); - result.emplace_back(TextToken, ")"); + result.emplace_back(BraceToken, ")"); result.emplace_back(EndMemoryOperandToken, ""); break; case MEM_REG: @@ -777,13 +777,13 @@ public: if (reg == NULL) return false; result.emplace_back(RegisterToken, reg); - result.emplace_back(TextToken, "("); + result.emplace_back(BraceToken, "("); reg = get_register((Reg)instr.operands[i].reg); if (reg == NULL) return false; result.emplace_back(RegisterToken, reg); - result.emplace_back(TextToken, ")"); + result.emplace_back(BraceToken, ")"); result.emplace_back(EndMemoryOperandToken, ""); break; default: diff --git a/arch/powerpc/arch_ppc.cpp b/arch/powerpc/arch_ppc.cpp index 6366db16..2f657b7a 100644 --- a/arch/powerpc/arch_ppc.cpp +++ b/arch/powerpc/arch_ppc.cpp @@ -500,7 +500,7 @@ class PowerpcArchitecture: public Architecture // 111111AAA00BBBBBCCCCC00001000000 "fcmpo crA,fB,fC" uint32_t tmp = insword & 0xFC6007FF; if (tmp==0xFC000040) { - result.emplace_back(TextToken, "fcmpo"); + result.emplace_back(InstructionToken, "fcmpo"); result.emplace_back(TextToken, " "); snprintf(buf, sizeof(buf), "cr%d", (insword >> 23) & 7); result.emplace_back(RegisterToken, buf); @@ -518,7 +518,7 @@ class PowerpcArchitecture: public Architecture int a = ((insword & 0x3E00000)>>21)|((insword & 0x1)<<5); int b = ((insword & 0x1F0000)>>16)|((insword & 0x4)<<3); int c = ((insword & 0xF800)>>11)|((insword & 0x2)<<4); - result.emplace_back(TextToken, "xxpermr"); + result.emplace_back(InstructionToken, "xxpermr"); result.emplace_back(TextToken, " "); snprintf(buf, sizeof(buf), "vs%d", a); result.emplace_back(RegisterToken, buf); @@ -539,16 +539,16 @@ class PowerpcArchitecture: public Architecture if (tmp==0x1000000C || tmp==0x1000000E || tmp==0x1000004C || tmp==0x1000004E) { switch(tmp) { case 0x1000000C: - result.emplace_back(TextToken, "psq_lx"); + result.emplace_back(InstructionToken, "psq_lx"); result.emplace_back(TextToken, " "); break; - case 0x1000000E: result.emplace_back(TextToken, "psq_stx"); + case 0x1000000E: result.emplace_back(InstructionToken, "psq_stx"); result.emplace_back(TextToken, " "); break; - case 0x1000004C: result.emplace_back(TextToken, "psq_lux"); + case 0x1000004C: result.emplace_back(InstructionToken, "psq_lux"); result.emplace_back(TextToken, " "); break; - case 0x1000004E: result.emplace_back(TextToken, "psq_stux"); + case 0x1000004E: result.emplace_back(InstructionToken, "psq_stux"); result.emplace_back(TextToken, " "); break; } @@ -578,10 +578,10 @@ class PowerpcArchitecture: public Architecture tmp = insword & 0xFC00F83F; if (tmp==0x10000018 || tmp==0x10000019 || tmp==0x1000001A || tmp==0x1000001B) { switch(tmp) { - case 0x10000018: result.emplace_back(TextToken, "ps_muls0"); break; - case 0x10000019: result.emplace_back(TextToken, "ps_muls0."); break; - case 0x1000001A: result.emplace_back(TextToken, "ps_muls1"); break; - case 0x1000001B: result.emplace_back(TextToken, "ps_muls1."); break; + case 0x10000018: result.emplace_back(InstructionToken, "ps_muls0"); break; + case 0x10000019: result.emplace_back(InstructionToken, "ps_muls0."); break; + case 0x1000001A: result.emplace_back(InstructionToken, "ps_muls1"); break; + case 0x1000001B: result.emplace_back(InstructionToken, "ps_muls1."); break; } result.emplace_back(TextToken, " "); snprintf(buf, sizeof(buf), "f%d", (insword & 0x3E00000) >> 21); @@ -664,7 +664,7 @@ class PowerpcArchitecture: public Architecture case PPC_OP_REG: //MYLOG("pushing a register\n"); if (capstoneWorkaround || (insn->id == PPC_INS_ISEL && i == 3)) - result.emplace_back(TextToken, GetFlagName(op->reg - PPC_REG_R0)); + result.emplace_back(RegisterToken, GetFlagName(op->reg - PPC_REG_R0)); else result.emplace_back(RegisterToken, GetRegisterName(op->reg)); break; @@ -703,9 +703,9 @@ class PowerpcArchitecture: public Architecture snprintf(buf, sizeof(buf), "%d", op->mem.disp); result.emplace_back(IntegerToken, buf, op->mem.disp, 4); - result.emplace_back(TextToken, "("); + result.emplace_back(BraceToken, "("); result.emplace_back(RegisterToken, GetRegisterName(op->mem.base)); - result.emplace_back(TextToken, ")"); + result.emplace_back(BraceToken, ")"); break; case PPC_OP_CRX: case PPC_OP_INVALID: diff --git a/arch/riscv/src/lib.rs b/arch/riscv/src/lib.rs index 8b9fde31..6b3451a9 100644 --- a/arch/riscv/src/lib.rs +++ b/arch/riscv/src/lib.rs @@ -1031,12 +1031,12 @@ impl<D: 'static + RiscVDisassembler + Send + Sync> architecture::Architecture fo Integer(i as u64), )); - res.push(InstructionTextToken::new(BnString::new("("), Text)); + res.push(InstructionTextToken::new(BnString::new("("), Brace)); res.push(InstructionTextToken::new( BnString::new(®.name()), Register, )); - res.push(InstructionTextToken::new(BnString::new(")"), Text)); + res.push(InstructionTextToken::new(BnString::new(")"), Brace)); res.push(InstructionTextToken::new( BnString::new(""), EndMemoryOperand, diff --git a/arch/x86/arch_x86.cpp b/arch/x86/arch_x86.cpp index 94cf31d5..cddce41d 100644 --- a/arch/x86/arch_x86.cpp +++ b/arch/x86/arch_x86.cpp @@ -548,55 +548,56 @@ BNRegisterInfo X86CommonArchitecture::RegisterInfo(xed_reg_enum_t fullWidthReg, void X86CommonArchitecture::GetAddressSizeToken(const short bytes, vector<InstructionTextToken>& result, const bool lowerCase) { // Size + result.emplace_back(BeginMemoryOperandToken, ""); switch (bytes) { case 1: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"byte "); + result.emplace_back(KeywordToken, "byte "); else - result.emplace_back(BeginMemoryOperandToken,"BYTE "); + result.emplace_back(KeywordToken, "BYTE "); break; case 2: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"word "); + result.emplace_back(KeywordToken, "word "); else - result.emplace_back(BeginMemoryOperandToken,"WORD "); + result.emplace_back(KeywordToken, "WORD "); break; case 4: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"dword "); + result.emplace_back(KeywordToken, "dword "); else - result.emplace_back(BeginMemoryOperandToken,"DWORD "); + result.emplace_back(KeywordToken, "DWORD "); break; case 8: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"qword "); + result.emplace_back(KeywordToken, "qword "); else - result.emplace_back(BeginMemoryOperandToken,"QWORD "); + result.emplace_back(KeywordToken, "QWORD "); break; case 10: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"tword "); + result.emplace_back(KeywordToken, "tword "); else - result.emplace_back(BeginMemoryOperandToken,"TWORD "); + result.emplace_back(KeywordToken, "TWORD "); break; case 16: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"xmmword "); + result.emplace_back(KeywordToken, "xmmword "); else - result.emplace_back(BeginMemoryOperandToken,"XMMWORD "); + result.emplace_back(KeywordToken, "XMMWORD "); break; case 32: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"ymmword "); + result.emplace_back(KeywordToken, "ymmword "); else - result.emplace_back(BeginMemoryOperandToken,"YMMWORD "); + result.emplace_back(KeywordToken, "YMMWORD "); break; case 64: if (lowerCase) - result.emplace_back(BeginMemoryOperandToken,"zmmword "); + result.emplace_back(KeywordToken, "zmmword "); else - result.emplace_back(BeginMemoryOperandToken,"ZMMWORD "); + result.emplace_back(KeywordToken, "ZMMWORD "); break; default: break; @@ -808,10 +809,10 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const GetAddressSizeToken(xed_decoded_inst_operand_length_bits(xedd, opIndex) / 8, result, m_disassembly_options.lowerCase); if (m_disassembly_options.lowerCase) - result.emplace_back(TextToken, "ptr "); + result.emplace_back(KeywordToken, "ptr "); else - result.emplace_back(TextToken, "PTR "); - result.emplace_back(TextToken, "["); + result.emplace_back(KeywordToken, "PTR "); + result.emplace_back(BraceToken, "["); // Segment const xed_reg_enum_t seg = xed_decoded_inst_get_seg_reg(xedd, 0); @@ -823,7 +824,7 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const for (char& c : seg_str) c = tolower(c); result.emplace_back(RegisterToken, seg_str); - result.emplace_back(TextToken, ":"); + result.emplace_back(OperationToken, ":"); } bool started = false; @@ -855,7 +856,8 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const result.emplace_back(CodeRelativeAddressToken, sstream.str(), disp, GetAddressSize()); - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -871,7 +873,7 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const else // normal path { if (started) - result.emplace_back(TextToken, "+"); + result.emplace_back(OperationToken, "+"); started = true; string index_str(xed_reg_enum_t2str(index)); @@ -884,7 +886,7 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const const unsigned int scale = xed_decoded_inst_get_scale(xedd, 0); if (scale != 1) { - result.emplace_back(TextToken, "*"); + result.emplace_back(OperationToken, "*"); stringstream sstream; sstream << scale; result.emplace_back(IntegerToken, sstream.str(), scale, 1); @@ -908,11 +910,11 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const { if (disp < 0) { - result.emplace_back(TextToken, "-"); + result.emplace_back(OperationToken, "-"); disp = -disp; } else - result.emplace_back(TextToken, "+"); + result.emplace_back(OperationToken, "+"); if (disp_bytes == 2) sstream << (uint16_t)disp; @@ -939,7 +941,8 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const { result.emplace_back(IntegerToken, "0x0", disp, GetAddressSize()); } - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -948,9 +951,9 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const GetAddressSizeToken(xed_decoded_inst_operand_length_bits(xedd, opIndex) / 8, result, m_disassembly_options.lowerCase); if (m_disassembly_options.lowerCase) - result.emplace_back(TextToken, "ptr "); + result.emplace_back(KeywordToken, "ptr "); else - result.emplace_back(TextToken, "PTR "); + result.emplace_back(KeywordToken, "PTR "); // Segment const xed_reg_enum_t seg = xed_decoded_inst_get_seg_reg(xedd, 1); @@ -962,10 +965,10 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const c = tolower(c); result.emplace_back(RegisterToken, seg_str); - result.emplace_back(TextToken, ":"); + result.emplace_back(OperationToken, ":"); } - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); const xed_reg_enum_t base = xed_decoded_inst_get_base_reg(xedd, 1); if (base != XED_REG_INVALID) { @@ -975,7 +978,8 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const c = tolower(c); result.emplace_back(RegisterToken, base_str); } - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -1075,7 +1079,7 @@ void X86CommonArchitecture::GetOperandTextIntel(const xed_decoded_inst_t* const } default: { - result.emplace_back(TextToken, "unimplimented"); + result.emplace_back(KeywordToken, "unimplemented"); } // default case of outer switch } // outer switch @@ -1166,9 +1170,9 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons if(xed_decoded_inst_zeroing(xedd)) { if (m_disassembly_options.lowerCase) - result.emplace_back(TextToken, " {z}"); + result.emplace_back(OperationToken, " {z}"); else - result.emplace_back(TextToken, " {Z}"); + result.emplace_back(OperationToken, " {Z}"); } } @@ -1181,7 +1185,7 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons if (xed_inst_iclass(xi) != XED_ICLASS_LEA) GetAddressSizeToken(xed_decoded_inst_operand_length_bits(xedd, opIndex) / 8, result, m_disassembly_options.lowerCase); - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); // Segment const xed_reg_enum_t seg = xed_decoded_inst_get_seg_reg(xedd, 0); const bool validSegment = (seg != XED_REG_INVALID && !xed_operand_values_using_default_segment(ov, 0)); @@ -1192,7 +1196,7 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons for (char& c : seg_str) c = tolower(c); result.emplace_back(RegisterToken, seg_str); - result.emplace_back(TextToken, ":"); + result.emplace_back(OperationToken, ":"); } bool started = false; @@ -1212,9 +1216,9 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons else if ((base == XED_REG_RIP) || (base == XED_REG_EIP) || (base == XED_REG_IP)) { if (m_disassembly_options.lowerCase) - result.emplace_back(TextToken, "rel "); + result.emplace_back(KeywordToken, "rel "); else - result.emplace_back(TextToken, "REL "); + result.emplace_back(KeywordToken, "REL "); if (xed_operand_values_has_memory_displacement(ov)) disp += addr + len; @@ -1229,7 +1233,8 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons result.emplace_back(CodeRelativeAddressToken, sstream.str(), disp, GetAddressSize()); - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -1245,7 +1250,7 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons else // normal path { if (started) - result.emplace_back(TextToken, "+"); + result.emplace_back(OperationToken, "+"); started = true; string index_str(xed_reg_enum_t2str(index)); @@ -1258,7 +1263,7 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons const unsigned int scale = xed_decoded_inst_get_scale(xedd, 0); if (scale != 1) { - result.emplace_back(TextToken, "*"); + result.emplace_back(OperationToken, "*"); stringstream sstream; sstream << scale; result.emplace_back(IntegerToken, sstream.str(), scale, 1); @@ -1282,11 +1287,11 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons { if (disp < 0) { - result.emplace_back(TextToken, "-"); + result.emplace_back(OperationToken, "-"); disp = -disp; } else - result.emplace_back(TextToken, "+"); + result.emplace_back(OperationToken, "+"); if (disp_bytes == 2) sstream << (uint16_t)disp; @@ -1314,7 +1319,8 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons result.emplace_back(IntegerToken, "0x0", disp, GetAddressSize()); } - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -1332,10 +1338,10 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons c = tolower(c); result.emplace_back(RegisterToken, seg_str); - result.emplace_back(TextToken, ":"); + result.emplace_back(OperationToken, ":"); } - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); const xed_reg_enum_t base = xed_decoded_inst_get_base_reg(xedd, 1); if (base != XED_REG_INVALID) { @@ -1345,7 +1351,8 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons c = tolower(c); result.emplace_back(RegisterToken, base_str); } - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -1436,7 +1443,7 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons if ((xed_decoded_inst_get_iclass(xedd) == XED_ICLASS_CALL_NEAR) && (relbr == (int64_t)(addr + xed_decoded_inst_get_length(xedd)))) { sstream << "$+" << xed_decoded_inst_get_length(xedd); - result.emplace_back(TextToken, sstream.str()); + result.emplace_back(OperationToken, sstream.str()); break; } @@ -1453,9 +1460,9 @@ void X86CommonArchitecture::GetOperandTextBNIntel(const xed_decoded_inst_t* cons default: { if (m_disassembly_options.lowerCase) - result.emplace_back(TextToken, "unimplimented "); + result.emplace_back(KeywordToken, "unimplemented "); else - result.emplace_back(TextToken, "UNIMPLIMENTED "); + result.emplace_back(KeywordToken, "UNIMPLEMENTED "); } // default case of outer switch } // outer switch @@ -1559,10 +1566,10 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe GetAddressSizeToken(xed_decoded_inst_operand_length_bits(xedd, i) / 8, result, m_disassembly_options.lowerCase); if (m_disassembly_options.lowerCase) - result.emplace_back(TextToken, "ptr "); + result.emplace_back(KeywordToken, "ptr "); else - result.emplace_back(TextToken, "PTR "); - result.emplace_back(TextToken, "["); + result.emplace_back(KeywordToken, "PTR "); + result.emplace_back(BraceToken, "["); // Segment const xed_reg_enum_t seg = xed_decoded_inst_get_seg_reg(xedd, 0); @@ -1575,7 +1582,7 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe for (char& c : seg_str) c = tolower(c); result.emplace_back(RegisterToken, seg_str); - result.emplace_back(TextToken, ":"); + result.emplace_back(OperationToken, ":"); } bool started = false; @@ -1608,7 +1615,8 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe result.emplace_back(CodeRelativeAddressToken, sstream.str(), disp, GetAddressSize()); - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -1616,7 +1624,7 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe if (index != XED_REG_INVALID) { if (started) - result.emplace_back(TextToken, "+"); + result.emplace_back(OperationToken, "+"); started = true; string index_str(xed_reg_enum_t2str(index)); @@ -1630,7 +1638,7 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe const unsigned int scale = xed_decoded_inst_get_scale(xedd, 0); if (scale != 1) { - result.emplace_back(TextToken, "*"); + result.emplace_back(OperationToken, "*"); stringstream sstream; sstream << scale; result.emplace_back(IntegerToken, sstream.str(), scale, 1); @@ -1653,11 +1661,11 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe { if (disp < 0) { - result.emplace_back(TextToken, "-"); + result.emplace_back(OperationToken, "-"); disp = -disp; } else - result.emplace_back(TextToken, "+"); + result.emplace_back(OperationToken, "+"); if (disp_bytes == 2) sstream << (uint16_t)disp; @@ -1684,7 +1692,8 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe { result.emplace_back(IntegerToken, "0x0", disp, GetAddressSize()); } - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -1694,9 +1703,9 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe GetAddressSizeToken(xed_decoded_inst_operand_length_bits(xedd, i) / 8, result, m_disassembly_options.lowerCase); if (m_disassembly_options.lowerCase) - result.emplace_back(TextToken, "ptr "); + result.emplace_back(KeywordToken, "ptr "); else - result.emplace_back(TextToken, "PTR "); + result.emplace_back(KeywordToken, "PTR "); // Segment const xed_reg_enum_t seg = xed_decoded_inst_get_seg_reg(xedd, 1); @@ -1709,10 +1718,10 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe c = tolower(c); result.emplace_back(RegisterToken, seg_str); - result.emplace_back(TextToken, ":"); + result.emplace_back(OperationToken, ":"); } - result.emplace_back(TextToken, "["); + result.emplace_back(BraceToken, "["); const xed_reg_enum_t base = xed_decoded_inst_get_base_reg(xedd, 1); if (base != XED_REG_INVALID) { @@ -1723,7 +1732,8 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe c = tolower(c); result.emplace_back(RegisterToken, base_str); } - result.emplace_back(EndMemoryOperandToken, "]"); + result.emplace_back(EndMemoryOperandToken, ""); + result.emplace_back(BraceToken, "]"); break; } @@ -1829,7 +1839,7 @@ void X86CommonArchitecture::GetOperandTextATT(const xed_decoded_inst_t* const xe default: { - result.emplace_back(TextToken, "unimplimented"); + result.emplace_back(KeywordToken, "unimplemented"); } // default case of outer switch } // outer switch |
