| // 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. |
| |
| #ifndef SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_MODIFIED_TYPE_H_ |
| #define SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_MODIFIED_TYPE_H_ |
| |
| #include "src/developer/debug/zxdb/symbols/type.h" |
| |
| namespace zxdb { |
| |
| // A DWARF type modifier is something that applies to an underlying type. If you want to declare a |
| // type for "int*", you would first declare a base type for "int", and then declare a pointer |
| // modifier that references the "int" record. |
| // |
| // We also count typedefs as type modifiers since they apply a new name to a type in the same |
| // manner. |
| // |
| // We also count imported declarations are type modifiers. These are "using" statements. They also |
| // reference an underlying type but won't have a name. In this case, the name comes from the |
| // modified type but the namespace comes from the surrounding context of the ModifiedType. |
| class ModifiedType final : public Type { |
| public: |
| // Type/Symbol overrides. |
| const Type* StripCV() const override; |
| const Type* StripCVT() const override; |
| |
| // The underlying modified type. Note that there is no setter for this, it must be supplied in the |
| // constructor since the setter will decode the modified type if necessary to compute its size. |
| // |
| // This may be null. This means the modified type is "void" (e.g. a pointer modifying nothing is a |
| // void*, and a typedef of nothing is a typedef for void). |
| const LazySymbol& modified() const { return modified_; } |
| |
| // Returns true if this modified type is a modification of "void", e.g. "void*". |
| bool ModifiesVoid() const; |
| |
| protected: |
| // Symbol protected overrides: |
| const ModifiedType* AsModifiedType() const override; |
| |
| private: |
| FRIEND_REF_COUNTED_THREAD_SAFE(ModifiedType); |
| FRIEND_MAKE_REF_COUNTED(ModifiedType); |
| |
| ModifiedType(DwarfTag kind, LazySymbol modified); |
| ~ModifiedType() override; |
| |
| // Symbol protected overrides. |
| std::string ComputeFullName() const override; |
| Identifier ComputeIdentifier() const override; |
| |
| LazySymbol modified_; |
| }; |
| |
| } // namespace zxdb |
| |
| #endif // SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_MODIFIED_TYPE_H_ |