13#include "lldb/Host/Config.h"
31#include "llvm/Config/llvm-config.h"
32#include "llvm/Support/ErrorExtras.h"
33#include "llvm/Support/MemoryBuffer.h"
66 return "Compact C Type Format Symbol Reader";
80 const SectionList *section_list = module_sp->GetSectionList();
91 if (
m_data.GetByteSize() == 0)
97 LLDB_LOG(log,
"Parsing Compact C Type format for {0}", module_desc.
GetData());
102 constexpr size_t ctf_header_size =
sizeof(
ctf_header_t);
103 if (!
m_data.ValidOffsetForDataOfSize(offset, ctf_header_size)) {
104 LLDB_LOG(log,
"CTF parsing failed: insufficient data for CTF header");
125 LLDB_LOG(log,
"CTF parsing failed: invalid magic: {0:x}",
131 LLDB_LOG(log,
"CTF parsing failed: unsupported version: {0}",
136 LLDB_LOG(log,
"Parsed valid CTF preamble: version {0}, flags {1:x}",
145 const std::size_t decompressed_size = ctf_header.
stroff + ctf_header.
strlen;
147 std::make_shared<DataBufferHeap>(decompressed_size, 0x0);
150 memset(&zstr, 0,
sizeof(zstr));
151 zstr.next_in = (Bytef *)
const_cast<uint8_t *
>(
m_data.GetDataStart() +
153 zstr.avail_in =
m_data.BytesLeft(offset);
155 (Bytef *)
const_cast<uint8_t *
>(decompressed_data->GetBytes());
156 zstr.avail_out = decompressed_size;
158 int rc = inflateInit(&zstr);
160 LLDB_LOG(log,
"CTF parsing failed: inflate initialization error: {0}",
165 rc = inflate(&zstr, Z_FINISH);
166 if (rc != Z_STREAM_END) {
167 LLDB_LOG(log,
"CTF parsing failed: inflate error: {0}", zError(rc));
171 rc = inflateEnd(&zstr);
173 LLDB_LOG(log,
"CTF parsing failed: inflate end error: {0}", zError(rc));
177 if (zstr.total_out != decompressed_size) {
179 "CTF parsing failed: decompressed size ({0}) doesn't match "
180 "expected size ([1})",
181 zstr.total_out, decompressed_size);
186 m_data.GetAddressByteSize());
191 "CTF parsing failed: data is compressed but no zlib inflate support");
199 "CTF parsing failed: invalid label section offset in header: {0}",
206 "CTF parsing failed: invalid object section offset in header: {0}",
214 "CTF parsing failed: invalid function section offset in header: {0}",
221 "CTF parsing failed: invalid type section offset in header: {0}",
228 "CTF parsing failed: invalid string section offset in header: {0}",
235 if (!
m_data.ValidOffset(str_end_offset - 1)) {
237 "CTF parsing failed: invalid string section length in header: {0}",
245 "CTF parsing failed: invalid parent label offset: {0} exceeds end "
246 "of string section ({1})",
247 ctf_header.
parlabel, str_end_offset);
253 "CTF parsing failed: invalid parent name offset: {0} exceeds end "
254 "of string section ({1})",
255 ctf_header.
parname, str_end_offset);
260 "Parsed valid CTF header: lbloff = {0}, objtoff = {1}, funcoff = "
261 "{2}, typeoff = {3}, stroff = {4}, strlen = {5}",
272 if (
auto err = type_system_or_err.takeError()) {
273 LLDB_LOG_ERROR(log, std::move(err),
"Unable to get type system: {0}");
277 auto ts = *type_system_or_err;
278 m_ast = llvm::dyn_cast_or_null<TypeSystemClang>(ts.get());
288 if (!
m_data.ValidOffset(offset))
290 const char *str =
m_data.GetCStr(&offset);
293 return llvm::StringRef(str);
299 return ((data)&0xff000000) >> 24;
305 return (data)&0x0000ffff;
311 return ((data)&0xf800) >> 11;
325 return clang::TagTypeKind::Struct;
327 return clang::TagTypeKind::Union;
330 return clang::TagTypeKind::Struct;
334llvm::Expected<TypeSP>
339 return llvm::createStringErrorV(
340 "unsupported integer type: no corresponding basic clang "
348 bool compiler_type_is_signed =
false;
350 return llvm::createStringErrorV(
351 "Found compiler type for '{0}' but it's not an integer type: {1}",
356 if (compiler_type_is_signed != type_is_signed)
357 return llvm::createStringErrorV(
358 "Found integer compiler type for {0} but compiler type is {1} and "
360 ctf_integer.
name, compiler_type_is_signed ?
"signed" :
"unsigned",
361 type_is_signed ?
"signed" :
"unsigned");
371llvm::Expected<lldb::TypeSP>
375 return llvm::createStringErrorV(
"Could not find modified type: {0}",
380 switch (ctf_modifier.
kind) {
394 return llvm::createStringErrorV(
395 "ParseModifier called with unsupported kind: {0}", ctf_modifier.
kind);
404llvm::Expected<lldb::TypeSP>
407 if (!underlying_type)
408 return llvm::createStringErrorV(
409 "Could not find typedef underlying type: {0}", ctf_typedef.
type);
412 clang::DeclContext *decl_ctx =
m_ast->GetTranslationUnitDecl();
414 ctf_typedef.
name.data(),
m_ast->CreateDeclContext(decl_ctx), 0);
422llvm::Expected<lldb::TypeSP>
426 return llvm::createStringErrorV(
"Could not find array element type: {0}",
429 auto element_size_or_err = element_type->
GetByteSize(
nullptr);
430 if (!element_size_or_err)
431 return element_size_or_err.takeError();
433 uint64_t size = ctf_array.
nelems * *element_size_or_err;
445llvm::Expected<lldb::TypeSP>
455 m_ast->AddEnumerationValueToEnumerationType(
456 enum_type, value_decl, value.
name.data(), value.
value, ctf_enum.
size);
465llvm::Expected<lldb::TypeSP>
467 std::vector<CompilerType> arg_types;
468 for (uint32_t arg : ctf_function.
args) {
470 arg_types.push_back(arg_type->GetFullCompilerType());
475 return llvm::createStringErrorV(
"Could not find function return type: {0}",
480 clang::CallingConv::CC_C);
488llvm::Expected<lldb::TypeSP>
507 const CTFType *ctf_type = it->second;
508 assert(ctf_type &&
"m_compiler_types should only contain valid CTF types");
511 assert(llvm::isa<CTFRecord>(ctf_type));
520 "Cannot complete type {0} because field {1} is incomplete",
527 m_ast->StartTagDeclarationDefinition(compiler_type);
530 assert(field_type &&
"field must be complete");
531 const uint32_t field_size =
532 llvm::expectedToOptional(field_type->
GetByteSize(
nullptr)).value_or(0);
537 m_ast->CompleteTagDeclarationDefinition(compiler_type);
547llvm::Expected<lldb::TypeSP>
560 return llvm::createStringError(
"cannot create type for unparsed type");
562 switch (ctf_type->
kind) {
586 return llvm::createStringErrorV(
587 "unsupported type (uid = {0}, name = {1}, kind = {2})", ctf_type->
uid,
590 llvm_unreachable(
"Unexpected CTF type kind");
593llvm::Expected<std::unique_ptr<CTFType>>
602 const uint32_t variable_length =
GetVLen(ctf_stype.
info);
603 const uint32_t type = ctf_stype.
GetType();
604 const uint32_t size = ctf_stype.
GetSize();
608 const uint32_t vdata =
m_data.GetU32(&offset);
611 return std::make_unique<CTFInteger>(uid, name,
bits, encoding);
614 return std::make_unique<CTFConst>(uid, type);
616 return std::make_unique<CTFPointer>(uid, type);
618 return std::make_unique<CTFRestrict>(uid, type);
620 return std::make_unique<CTFVolatile>(uid, type);
622 return std::make_unique<CTFTypedef>(uid, name, type);
624 const uint32_t type =
m_data.GetU32(&offset);
625 const uint32_t index =
m_data.GetU32(&offset);
626 const uint32_t nelems =
m_data.GetU32(&offset);
627 return std::make_unique<CTFArray>(uid, name, type, index, nelems);
630 std::vector<CTFEnum::Value> values;
631 for (uint32_t i = 0; i < variable_length; ++i) {
632 const uint32_t value_name =
m_data.GetU32(&offset);
633 const uint32_t value =
m_data.GetU32(&offset);
634 values.emplace_back(
ReadString(value_name), value);
636 return std::make_unique<CTFEnum>(uid, name, variable_length, size, values);
639 std::vector<uint32_t> args;
640 bool variadic =
false;
641 for (uint32_t i = 0; i < variable_length; ++i) {
642 const uint32_t arg_uid =
m_data.GetU32(&offset);
648 args.push_back(arg_uid);
652 if (variable_length % 2 == 1)
654 return std::make_unique<CTFFunction>(uid, name, variable_length, type, args,
659 std::vector<CTFRecord::Field> fields;
660 for (uint32_t i = 0; i < variable_length; ++i) {
661 const uint32_t field_name =
m_data.GetU32(&offset);
662 const uint32_t type =
m_data.GetU32(&offset);
663 uint64_t field_offset = 0;
665 field_offset =
m_data.GetU16(&offset);
668 const uint32_t offset_hi =
m_data.GetU32(&offset);
669 const uint32_t offset_lo =
m_data.GetU32(&offset);
670 field_offset = (((uint64_t)offset_hi) << 32) | ((uint64_t)offset_lo);
672 fields.emplace_back(
ReadString(field_name), type, field_offset);
674 return std::make_unique<CTFRecord>(
static_cast<CTFType::Kind>(kind), uid,
675 name, variable_length, size, fields);
678 return std::make_unique<CTFForward>(uid, name);
680 return std::make_unique<CTFType>(
static_cast<CTFType::Kind>(kind), uid,
684 offset += (variable_length *
sizeof(uint32_t));
688 return llvm::createStringErrorV(
689 "unsupported type (name = {0}, kind = {1}, vlength = {2})", name, kind,
710 while (type_offset < type_offset_end) {
711 llvm::Expected<std::unique_ptr<CTFType>> type_or_error =
714 m_ctf_types[(*type_or_error)->uid] = std::move(*type_or_error);
717 "Failed to parse type {1} at offset {2}: {0}", type_uid,
732 CTFType *ctf_type = ctf_type_it->second.get();
733 if (!llvm::isa<CTFRecord>(ctf_type))
741 CTFType *ctf_type = t.second.get();
742 assert(ctf_type &&
"invalid type in m_ctf_types");
743 assert(llvm::isa<CTFRecord>(ctf_type) &&
"leaking non record type");
768 LLDB_LOG(log,
"Parsing CTF functions");
773 uint32_t symbol_idx = 0;
775 while (function_offset < function_offset_end) {
776 const uint32_t info =
m_data.GetU32(&function_offset);
777 const uint16_t kind =
GetKind(info);
778 const uint16_t variable_length =
GetVLen(info);
791 const uint32_t ret_uid =
m_data.GetU32(&function_offset);
792 const uint32_t num_args = variable_length;
794 std::vector<CompilerType> arg_types;
795 arg_types.reserve(num_args);
797 bool is_variadic =
false;
798 for (uint32_t i = 0; i < variable_length; i++) {
799 const uint32_t arg_uid =
m_data.GetU32(&function_offset);
821 arg_types, is_variadic, 0, clang::CallingConv::CC_C);
827 m_types[function_type_uid] = type_sp;
831 FunctionSP function_sp = std::make_shared<Function>(
832 &cu, func_uid, function_type_uid, symbol->
GetMangled(), type_sp.get(),
849 const ArchSpec &architecture = module_sp->GetArchitecture();
854 stream.
PutHex8(llvm::dwarf::DW_OP_addr);
858 std::make_shared<DataBufferHeap>(stream.
GetData(), stream.
GetSize());
877 Symtab *symtab = module_sp->GetSymtab();
882 LLDB_LOG(log,
"Parsing CTF objects");
887 uint32_t symbol_idx = 0;
889 while (object_offset < object_offset_end) {
890 const uint32_t type_uid =
m_data.GetU32(&object_offset);
892 if (
const Symbol *symbol =
896 ranges.
Append(symbol->GetFileAddress(), symbol->GetByteSize());
898 auto type_sp = std::make_shared<SymbolFileType>(*
this, type_uid);
904 m_variables.emplace_back(std::make_shared<Variable>(
905 variable_type_uid, symbol->GetName().AsCString(),
907 m_comp_unit_sp.get(), ranges, &decl, location, symbol->IsExternal(),
929 SymbolContextItem resolve_scope,
935 uint32_t resolved_flags = 0;
938 if (resolve_scope & eSymbolContextSymbol) {
942 resolved_flags |= eSymbolContextSymbol;
946 if (resolve_scope & eSymbolContextFunction) {
949 function_sp->GetAddressRanges(), [&](
const AddressRange range) {
950 return range.ContainsFileAddress(so_addr.GetFileAddress());
953 resolved_flags |= eSymbolContextFunction;
960 if (resolve_scope & eSymbolContextVariable) {
962 if (variable_sp->LocationIsValidForAddress(so_addr.
GetFileAddress())) {
969 return resolved_flags;
989 auto type_it =
m_types.find(type_uid);
991 return type_it->second.get();
997 CTFType *ctf_type = ctf_type_it->second.get();
998 assert(ctf_type &&
"m_ctf_types should only contain valid CTF types");
999 assert(ctf_type->
uid == type_uid &&
1000 "CTF type UID doesn't match UID in m_ctf_types");
1004 llvm::Expected<TypeSP> type_or_error =
CreateType(ctf_type);
1005 if (!type_or_error) {
1007 "Failed to create type for {1}: {0}", ctf_type->
uid);
1011 TypeSP type_sp = *type_or_error;
1015 type_sp->Dump(&ss,
true);
1016 LLDB_LOGV(log,
"Adding type {0}: {1}", type_sp->GetID(),
1017 llvm::StringRef(ss.
GetString()).rtrim());
1022 return type_sp.get();
1033 if (type_sp && type_sp->GetName() == name) {
1035 if (results.
Done(match))
1048 if (matches == max_matches)
1050 if (type_sp && regex.
Execute(type_sp->GetName()))
1064 if (function_sp && function_sp->GetName() == name) {
1074 bool include_inlines,
1077 if (function_sp && regex.
Execute(function_sp->GetName())) {
1094 if (matches == max_matches)
1096 if (variable_sp && variable_sp->GetName() == name) {
1110 if (matches == max_matches)
1112 if (variable_sp && regex.
Execute(variable_sp->GetName())) {
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERROR(log, error,...)
#define LLDB_LOGV(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
uint32_t GetKind(uint32_t data)
Return the type kind encoded in the given data.
static DWARFExpression CreateDWARFExpression(ModuleSP module_sp, const Symbol &symbol)
uint32_t GetVLen(uint32_t data)
Return the variable length encoded in the given data.
static clang::TagTypeKind TranslateRecordKind(CTFType::Kind type)
static uint32_t GetEncoding(uint32_t data)
Return the integer display representation encoded in the given data.
static uint32_t GetBits(uint32_t data)
Return the integral width in bits encoded in the given data.
static uint32_t GetBytes(uint32_t bits)
A section + offset based address range class.
A section + offset based address class.
lldb::addr_t GetFileAddress() const
Get the file address.
An architecture specification class.
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
A class that describes a compilation unit.
void AddFunction(lldb::FunctionSP &function_sp)
Add a function to this compile unit.
Represents a generic declaration context in a program.
Generic representation of a type in a programming language.
CompilerType AddConstModifier() const
Return a new CompilerType adds a const modifier to this type if this type is valid and the type syste...
ConstString GetDisplayTypeName() const
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
lldb::opaque_compiler_type_t GetOpaqueQualType() const
CompilerType AddVolatileModifier() const
Return a new CompilerType adds a volatile modifier to this type if this type is valid and the type sy...
CompilerType AddRestrictModifier() const
Return a new CompilerType adds a restrict modifier to this type if this type is valid and the type sy...
bool IsIntegerType(bool &is_signed) const
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...
A uniqued constant string class.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
"lldb/Expression/DWARFExpressionList.h" Encapsulates a range map from file address range to a single ...
"lldb/Expression/DWARFExpression.h" Encapsulates a DWARF location expression and interprets it.
void SetRegisterKind(lldb::RegisterKind reg_kind)
Set the call-frame-info style register kind.
A class that describes the declaration location of a lldb object.
lldb::ModuleSP GetModule() const
Get const accessor for the module pointer.
A class that encapsulates name lookup information.
ConstString GetLookupName() const
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
void Append(const Entry &entry)
bool Execute(llvm::StringRef string, llvm::SmallVectorImpl< llvm::StringRef > *matches=nullptr) const
Execute a regular expression match using the compiled regular expression that is already in this obje...
lldb::SectionSP FindSectionByType(lldb::SectionType sect_type, bool check_children, size_t start_idx=0) const
const char * GetData() const
const char * GetData() const
llvm::StringRef GetString() const
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
size_t size_t PutHex8(uint8_t uvalue)
Append an uint8_t value in the hexadecimal format to the stream.
@ eBinary
Get and put data as binary instead of as the default string mode.
size_t PutMaxHex64(uint64_t uvalue, size_t byte_size, lldb::ByteOrder byte_order=lldb::eByteOrderInvalid)
Defines a list of symbol context objects.
void Append(const SymbolContext &sc)
Append a new symbol context to the list.
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
CompileUnit * comp_unit
The CompileUnit for a given query.
Variable * variable
The global variable matching the given query.
Symbol * symbol
The Symbol for a given query.
void FindTypesByRegex(const lldb_private::RegularExpression ®ex, uint32_t max_matches, lldb_private::TypeMap &types)
Type * ResolveTypeUID(lldb::user_id_t type_uid) override
static constexpr uint16_t g_ctf_magic
llvm::Expected< lldb::TypeSP > CreateFunction(const CTFFunction &ctf_function)
void AddSymbols(Symtab &symtab) override
bool CompleteType(CompilerType &compiler_type) override
lldb::CompUnitSP m_comp_unit_sp
std::vector< lldb::FunctionSP > m_functions
static char ID
LLVM RTTI support.
llvm::Expected< lldb::TypeSP > CreateTypedef(const CTFTypedef &ctf_typedef)
size_t ParseFunctions(CompileUnit &comp_unit) override
static llvm::StringRef GetPluginDescriptionStatic()
llvm::DenseMap< lldb::opaque_compiler_type_t, const CTFType * > m_compiler_types
To complete types, we need a way to map (imcomplete) compiler types back to parsed CTF types.
void FindFunctions(const lldb_private::Module::LookupInfo &lookup_info, const lldb_private::CompilerDeclContext &parent_decl_ctx, bool include_inlines, lldb_private::SymbolContextList &sc_list) override
llvm::Expected< lldb::TypeSP > CreateArray(const CTFArray &ctf_array)
uint32_t CalculateAbilities() override
size_t ParseVariablesForContext(const SymbolContext &sc) override
static lldb_private::SymbolFile * CreateInstance(lldb::ObjectFileSP objfile_sp)
lldb::offset_t m_body_offset
The start offset of the CTF body into m_data.
static constexpr uint16_t g_ctf_field_threshold
lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override
static llvm::StringRef GetPluginNameStatic()
size_t ParseObjects(CompileUnit &comp_unit)
llvm::Expected< lldb::TypeSP > CreateForward(const CTFForward &ctf_forward)
llvm::Expected< lldb::TypeSP > CreateEnum(const CTFEnum &ctf_enum)
void InitializeObject() override
Initialize the SymbolFile object.
void FindTypes(const lldb_private::TypeQuery &match, lldb_private::TypeResults &results) override
Find types using a type-matching object that contains all search parameters.
llvm::StringRef ReadString(lldb::offset_t offset) const
llvm::Expected< lldb::TypeSP > CreateRecord(const CTFRecord &ctf_record)
void FindGlobalVariables(lldb_private::ConstString name, const lldb_private::CompilerDeclContext &parent_decl_ctx, uint32_t max_matches, lldb_private::VariableList &variables) override
llvm::Expected< lldb::TypeSP > CreateInteger(const CTFInteger &ctf_integer)
static constexpr uint8_t g_ctf_version
llvm::DenseMap< lldb::user_id_t, lldb::TypeSP > m_types
Parsed LLDB types.
std::vector< lldb::VariableSP > m_variables
llvm::DenseMap< lldb::user_id_t, std::unique_ptr< CTFType > > m_ctf_types
Parsed CTF types.
llvm::Expected< lldb::TypeSP > CreateModifier(const CTFModifier &ctf_modifier)
llvm::Expected< lldb::TypeSP > CreateType(CTFType *ctf_type)
SymbolFileCTF(lldb::ObjectFileSP objfile_sp)
uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr, lldb::SymbolContextItem resolve_scope, lldb_private::SymbolContext &sc) override
llvm::Expected< std::unique_ptr< CTFType > > ParseType(lldb::offset_t &offset, lldb::user_id_t uid)
std::optional< ctf_header_t > m_header
size_t ParseTypes(CompileUnit &cu) override
ObjectFile * GetObjectFile() override
virtual TypeList & GetTypeList()
lldb::ObjectFileSP m_objfile_sp
SymbolFileCommon(lldb::ObjectFileSP objfile_sp)
llvm::Expected< lldb::TypeSystemSP > GetTypeSystemForLanguage(lldb::LanguageType language) override
lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, std::optional< uint64_t > byte_size, SymbolContextScope *context, lldb::user_id_t encoding_uid, Type::EncodingDataType encoding_uid_type, const Declaration &decl, const CompilerType &compiler_qual_type, Type::ResolveState compiler_type_resolve_state, uint32_t opaque_payload=0) override
This function is used to create types that belong to a SymbolFile.
Provides public interface for all SymbolFiles.
virtual std::recursive_mutex & GetModuleMutex() const
Symbols file subclasses should override this to return the Module that owns the TypeSystem that this ...
lldb::addr_t GetFileAddress() const
lldb::addr_t GetByteSize() const
ConstString GetName() const
Address GetAddress() const
Symbol * FindSymbolWithType(lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, uint32_t &start_idx)
void Insert(const lldb::TypeSP &type)
A class that contains all state required for type lookups.
ConstString GetTypeBasename() const
Get the type basename to use when searching the type indexes in each SymbolFile object.
This class tracks the state and results of a TypeQuery.
bool InsertUnique(const lldb::TypeSP &type_sp)
When types that match a TypeQuery are found, this API is used to insert the matching types.
bool Done(const TypeQuery &query) const
Check if the type matching has found all of the matches that it needs.
bool AlreadySearched(lldb_private::SymbolFile *sym_file)
Check if a SymbolFile object has already been searched by this type match object.
static lldb::BasicType GetBasicTypeEnumeration(llvm::StringRef name)
static bool CompleteTagDeclarationDefinition(const CompilerType &type)
static clang::FieldDecl * AddFieldToRecordType(const CompilerType &type, llvm::StringRef name, const CompilerType &field_type, uint32_t bitfield_bit_size)
@ eEncodingIsUID
This type is the type whose UID is m_encoding_uid.
CompilerType GetFullCompilerType()
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope)
void AddVariable(const lldb::VariableSP &var_sp)
RangeVector< lldb::addr_t, lldb::addr_t > RangeList
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.
static uint32_t bits(const uint32_t val, const uint32_t msbit, const uint32_t lsbit)
std::shared_ptr< lldb_private::Function > FunctionSP
BasicType
Basic types enumeration for the public API SBType::GetBasicType().
std::shared_ptr< lldb_private::ObjectFile > ObjectFileSP
@ eLanguageTypeC
Non-standardized C, such as K&R.
std::shared_ptr< lldb_private::Type > TypeSP
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::Variable > VariableSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::Section > SectionSP
std::shared_ptr< lldb_private::Module > ModuleSP
std::shared_ptr< lldb_private::CompileUnit > CompUnitSP
@ eValueTypeVariableGlobal
globals variable
@ eRegisterKindDWARF
the register numbers seen DWARF
std::vector< Value > values
std::vector< uint32_t > args
std::vector< Field > fields