| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include "garnet/bin/zxdb/symbols/symbol.h" |
| |
| namespace zxdb { |
| |
| // Defines the relationship between two derived classes. This class will be |
| // a member of the derived class, and indicates the type of the base class and |
| // how to get to it. |
| class InheritedFrom final : public Symbol { |
| public: |
| // Construct with fxl::MakeRefCounted(). |
| |
| // Symbol override. |
| const InheritedFrom* AsInheritedFrom() const; |
| |
| const LazySymbol& from() const { return from_; } |
| |
| // This is the DW_AT_data_member_location attribute. In the common case it |
| // is a constant that's the offset from the beginning of the derived class to |
| // the beginning of the base class. |
| // |
| // DWARF also allows these to be a location description where the location of |
| // the derived class is pushed on the stack, the expression is evaluated, and |
| // the result is the location. I have not seen our toolchain generate this |
| // type of location so it's not been implemented. If we have a test case, |
| // this more complex mode should be supported and tested. |
| uint64_t offset() const { return offset_; } |
| |
| // We could add the value of the DW_AT_accessibility tag here if needed. |
| |
| private: |
| FRIEND_REF_COUNTED_THREAD_SAFE(InheritedFrom); |
| FRIEND_MAKE_REF_COUNTED(InheritedFrom); |
| |
| InheritedFrom(LazySymbol from, uint64_t offset); |
| ~InheritedFrom(); |
| |
| LazySymbol from_; |
| |
| uint64_t offset_ = 0; |
| }; |
| |
| } // namespace zxdb |