xref: /llvm-project/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h (revision e7950fceb1e7f82370f6cff80b258e552eb410a6)
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