Filled in a few new APIs for the enhanced
authorSean Callanan <scallanan@apple.com>
Thu, 4 Feb 2010 01:43:08 +0000 (01:43 +0000)
committerSean Callanan <scallanan@apple.com>
Thu, 4 Feb 2010 01:43:08 +0000 (01:43 +0000)
disassembly library that provide access to
instruction information, and fixed ambiguous
wording in the comments for the header.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95274 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm-c/EnhancedDisassembly.h
tools/edis/EDMain.cpp
tools/edis/EDOperand.cpp
tools/edis/EDOperand.h

index 54a42221972019a80cd4404f51bb6b1ff7c4fe79..a9703f5995d216b3c2debf641946181a1ef432b3 100644 (file)
@@ -176,7 +176,7 @@ void EDReleaseInst(EDInstRef inst);
 /*!
  @function EDInstByteSize
  @param inst The instruction to be queried.
 /*!
  @function EDInstByteSize
  @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);
 
index c2c179693e9546be6641ae300a21dbc8a1a35a65..1d2a6078b5eab88c7a08cbeb0b26fd4bb079ceb3 100644 (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,
                       EDOperandRef operand,
                       EDRegisterReaderCallback regReader,
 int EDEvaluateOperand(uint64_t *result,
                       EDOperandRef operand,
                       EDRegisterReaderCallback regReader,
index c15860affda526ac74bafded0fa49daba66381bf..da6797e035d8233c136658c715eb70b3865c9d85 100644 (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__
 struct RegisterReaderWrapper {
   EDRegisterBlock_t regBlock;
 #ifdef __BLOCKS__
 struct RegisterReaderWrapper {
   EDRegisterBlock_t regBlock;
index 32d3a5ef83dcd19ace0c85254b9e1dd768f01a16..ad9345b758bded5290a04dd4625d07098d9a4143 100644 (file)
@@ -54,6 +54,19 @@ struct EDOperand {
   int evaluate(uint64_t &result,
                EDRegisterReaderCallback callback,
                void *arg);
   int evaluate(uint64_t &result,
                EDRegisterReaderCallback callback,
                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__
   /// evaluate - Like evaluate for a callback, but uses a block instead
   
 #ifdef __BLOCKS__
   /// evaluate - Like evaluate for a callback, but uses a block instead