23#include "llvm/Support/ErrorExtras.h"
37 return type_system_sp->IsAggregateType(
m_type);
44 return type_system_sp->IsAnonymousType(
m_type);
51 return type_system_sp->IsScopedEnumerationType(
m_type);
56 bool *is_incomplete)
const {
59 return type_system_sp->IsArrayType(
m_type, element_type_ptr, size,
63 element_type_ptr->
Clear();
67 *is_incomplete =
false;
72 uint64_t *size)
const {
75 return type_system_sp->IsVectorType(
m_type, element_type, size);
82 return type_system_sp->IsRuntimeGeneratedType(
m_type);
89 return type_system_sp->IsCharType(
m_type);
96 return type_system_sp->IsCompleteType(
m_type);
103 return type_system_sp->IsForcefullyCompleted(
m_type);
110 return type_system_sp->IsConst(
m_type);
117 return type_system_sp->GetPtrAuthKey(
m_type);
124 return type_system_sp->GetPtrAuthDiscriminator(
m_type);
131 return type_system_sp->GetPtrAuthAddressDiversity(
m_type);
138 return type_system_sp->IsFunctionType(
m_type);
147 return type_system_sp->IsHomogeneousAggregate(
m_type, base_type_ptr);
154 return type_system_sp->GetNumberOfFunctionArguments(
m_type);
169 return type_system_sp->IsFunctionPointerType(
m_type);
176 return type_system_sp->IsMemberFunctionPointerType(
m_type);
183 return type_system_sp->IsMemberDataPointerType(
m_type);
191 return type_system_sp->IsBlockPointerType(
m_type, function_pointer_type_ptr);
198 return type_system_sp->IsIntegerType(
m_type, is_signed);
205 return type_system_sp->IsEnumerationType(
m_type, is_signed);
216 return type_system_sp->IsPointerType(
m_type, pointee_type);
219 pointee_type->
Clear();
226 return type_system_sp->IsPointerOrReferenceType(
m_type, pointee_type);
229 pointee_type->
Clear();
234 bool *is_rvalue)
const {
237 return type_system_sp->IsReferenceType(
m_type, pointee_type, is_rvalue);
240 pointee_type->
Clear();
247 return type_system_sp->ShouldTreatScalarValueAsAddress(
m_type);
259 return type_system_sp->IsFloatingPointType(
m_type);
271 return type_system_sp->IsDefined(
m_type);
278 return type_system_sp->IsPolymorphicClass(
m_type);
284 bool check_cplusplus,
285 bool check_objc)
const {
288 return type_system_sp->IsPossibleDynamicType(
m_type, dynamic_pointee_type,
289 check_cplusplus, check_objc);
296 return type_system_sp->IsScalarType(
m_type);
303 return type_system_sp->IsTemplateType(
m_type);
310 return type_system_sp->IsTypedefType(
m_type);
317 return type_system_sp->IsVoidType(
m_type);
324 return type_system_sp->HasPointerAuthQualifier(
m_type);
331 return type_system_sp->GetTargetAddressSpace(
m_type);
352 return type_system_sp->IsBeingDefined(
m_type);
357 bool is_signed =
false;
362 bool is_signed =
false;
400 return type_system_sp->IsPromotableIntegerType(
m_type);
417 (lldb::eTypeClassClass | lldb::eTypeClassStruct |
418 lldb::eTypeClassUnion);
423 bool carry_virtual)
const {
425 return carry_virtual;
427 if (!carry_virtual) {
429 for (uint32_t i = 0; i < num_virtual_bases; ++i) {
432 if (base.IsVirtualBase(target_base, virtual_base,
435 *virtual_base = base;
443 for (uint32_t i = 0; i < num_direct_bases; ++i) {
446 if (base.IsVirtualBase(target_base, virtual_base, carry_virtual))
465 if (name.IsEmpty() || canonical_name.IsEmpty())
468 if (name == canonical_name)
469 return llvm::formatv(
"'{0}'", name);
471 return llvm::formatv(
"'{0}' (canonically referred to as '{1}')", name,
481 return name == rhs_name;
486 case lldb::eTypeClassClass:
488 case lldb::eTypeClassEnumeration:
490 case lldb::eTypeClassStruct:
492 case lldb::eTypeClassUnion:
497 llvm_unreachable(
"All cases are covered by code above.");
504 for (uint32_t i = 0; i < num_direct_bases; ++i) {
519 return type_system_sp->GetCompleteType(
m_type);
526 return type_system_sp->GetPointerByteSize();
533 return type_system_sp->GetTypeName(
m_type, BaseOnly);
541 return type_system_sp->GetDisplayTypeName(
m_type);
548 return type_system_sp->GetMangledTypeName(
m_type);
557 return type_system_sp->GetTypeInfo(
m_type,
558 pointee_or_element_compiler_type);
565 return type_system_sp->GetMinimumLanguage(
m_type);
572 return type_system_sp->GetTypeClass(
m_type);
573 return lldb::eTypeClassInvalid;
591 return type_system_sp->GetTypeQualifiers(
m_type);
601 return type_system_sp->GetArrayElementType(
m_type, exe_scope);
609 return type_system_sp->GetArrayType(
m_type, size);
638 return type_system_sp->GetFunctionArgumentCount(
m_type);
646 return type_system_sp->GetFunctionArgumentTypeAtIndex(
m_type, idx);
654 return type_system_sp->GetFunctionReturnType(
m_type);
662 return type_system_sp->GetNumMemberFunctions(
m_type);
670 return type_system_sp->GetMemberFunctionAtIndex(
m_type, idx);
685 return type_system_sp->GetPointeeType(
m_type);
693 return type_system_sp->GetPointerType(
m_type);
757 uint32_t payload)
const {
782llvm::Expected<uint64_t>
786 return type_system_sp->GetBitSize(
m_type, exe_scope);
787 return llvm::createStringError(
"invalid type: cannot determine size");
790llvm::Expected<uint64_t>
793 if (!bit_size_or_err)
794 return bit_size_or_err.takeError();
795 return (*bit_size_or_err + 7) / 8;
802 return type_system_sp->GetTypeBitAlign(
m_type, exe_scope);
809 return type_system_sp->GetEncoding(
m_type);
816 return type_system_sp->GetFormat(
m_type);
820llvm::Expected<uint32_t>
825 return type_system_sp->GetNumChildren(
m_type, omit_empty_base_classes,
827 return llvm::createStringError(
"invalid type");
833 return type_system_sp->GetBasicTypeEnumeration(
m_type);
840 const llvm::APSInt &value)>
const &callback)
const {
843 return type_system_sp->ForEachEnumerator(
m_type, callback);
849 return type_system_sp->GetNumFields(
m_type);
854 uint64_t *bit_offset_ptr,
855 uint32_t *bitfield_bit_size_ptr,
856 bool *is_bitfield_ptr)
const {
860 bitfield_bit_size_ptr, is_bitfield_ptr);
867 return type_system_sp->GetNumDirectBaseClasses(
m_type);
874 return type_system_sp->GetNumVirtualBaseClasses(
m_type);
880 uint32_t *bit_offset_ptr)
const {
890 uint32_t *bit_offset_ptr)
const {
906 uint32_t &deref_byte_size, int32_t &deref_byte_offset,
ValueObject *valobj,
907 uint64_t &language_flags)
const {
910 return type_system_sp->GetDereferencedType(
911 m_type, exe_ctx, deref_name, deref_byte_size, deref_byte_offset,
912 valobj, language_flags);
918 bool omit_empty_base_classes,
bool ignore_array_bounds,
919 std::string &child_name, uint32_t &child_byte_size,
920 int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size,
921 uint32_t &child_bitfield_bit_offset,
bool &child_is_base_class,
922 bool &child_is_deref_of_parent,
ValueObject *valobj,
923 uint64_t &language_flags)
const {
926 return type_system_sp->GetChildCompilerTypeAtIndex(
927 m_type, exe_ctx, idx, transparent_pointers, omit_empty_base_classes,
928 ignore_array_bounds, child_name, child_byte_size, child_byte_offset,
929 child_bitfield_bit_size, child_bitfield_bit_offset,
930 child_is_base_class, child_is_deref_of_parent, valobj,
969 llvm::StringRef name,
bool omit_empty_base_classes,
970 std::vector<uint32_t> &child_indexes)
const {
971 if (
IsValid() && !name.empty()) {
973 return type_system_sp->GetIndexOfChildMemberWithName(
974 m_type, name, omit_empty_base_classes, child_indexes);
981 if (
IsValid() && !name.empty()) {
983 return type_system_sp->GetDirectNestedTypeWithName(
m_type, name);
991 return type_system_sp->GetNumTemplateArguments(
m_type, expand_pack);
1000 return type_system_sp->GetTemplateArgumentKind(
m_type, idx, expand_pack);
1005 bool expand_pack)
const {
1008 return type_system_sp->GetTypeTemplateArgument(
m_type, idx, expand_pack);
1013std::optional<CompilerType::IntegralTemplateArgument>
1017 return type_system_sp->GetIntegralTemplateArgument(
m_type, idx, expand_pack);
1018 return std::nullopt;
1038 return type_system_sp->ShouldPrintAsOneLiner(
m_type, valobj);
1045 return type_system_sp->IsMeaninglessWithoutDynamicResolution(
m_type);
1053llvm::Expected<uint32_t>
1055 bool omit_empty_base_classes)
const {
1056 if (
IsValid() && !name.empty()) {
1058 return type_system_sp->GetIndexOfChildWithName(
m_type, name,
1059 omit_empty_base_classes);
1061 return llvm::createStringErrorV(
"type has no child named '{0}'", name);
1069 uint32_t bitfield_bit_size,
1070 uint32_t bitfield_bit_offset,
1074 return type_system_sp->DumpTypeValue(
1075 m_type, *s, format, data, byte_offset, byte_size, bitfield_bit_size,
1076 bitfield_bit_offset, exe_scope);
1083 type_system_sp->DumpTypeDescription(
m_type, level);
1090 type_system_sp->DumpTypeDescription(
m_type, *s, level);
1097 return type_system_sp->dump(
m_type);
1098 llvm::errs() <<
"<invalid>\n";
1104 size_t data_byte_size,
Scalar &value,
1119 if (!byte_size_or_err) {
1122 "Cannot get value as scalar: Cannot determine type size: {0}");
1125 uint64_t byte_size = *byte_size_or_err;
1139 if (byte_size <=
sizeof(
unsigned long long)) {
1140 uint64_t uval64 = data.
GetMaxU64(&offset, byte_size);
1141 if (byte_size <=
sizeof(
unsigned int)) {
1142 value = (
unsigned int)uval64;
1144 }
else if (byte_size <=
sizeof(
unsigned long)) {
1145 value = (
unsigned long)uval64;
1147 }
else if (byte_size <=
sizeof(
unsigned long long)) {
1148 value = (
unsigned long long)uval64;
1156 if (byte_size <=
sizeof(
long long)) {
1157 int64_t sval64 = data.
GetMaxS64(&offset, byte_size);
1158 if (byte_size <=
sizeof(
int)) {
1159 value = (int)sval64;
1161 }
else if (byte_size <=
sizeof(
long)) {
1162 value = (long)sval64;
1164 }
else if (byte_size <=
sizeof(
long long)) {
1165 value = (
long long)sval64;
1173 if (byte_size <=
sizeof(
long double)) {
1176 if (byte_size ==
sizeof(
float)) {
1177 if (
sizeof(
float) ==
sizeof(uint32_t)) {
1178 u32 = data.
GetU32(&offset);
1179 value = *((
float *)&u32);
1181 }
else if (
sizeof(
float) ==
sizeof(uint64_t)) {
1182 u64 = data.
GetU64(&offset);
1183 value = *((
float *)&u64);
1186 }
else if (byte_size ==
sizeof(
double)) {
1187 if (
sizeof(
double) ==
sizeof(uint32_t)) {
1188 u32 = data.
GetU32(&offset);
1189 value = *((
double *)&u32);
1191 }
else if (
sizeof(
double) ==
sizeof(uint64_t)) {
1192 u64 = data.
GetU64(&offset);
1193 value = *((
double *)&u64);
1196 }
else if (byte_size ==
sizeof(
long double)) {
1197 if (
sizeof(
long double) ==
sizeof(uint32_t)) {
1198 u32 = data.
GetU32(&offset);
1199 value = *((
long double *)&u32);
1201 }
else if (
sizeof(
long double) ==
sizeof(uint64_t)) {
1202 u64 = data.
GetU64(&offset);
1203 value = *((
long double *)&u64);
1217 assert(
Verify() &&
"verification failed");
1223 assert(
Verify() &&
"verification failed");
1231 return type_system_sp->Verify(
m_type);
1262 return !(lhs == rhs);
#define LLDB_LOG_ERRORV(log, error,...)
Represents a generic declaration context in a program.
Represents a generic declaration such as a function declaration.
This is a minimal wrapper of a TypeSystem shared pointer as returned by CompilerType which conventien...
lldb::TypeSystemSP GetSharedPointer() const
bool operator==(const TypeSystemSPWrapper &other) const
lldb::TypeSystemSP m_typesystem_sp
TypeSystem * operator->() const
Only to be used in a one-off situations like if (typesystem && typesystem->method()) Do not store thi...
Generic representation of a type in a programming language.
uint32_t GetNumberOfNonEmptyBaseClasses()
Go through the base classes and count non-empty ones.
CompilerType GetTypeForFormatters() const
CompilerType GetTypeTemplateArgument(size_t idx, bool expand_pack=false) const
lldb::LanguageType GetMinimumLanguage()
bool GetValueAsScalar(const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size, Scalar &value, ExecutionContextScope *exe_scope) const
bool Verify() const
If the type is valid, ask the TypeSystem to verify the integrity of the type to catch CompilerTypes t...
lldb::BasicType GetBasicTypeEnumeration() const
std::optional< IntegralTemplateArgument > GetIntegralTemplateArgument(size_t idx, bool expand_pack=false) const
Returns the value of the template argument and its type.
TypeSystemSPWrapper GetTypeSystem() const
Accessors.
CompilerType GetArrayType(uint64_t size) const
CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) const
Create related types using the current type's AST.
bool IsPossibleDynamicType(CompilerType *target_type, bool check_cplusplus, bool check_objc) const
void SetCompilerType(lldb::TypeSystemWP type_system, lldb::opaque_compiler_type_t type)
CompilerType AddConstModifier() const
Return a new CompilerType adds a const modifier to this type if this type is valid and the type syste...
bool IsArrayType(CompilerType *element_type=nullptr, uint64_t *size=nullptr, bool *is_incomplete=nullptr) const
ConstString GetDisplayTypeName() const
CompilerType GetVirtualBaseClassAtIndex(size_t idx, uint32_t *bit_offset_ptr) const
size_t GetNumMemberFunctions() const
CompilerType GetFunctionArgumentTypeAtIndex(size_t idx) const
uint32_t IsHomogeneousAggregate(CompilerType *base_type_ptr) const
CompilerType GetFieldAtIndex(size_t idx, std::string &name, uint64_t *bit_offset_ptr, uint32_t *bitfield_bit_size_ptr, bool *is_bitfield_ptr) const
bool IsCompleteType() const
CompilerType GetRValueReferenceType() const
Return a new CompilerType that is a R value reference to this type if this type is valid and the type...
bool IsIntegerOrUnscopedEnumerationType() const
size_t GetIndexOfChildMemberWithName(llvm::StringRef name, bool omit_empty_base_classes, std::vector< uint32_t > &child_indexes) const
Lookup a child member given a name.
bool IsScalarOrUnscopedEnumerationType() const
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
bool IsContextuallyConvertibleToBool() const
This may only be defined in TypeSystemClang.
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
CompilerDecl GetStaticFieldWithName(llvm::StringRef name) const
lldb::TypeClass GetTypeClass() const
lldb::opaque_compiler_type_t GetOpaqueQualType() const
size_t GetNumTemplateArguments(bool expand_pack=false) const
Return the number of template arguments the type has.
CompilerType AddVolatileModifier() const
Return a new CompilerType adds a volatile modifier to this type if this type is valid and the type sy...
bool IsVirtualBase(CompilerType target_base, CompilerType *virtual_base, bool carry_virtual=false) const
Checks whether target_base is a virtual base of type (direct or indirect).
CompilerType AddRestrictModifier() const
Return a new CompilerType adds a restrict modifier to this type if this type is valid and the type sy...
bool IsPointerToVoid() const
bool IsBeingDefined() const
lldb::TypeSystemWP m_type_system
bool HasPointerAuthQualifier() const
CompilerType GetDirectNestedTypeWithName(llvm::StringRef name) const
bool GetPtrAuthAddressDiversity() const
uint32_t GetNumVirtualBaseClasses() const
lldb::Encoding GetEncoding() const
size_t GetPointerByteSize() const
AST related queries.
CompilerType GetFunctionArgumentAtIndex(const size_t index) const
void ForEachEnumerator(std::function< bool(const CompilerType &integer_type, ConstString name, const llvm::APSInt &value)> const &callback) const
If this type is an enumeration, iterate through all of its enumerators using a callback.
bool IsMemberDataPointerType() const
LLVM_DUMP_METHOD void dump() const
Dumping types.
CompilerType GetLValueReferenceType() const
Return a new CompilerType that is a L value reference to this type if this type is valid and the type...
uint32_t GetNumFields() const
bool IsPromotableIntegerType() const
Checks if the type is eligible for integral promotion.
size_t GetNumberOfFunctionArguments() const
bool IsComplexType() const
bool IsIntegerOrEnumerationType(bool &is_signed) const
bool IsScopedEnumerationType() const
bool ShouldTreatScalarValueAsAddress() const
CompilerType GetNonReferenceType() const
If this type is a reference to a type (L value or R value reference), return a new type with the refe...
uint32_t GetNumDirectBaseClasses() const
bool IsMeaninglessWithoutDynamicResolution() const
bool IsBlockPointerType(CompilerType *function_pointer_type_ptr=nullptr) const
bool IsAnonymousType() const
ConstString GetTypeName(bool BaseOnly=false) const
bool IsEnumerationIntegerTypeSigned() const
CompilerType GetTypedefedType() const
If the current object represents a typedef type, get the underlying type.
bool IsReferenceType(CompilerType *pointee_type=nullptr, bool *is_rvalue=nullptr) const
bool DumpTypeValue(Stream *s, lldb::Format format, const DataExtractor &data, lldb::offset_t data_offset, size_t data_byte_size, uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset, ExecutionContextScope *exe_scope)
bool IsArrayOfScalarType() const
std::string TypeDescription()
bool IsAggregateType() const
CompilerType GetArrayElementType(ExecutionContextScope *exe_scope) const
Creating related types.
bool IsInteger() const
This is used when you don't care about the signedness of the integer.
CompilerType AddAddressSpaceModifier(uint32_t address_space) const
Return a new CompilerType that qualifies this type with the given target address space if this type i...
llvm::Expected< CompilerType > GetDereferencedType(ExecutionContext *exe_ctx, std::string &deref_name, uint32_t &deref_byte_size, int32_t &deref_byte_offset, ValueObject *valobj, uint64_t &language_flags) const
lldb::Format GetFormat() const
CompilerType GetFullyUnqualifiedType() const
ConstString GetMangledTypeName() const
unsigned GetTypeQualifiers() const
llvm::Expected< CompilerType > GetChildCompilerTypeAtIndex(ExecutionContext *exe_ctx, size_t idx, bool transparent_pointers, bool omit_empty_base_classes, bool ignore_array_bounds, std::string &child_name, uint32_t &child_byte_size, int32_t &child_byte_offset, uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset, bool &child_is_base_class, bool &child_is_deref_of_parent, ValueObject *valobj, uint64_t &language_flags) const
CompilerType GetDirectBaseClassAtIndex(size_t idx, uint32_t *bit_offset_ptr) const
std::optional< size_t > GetTypeBitAlign(ExecutionContextScope *exe_scope) const
const char * GetTypeTag()
bool IsFunctionPointerType() const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
bool IsIntegerType(bool &is_signed) const
bool GetCompleteType() const
Type Completion.
bool IsUnscopedEnumerationType() const
bool IsFloatingPointType() const
Returns true for floating point types (including complex floats).
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
std::optional< uint32_t > GetTargetAddressSpace() const
int GetFunctionArgumentCount() const
Returns -1 if this isn't a function of if the function doesn't have a prototype Returns a value >= 0 ...
llvm::Expected< uint32_t > GetIndexOfChildWithName(llvm::StringRef name, bool omit_empty_base_classes) const
Lookup a child given a name.
unsigned GetPtrAuthDiscriminator() const
bool IsRealFloatingPointType() const
Returns true for non-complex float types.
llvm::Expected< uint32_t > GetNumChildren(bool omit_empty_base_classes, const ExecutionContext *exe_ctx) const
bool IsFunctionType() const
CompilerType GetEnumerationIntegerType() const
lldb::opaque_compiler_type_t m_type
bool CompareTypes(CompilerType rhs) const
llvm::Expected< uint64_t > GetBitSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bits.
bool IsScalarType() const
bool IsForcefullyCompleted() const
bool IsEnumerationType() const
This is used when you don't care about the signedness of the enum.
bool IsPolymorphicClass() const
unsigned GetPtrAuthKey() const
CompilerType GetPromotedIntegerType() const
If the type is promotable, returns the type promoted to a larger integer type according to the type s...
CompilerType CreateTypedef(const char *name, const CompilerDeclContext &decl_ctx, uint32_t payload) const
Create a typedef to this type using "name" as the name of the typedef this type is valid and the type...
bool IsTypedefType() const
CompilerType GetFunctionReturnType() const
bool IsRecordType() const
bool IsVectorType(CompilerType *element_type=nullptr, uint64_t *size=nullptr) const
bool IsMemberFunctionPointerType() const
CompilerType GetAtomicType() const
Return a new CompilerType that is the atomic type of this type.
bool IsTemplateType() const
bool IsNullPtrType() const
CompilerType GetCanonicalType() const
void DumpTypeDescription(lldb::DescriptionLevel level=lldb::eDescriptionLevelFull) const
Dump to stdout.
bool IsRuntimeGeneratedType() const
lldb::TemplateArgumentKind GetTemplateArgumentKind(size_t idx, bool expand_pack=false) const
LazyBool ShouldPrintAsOneLiner(ValueObject *valobj) const
TypeMemberFunctionImpl GetMemberFunctionAtIndex(size_t idx)
bool IsPointerOrReferenceType(CompilerType *pointee_type=nullptr) const
bool IsPointerToScalarType() const
CompilerType(lldb::TypeSystemWP type_system, lldb::opaque_compiler_type_t type)
Creates a CompilerType with the given TypeSystem and opaque compiler type.
bool IsPointerType(CompilerType *pointee_type=nullptr) const
CompilerType AddPtrAuthModifier(uint32_t payload) const
Return a new CompilerType adds a ptrauth modifier from the given 32-bit opaque payload to this type i...
A uniqued constant string class.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A stream class that can stream formatted output to a file.
Interface for representing a type system.
virtual CompilerDecl GetStaticFieldWithName(lldb::opaque_compiler_type_t type, llvm::StringRef name)
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
bool operator!=(const Address &lhs, const Address &rhs)
bool operator==(const Address &lhs, const Address &rhs)
void * opaque_compiler_type_t
DescriptionLevel
Description levels for "void GetDescription(Stream *, DescriptionLevel)" calls.
BasicType
Basic types enumeration for the public API SBType::GetBasicType().
Format
Display format definitions.
LanguageType
Programming language type.
@ eLanguageTypeC
Non-standardized C, such as K&R.
@ eTemplateArgumentKindNull
Encoding
Register encoding definitions.
@ eEncodingVector
vector registers
@ eEncodingUint
unsigned integer
@ eEncodingSint
signed integer
std::weak_ptr< lldb_private::TypeSystem > TypeSystemWP