mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +00:00
Fill in a glaring omission in derived User classes, namely
add efficient versions of op_begin and op_end. Up to now always those from User have been called, which in most cases follow an indirection (OperandList) even if the exact Instruction type is known. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64331 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fbef3101a5
commit
6cd093b56e
@ -119,6 +119,10 @@ struct HungoffOperandTraits {
|
||||
public: \
|
||||
inline VALUECLASS *getOperand(unsigned) const; \
|
||||
inline void setOperand(unsigned, VALUECLASS*); \
|
||||
inline op_iterator op_begin(); \
|
||||
inline const_op_iterator op_begin() const; \
|
||||
inline op_iterator op_end(); \
|
||||
inline const_op_iterator op_end() const; \
|
||||
protected: \
|
||||
template <unsigned> inline Use &Op(); \
|
||||
template <unsigned> inline const Use &Op() const; \
|
||||
@ -127,6 +131,18 @@ struct HungoffOperandTraits {
|
||||
|
||||
/// Macro for generating out-of-class operand accessor definitions
|
||||
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS) \
|
||||
CLASS::op_iterator CLASS::op_begin() { \
|
||||
return OperandTraits<CLASS>::op_begin(this); \
|
||||
} \
|
||||
CLASS::const_op_iterator CLASS::op_begin() const { \
|
||||
return OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this)); \
|
||||
} \
|
||||
CLASS::op_iterator CLASS::op_end() { \
|
||||
return OperandTraits<CLASS>::op_end(this); \
|
||||
} \
|
||||
CLASS::const_op_iterator CLASS::op_end() const { \
|
||||
return OperandTraits<CLASS>::op_end(const_cast<CLASS*>(this)); \
|
||||
} \
|
||||
VALUECLASS *CLASS::getOperand(unsigned i_nocapture) const { \
|
||||
assert(i_nocapture < OperandTraits<CLASS>::operands(this) \
|
||||
&& "getOperand() out of range!"); \
|
||||
@ -153,6 +169,18 @@ template <unsigned Idx_nocapture> const Use &CLASS::Op() const { \
|
||||
/// Macro for generating out-of-class operand accessor
|
||||
/// definitions with casted result
|
||||
#define DEFINE_TRANSPARENT_CASTED_OPERAND_ACCESSORS(CLASS, VALUECLASS) \
|
||||
CLASS::op_iterator CLASS::op_begin() { \
|
||||
return OperandTraits<CLASS>::op_begin(this); \
|
||||
} \
|
||||
CLASS::const_op_iterator CLASS::op_begin() const { \
|
||||
return OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this)); \
|
||||
} \
|
||||
CLASS::op_iterator CLASS::op_end() { \
|
||||
return OperandTraits<CLASS>::op_end(this); \
|
||||
} \
|
||||
CLASS::const_op_iterator CLASS::op_end() const { \
|
||||
return OperandTraits<CLASS>::op_end(const_cast<CLASS*>(this)); \
|
||||
} \
|
||||
VALUECLASS *CLASS::getOperand(unsigned i_nocapture) const { \
|
||||
assert(i_nocapture < OperandTraits<CLASS>::operands(this) \
|
||||
&& "getOperand() out of range!"); \
|
||||
|
Loading…
x
Reference in New Issue
Block a user