本文整理汇总了C++中DWARFDIE::GetID方法的典型用法代码示例。如果您正苦于以下问题:C++ DWARFDIE::GetID方法的具体用法?C++ DWARFDIE::GetID怎么用?C++ DWARFDIE::GetID使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DWARFDIE
的用法示例。
在下文中一共展示了DWARFDIE::GetID方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ParseBaseTypeFromDIE
TypeSP DWARFASTParserOCaml::ParseBaseTypeFromDIE(const DWARFDIE &die) {
SymbolFileDWARF *dwarf = die.GetDWARF();
dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
ConstString type_name;
uint64_t byte_size = 0;
DWARFAttributes attributes;
const size_t num_attributes = die.GetAttributes(attributes);
for (uint32_t i = 0; i < num_attributes; ++i) {
DWARFFormValue form_value;
dw_attr_t attr = attributes.AttributeAtIndex(i);
if (attributes.ExtractFormValueAtIndex(i, form_value)) {
switch (attr) {
case DW_AT_name:
type_name.SetCString(form_value.AsCString());
break;
case DW_AT_byte_size:
byte_size = form_value.Unsigned();
break;
case DW_AT_encoding:
break;
default:
assert(false && "Unsupported attribute for DW_TAG_base_type");
}
}
}
Declaration decl;
CompilerType compiler_type = m_ast.CreateBaseType(type_name, byte_size);
return std::make_shared<Type>(die.GetID(), dwarf, type_name, byte_size,
nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID,
decl, compiler_type, Type::eResolveStateFull);
}
示例2: type_die_ref
TypeSP
DWARFASTParserJava::ParseReferenceTypeFromDIE(const DWARFDIE &die)
{
SymbolFileDWARF *dwarf = die.GetDWARF();
dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
Declaration decl;
DWARFFormValue type_attr_value;
DWARFAttributes attributes;
const size_t num_attributes = die.GetAttributes(attributes);
for (uint32_t i = 0; i < num_attributes; ++i)
{
DWARFFormValue form_value;
dw_attr_t attr = attributes.AttributeAtIndex(i);
if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
case DW_AT_type:
type_attr_value = form_value;
break;
default:
assert(false && "Unsupported attribute for DW_TAG_array_type");
}
}
}
DIERef type_die_ref(type_attr_value);
Type *pointee_type = dwarf->ResolveTypeUID(type_die_ref);
if (!pointee_type)
return nullptr;
CompilerType pointee_compiler_type = pointee_type->GetForwardCompilerType();
CompilerType reference_compiler_type = m_ast.CreateReferenceType(pointee_compiler_type);
TypeSP type_sp(new Type(die.GetID(), dwarf, reference_compiler_type.GetTypeName(), -1, nullptr,
type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl,
reference_compiler_type, Type::eResolveStateFull));
type_sp->SetEncodingType(pointee_type);
return type_sp;
}
示例3: length_expression
TypeSP
DWARFASTParserJava::ParseArrayTypeFromDIE(const DWARFDIE &die)
{
SymbolFileDWARF *dwarf = die.GetDWARF();
dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
ConstString linkage_name;
DWARFFormValue type_attr_value;
lldb::addr_t data_offset = LLDB_INVALID_ADDRESS;
DWARFExpression length_expression(die.GetCU());
DWARFAttributes attributes;
const size_t num_attributes = die.GetAttributes(attributes);
for (uint32_t i = 0; i < num_attributes; ++i)
{
DWARFFormValue form_value;
dw_attr_t attr = attributes.AttributeAtIndex(i);
if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
case DW_AT_linkage_name:
linkage_name.SetCString(form_value.AsCString());
break;
case DW_AT_type:
type_attr_value = form_value;
break;
case DW_AT_data_member_location:
data_offset = form_value.Unsigned();
break;
case DW_AT_declaration:
break;
default:
assert(false && "Unsupported attribute for DW_TAG_array_type");
}
}
}
for (DWARFDIE child_die = die.GetFirstChild(); child_die.IsValid(); child_die = child_die.GetSibling())
{
if (child_die.Tag() == DW_TAG_subrange_type)
{
DWARFAttributes attributes;
const size_t num_attributes = child_die.GetAttributes(attributes);
for (uint32_t i = 0; i < num_attributes; ++i)
{
DWARFFormValue form_value;
dw_attr_t attr = attributes.AttributeAtIndex(i);
if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
case DW_AT_count:
if (form_value.BlockData())
length_expression.CopyOpcodeData(form_value.BlockData(), form_value.Unsigned(),
child_die.GetCU()->GetByteOrder(),
child_die.GetCU()->GetAddressByteSize());
break;
default:
assert(false && "Unsupported attribute for DW_TAG_subrange_type");
}
}
}
}
else
{
assert(false && "Unsupported child for DW_TAG_array_type");
}
}
DIERef type_die_ref(type_attr_value);
Type *element_type = dwarf->ResolveTypeUID(type_die_ref);
if (!element_type)
return nullptr;
CompilerType element_compiler_type = element_type->GetForwardCompilerType();
CompilerType array_compiler_type =
m_ast.CreateArrayType(element_compiler_type, length_expression, data_offset);
Declaration decl;
TypeSP type_sp(new Type(die.GetID(), dwarf, array_compiler_type.GetTypeName(), -1, nullptr,
type_die_ref.GetUID(dwarf), Type::eEncodingIsUID, &decl,
array_compiler_type, Type::eResolveStateFull));
type_sp->SetEncodingType(element_type);
return type_sp;
}
示例4: compiler_type
lldb::TypeSP
DWARFASTParserJava::ParseClassTypeFromDIE(const DWARFDIE &die, bool &is_new_type)
{
SymbolFileDWARF *dwarf = die.GetDWARF();
dwarf->m_die_to_type[die.GetDIE()] = DIE_IS_BEING_PARSED;
Declaration decl;
ConstString name;
ConstString linkage_name;
bool is_forward_declaration = false;
uint32_t byte_size = 0;
DWARFAttributes attributes;
const size_t num_attributes = die.GetAttributes(attributes);
for (uint32_t i = 0; i < num_attributes; ++i)
{
DWARFFormValue form_value;
dw_attr_t attr = attributes.AttributeAtIndex(i);
if (attributes.ExtractFormValueAtIndex(i, form_value))
{
switch (attr)
{
case DW_AT_name:
name.SetCString(form_value.AsCString());
break;
case DW_AT_declaration:
is_forward_declaration = form_value.Boolean();
break;
case DW_AT_byte_size:
byte_size = form_value.Unsigned();
break;
case DW_AT_linkage_name:
linkage_name.SetCString(form_value.AsCString());
break;
default:
assert(false && "Unsupported attribute for DW_TAG_class_type");
}
}
}
UniqueDWARFASTType unique_ast_entry;
if (name)
{
std::string qualified_name;
if (die.GetQualifiedName(qualified_name))
{
name.SetCString(qualified_name.c_str());
if (dwarf->GetUniqueDWARFASTTypeMap().Find(name, die, Declaration(), -1, unique_ast_entry))
{
if (unique_ast_entry.m_type_sp)
{
dwarf->GetDIEToType()[die.GetDIE()] = unique_ast_entry.m_type_sp.get();
is_new_type = false;
return unique_ast_entry.m_type_sp;
}
}
}
}
if (is_forward_declaration)
{
DWARFDeclContext die_decl_ctx;
die.GetDWARFDeclContext(die_decl_ctx);
TypeSP type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx);
if (type_sp)
{
// We found a real definition for this type elsewhere so lets use it
dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get();
is_new_type = false;
return type_sp;
}
}
CompilerType compiler_type(&m_ast, dwarf->GetForwardDeclDieToClangType().lookup(die.GetDIE()));
if (!compiler_type)
compiler_type = m_ast.CreateObjectType(name, linkage_name, byte_size);
is_new_type = true;
TypeSP type_sp(new Type(die.GetID(), dwarf, name,
-1, // byte size isn't specified
nullptr, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, compiler_type,
Type::eResolveStateForward));
// Add our type to the unique type map
unique_ast_entry.m_type_sp = type_sp;
unique_ast_entry.m_die = die;
unique_ast_entry.m_declaration = decl;
unique_ast_entry.m_byte_size = -1;
dwarf->GetUniqueDWARFASTTypeMap().Insert(name, unique_ast_entry);
if (!is_forward_declaration)
{
// Leave this as a forward declaration until we need to know the details of the type
dwarf->GetForwardDeclDieToClangType()[die.GetDIE()] = compiler_type.GetOpaqueQualType();
dwarf->GetForwardDeclClangTypeToDie()[compiler_type.GetOpaqueQualType()] = die.GetDIERef();
}
return type_sp;
}