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