Home | History | Annotate | Download | only in llvm-c
      1 /*===-- llvm-c/EnhancedDisassembly.h - Disassembler C Interface ---*- C -*-===*\
      2 |*                                                                            *|
      3 |*                     The LLVM Compiler Infrastructure                       *|
      4 |*                                                                            *|
      5 |* This file is distributed under the University of Illinois Open Source      *|
      6 |* License. See LICENSE.TXT for details.                                      *|
      7 |*                                                                            *|
      8 |*===----------------------------------------------------------------------===*|
      9 |*                                                                            *|
     10 |* This header declares the C interface to EnhancedDisassembly.so, which      *|
     11 |* implements a disassembler with the ability to extract operand values and   *|
     12 |* individual tokens from assembly instructions.                              *|
     13 |*                                                                            *|
     14 |* The header declares additional interfaces if the host compiler supports    *|
     15 |* the blocks API.                                                            *|
     16 |*                                                                            *|
     17 \*===----------------------------------------------------------------------===*/
     18 
     19 #ifndef LLVM_C_ENHANCEDDISASSEMBLY_H
     20 #define LLVM_C_ENHANCEDDISASSEMBLY_H
     21 
     22 #include "llvm/Support/DataTypes.h"
     23 
     24 #ifdef __cplusplus
     25 extern "C" {
     26 #endif
     27 
     28 /**
     29  * @defgroup LLVMCEnhancedDisassembly Enhanced Disassembly
     30  * @ingroup LLVMC
     31  * @deprecated
     32  *
     33  * This module contains an interface to the Enhanced Disassembly (edis)
     34  * library. The edis library is deprecated and will likely disappear in
     35  * the near future. You should use the @ref LLVMCDisassembler interface
     36  * instead.
     37  *
     38  * @{
     39  */
     40 
     41 /*!
     42  @typedef EDByteReaderCallback
     43  Interface to memory from which instructions may be read.
     44  @param byte A pointer whose target should be filled in with the data returned.
     45  @param address The address of the byte to be read.
     46  @param arg An anonymous argument for client use.
     47  @result 0 on success; -1 otherwise.
     48  */
     49 typedef int (*EDByteReaderCallback)(uint8_t *byte, uint64_t address, void *arg);
     50 
     51 /*!
     52  @typedef EDRegisterReaderCallback
     53  Interface to registers from which registers may be read.
     54  @param value A pointer whose target should be filled in with the value of the
     55    register.
     56  @param regID The LLVM register identifier for the register to read.
     57  @param arg An anonymous argument for client use.
     58  @result 0 if the register could be read; -1 otherwise.
     59  */
     60 typedef int (*EDRegisterReaderCallback)(uint64_t *value, unsigned regID,
     61                                         void* arg);
     62 
     63 /*!
     64  @typedef EDAssemblySyntax_t
     65  An assembly syntax for use in tokenizing instructions.
     66  */
     67 enum {
     68 /*! @constant kEDAssemblySyntaxX86Intel Intel syntax for i386 and x86_64. */
     69   kEDAssemblySyntaxX86Intel  = 0,
     70 /*! @constant kEDAssemblySyntaxX86ATT AT&T syntax for i386 and x86_64. */
     71   kEDAssemblySyntaxX86ATT    = 1,
     72   kEDAssemblySyntaxARMUAL    = 2
     73 };
     74 typedef unsigned EDAssemblySyntax_t;
     75 
     76 /*!
     77  @typedef EDDisassemblerRef
     78  Encapsulates a disassembler for a single CPU architecture.
     79  */
     80 typedef void *EDDisassemblerRef;
     81 
     82 /*!
     83  @typedef EDInstRef
     84  Encapsulates a single disassembled instruction in one assembly syntax.
     85  */
     86 typedef void *EDInstRef;
     87 
     88 /*!
     89  @typedef EDTokenRef
     90  Encapsulates a token from the disassembly of an instruction.
     91  */
     92 typedef void *EDTokenRef;
     93 
     94 /*!
     95  @typedef EDOperandRef
     96  Encapsulates an operand of an instruction.
     97  */
     98 typedef void *EDOperandRef;
     99 
    100 /*!
    101  @functiongroup Getting a disassembler
    102  */
    103 
    104 /*!
    105  @function EDGetDisassembler
    106  Gets the disassembler for a given target.
    107  @param disassembler A pointer whose target will be filled in with the
    108    disassembler.
    109  @param triple Identifies the target.  Example: "x86_64-apple-darwin10"
    110  @param syntax The assembly syntax to use when decoding instructions.
    111  @result 0 on success; -1 otherwise.
    112  */
    113 int EDGetDisassembler(EDDisassemblerRef *disassembler,
    114                       const char *triple,
    115                       EDAssemblySyntax_t syntax);
    116 
    117 /*!
    118  @functiongroup Generic architectural queries
    119  */
    120 
    121 /*!
    122  @function EDGetRegisterName
    123  Gets the human-readable name for a given register.
    124  @param regName A pointer whose target will be pointed at the name of the
    125    register.  The name does not need to be deallocated and will be
    126  @param disassembler The disassembler to query for the name.
    127  @param regID The register identifier, as returned by EDRegisterTokenValue.
    128  @result 0 on success; -1 otherwise.
    129  */
    130 int EDGetRegisterName(const char** regName,
    131                       EDDisassemblerRef disassembler,
    132                       unsigned regID);
    133 
    134 /*!
    135  @function EDRegisterIsStackPointer
    136  Determines if a register is one of the platform's stack-pointer registers.
    137  @param disassembler The disassembler to query.
    138  @param regID The register identifier, as returned by EDRegisterTokenValue.
    139  @result 1 if true; 0 otherwise.
    140  */
    141 int EDRegisterIsStackPointer(EDDisassemblerRef disassembler,
    142                              unsigned regID);
    143 
    144 /*!
    145  @function EDRegisterIsProgramCounter
    146  Determines if a register is one of the platform's stack-pointer registers.
    147  @param disassembler The disassembler to query.
    148  @param regID The register identifier, as returned by EDRegisterTokenValue.
    149  @result 1 if true; 0 otherwise.
    150  */
    151 int EDRegisterIsProgramCounter(EDDisassemblerRef disassembler,
    152                                unsigned regID);
    153 
    154 /*!
    155  @functiongroup Creating and querying instructions
    156  */
    157 
    158 /*!
    159  @function EDCreateInst
    160  Gets a set of contiguous instructions from a disassembler.
    161  @param insts A pointer to an array that will be filled in with the
    162    instructions.  Must have at least count entries.  Entries not filled in will
    163    be set to NULL.
    164  @param count The maximum number of instructions to fill in.
    165  @param disassembler The disassembler to use when decoding the instructions.
    166  @param byteReader The function to use when reading the instruction's machine
    167    code.
    168  @param address The address of the first byte of the instruction.
    169  @param arg An anonymous argument to be passed to byteReader.
    170  @result The number of instructions read on success; 0 otherwise.
    171  */
    172 unsigned int EDCreateInsts(EDInstRef *insts,
    173                            unsigned int count,
    174                            EDDisassemblerRef disassembler,
    175                            EDByteReaderCallback byteReader,
    176                            uint64_t address,
    177                            void *arg);
    178 
    179 /*!
    180  @function EDReleaseInst
    181  Frees the memory for an instruction.  The instruction can no longer be accessed
    182  after this call.
    183  @param inst The instruction to be freed.
    184  */
    185 void EDReleaseInst(EDInstRef inst);
    186 
    187 /*!
    188  @function EDInstByteSize
    189  @param inst The instruction to be queried.
    190  @result The number of bytes in the instruction's machine-code representation.
    191  */
    192 int EDInstByteSize(EDInstRef inst);
    193 
    194 /*!
    195  @function EDGetInstString
    196  Gets the disassembled text equivalent of the instruction.
    197  @param buf A pointer whose target will be filled in with a pointer to the
    198    string.  (The string becomes invalid when the instruction is released.)
    199  @param inst The instruction to be queried.
    200  @result 0 on success; -1 otherwise.
    201  */
    202 int EDGetInstString(const char **buf,
    203                     EDInstRef inst);
    204 
    205 /*!
    206  @function EDInstID
    207  @param instID A pointer whose target will be filled in with the LLVM identifier
    208    for the instruction.
    209  @param inst The instruction to be queried.
    210  @result 0 on success; -1 otherwise.
    211  */
    212 int EDInstID(unsigned *instID, EDInstRef inst);
    213 
    214 /*!
    215  @function EDInstIsBranch
    216  @param inst The instruction to be queried.
    217  @result 1 if the instruction is a branch instruction; 0 if it is some other
    218    type of instruction; -1 if there was an error.
    219  */
    220 int EDInstIsBranch(EDInstRef inst);
    221 
    222 /*!
    223  @function EDInstIsMove
    224  @param inst The instruction to be queried.
    225  @result 1 if the instruction is a move instruction; 0 if it is some other
    226    type of instruction; -1 if there was an error.
    227  */
    228 int EDInstIsMove(EDInstRef inst);
    229 
    230 /*!
    231  @function EDBranchTargetID
    232  @param inst The instruction to be queried.
    233  @result The ID of the branch target operand, suitable for use with
    234    EDCopyOperand.  -1 if no such operand exists.
    235  */
    236 int EDBranchTargetID(EDInstRef inst);
    237 
    238 /*!
    239  @function EDMoveSourceID
    240  @param inst The instruction to be queried.
    241  @result The ID of the move source operand, suitable for use with
    242    EDCopyOperand.  -1 if no such operand exists.
    243  */
    244 int EDMoveSourceID(EDInstRef inst);
    245 
    246 /*!
    247  @function EDMoveTargetID
    248  @param inst The instruction to be queried.
    249  @result The ID of the move source operand, suitable for use with
    250    EDCopyOperand.  -1 if no such operand exists.
    251  */
    252 int EDMoveTargetID(EDInstRef inst);
    253 
    254 /*!
    255  @functiongroup Creating and querying tokens
    256  */
    257 
    258 /*!
    259  @function EDNumTokens
    260  @param inst The instruction to be queried.
    261  @result The number of tokens in the instruction, or -1 on error.
    262  */
    263 int EDNumTokens(EDInstRef inst);
    264 
    265 /*!
    266  @function EDGetToken
    267  Retrieves a token from an instruction.  The token is valid until the
    268  instruction is released.
    269  @param token A pointer to be filled in with the token.
    270  @param inst The instruction to be queried.
    271  @param index The index of the token in the instruction.
    272  @result 0 on success; -1 otherwise.
    273  */
    274 int EDGetToken(EDTokenRef *token,
    275                EDInstRef inst,
    276                int index);
    277 
    278 /*!
    279  @function EDGetTokenString
    280  Gets the disassembled text for a token.
    281  @param buf A pointer whose target will be filled in with a pointer to the
    282    string.  (The string becomes invalid when the token is released.)
    283  @param token The token to be queried.
    284  @result 0 on success; -1 otherwise.
    285  */
    286 int EDGetTokenString(const char **buf,
    287                      EDTokenRef token);
    288 
    289 /*!
    290  @function EDOperandIndexForToken
    291  Returns the index of the operand to which a token belongs.
    292  @param token The token to be queried.
    293  @result The operand index on success; -1 otherwise
    294  */
    295 int EDOperandIndexForToken(EDTokenRef token);
    296 
    297 /*!
    298  @function EDTokenIsWhitespace
    299  @param token The token to be queried.
    300  @result 1 if the token is whitespace; 0 if not; -1 on error.
    301  */
    302 int EDTokenIsWhitespace(EDTokenRef token);
    303 
    304 /*!
    305  @function EDTokenIsPunctuation
    306  @param token The token to be queried.
    307  @result 1 if the token is punctuation; 0 if not; -1 on error.
    308  */
    309 int EDTokenIsPunctuation(EDTokenRef token);
    310 
    311 /*!
    312  @function EDTokenIsOpcode
    313  @param token The token to be queried.
    314  @result 1 if the token is opcode; 0 if not; -1 on error.
    315  */
    316 int EDTokenIsOpcode(EDTokenRef token);
    317 
    318 /*!
    319  @function EDTokenIsLiteral
    320  @param token The token to be queried.
    321  @result 1 if the token is a numeric literal; 0 if not; -1 on error.
    322  */
    323 int EDTokenIsLiteral(EDTokenRef token);
    324 
    325 /*!
    326  @function EDTokenIsRegister
    327  @param token The token to be queried.
    328  @result 1 if the token identifies a register; 0 if not; -1 on error.
    329  */
    330 int EDTokenIsRegister(EDTokenRef token);
    331 
    332 /*!
    333  @function EDTokenIsNegativeLiteral
    334  @param token The token to be queried.
    335  @result 1 if the token is a negative signed literal; 0 if not; -1 on error.
    336  */
    337 int EDTokenIsNegativeLiteral(EDTokenRef token);
    338 
    339 /*!
    340  @function EDLiteralTokenAbsoluteValue
    341  @param value A pointer whose target will be filled in with the absolute value
    342    of the literal.
    343  @param token The token to be queried.
    344  @result 0 on success; -1 otherwise.
    345  */
    346 int EDLiteralTokenAbsoluteValue(uint64_t *value,
    347                                 EDTokenRef token);
    348 
    349 /*!
    350  @function EDRegisterTokenValue
    351  @param registerID A pointer whose target will be filled in with the LLVM
    352    register identifier for the token.
    353  @param token The token to be queried.
    354  @result 0 on success; -1 otherwise.
    355  */
    356 int EDRegisterTokenValue(unsigned *registerID,
    357                          EDTokenRef token);
    358 
    359 /*!
    360  @functiongroup Creating and querying operands
    361  */
    362 
    363 /*!
    364  @function EDNumOperands
    365  @param inst The instruction to be queried.
    366  @result The number of operands in the instruction, or -1 on error.
    367  */
    368 int EDNumOperands(EDInstRef inst);
    369 
    370 /*!
    371  @function EDGetOperand
    372  Retrieves an operand from an instruction.  The operand is valid until the
    373  instruction is released.
    374  @param operand A pointer to be filled in with the operand.
    375  @param inst The instruction to be queried.
    376  @param index The index of the operand in the instruction.
    377  @result 0 on success; -1 otherwise.
    378  */
    379 int EDGetOperand(EDOperandRef *operand,
    380                  EDInstRef inst,
    381                  int index);
    382 
    383 /*!
    384  @function EDOperandIsRegister
    385  @param operand The operand to be queried.
    386  @result 1 if the operand names a register; 0 if not; -1 on error.
    387  */
    388 int EDOperandIsRegister(EDOperandRef operand);
    389 
    390 /*!
    391  @function EDOperandIsImmediate
    392  @param operand The operand to be queried.
    393  @result 1 if the operand specifies an immediate value; 0 if not; -1 on error.
    394  */
    395 int EDOperandIsImmediate(EDOperandRef operand);
    396 
    397 /*!
    398  @function EDOperandIsMemory
    399  @param operand The operand to be queried.
    400  @result 1 if the operand specifies a location in memory; 0 if not; -1 on error.
    401  */
    402 int EDOperandIsMemory(EDOperandRef operand);
    403 
    404 /*!
    405  @function EDRegisterOperandValue
    406  @param value A pointer whose target will be filled in with the LLVM register ID
    407    of the register named by the operand.
    408  @param operand The operand to be queried.
    409  @result 0 on success; -1 otherwise.
    410  */
    411 int EDRegisterOperandValue(unsigned *value,
    412                            EDOperandRef operand);
    413 
    414 /*!
    415  @function EDImmediateOperandValue
    416  @param value A pointer whose target will be filled in with the value of the
    417    immediate.
    418  @param operand The operand to be queried.
    419  @result 0 on success; -1 otherwise.
    420  */
    421 int EDImmediateOperandValue(uint64_t *value,
    422                             EDOperandRef operand);
    423 
    424 /*!
    425  @function EDEvaluateOperand
    426  Evaluates an operand using a client-supplied register state accessor.  Register
    427  operands are evaluated by reading the value of the register; immediate operands
    428  are evaluated by reporting the immediate value; memory operands are evaluated
    429  by computing the target address (with only those relocations applied that were
    430  already applied to the original bytes).
    431  @param result A pointer whose target is to be filled with the result of
    432    evaluating the operand.
    433  @param operand The operand to be evaluated.
    434  @param regReader The function to use when reading registers from the register
    435    state.
    436  @param arg An anonymous argument for client use.
    437  @result 0 if the operand could be evaluated; -1 otherwise.
    438  */
    439 int EDEvaluateOperand(uint64_t *result,
    440                       EDOperandRef operand,
    441                       EDRegisterReaderCallback regReader,
    442                       void *arg);
    443 
    444 #ifdef __BLOCKS__
    445 
    446 /*!
    447  @typedef EDByteBlock_t
    448  Block-based interface to memory from which instructions may be read.
    449  @param byte A pointer whose target should be filled in with the data returned.
    450  @param address The address of the byte to be read.
    451  @result 0 on success; -1 otherwise.
    452  */
    453 typedef int (^EDByteBlock_t)(uint8_t *byte, uint64_t address);
    454 
    455 /*!
    456  @typedef EDRegisterBlock_t
    457  Block-based interface to registers from which registers may be read.
    458  @param value A pointer whose target should be filled in with the value of the
    459    register.
    460  @param regID The LLVM register identifier for the register to read.
    461  @result 0 if the register could be read; -1 otherwise.
    462  */
    463 typedef int (^EDRegisterBlock_t)(uint64_t *value, unsigned regID);
    464 
    465 /*!
    466  @typedef EDTokenVisitor_t
    467  Block-based handler for individual tokens.
    468  @param token The current token being read.
    469  @result 0 to continue; 1 to stop normally; -1 on error.
    470  */
    471 typedef int (^EDTokenVisitor_t)(EDTokenRef token);
    472 
    473 /*! @functiongroup Block-based interfaces */
    474 
    475 /*!
    476  @function EDBlockCreateInsts
    477  Gets a set of contiguous instructions from a disassembler, using a block to
    478  read memory.
    479  @param insts A pointer to an array that will be filled in with the
    480    instructions.  Must have at least count entries.  Entries not filled in will
    481    be set to NULL.
    482  @param count The maximum number of instructions to fill in.
    483  @param disassembler The disassembler to use when decoding the instructions.
    484  @param byteBlock The block to use when reading the instruction's machine
    485    code.
    486  @param address The address of the first byte of the instruction.
    487  @result The number of instructions read on success; 0 otherwise.
    488  */
    489 unsigned int EDBlockCreateInsts(EDInstRef *insts,
    490                                 int count,
    491                                 EDDisassemblerRef disassembler,
    492                                 EDByteBlock_t byteBlock,
    493                                 uint64_t address);
    494 
    495 /*!
    496  @function EDBlockEvaluateOperand
    497  Evaluates an operand using a block to read registers.
    498  @param result A pointer whose target is to be filled with the result of
    499    evaluating the operand.
    500  @param operand The operand to be evaluated.
    501  @param regBlock The block to use when reading registers from the register
    502    state.
    503  @result 0 if the operand could be evaluated; -1 otherwise.
    504  */
    505 int EDBlockEvaluateOperand(uint64_t *result,
    506                            EDOperandRef operand,
    507                            EDRegisterBlock_t regBlock);
    508 
    509 /*!
    510  @function EDBlockVisitTokens
    511  Visits every token with a visitor.
    512  @param inst The instruction with the tokens to be visited.
    513  @param visitor The visitor.
    514  @result 0 if the visit ended normally; -1 if the visitor encountered an error
    515    or there was some other error.
    516  */
    517 int EDBlockVisitTokens(EDInstRef inst,
    518                        EDTokenVisitor_t visitor);
    519 
    520 /**
    521  * @}
    522  */
    523 
    524 #endif
    525 
    526 #ifdef __cplusplus
    527 }
    528 #endif
    529 
    530 #endif
    531