1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

Filled in a few new APIs for the enhanced

disassembly library that provide access to
instruction information, and fixed ambiguous
wording in the comments for the header.

llvm-svn: 95274
This commit is contained in:
Sean Callanan 2010-02-04 01:43:08 +00:00
parent 05d47a0cf5
commit 7662f4139b
4 changed files with 62 additions and 1 deletions

View File

@ -176,7 +176,7 @@ void EDReleaseInst(EDInstRef inst);
/*! /*!
@function EDInstByteSize @function EDInstByteSize
@param inst The instruction to be queried. @param inst The instruction to be queried.
@result The number of bytes consumed by the instruction. @result The number of bytes in the instruction's machine-code representation.
*/ */
int EDInstByteSize(EDInstRef inst); int EDInstByteSize(EDInstRef inst);

View File

@ -201,6 +201,34 @@ int EDGetOperand(EDOperandRef *operand,
return inst->getOperand(*operand, index); return inst->getOperand(*operand, index);
} }
int EDOperandIsRegister(EDOperandRef operand) {
return operand->isRegister();
}
int EDOperandIsImmediate(EDOperandRef operand) {
return operand->isImmediate();
}
int EDOperandIsMemory(EDOperandRef operand) {
return operand->isMemory();
}
int EDRegisterOperandValue(unsigned *value,
EDOperandRef operand) {
if(!operand->isRegister())
return -1;
*value = operand->regVal();
return 0;
}
int EDImmedateOperandValue(uint64_t *value,
EDOperandRef operand) {
if(!operand->isImmediate())
return -1;
*value = operand->immediateVal();
return 0;
}
int EDEvaluateOperand(uint64_t *result, int EDEvaluateOperand(uint64_t *result,
EDOperandRef operand, EDOperandRef operand,
EDRegisterReaderCallback regReader, EDRegisterReaderCallback regReader,

View File

@ -125,6 +125,26 @@ int EDOperand::evaluate(uint64_t &result,
return -1; return -1;
} }
int EDOperand::isRegister() {
return(Inst.ThisInstInfo->operandFlags[OpIndex] & kOperandFlagRegister);
}
unsigned EDOperand::regVal() {
return Inst.Inst->getOperand(MCOpIndex).getReg();
}
int EDOperand::isImmediate() {
return(Inst.ThisInstInfo->operandFlags[OpIndex] & kOperandFlagImmediate);
}
uint64_t EDOperand::immediateVal() {
return Inst.Inst->getOperand(MCOpIndex).getImm();
}
int EDOperand::isMemory() {
return(Inst.ThisInstInfo->operandFlags[OpIndex] & kOperandFlagMemory);
}
#ifdef __BLOCKS__ #ifdef __BLOCKS__
struct RegisterReaderWrapper { struct RegisterReaderWrapper {
EDRegisterBlock_t regBlock; EDRegisterBlock_t regBlock;

View File

@ -54,6 +54,19 @@ struct EDOperand {
int evaluate(uint64_t &result, int evaluate(uint64_t &result,
EDRegisterReaderCallback callback, EDRegisterReaderCallback callback,
void *arg); void *arg);
/// isRegister - Returns 1 if the operand is a register or 0 otherwise
int isRegister();
/// regVal - Returns the register value.
unsigned regVal();
/// isImmediate - Returns 1 if the operand is an immediate or 0 otherwise
int isImmediate();
/// immediateVal - Returns the immediate value.
uint64_t immediateVal();
/// isMemory - Returns 1 if the operand is a memory location or 0 otherwise
int isMemory();
#ifdef __BLOCKS__ #ifdef __BLOCKS__
/// evaluate - Like evaluate for a callback, but uses a block instead /// evaluate - Like evaluate for a callback, but uses a block instead