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