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