- DIExpressionIterator begin() const;
- DIExpressionIterator end() const;
-};
-
-/// \brief An iterator for DIExpression elments.
-class DIExpressionIterator
- : public std::iterator<std::forward_iterator_tag, StringRef, unsigned,
- const uint64_t *, uint64_t> {
- DIHeaderFieldIterator I;
- DIExpressionIterator(DIHeaderFieldIterator I) : I(I) {}
-public:
- DIExpressionIterator() {}
- DIExpressionIterator(const DIExpression Expr)
- : I(Expr.getHeader()) { ++I; }
- uint64_t operator*() const { return I.getNumber<uint64_t>(); }
- DIExpressionIterator &operator++() {
- increment();
- return *this;
- }
- DIExpressionIterator operator++(int) {
- DIExpressionIterator X(*this);
- increment();
- return X;
- }
- bool operator==(const DIExpressionIterator &X) const {
- return I == X.I;
- }
- bool operator!=(const DIExpressionIterator &X) const {
- return !(*this == X);
- }
-
- uint64_t getArg(unsigned N) const {
- auto In = I;
- std::advance(In, N);
- return *DIExpressionIterator(In);
- }
-
- const DIHeaderFieldIterator& getBase() const { return I; }
-
-private:
- void increment() {
- switch (**this) {
- case dwarf::DW_OP_piece: std::advance(I, 3); break;
- case dwarf::DW_OP_plus: std::advance(I, 2); break;
- case dwarf::DW_OP_deref: std::advance(I, 1); break;
- default:
- assert("unsupported operand");
+ /// \brief An iterator for DIExpression elements.
+ class iterator
+ : public std::iterator<std::forward_iterator_tag, StringRef, unsigned,
+ const uint64_t *, uint64_t> {
+ DIHeaderFieldIterator I;
+ iterator(DIHeaderFieldIterator I) : I(I) {}
+ public:
+ iterator() {}
+ iterator(const DIExpression &Expr) : I(++Expr.header_begin()) {}
+ uint64_t operator*() const { return I.getNumber<uint64_t>(); }
+ iterator &operator++() {
+ increment();
+ return *this;