xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/ExpressionParser/Clang/ClangASTMetadata.h (revision e25152834cdf3b353892835a4f3b157e066a8ed4)
1*5ffd83dbSDimitry Andric //===-- ClangASTMetadata.h --------------------------------------*- C++ -*-===//
2*5ffd83dbSDimitry Andric //
3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5ffd83dbSDimitry Andric //
7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
8*5ffd83dbSDimitry Andric 
9*5ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGASTMETADATA_H
10*5ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGASTMETADATA_H
11*5ffd83dbSDimitry Andric 
12*5ffd83dbSDimitry Andric #include "lldb/Core/dwarf.h"
13*5ffd83dbSDimitry Andric #include "lldb/lldb-defines.h"
14*5ffd83dbSDimitry Andric #include "lldb/lldb-enumerations.h"
15*5ffd83dbSDimitry Andric 
16*5ffd83dbSDimitry Andric namespace lldb_private {
17*5ffd83dbSDimitry Andric 
18*5ffd83dbSDimitry Andric class ClangASTMetadata {
19*5ffd83dbSDimitry Andric public:
ClangASTMetadata()20*5ffd83dbSDimitry Andric   ClangASTMetadata()
21*5ffd83dbSDimitry Andric       : m_user_id(0), m_union_is_user_id(false), m_union_is_isa_ptr(false),
22*5ffd83dbSDimitry Andric         m_has_object_ptr(false), m_is_self(false), m_is_dynamic_cxx(true),
23*5ffd83dbSDimitry Andric         m_is_forcefully_completed(false) {}
24*5ffd83dbSDimitry Andric 
GetIsDynamicCXXType()25*5ffd83dbSDimitry Andric   bool GetIsDynamicCXXType() const { return m_is_dynamic_cxx; }
26*5ffd83dbSDimitry Andric 
SetIsDynamicCXXType(bool b)27*5ffd83dbSDimitry Andric   void SetIsDynamicCXXType(bool b) { m_is_dynamic_cxx = b; }
28*5ffd83dbSDimitry Andric 
SetUserID(lldb::user_id_t user_id)29*5ffd83dbSDimitry Andric   void SetUserID(lldb::user_id_t user_id) {
30*5ffd83dbSDimitry Andric     m_user_id = user_id;
31*5ffd83dbSDimitry Andric     m_union_is_user_id = true;
32*5ffd83dbSDimitry Andric     m_union_is_isa_ptr = false;
33*5ffd83dbSDimitry Andric   }
34*5ffd83dbSDimitry Andric 
GetUserID()35*5ffd83dbSDimitry Andric   lldb::user_id_t GetUserID() const {
36*5ffd83dbSDimitry Andric     if (m_union_is_user_id)
37*5ffd83dbSDimitry Andric       return m_user_id;
38*5ffd83dbSDimitry Andric     else
39*5ffd83dbSDimitry Andric       return LLDB_INVALID_UID;
40*5ffd83dbSDimitry Andric   }
41*5ffd83dbSDimitry Andric 
SetISAPtr(uint64_t isa_ptr)42*5ffd83dbSDimitry Andric   void SetISAPtr(uint64_t isa_ptr) {
43*5ffd83dbSDimitry Andric     m_isa_ptr = isa_ptr;
44*5ffd83dbSDimitry Andric     m_union_is_user_id = false;
45*5ffd83dbSDimitry Andric     m_union_is_isa_ptr = true;
46*5ffd83dbSDimitry Andric   }
47*5ffd83dbSDimitry Andric 
GetISAPtr()48*5ffd83dbSDimitry Andric   uint64_t GetISAPtr() const {
49*5ffd83dbSDimitry Andric     if (m_union_is_isa_ptr)
50*5ffd83dbSDimitry Andric       return m_isa_ptr;
51*5ffd83dbSDimitry Andric     else
52*5ffd83dbSDimitry Andric       return 0;
53*5ffd83dbSDimitry Andric   }
54*5ffd83dbSDimitry Andric 
SetObjectPtrName(const char * name)55*5ffd83dbSDimitry Andric   void SetObjectPtrName(const char *name) {
56*5ffd83dbSDimitry Andric     m_has_object_ptr = true;
57*5ffd83dbSDimitry Andric     if (strcmp(name, "self") == 0)
58*5ffd83dbSDimitry Andric       m_is_self = true;
59*5ffd83dbSDimitry Andric     else if (strcmp(name, "this") == 0)
60*5ffd83dbSDimitry Andric       m_is_self = false;
61*5ffd83dbSDimitry Andric     else
62*5ffd83dbSDimitry Andric       m_has_object_ptr = false;
63*5ffd83dbSDimitry Andric   }
64*5ffd83dbSDimitry Andric 
GetObjectPtrLanguage()65*5ffd83dbSDimitry Andric   lldb::LanguageType GetObjectPtrLanguage() const {
66*5ffd83dbSDimitry Andric     if (m_has_object_ptr) {
67*5ffd83dbSDimitry Andric       if (m_is_self)
68*5ffd83dbSDimitry Andric         return lldb::eLanguageTypeObjC;
69*5ffd83dbSDimitry Andric       else
70*5ffd83dbSDimitry Andric         return lldb::eLanguageTypeC_plus_plus;
71*5ffd83dbSDimitry Andric     }
72*5ffd83dbSDimitry Andric     return lldb::eLanguageTypeUnknown;
73*5ffd83dbSDimitry Andric   }
74*5ffd83dbSDimitry Andric 
GetObjectPtrName()75*5ffd83dbSDimitry Andric   const char *GetObjectPtrName() const {
76*5ffd83dbSDimitry Andric     if (m_has_object_ptr) {
77*5ffd83dbSDimitry Andric       if (m_is_self)
78*5ffd83dbSDimitry Andric         return "self";
79*5ffd83dbSDimitry Andric       else
80*5ffd83dbSDimitry Andric         return "this";
81*5ffd83dbSDimitry Andric     } else
82*5ffd83dbSDimitry Andric       return nullptr;
83*5ffd83dbSDimitry Andric   }
84*5ffd83dbSDimitry Andric 
HasObjectPtr()85*5ffd83dbSDimitry Andric   bool HasObjectPtr() const { return m_has_object_ptr; }
86*5ffd83dbSDimitry Andric 
87*5ffd83dbSDimitry Andric   /// A type is "forcefully completed" if it was declared complete to satisfy an
88*5ffd83dbSDimitry Andric   /// AST invariant (e.g. base classes must be complete types), but in fact we
89*5ffd83dbSDimitry Andric   /// were not able to find a actual definition for it.
IsForcefullyCompleted()90*5ffd83dbSDimitry Andric   bool IsForcefullyCompleted() const { return m_is_forcefully_completed; }
91*5ffd83dbSDimitry Andric 
92*5ffd83dbSDimitry Andric   void SetIsForcefullyCompleted(bool value = true) {
93*5ffd83dbSDimitry Andric     m_is_forcefully_completed = true;
94*5ffd83dbSDimitry Andric   }
95*5ffd83dbSDimitry Andric 
96*5ffd83dbSDimitry Andric   void Dump(Stream *s);
97*5ffd83dbSDimitry Andric 
98*5ffd83dbSDimitry Andric private:
99*5ffd83dbSDimitry Andric   union {
100*5ffd83dbSDimitry Andric     lldb::user_id_t m_user_id;
101*5ffd83dbSDimitry Andric     uint64_t m_isa_ptr;
102*5ffd83dbSDimitry Andric   };
103*5ffd83dbSDimitry Andric 
104*5ffd83dbSDimitry Andric   bool m_union_is_user_id : 1, m_union_is_isa_ptr : 1, m_has_object_ptr : 1,
105*5ffd83dbSDimitry Andric       m_is_self : 1, m_is_dynamic_cxx : 1, m_is_forcefully_completed : 1;
106*5ffd83dbSDimitry Andric };
107*5ffd83dbSDimitry Andric 
108*5ffd83dbSDimitry Andric } // namespace lldb_private
109*5ffd83dbSDimitry Andric 
110*5ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGASTMETADATA_H
111