1847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner//===-- EDDisassembler.h - LLVM Enhanced Disassembler -----------*- C++ -*-===// 2ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// 3ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// The LLVM Compiler Infrastructure 4ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// 5ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// This file is distributed under the University of Illinois Open Source 6ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// License. See LICENSE.TXT for details. 7ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// 8ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan//===----------------------------------------------------------------------===// 9ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// 10ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// This file defines the interface for the Enhanced Disassembly library's 11ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// disassembler class. The disassembler is responsible for vending individual 12ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// instructions according to a given architecture and disassembly syntax. 13ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan// 14ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan//===----------------------------------------------------------------------===// 15ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 16847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner#ifndef LLVM_EDDISASSEMBLER_H 17847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner#define LLVM_EDDISASSEMBLER_H 18ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 19a4f15d66ab219dcf969412496381dce5f4fc16a2Chris Lattner#include "EDInfo.h" 20ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 21ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan#include "llvm/ADT/OwningPtr.h" 22ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan#include "llvm/ADT/Triple.h" 23ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan#include "llvm/Support/raw_ostream.h" 241f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Mutex.h" 25ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 26ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan#include <map> 27ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan#include <set> 283f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan#include <string> 29ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan#include <vector> 30ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 31ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanannamespace llvm { 32ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass AsmLexer; 330e6a052331f674dd70e28af41f654a7874405eabEvan Chengclass AsmParser; 34ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass AsmToken; 35ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass MCContext; 36ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass MCAsmInfo; 37ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass MCAsmLexer; 38ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass MCDisassembler; 39ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass MCInst; 4017463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topperclass MCInstPrinter; 4117463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topperclass MCInstrInfo; 42ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass MCParsedAsmOperand; 430e6a052331f674dd70e28af41f654a7874405eabEvan Chengclass MCRegisterInfo; 44ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass MCStreamer; 45ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Chengclass MCSubtargetInfo; 4694b9550a32d189704a8eae55505edf62662c0534Evan Chengclass MCTargetAsmLexer; 4794b9550a32d189704a8eae55505edf62662c0534Evan Chengclass MCTargetAsmParser; 48ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanantemplate <typename T> class SmallVectorImpl; 49ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass SourceMgr; 50ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananclass Target; 519899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan 529899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callananstruct EDInstInfo; 53847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattnerstruct EDInst; 54847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattnerstruct EDOperand; 55847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattnerstruct EDToken; 56847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner 57847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattnertypedef int (*EDByteReaderCallback)(uint8_t *byte, uint64_t address, void *arg); 58ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 59ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan/// EDDisassembler - Encapsulates a disassembler for a single architecture and 60ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan/// disassembly syntax. Also manages the static disassembler registry. 61ee5dfd42f1361da9e44b768a12495be235d6043fSean Callananstruct EDDisassembler { 62847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner typedef enum { 63847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner /*! @constant kEDAssemblySyntaxX86Intel Intel syntax for i386 and x86_64. */ 64847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner kEDAssemblySyntaxX86Intel = 0, 65847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner /*! @constant kEDAssemblySyntaxX86ATT AT&T syntax for i386 and x86_64. */ 66847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner kEDAssemblySyntaxX86ATT = 1, 67847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner kEDAssemblySyntaxARMUAL = 2 68847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner } AssemblySyntax; 69847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner 70847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner 71ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan //////////////////// 72ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan // Static members // 73ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan //////////////////// 74ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 75ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// CPUKey - Encapsulates the descriptor of an architecture/disassembly-syntax 76ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// pair 77ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan struct CPUKey { 78ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The architecture type 793f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan std::string Triple; 80ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 81ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The assembly syntax 82847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner AssemblySyntax Syntax; 83ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 84ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// operator== - Equality operator 85ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan bool operator==(const CPUKey &key) const { 863f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan return (Triple == key.Triple && 87ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan Syntax == key.Syntax); 88ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan } 89ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 90ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// operator< - Less-than operator 91ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan bool operator<(const CPUKey &key) const { 923f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan return ((Triple < key.Triple) || 933f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan ((Triple == key.Triple) && Syntax < (key.Syntax))); 94ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan } 95ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan }; 96ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 97ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan typedef std::map<CPUKey, EDDisassembler*> DisassemblerMap_t; 98ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 99ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// A map from disassembler specifications to disassemblers. Populated 100ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// lazily. 101ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan static DisassemblerMap_t sDisassemblers; 102ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 103ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// getDisassembler - Returns the specified disassemble, or NULL on failure 104ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 105ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg arch - The desired architecture 106ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg syntax - The desired disassembly syntax 107ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan static EDDisassembler *getDisassembler(llvm::Triple::ArchType arch, 108847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner AssemblySyntax syntax); 109ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 110ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// getDisassembler - Returns the disassembler for a given combination of 111ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// CPU type, CPU subtype, and assembly syntax, or NULL on failure 112ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 113ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg str - The string representation of the architecture triple, e.g., 114ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// "x86_64-apple-darwin" 115ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg syntax - The disassembly syntax for the required disassembler 116ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan static EDDisassembler *getDisassembler(llvm::StringRef str, 117847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner AssemblySyntax syntax); 118ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 119ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan //////////////////////// 120ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan // Per-object members // 121ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan //////////////////////// 122ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 1238f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan /// True only if the object has been successfully initialized 124ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan bool Valid; 1258f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan /// True if the disassembler can provide semantic information 1268f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan bool HasSemantics; 127ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 1288f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan /// The stream to write errors to 1298f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan llvm::raw_ostream &ErrorStream; 130ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 1313f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan /// The triple/syntax pair for the current architecture 132ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan CPUKey Key; 1333f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan /// The Triple fur the current architecture 1343f4f34c7ba24c3703a0cddf778183f7d876ac83fSean Callanan Triple TgtTriple; 135ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The LLVM target corresponding to the disassembler 136ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan const llvm::Target *Tgt; 137ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The assembly information for the target architecture 138ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::OwningPtr<const llvm::MCAsmInfo> AsmInfo; 139b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy /// The subtarget information for the target architecture 140b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy llvm::OwningPtr<const llvm::MCSubtargetInfo> STI; 14117463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper // The instruction information for the target architecture. 14217463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper llvm::OwningPtr<const llvm::MCInstrInfo> MII; 1430e6a052331f674dd70e28af41f654a7874405eabEvan Cheng // The register information for the target architecture. 1440e6a052331f674dd70e28af41f654a7874405eabEvan Cheng llvm::OwningPtr<const llvm::MCRegisterInfo> MRI; 145ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The disassembler for the target architecture 146ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::OwningPtr<const llvm::MCDisassembler> Disassembler; 147ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The output string for the instruction printer; must be guarded with 148ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// PrinterMutex 149ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::OwningPtr<std::string> InstString; 150ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The output stream for the disassembler; must be guarded with 151ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// PrinterMutex 152ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::OwningPtr<llvm::raw_string_ostream> InstStream; 153ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The instruction printer for the target architecture; must be guarded with 154ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// PrinterMutex when printing 155ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::OwningPtr<llvm::MCInstPrinter> InstPrinter; 156ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The mutex that guards the instruction printer's printing functions, which 157ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// use a shared stream 158ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::sys::Mutex PrinterMutex; 159ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The array of instruction information provided by the TableGen backend for 160ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// the target architecture 1619899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan const llvm::EDInstInfo *InstInfos; 162ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The target-specific lexer for use in tokenizing strings, in 163ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// target-independent and target-specific portions 164ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::OwningPtr<llvm::AsmLexer> GenericAsmLexer; 16594b9550a32d189704a8eae55505edf62662c0534Evan Cheng llvm::OwningPtr<llvm::MCTargetAsmLexer> SpecificAsmLexer; 166ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The guard for the above 167ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::sys::Mutex ParserMutex; 168ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// The LLVM number used for the target disassembly syntax variant 169ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan int LLVMSyntaxVariant; 170ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 171ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan typedef std::vector<std::string> regvec_t; 172ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan typedef std::map<std::string, unsigned> regrmap_t; 173ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 174ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// A vector of registers for quick mapping from LLVM register IDs to names 175ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan regvec_t RegVec; 176ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// A map of registers for quick mapping from register names to LLVM IDs 177ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan regrmap_t RegRMap; 178ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 179ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// A set of register IDs for aliases of the stack pointer for the current 180ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// architecture 181ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan std::set<unsigned> stackPointers; 182ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// A set of register IDs for aliases of the program counter for the current 183ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// architecture 184ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan std::set<unsigned> programCounters; 185ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 186ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// Constructor - initializes a disassembler with all the necessary objects, 187ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// which come pre-allocated from the registry accessor function 188ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 189ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg key - the architecture and disassembly syntax for the 190ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// disassembler 191ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan EDDisassembler(CPUKey& key); 192ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 193ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// valid - reports whether there was a failure in the constructor. 194ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan bool valid() { 195ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan return Valid; 196ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan } 197ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 1988f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan /// hasSemantics - reports whether the disassembler can provide operands and 1998f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan /// tokens. 2008f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan bool hasSemantics() { 2018f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan return HasSemantics; 2028f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan } 2038f993b8c244bb5ec19d004a070eb9f32c5a29b1aSean Callanan 204ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan ~EDDisassembler(); 205ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 206ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// createInst - creates and returns an instruction given a callback and 207ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// memory address, or NULL on failure 208ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 209ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg byteReader - A callback function that provides machine code bytes 210ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg address - The address of the first byte of the instruction, 211ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// suitable for passing to byteReader 212ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg arg - An opaque argument for byteReader 213ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan EDInst *createInst(EDByteReaderCallback byteReader, 214ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan uint64_t address, 215ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan void *arg); 216ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 217ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// initMaps - initializes regVec and regRMap using the provided register 218ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// info 219ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 220ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg registerInfo - the register information to use as a source 2211b0fc9b4182d6bd0703cdfb3b0b91d1e093c946cEvan Cheng void initMaps(const llvm::MCRegisterInfo ®isterInfo); 222ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// nameWithRegisterID - Returns the name (owned by the EDDisassembler) of a 223ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// register for a given register ID, or NULL on failure 224ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 225ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg registerID - the ID of the register to be queried 226ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan const char *nameWithRegisterID(unsigned registerID) const; 227ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// registerIDWithName - Returns the ID of a register for a given register 228ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// name, or (unsigned)-1 on failure 229ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 230ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg name - The name of the register 231ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan unsigned registerIDWithName(const char *name) const; 232ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 233ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// registerIsStackPointer - reports whether a register ID is an alias for the 234ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// stack pointer register 235ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 236ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg registerID - The LLVM register ID 237ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan bool registerIsStackPointer(unsigned registerID); 238ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// registerIsStackPointer - reports whether a register ID is an alias for the 239ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// stack pointer register 240ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 241ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg registerID - The LLVM register ID 242ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan bool registerIsProgramCounter(unsigned registerID); 243ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 244ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// printInst - prints an MCInst to a string, returning 0 on success, or -1 245ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// otherwise 246ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 247ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg str - A reference to a string which is filled in with the string 248ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// representation of the instruction 249ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg inst - A reference to the MCInst to be printed 250ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan int printInst(std::string& str, 251ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::MCInst& inst); 252ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 253ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// parseInst - extracts operands and tokens from a string for use in 254ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// tokenizing the string. Returns 0 on success, or -1 otherwise. 255ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// 256ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg operands - A reference to a vector that will be filled in with the 257ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// parsed operands 258ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg tokens - A reference to a vector that will be filled in with the 259ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// tokens 260ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// @arg str - The string representation of the instruction 261ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan int parseInst(llvm::SmallVectorImpl<llvm::MCParsedAsmOperand*> &operands, 262ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan llvm::SmallVectorImpl<llvm::AsmToken> &tokens, 263ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan const std::string &str); 264ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 265ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan /// llvmSyntaxVariant - returns the LLVM syntax variant for this disassembler 266ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan int llvmSyntaxVariant() const; 267ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan}; 268ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan 269847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner} // end namespace llvm 270847da55716e9c1d39c08ed052bc86d28796cb91fChris Lattner 271ee5dfd42f1361da9e44b768a12495be235d6043fSean Callanan#endif 272