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