1c28a977bSCarlos Alberto Enciso //===-- LVElement.h ---------------------------------------------*- C++ -*-===// 2c28a977bSCarlos Alberto Enciso // 3c28a977bSCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c28a977bSCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information. 5c28a977bSCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c28a977bSCarlos Alberto Enciso // 7c28a977bSCarlos Alberto Enciso //===----------------------------------------------------------------------===// 8c28a977bSCarlos Alberto Enciso // 9c28a977bSCarlos Alberto Enciso // This file defines the LVElement class, which is used to describe a debug 10c28a977bSCarlos Alberto Enciso // information element. 11c28a977bSCarlos Alberto Enciso // 12c28a977bSCarlos Alberto Enciso //===----------------------------------------------------------------------===// 13c28a977bSCarlos Alberto Enciso 14c28a977bSCarlos Alberto Enciso #ifndef LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVELEMENT_H 15c28a977bSCarlos Alberto Enciso #define LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVELEMENT_H 16c28a977bSCarlos Alberto Enciso 17c28a977bSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVObject.h" 18e28b9357SCarlos Alberto Enciso #include "llvm/Support/Casting.h" 190332a8e7SCarlos Alberto Enciso #include <map> 20c28a977bSCarlos Alberto Enciso #include <set> 210332a8e7SCarlos Alberto Enciso #include <vector> 22c28a977bSCarlos Alberto Enciso 23c28a977bSCarlos Alberto Enciso namespace llvm { 24c28a977bSCarlos Alberto Enciso namespace logicalview { 25c28a977bSCarlos Alberto Enciso 26e28b9357SCarlos Alberto Enciso // RTTI Subclasses ID. 27e28b9357SCarlos Alberto Enciso enum class LVSubclassID : unsigned char { 28e28b9357SCarlos Alberto Enciso LV_ELEMENT, 29e28b9357SCarlos Alberto Enciso LV_LINE_FIRST, 30e28b9357SCarlos Alberto Enciso LV_LINE, 31e28b9357SCarlos Alberto Enciso LV_LINE_DEBUG, 32e28b9357SCarlos Alberto Enciso LV_LINE_ASSEMBLER, 33e28b9357SCarlos Alberto Enciso LV_LINE_LAST, 34e28b9357SCarlos Alberto Enciso lV_SCOPE_FIRST, 35e28b9357SCarlos Alberto Enciso LV_SCOPE, 36e28b9357SCarlos Alberto Enciso LV_SCOPE_AGGREGATE, 37e28b9357SCarlos Alberto Enciso LV_SCOPE_ALIAS, 38e28b9357SCarlos Alberto Enciso LV_SCOPE_ARRAY, 39e28b9357SCarlos Alberto Enciso LV_SCOPE_COMPILE_UNIT, 40e28b9357SCarlos Alberto Enciso LV_SCOPE_ENUMERATION, 41e28b9357SCarlos Alberto Enciso LV_SCOPE_FORMAL_PACK, 42e28b9357SCarlos Alberto Enciso LV_SCOPE_FUNCTION, 43e28b9357SCarlos Alberto Enciso LV_SCOPE_FUNCTION_INLINED, 44e28b9357SCarlos Alberto Enciso LV_SCOPE_FUNCTION_TYPE, 45e28b9357SCarlos Alberto Enciso LV_SCOPE_NAMESPACE, 46e28b9357SCarlos Alberto Enciso LV_SCOPE_ROOT, 47e28b9357SCarlos Alberto Enciso LV_SCOPE_TEMPLATE_PACK, 48e28b9357SCarlos Alberto Enciso LV_SCOPE_LAST, 49e28b9357SCarlos Alberto Enciso LV_SYMBOL_FIRST, 50e28b9357SCarlos Alberto Enciso LV_SYMBOL, 51e28b9357SCarlos Alberto Enciso LV_SYMBOL_LAST, 52e28b9357SCarlos Alberto Enciso LV_TYPE_FIRST, 53e28b9357SCarlos Alberto Enciso LV_TYPE, 54e28b9357SCarlos Alberto Enciso LV_TYPE_DEFINITION, 55e28b9357SCarlos Alberto Enciso LV_TYPE_ENUMERATOR, 56e28b9357SCarlos Alberto Enciso LV_TYPE_IMPORT, 57e28b9357SCarlos Alberto Enciso LV_TYPE_PARAM, 58e28b9357SCarlos Alberto Enciso LV_TYPE_SUBRANGE, 59e28b9357SCarlos Alberto Enciso LV_TYPE_LAST 60e28b9357SCarlos Alberto Enciso }; 61e28b9357SCarlos Alberto Enciso 62c28a977bSCarlos Alberto Enciso enum class LVElementKind { Discarded, Global, Optimized, LastEntry }; 63c28a977bSCarlos Alberto Enciso using LVElementKindSet = std::set<LVElementKind>; 640332a8e7SCarlos Alberto Enciso using LVElementDispatch = std::map<LVElementKind, LVElementGetFunction>; 650332a8e7SCarlos Alberto Enciso using LVElementRequest = std::vector<LVElementGetFunction>; 66c28a977bSCarlos Alberto Enciso 67c28a977bSCarlos Alberto Enciso class LVElement : public LVObject { 68e28b9357SCarlos Alberto Enciso enum class Property { 69e28b9357SCarlos Alberto Enciso IsLine, // A logical line. 70e28b9357SCarlos Alberto Enciso IsScope, // A logical scope. 71e28b9357SCarlos Alberto Enciso IsSymbol, // A logical symbol. 72e28b9357SCarlos Alberto Enciso IsType, // A logical type. 73e28b9357SCarlos Alberto Enciso IsEnumClass, 74e28b9357SCarlos Alberto Enciso IsExternal, 75e28b9357SCarlos Alberto Enciso HasType, 76e28b9357SCarlos Alberto Enciso HasAugmentedName, 77e28b9357SCarlos Alberto Enciso IsTypedefReduced, 78e28b9357SCarlos Alberto Enciso IsArrayResolved, 79e28b9357SCarlos Alberto Enciso IsMemberPointerResolved, 80e28b9357SCarlos Alberto Enciso IsTemplateResolved, 81e28b9357SCarlos Alberto Enciso IsInlined, 82e28b9357SCarlos Alberto Enciso IsInlinedAbstract, 83e28b9357SCarlos Alberto Enciso InvalidFilename, 84e28b9357SCarlos Alberto Enciso HasReference, 85e28b9357SCarlos Alberto Enciso HasReferenceAbstract, 86e28b9357SCarlos Alberto Enciso HasReferenceExtension, 87e28b9357SCarlos Alberto Enciso HasReferenceSpecification, 88e28b9357SCarlos Alberto Enciso QualifiedResolved, 89e28b9357SCarlos Alberto Enciso IncludeInPrint, 90e28b9357SCarlos Alberto Enciso IsStatic, 91e28b9357SCarlos Alberto Enciso TransformName, 92e28b9357SCarlos Alberto Enciso IsScoped, // CodeView local type. 93e28b9357SCarlos Alberto Enciso IsNested, // CodeView nested type. 94e28b9357SCarlos Alberto Enciso IsScopedAlready, // CodeView nested type inserted in correct scope. 95e28b9357SCarlos Alberto Enciso IsArtificial, 96e28b9357SCarlos Alberto Enciso IsReferencedType, 97e28b9357SCarlos Alberto Enciso IsSystem, 98e28b9357SCarlos Alberto Enciso OffsetFromTypeIndex, 99e28b9357SCarlos Alberto Enciso IsAnonymous, 100e28b9357SCarlos Alberto Enciso LastEntry 101e28b9357SCarlos Alberto Enciso }; 102e28b9357SCarlos Alberto Enciso // Typed bitvector with properties for this element. 103e28b9357SCarlos Alberto Enciso LVProperties<Property> Properties; 1040332a8e7SCarlos Alberto Enciso static LVElementDispatch Dispatch; 105e28b9357SCarlos Alberto Enciso 106e28b9357SCarlos Alberto Enciso /// RTTI. 107e28b9357SCarlos Alberto Enciso const LVSubclassID SubclassID; 108e28b9357SCarlos Alberto Enciso 109c28a977bSCarlos Alberto Enciso // Indexes in the String Pool. 110c28a977bSCarlos Alberto Enciso size_t NameIndex = 0; 111e28b9357SCarlos Alberto Enciso size_t QualifiedNameIndex = 0; 112c28a977bSCarlos Alberto Enciso size_t FilenameIndex = 0; 113c28a977bSCarlos Alberto Enciso 114e28b9357SCarlos Alberto Enciso uint16_t AccessibilityCode : 2; // DW_AT_accessibility. 115e28b9357SCarlos Alberto Enciso uint16_t InlineCode : 2; // DW_AT_inline. 116e28b9357SCarlos Alberto Enciso uint16_t VirtualityCode : 2; // DW_AT_virtuality. 117e28b9357SCarlos Alberto Enciso 118e28b9357SCarlos Alberto Enciso // The given Specification points to an element that is connected via the 119e28b9357SCarlos Alberto Enciso // DW_AT_specification, DW_AT_abstract_origin or DW_AT_extension attribute. 120e28b9357SCarlos Alberto Enciso void setFileLine(LVElement *Specification); 121e28b9357SCarlos Alberto Enciso 122e28b9357SCarlos Alberto Enciso // Get the qualified name that include its parents name. 123e28b9357SCarlos Alberto Enciso void resolveQualifiedName(); 124e28b9357SCarlos Alberto Enciso 125e28b9357SCarlos Alberto Enciso protected: 126e28b9357SCarlos Alberto Enciso // Type of this element. 127e28b9357SCarlos Alberto Enciso LVElement *ElementType = nullptr; 128e28b9357SCarlos Alberto Enciso 129e28b9357SCarlos Alberto Enciso // Print the FileName Index. 130e28b9357SCarlos Alberto Enciso void printFileIndex(raw_ostream &OS, bool Full = true) const override; 131e28b9357SCarlos Alberto Enciso 132c28a977bSCarlos Alberto Enciso public: LVElement(LVSubclassID ID)133e28b9357SCarlos Alberto Enciso LVElement(LVSubclassID ID) 134e28b9357SCarlos Alberto Enciso : LVObject(), SubclassID(ID), AccessibilityCode(0), InlineCode(0), 135e28b9357SCarlos Alberto Enciso VirtualityCode(0) {} 136e28b9357SCarlos Alberto Enciso LVElement(const LVElement &) = delete; 137e28b9357SCarlos Alberto Enciso LVElement &operator=(const LVElement &) = delete; 138c28a977bSCarlos Alberto Enciso virtual ~LVElement() = default; 139c28a977bSCarlos Alberto Enciso getSubclassID()140e28b9357SCarlos Alberto Enciso LVSubclassID getSubclassID() const { return SubclassID; } 141e28b9357SCarlos Alberto Enciso 142e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsLine); 143e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsScope); 144e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsSymbol); 145e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsType); 146e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsEnumClass); 147e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsExternal); 148e28b9357SCarlos Alberto Enciso PROPERTY(Property, HasType); 149e28b9357SCarlos Alberto Enciso PROPERTY(Property, HasAugmentedName); 150e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsTypedefReduced); 151e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsArrayResolved); 152e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsMemberPointerResolved); 153e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsTemplateResolved); 154e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsInlined); 155e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsInlinedAbstract); 156e28b9357SCarlos Alberto Enciso PROPERTY(Property, InvalidFilename); 157e28b9357SCarlos Alberto Enciso PROPERTY(Property, HasReference); 158e28b9357SCarlos Alberto Enciso PROPERTY(Property, HasReferenceAbstract); 159e28b9357SCarlos Alberto Enciso PROPERTY(Property, HasReferenceExtension); 160e28b9357SCarlos Alberto Enciso PROPERTY(Property, HasReferenceSpecification); 161e28b9357SCarlos Alberto Enciso PROPERTY(Property, QualifiedResolved); 162e28b9357SCarlos Alberto Enciso PROPERTY(Property, IncludeInPrint); 163e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsStatic); 164e28b9357SCarlos Alberto Enciso PROPERTY(Property, TransformName); 165e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsScoped); 166e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsNested); 167e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsScopedAlready); 168e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsArtificial); 169e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsReferencedType); 170e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsSystem); 171e28b9357SCarlos Alberto Enciso PROPERTY(Property, OffsetFromTypeIndex); 172e28b9357SCarlos Alberto Enciso PROPERTY(Property, IsAnonymous); 173e28b9357SCarlos Alberto Enciso isNamed()174c28a977bSCarlos Alberto Enciso bool isNamed() const override { return NameIndex != 0; } isTyped()175e28b9357SCarlos Alberto Enciso bool isTyped() const override { return ElementType != nullptr; } isFiled()176e28b9357SCarlos Alberto Enciso bool isFiled() const override { return FilenameIndex != 0; } 177e28b9357SCarlos Alberto Enciso 178e28b9357SCarlos Alberto Enciso // The Element class type can point to a Type or Scope. getIsKindType()179e28b9357SCarlos Alberto Enciso bool getIsKindType() const { return ElementType && ElementType->getIsType(); } getIsKindScope()180e28b9357SCarlos Alberto Enciso bool getIsKindScope() const { 181e28b9357SCarlos Alberto Enciso return ElementType && ElementType->getIsScope(); 182e28b9357SCarlos Alberto Enciso } 183c28a977bSCarlos Alberto Enciso getName()184c28a977bSCarlos Alberto Enciso StringRef getName() const override { 185c28a977bSCarlos Alberto Enciso return getStringPool().getString(NameIndex); 186c28a977bSCarlos Alberto Enciso } 187e28b9357SCarlos Alberto Enciso void setName(StringRef ElementName) override; 188c28a977bSCarlos Alberto Enciso 189c28a977bSCarlos Alberto Enciso // Get pathname associated with the Element. getPathname()190c28a977bSCarlos Alberto Enciso StringRef getPathname() const { 191c28a977bSCarlos Alberto Enciso return getStringPool().getString(getFilenameIndex()); 192c28a977bSCarlos Alberto Enciso } 193c28a977bSCarlos Alberto Enciso 194e28b9357SCarlos Alberto Enciso // Set filename associated with the Element. 195e28b9357SCarlos Alberto Enciso void setFilename(StringRef Filename); 196e28b9357SCarlos Alberto Enciso 197e28b9357SCarlos Alberto Enciso // Set the Element qualified name. setQualifiedName(StringRef Name)198e28b9357SCarlos Alberto Enciso void setQualifiedName(StringRef Name) { 199e28b9357SCarlos Alberto Enciso QualifiedNameIndex = getStringPool().getIndex(Name); 200e28b9357SCarlos Alberto Enciso } getQualifiedName()201e28b9357SCarlos Alberto Enciso StringRef getQualifiedName() const { 202e28b9357SCarlos Alberto Enciso return getStringPool().getString(QualifiedNameIndex); 203e28b9357SCarlos Alberto Enciso } 204e28b9357SCarlos Alberto Enciso getNameIndex()205e28b9357SCarlos Alberto Enciso size_t getNameIndex() const { return NameIndex; } getQualifiedNameIndex()206e28b9357SCarlos Alberto Enciso size_t getQualifiedNameIndex() const { return QualifiedNameIndex; } 207e28b9357SCarlos Alberto Enciso setInnerComponent()208*e7950fceSCarlos Alberto Enciso void setInnerComponent() { setInnerComponent(getName()); } 209*e7950fceSCarlos Alberto Enciso void setInnerComponent(StringRef Name); 210*e7950fceSCarlos Alberto Enciso 211c28a977bSCarlos Alberto Enciso // Element type name. 212c28a977bSCarlos Alberto Enciso StringRef getTypeName() const; 213e28b9357SCarlos Alberto Enciso getProducer()214e28b9357SCarlos Alberto Enciso virtual StringRef getProducer() const { return StringRef(); } setProducer(StringRef ProducerName)215e28b9357SCarlos Alberto Enciso virtual void setProducer(StringRef ProducerName) {} 216e28b9357SCarlos Alberto Enciso isCompileUnit()217e28b9357SCarlos Alberto Enciso virtual bool isCompileUnit() const { return false; } isRoot()218e28b9357SCarlos Alberto Enciso virtual bool isRoot() const { return false; } 219e28b9357SCarlos Alberto Enciso setReference(LVElement * Element)220e28b9357SCarlos Alberto Enciso virtual void setReference(LVElement *Element) {} setReference(LVScope * Scope)221e28b9357SCarlos Alberto Enciso virtual void setReference(LVScope *Scope) {} setReference(LVSymbol * Symbol)222e28b9357SCarlos Alberto Enciso virtual void setReference(LVSymbol *Symbol) {} setReference(LVType * Type)223e28b9357SCarlos Alberto Enciso virtual void setReference(LVType *Type) {} 224e28b9357SCarlos Alberto Enciso setLinkageName(StringRef LinkageName)225e28b9357SCarlos Alberto Enciso virtual void setLinkageName(StringRef LinkageName) {} getLinkageName()226e28b9357SCarlos Alberto Enciso virtual StringRef getLinkageName() const { return StringRef(); } getLinkageNameIndex()227e28b9357SCarlos Alberto Enciso virtual size_t getLinkageNameIndex() const { return 0; } 228e28b9357SCarlos Alberto Enciso getCallLineNumber()229e28b9357SCarlos Alberto Enciso virtual uint32_t getCallLineNumber() const { return 0; } setCallLineNumber(uint32_t Number)230e28b9357SCarlos Alberto Enciso virtual void setCallLineNumber(uint32_t Number) {} getCallFilenameIndex()231e28b9357SCarlos Alberto Enciso virtual size_t getCallFilenameIndex() const { return 0; } setCallFilenameIndex(size_t Index)232e28b9357SCarlos Alberto Enciso virtual void setCallFilenameIndex(size_t Index) {} getFilenameIndex()233c28a977bSCarlos Alberto Enciso size_t getFilenameIndex() const { return FilenameIndex; } setFilenameIndex(size_t Index)234e28b9357SCarlos Alberto Enciso void setFilenameIndex(size_t Index) { FilenameIndex = Index; } 235e28b9357SCarlos Alberto Enciso 236e28b9357SCarlos Alberto Enciso // Set the File location for the Element. 237e28b9357SCarlos Alberto Enciso void setFile(LVElement *Reference = nullptr); 238e28b9357SCarlos Alberto Enciso isBase()239e28b9357SCarlos Alberto Enciso virtual bool isBase() const { return false; } isTemplateParam()240e28b9357SCarlos Alberto Enciso virtual bool isTemplateParam() const { return false; } 241e28b9357SCarlos Alberto Enciso getBitSize()242e28b9357SCarlos Alberto Enciso virtual uint32_t getBitSize() const { return 0; } setBitSize(uint32_t Size)243e28b9357SCarlos Alberto Enciso virtual void setBitSize(uint32_t Size) {} 244e28b9357SCarlos Alberto Enciso getCount()245e28b9357SCarlos Alberto Enciso virtual int64_t getCount() const { return 0; } setCount(int64_t Value)246e28b9357SCarlos Alberto Enciso virtual void setCount(int64_t Value) {} getLowerBound()247e28b9357SCarlos Alberto Enciso virtual int64_t getLowerBound() const { return 0; } setLowerBound(int64_t Value)248e28b9357SCarlos Alberto Enciso virtual void setLowerBound(int64_t Value) {} getUpperBound()249e28b9357SCarlos Alberto Enciso virtual int64_t getUpperBound() const { return 0; } setUpperBound(int64_t Value)250e28b9357SCarlos Alberto Enciso virtual void setUpperBound(int64_t Value) {} getBounds()251e28b9357SCarlos Alberto Enciso virtual std::pair<unsigned, unsigned> getBounds() const { return {}; } setBounds(unsigned Lower,unsigned Upper)252e28b9357SCarlos Alberto Enciso virtual void setBounds(unsigned Lower, unsigned Upper) {} 253e28b9357SCarlos Alberto Enciso 254e28b9357SCarlos Alberto Enciso // Access DW_AT_GNU_discriminator attribute. getDiscriminator()255e28b9357SCarlos Alberto Enciso virtual uint32_t getDiscriminator() const { return 0; } setDiscriminator(uint32_t Value)256e28b9357SCarlos Alberto Enciso virtual void setDiscriminator(uint32_t Value) {} 257e28b9357SCarlos Alberto Enciso 258e28b9357SCarlos Alberto Enciso // Process the values for a DW_TAG_enumerator. getValue()259*e7950fceSCarlos Alberto Enciso virtual StringRef getValue() const { return {}; } setValue(StringRef Value)260e28b9357SCarlos Alberto Enciso virtual void setValue(StringRef Value) {} getValueIndex()261e28b9357SCarlos Alberto Enciso virtual size_t getValueIndex() const { return 0; } 262e28b9357SCarlos Alberto Enciso 263e28b9357SCarlos Alberto Enciso // DWARF Accessibility Codes. getAccessibilityCode()264e28b9357SCarlos Alberto Enciso uint32_t getAccessibilityCode() const { return AccessibilityCode; } setAccessibilityCode(uint32_t Access)265e28b9357SCarlos Alberto Enciso void setAccessibilityCode(uint32_t Access) { AccessibilityCode = Access; } 266e28b9357SCarlos Alberto Enciso StringRef 267e28b9357SCarlos Alberto Enciso accessibilityString(uint32_t Access = dwarf::DW_ACCESS_private) const; 268e28b9357SCarlos Alberto Enciso 269*e7950fceSCarlos Alberto Enciso // CodeView Accessibility Codes. 270*e7950fceSCarlos Alberto Enciso std::optional<uint32_t> getAccessibilityCode(codeview::MemberAccess Access); setAccessibilityCode(codeview::MemberAccess Access)271*e7950fceSCarlos Alberto Enciso void setAccessibilityCode(codeview::MemberAccess Access) { 272*e7950fceSCarlos Alberto Enciso if (std::optional<uint32_t> Code = getAccessibilityCode(Access)) 273*e7950fceSCarlos Alberto Enciso AccessibilityCode = Code.value(); 274*e7950fceSCarlos Alberto Enciso } 275*e7950fceSCarlos Alberto Enciso 276e28b9357SCarlos Alberto Enciso // DWARF Inline Codes. getInlineCode()277e28b9357SCarlos Alberto Enciso uint32_t getInlineCode() const { return InlineCode; } setInlineCode(uint32_t Code)278e28b9357SCarlos Alberto Enciso void setInlineCode(uint32_t Code) { InlineCode = Code; } 279e28b9357SCarlos Alberto Enciso StringRef inlineCodeString(uint32_t Code) const; 280e28b9357SCarlos Alberto Enciso 281e28b9357SCarlos Alberto Enciso // DWARF Virtuality Codes. getVirtualityCode()282e28b9357SCarlos Alberto Enciso uint32_t getVirtualityCode() const { return VirtualityCode; } setVirtualityCode(uint32_t Virtuality)283e28b9357SCarlos Alberto Enciso void setVirtualityCode(uint32_t Virtuality) { VirtualityCode = Virtuality; } 284e28b9357SCarlos Alberto Enciso StringRef 285e28b9357SCarlos Alberto Enciso virtualityString(uint32_t Virtuality = dwarf::DW_VIRTUALITY_none) const; 286e28b9357SCarlos Alberto Enciso 287*e7950fceSCarlos Alberto Enciso // CodeView Virtuality Codes. 288*e7950fceSCarlos Alberto Enciso std::optional<uint32_t> getVirtualityCode(codeview::MethodKind Virtuality); setVirtualityCode(codeview::MethodKind Virtuality)289*e7950fceSCarlos Alberto Enciso void setVirtualityCode(codeview::MethodKind Virtuality) { 290*e7950fceSCarlos Alberto Enciso if (std::optional<uint32_t> Code = getVirtualityCode(Virtuality)) 291*e7950fceSCarlos Alberto Enciso VirtualityCode = Code.value(); 292*e7950fceSCarlos Alberto Enciso } 293*e7950fceSCarlos Alberto Enciso 294e28b9357SCarlos Alberto Enciso // DWARF Extern Codes. 295e28b9357SCarlos Alberto Enciso StringRef externalString() const; 296e28b9357SCarlos Alberto Enciso getType()297e28b9357SCarlos Alberto Enciso LVElement *getType() const { return ElementType; } 298e28b9357SCarlos Alberto Enciso LVType *getTypeAsType() const; 299e28b9357SCarlos Alberto Enciso LVScope *getTypeAsScope() const; 300e28b9357SCarlos Alberto Enciso 301e28b9357SCarlos Alberto Enciso void setType(LVElement *Element = nullptr) { 302e28b9357SCarlos Alberto Enciso ElementType = Element; 303e28b9357SCarlos Alberto Enciso if (Element) { 304e28b9357SCarlos Alberto Enciso setHasType(); 305e28b9357SCarlos Alberto Enciso Element->setIsReferencedType(); 306e28b9357SCarlos Alberto Enciso } 307e28b9357SCarlos Alberto Enciso } 308e28b9357SCarlos Alberto Enciso 309e28b9357SCarlos Alberto Enciso // Set the type for the element, handling template parameters. 310e28b9357SCarlos Alberto Enciso void setGenericType(LVElement *Element); 311e28b9357SCarlos Alberto Enciso getTypeQualifiedName()312e28b9357SCarlos Alberto Enciso StringRef getTypeQualifiedName() const { 313e28b9357SCarlos Alberto Enciso return ElementType ? ElementType->getQualifiedName() : ""; 314e28b9357SCarlos Alberto Enciso } 315e28b9357SCarlos Alberto Enciso 316e28b9357SCarlos Alberto Enciso StringRef typeAsString() const; 317e28b9357SCarlos Alberto Enciso std::string typeOffsetAsString() const; 318e28b9357SCarlos Alberto Enciso std::string discriminatorAsString() const; 319e28b9357SCarlos Alberto Enciso 320e28b9357SCarlos Alberto Enciso LVScope *traverseParents(LVScopeGetFunction GetFunction) const; 321e28b9357SCarlos Alberto Enciso 322e28b9357SCarlos Alberto Enciso LVScope *getFunctionParent() const; 323e28b9357SCarlos Alberto Enciso virtual LVScope *getCompileUnitParent() const; 324e28b9357SCarlos Alberto Enciso 325e28b9357SCarlos Alberto Enciso // Print any referenced element. 326e28b9357SCarlos Alberto Enciso void printReference(raw_ostream &OS, bool Full, LVElement *Parent) const; 327e28b9357SCarlos Alberto Enciso 328e28b9357SCarlos Alberto Enciso // Print the linkage name (Symbols and functions). 329e28b9357SCarlos Alberto Enciso void printLinkageName(raw_ostream &OS, bool Full, LVElement *Parent, 330e28b9357SCarlos Alberto Enciso LVScope *Scope) const; 331e28b9357SCarlos Alberto Enciso void printLinkageName(raw_ostream &OS, bool Full, LVElement *Parent) const; 332e28b9357SCarlos Alberto Enciso 333e28b9357SCarlos Alberto Enciso // Generate the full name for the Element. 334e28b9357SCarlos Alberto Enciso void resolveFullname(LVElement *BaseType, StringRef Name = emptyString()); 335e28b9357SCarlos Alberto Enciso 336e28b9357SCarlos Alberto Enciso // Generate a name for unnamed elements. 337e28b9357SCarlos Alberto Enciso void generateName(std::string &Prefix) const; 338e28b9357SCarlos Alberto Enciso void generateName(); 339e28b9357SCarlos Alberto Enciso removeElement(LVElement * Element)340e28b9357SCarlos Alberto Enciso virtual bool removeElement(LVElement *Element) { return false; } 341e28b9357SCarlos Alberto Enciso virtual void updateLevel(LVScope *Parent, bool Moved = false); 342e28b9357SCarlos Alberto Enciso 343e28b9357SCarlos Alberto Enciso // During the parsing of the debug information, the logical elements are 344e28b9357SCarlos Alberto Enciso // created with information extracted from its description entries (DIE). 345e28b9357SCarlos Alberto Enciso // But they are not complete for the logical view concept. A second pass 346e28b9357SCarlos Alberto Enciso // is executed in order to collect their additional information. 347e28b9357SCarlos Alberto Enciso // The following functions 'resolve' some of their properties, such as 348e28b9357SCarlos Alberto Enciso // name, references, parents, extra information based on the element kind. 349e28b9357SCarlos Alberto Enciso virtual void resolve(); resolveExtra()350e28b9357SCarlos Alberto Enciso virtual void resolveExtra() {} 351e28b9357SCarlos Alberto Enciso virtual void resolveName(); resolveReferences()352e28b9357SCarlos Alberto Enciso virtual void resolveReferences() {} 353e28b9357SCarlos Alberto Enciso void resolveParents(); 3540332a8e7SCarlos Alberto Enciso 355e98a4c5aSCarlos Alberto Enciso bool referenceMatch(const LVElement *Element) const; 356e98a4c5aSCarlos Alberto Enciso 357e98a4c5aSCarlos Alberto Enciso // Returns true if current element is logically equal to the given 'Element'. 358e98a4c5aSCarlos Alberto Enciso bool equals(const LVElement *Element) const; 359e98a4c5aSCarlos Alberto Enciso 360e98a4c5aSCarlos Alberto Enciso // Report the current element as missing or added during comparison. report(LVComparePass Pass)361e98a4c5aSCarlos Alberto Enciso virtual void report(LVComparePass Pass) {} 362e98a4c5aSCarlos Alberto Enciso getDispatch()3630332a8e7SCarlos Alberto Enciso static LVElementDispatch &getDispatch() { return Dispatch; } 364c28a977bSCarlos Alberto Enciso }; 365c28a977bSCarlos Alberto Enciso 366c28a977bSCarlos Alberto Enciso } // end namespace logicalview 367c28a977bSCarlos Alberto Enciso } // end namespace llvm 368c28a977bSCarlos Alberto Enciso 369c28a977bSCarlos Alberto Enciso #endif // LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVELEMENT_H 370