diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-04-05 01:04:27 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-04-05 01:04:27 +0000 |
commit | 1b0194d646d67c341a162c580196bb25aee2e12a (patch) | |
tree | 6a432d546927156ed03da72fc895e5c8e2a7ae6c /lib/Target/ARM/Disassembler/ARMDisassemblerCore.h | |
parent | 90429c487fe62582241ffe0d3e8acce936f2f8bc (diff) |
Reverting 100265 to try to get buildbots green again. Lots of self-hosting buildbots started complaining since this commit. Also xfail ARM disassembly tests.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100378 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/Disassembler/ARMDisassemblerCore.h')
-rw-r--r-- | lib/Target/ARM/Disassembler/ARMDisassemblerCore.h | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h b/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h index 3075230370..6d742512f8 100644 --- a/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h +++ b/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h @@ -13,8 +13,8 @@ // specifies the encoding used by the instruction, as well as a helper function // to convert the enums to printable char strings. // -// It also contains code to represent the concepts of Builder and DisassembleFP -// to solve the problem of disassembling an ARM instr. +// It also contains code to represent the concepts of Builder, Builder Factory, +// as well as the Algorithm to solve the problem of disassembling an ARM instr. // //===----------------------------------------------------------------------===// @@ -171,23 +171,60 @@ typedef ARMBasicMCBuilder *BO; typedef bool (*DisassembleFP)(MCInst &MI, unsigned Opcode, uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO Builder); +/// ARMAlgorithm - ARMAlgorithm implements the ARM/Thumb disassembly by solving +/// the problem of building the MCOperands of an MCInst. Construction of +/// ARMAlgorithm requires passing in a function pointer with the DisassembleFP +/// data type. +class ARMAlgorithm { +public: + /// GetInstance - GetInstance returns an instance of ARMAlgorithm given the + /// encoding Format. API clients should not free up the returned instance. + static ARMAlgorithm *GetInstance(ARMFormat Format); + + /// DoCleanup - DoCleanup is meant to be called upon exit as an exit handler. + static void DoCleanup(); + + /// Return true if this algorithm successfully disassembles the instruction. + /// NumOpsAdded is updated to reflect the number of operands added by the + /// algorithm. NumOpsAdded may be less than NumOps, in which case, there are + /// operands unaccounted for which need to be dealt with by the API client. + bool Solve(MCInst &MI, unsigned Opcode, uint32_t insn, unsigned short NumOps, + unsigned &NumOpsAdded, BO Builder) const { + if (Disassemble == NULL) + return false; + + return (*Disassemble)(MI, Opcode, insn, NumOps, NumOpsAdded, Builder); + } + +private: + ARMAlgorithm(DisassembleFP fp) : Disassemble(fp) {} + ARMAlgorithm(ARMAlgorithm &AA) : Disassemble(AA.Disassemble) {} + + virtual ~ARMAlgorithm() {} + + DisassembleFP Disassemble; +}; + /// ARMBasicMCBuilder - ARMBasicMCBuilder represents an ARM MCInst builder that /// knows how to build up the MCOperand list. class ARMBasicMCBuilder { unsigned Opcode; ARMFormat Format; unsigned short NumOps; - DisassembleFP Disasm; + const ARMAlgorithm &Algo; Session *SP; public: ARMBasicMCBuilder(ARMBasicMCBuilder &B) - : Opcode(B.Opcode), Format(B.Format), NumOps(B.NumOps), Disasm(B.Disasm), + : Opcode(B.Opcode), Format(B.Format), NumOps(B.NumOps), Algo(B.Algo), SP(B.SP) {} - /// Opcode, Format, and NumOperands make up an ARM Basic MCBuilder. - ARMBasicMCBuilder(unsigned opc, ARMFormat format, unsigned short num); + /// Opcode, Format, NumOperands, and Algo make an ARM Basic MCBuilder. + ARMBasicMCBuilder(unsigned opc, ARMFormat format, unsigned short num, + const ARMAlgorithm &algo) + : Opcode(opc), Format(format), NumOps(num), Algo(algo), SP(0) + {} virtual ~ARMBasicMCBuilder() {} @@ -219,9 +256,9 @@ public: /// BuildIt - BuildIt performs the build step for this ARM Basic MC Builder. /// The general idea is to set the Opcode for the MCInst, followed by adding /// the appropriate MCOperands to the MCInst. ARM Basic MC Builder delegates - /// to the Format-specific disassemble function for disassembly, followed by - /// TryPredicateAndSBitModifier() for PredicateOperand and OptionalDefOperand - /// which follow the Dst/Src Operands. + /// to the Algo (ARM Disassemble Algorithm) object to perform Format-specific + /// disassembly, followed by class method TryPredicateAndSBitModifier() to do + /// PredicateOperand and OptionalDefOperand which follow the Dst/Src Operands. virtual bool BuildIt(MCInst &MI, uint32_t insn); /// RunBuildAfterHook - RunBuildAfterHook performs operations deemed necessary |