[X86][Disassembler] Simplify

This commit is contained in:
Fangrui Song 2020-01-11 18:08:06 -08:00
parent c5b94ea265
commit 51c1d7c4be
3 changed files with 7 additions and 45 deletions

View File

@ -97,12 +97,6 @@ void llvm::X86Disassembler::Debug(const char *file, unsigned line,
dbgs() << file << ":" << line << ": " << s;
}
StringRef llvm::X86Disassembler::GetInstrName(unsigned Opcode,
const void *mii) {
const MCInstrInfo *MII = static_cast<const MCInstrInfo *>(mii);
return MII->getName(Opcode);
}
#define debug(s) LLVM_DEBUG(Debug(__FILE__, __LINE__, s));
namespace llvm {

View File

@ -15,6 +15,7 @@
#include "X86DisassemblerDecoder.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/MC/MCInstrInfo.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
@ -60,18 +61,6 @@ struct ContextDecision {
#define debug(s) do { } while (0)
#endif
/*
* contextForAttrs - Client for the instruction context table. Takes a set of
* attributes and returns the appropriate decode context.
*
* @param attrMask - Attributes, from the enumeration attributeBits.
* @return - The InstructionContext to use when looking up an
* an instruction with these attributes.
*/
static InstructionContext contextForAttrs(uint16_t attrMask) {
return static_cast<InstructionContext>(CONTEXTS_SYM[attrMask]);
}
/*
* modRMRequired - Reads the appropriate instruction table to determine whether
* the ModR/M byte is required to decode a particular instruction.
@ -86,7 +75,7 @@ static InstructionContext contextForAttrs(uint16_t attrMask) {
static int modRMRequired(OpcodeType type,
InstructionContext insnContext,
uint16_t opcode) {
const struct ContextDecision* decision = nullptr;
const struct ContextDecision *decision;
switch (type) {
case ONEBYTE:
@ -698,7 +687,7 @@ static int getIDWithAttrMask(uint16_t* instructionID,
uint16_t attrMask) {
bool hasModRMExtension;
InstructionContext instructionClass = contextForAttrs(attrMask);
auto instructionClass = InstructionContext(CONTEXTS_SYM[attrMask]);
hasModRMExtension = modRMRequired(insn->opcodeType,
instructionClass,
@ -774,7 +763,7 @@ static bool is64Bit(const char *name) {
* @return - 0 if the ModR/M could be read when needed or was not needed;
* nonzero otherwise.
*/
static int getID(struct InternalInstruction* insn, const MCInstrInfo *miiArg) {
static int getID(struct InternalInstruction* insn, const MCInstrInfo *mii) {
uint16_t attrMask;
uint16_t instructionID;
@ -946,7 +935,7 @@ static int getID(struct InternalInstruction* insn, const MCInstrInfo *miiArg) {
return 0;
}
auto SpecName = GetInstrName(instructionIDWithREXW, miiArg);
auto SpecName = mii->getName(instructionIDWithREXW);
// If not a 64-bit instruction. Switch the opcode.
if (!is64Bit(SpecName.data())) {
insn->instructionID = instructionIDWithREXW;
@ -1018,8 +1007,8 @@ static int getID(struct InternalInstruction* insn, const MCInstrInfo *miiArg) {
return 0;
}
specName = GetInstrName(instructionID, miiArg);
specWithOpSizeName = GetInstrName(instructionIDWithOpsize, miiArg);
specName = mii->getName(instructionID);
specWithOpSizeName = mii->getName(instructionIDWithOpsize);
if (is16BitEquivalent(specName.data(), specWithOpSizeName.data()) &&
(insn->mode == MODE_16BIT) ^ insn->hasOpSize) {

View File

@ -505,25 +505,6 @@ enum VectorExtensionType {
TYPE_XOP = 0x4
};
/// Type for the byte reader that the consumer must provide to
/// the decoder. Reads a single byte from the instruction's address space.
/// \param arg A baton that the consumer can associate with any internal
/// state that it needs.
/// \param byte A pointer to a single byte in memory that should be set to
/// contain the value at address.
/// \param address The address in the instruction's address space that should
/// be read from.
/// \return -1 if the byte cannot be read for any reason; 0 otherwise.
typedef int (*byteReader_t)(const void *arg, uint8_t *byte, uint64_t address);
/// Type for the logging function that the consumer can provide to
/// get debugging output from the decoder.
/// \param arg A baton that the consumer can associate with any internal
/// state that it needs.
/// \param log A string that contains the message. Will be reused after
/// the logger returns.
typedef void (*dlog_t)(void *arg, const char *log);
/// The specification for how to extract and interpret a full instruction and
/// its operands.
struct InstructionSpecifier {
@ -664,8 +645,6 @@ int decodeInstruction(InternalInstruction *insn, const MCInstrInfo *mii);
/// \param s The message to print.
void Debug(const char *file, unsigned line, const char *s);
StringRef GetInstrName(unsigned Opcode, const void *mii);
} // namespace X86Disassembler
} // namespace llvm