diff --git a/include/interfaces/irdb/STARSInstruction.h b/include/interfaces/irdb/STARSInstruction.h index b49c243b78d818bc88f78d7ed9e2c2824f7d7cf5..d4217680b98706c1a061a903253ae7297997ceb1 100644 --- a/include/interfaces/irdb/STARSInstruction.h +++ b/include/interfaces/irdb/STARSInstruction.h @@ -22,10 +22,14 @@ class STARS_IRDB_Instruction_t : public STARS_Instruction_t // Data initialization methods // jdh: get DISASM structure? why not done in constructor? +// ANSWER: We could call from constructor, but then we have to change some code that calls SMPInstr::FillCmd() and +// add some sort of query to get the bool return value of the current STARS_GetCmd(), i.e. to indicate that there +// were no errors in IDA Pro or beaEngine. virtual bool STARS_GetCmd(void) { assert(0); } // Get (accessor) methods // jdh: OK if insn sizes aren't well defined? +// ANSWER: Shouldn't the size of machine code in bytes be available from beaEngine? virtual inline uint16_t GetSize(void) const { assert(0); } virtual inline uint16_t GetIDAOpcode(void) const { assert(0); } virtual STARS_InstructionID_t GetNextInstructionID(void) { assert(0); } @@ -33,20 +37,31 @@ class STARS_IRDB_Instruction_t : public STARS_Instruction_t // jdh: what are features? // what bits are used and what're their meanings? +// ANSWER: Bit map identifying whether an operand is a DEF or USE, and of course some operands are both. +// STARSIDAInstruction.cpp has: +// static uint32_t UseMacros[STARS_UA_MAXOP] = {STARS_CF_USE1, STARS_CF_USE2, STARS_CF_USE3, STARS_CF_USE4, STARS_CF_USE5, STARS_CF_USE6}; +// static uint32_t DefMacros[STARS_UA_MAXOP] = { STARS_CF_CHG1, STARS_CF_CHG2, STARS_CF_CHG3, STARS_CF_CHG4, STARS_CF_CHG5, STARS_CF_CHG6 }; +// Each of these macro values is #defined and commented in STARSTypes.h. + virtual inline uint32_t GetInstFeatures(void) const { assert(0); } // jdh: consider returning by reference? +// ANSWER: That would be a good optimization, but I will need some code reading time to ensure safety. virtual STARSOpndTypePtr GetOpnd(std::size_t OpndNum) const { assert(0); } // Set (mutator) methods // why do instructions need to keep track of this? + // ANSWER: Imitating IDA Pro structure. Operands appear in many containers where it would not make + // sense to carry around DEF or USE bits, but the features bitmap in the instruction holds them + // within the context of the instruction they are part of. These mutators set bits in STARSfeatures. virtual void SetOpUsed(std::size_t OpndNum) {assert(0); } // set the USE bit virtual void SetOpNotUsed(std::size_t OpndNum) {assert(0); } // reset the USE bit virtual void SetOpDefed(std::size_t OpndNum) {assert(0); } // set the DEF bit virtual void SetOpNotDefed(std::size_t OpndNum) {assert(0); } // reset the DEF bit // jdh: not needed for IRDB? +// ANSWER: Should never be called for IRDB variant. virtual void RemoveIDAOp1ForIMUL(void) {assert(0); } // Fix up IDA Pro IMUL instruction by removing operand 1 // Query methods @@ -56,20 +71,28 @@ class STARS_IRDB_Instruction_t : public STARS_Instruction_t virtual bool OpcodeDefaultsTo64BitOperands(void) const {assert(0); } // jdh: vex, etc. insns? + // ANSWER: Yes. See implementations in STARSIDAInstruction.cpp. virtual bool Has64BitOperands(void) const {assert(0); } virtual inline bool Uses64BitAddressing(void) const {assert(0); } virtual bool Uses32BitAddressing(void) const {assert(0); } // jdh: why are these not part of the Opnd class? +// ANSWER: Just passing through to Opnd class. Implementation from idapro/STARSInstruction.h could be put in base class: +// inline bool IsRegOpnd(std::size_t OpndNum) const { return (STARScmd.Operands.at(OpndNum)->IsRegOp()); }; +// inline bool IsImmedOpnd(std::size_t OpndNum) const { return (STARScmd.Operands.at(OpndNum)->IsImmedOp()); }; virtual inline bool IsRegOpnd(std::size_t OpndNum) const {assert(0); } virtual inline bool IsImmedOpnd(std::size_t OpndNum) const {assert(0); } // jdh: what does this do? - virtual inline bool RegOpndMatches(std::size_t OpndNum, uint16_t RegNum) const {assert(0); } +// ANSWER: Again, inline implementation could be in base class: +// inline bool RegOpndMatches(std::size_t OpndNum, uint16_t RegNum) const { return STARScmd.Operands.at(OpndNum)->MatchesReg(RegNum); }; + virtual inline bool RegOpndMatches(std::size_t OpndNum, uint16_t RegNum) const { assert(0); } + virtual bool IsUseOpnd(std::size_t OpndNum) const {assert(0); } virtual bool IsDefOpnd(std::size_t OpndNum) const {assert(0); } // jdh: what's this mean? +// ANSWER: CurrInst is branch to a chunk that is disjoint from current chunk. Chunking is an IDA Pro concept. virtual bool IsBranchToFarChunk(SMPInstr *CurrInst, STARS_ea_t &TargetAddr) {assert(0); } // Operand creation methods @@ -78,9 +101,14 @@ class STARS_IRDB_Instruction_t : public STARS_Instruction_t // jdh: do these "make operand" methods create an operand that's somehow linked/related to this instruction, // or are these generic operand for any instruction. If generic, we should make them static factory-type methods // of the operand class. +// ANSWER: Could be static factory methods of operand class. Current idapro/STARSIDAInstruction.cpp implementations +// make use of IDA Pro headers. // jdh: what is a void operand? +// ANSWER: Placeholder, e.g. in an RTL tree, when there is no operand. Also, IDA Pro has an array of six operands +// for each instruction, and many of them have IDA Pro type o_void, which is now simulated in our brave new world +// of shared_ptrs to operands by having a VoidOpnd. virtual STARSOpndTypePtr MakeVoidOpnd(void) const {assert(0); } virtual STARSOpndTypePtr MakeImmediateOpnd(STARS_uval_t value) const {assert(0); } virtual STARSOpndTypePtr MakeRegOpnd(uint16_t RegNum) const {assert(0); }