uint32_t SectionList::AddUniqueSection (SectionSP& sect_sp) { uint32_t sect_idx = FindSectionIndex (sect_sp.get()); if (sect_idx == UINT32_MAX) sect_idx = AddSection (sect_sp); return sect_idx; }
void UnwindTable::Initialize() { if (m_initialized) return; std::lock_guard<std::mutex> guard(m_mutex); if (m_initialized) // check again once we've acquired the lock return; m_initialized = true; SectionList *sl = m_object_file.GetSectionList(); if (!sl) return; SectionSP sect = sl->FindSectionByType(eSectionTypeEHFrame, true); if (sect.get()) { m_eh_frame_up.reset( new DWARFCallFrameInfo(m_object_file, sect, DWARFCallFrameInfo::EH)); } sect = sl->FindSectionByType(eSectionTypeDWARFDebugFrame, true); if (sect) { m_debug_frame_up.reset( new DWARFCallFrameInfo(m_object_file, sect, DWARFCallFrameInfo::DWARF)); } sect = sl->FindSectionByType(eSectionTypeCompactUnwind, true); if (sect) { m_compact_unwind_up.reset(new CompactUnwindInfo(m_object_file, sect)); } sect = sl->FindSectionByType(eSectionTypeARMexidx, true); if (sect) { SectionSP sect_extab = sl->FindSectionByType(eSectionTypeARMextab, true); if (sect_extab.get()) { m_arm_unwind_up.reset(new ArmUnwindInfo(m_object_file, sect, sect_extab)); } } }
void UnwindTable::Initialize () { if (m_initialized) return; SectionList* sl = m_object_file.GetSectionList (); if (sl) { SectionSP sect = sl->FindSectionByType (eSectionTypeEHFrame, true); if (sect.get()) { m_eh_frame = new DWARFCallFrameInfo(m_object_file, sect, eRegisterKindGCC, true); } } ArchSpec arch; if (m_object_file.GetArchitecture (arch)) { m_assembly_profiler = UnwindAssembly::FindPlugin (arch); m_initialized = true; } }
AddressClass ObjectFile::GetAddressClass (addr_t file_addr) { Symtab *symtab = GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList); if (symtab) { Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr); if (symbol) { if (symbol->ValueIsAddress()) { const SectionSP section_sp (symbol->GetAddress().GetSection()); if (section_sp) { const SectionType section_type = section_sp->GetType(); switch (section_type) { case eSectionTypeInvalid: return eAddressClassUnknown; case eSectionTypeCode: return eAddressClassCode; case eSectionTypeContainer: return eAddressClassUnknown; case eSectionTypeData: case eSectionTypeDataCString: case eSectionTypeDataCStringPointers: case eSectionTypeDataSymbolAddress: case eSectionTypeData4: case eSectionTypeData8: case eSectionTypeData16: case eSectionTypeDataPointers: case eSectionTypeZeroFill: case eSectionTypeDataObjCMessageRefs: case eSectionTypeDataObjCCFStrings: return eAddressClassData; case eSectionTypeDebug: case eSectionTypeDWARFDebugAbbrev: case eSectionTypeDWARFDebugAranges: case eSectionTypeDWARFDebugFrame: case eSectionTypeDWARFDebugInfo: case eSectionTypeDWARFDebugLine: case eSectionTypeDWARFDebugLoc: case eSectionTypeDWARFDebugMacInfo: case eSectionTypeDWARFDebugPubNames: case eSectionTypeDWARFDebugPubTypes: case eSectionTypeDWARFDebugRanges: case eSectionTypeDWARFDebugStr: case eSectionTypeDWARFAppleNames: case eSectionTypeDWARFAppleTypes: case eSectionTypeDWARFAppleNamespaces: case eSectionTypeDWARFAppleObjC: return eAddressClassDebug; case eSectionTypeEHFrame: return eAddressClassRuntime; case eSectionTypeELFSymbolTable: case eSectionTypeELFDynamicSymbols: case eSectionTypeELFRelocationEntries: case eSectionTypeELFDynamicLinkInfo: case eSectionTypeOther: return eAddressClassUnknown; } } } const SymbolType symbol_type = symbol->GetType(); switch (symbol_type) { case eSymbolTypeAny: return eAddressClassUnknown; case eSymbolTypeAbsolute: return eAddressClassUnknown; case eSymbolTypeCode: return eAddressClassCode; case eSymbolTypeTrampoline: return eAddressClassCode; case eSymbolTypeResolver: return eAddressClassCode; case eSymbolTypeData: return eAddressClassData; case eSymbolTypeRuntime: return eAddressClassRuntime; case eSymbolTypeException: return eAddressClassRuntime; case eSymbolTypeSourceFile: return eAddressClassDebug; case eSymbolTypeHeaderFile: return eAddressClassDebug; case eSymbolTypeObjectFile: return eAddressClassDebug; case eSymbolTypeCommonBlock: return eAddressClassDebug; case eSymbolTypeBlock: return eAddressClassDebug; case eSymbolTypeLocal: return eAddressClassData; case eSymbolTypeParam: return eAddressClassData; case eSymbolTypeVariable: return eAddressClassData; case eSymbolTypeVariableType: return eAddressClassDebug; case eSymbolTypeLineEntry: return eAddressClassDebug; case eSymbolTypeLineHeader: return eAddressClassDebug; case eSymbolTypeScopeBegin: return eAddressClassDebug; case eSymbolTypeScopeEnd: return eAddressClassDebug; case eSymbolTypeAdditional: return eAddressClassUnknown; case eSymbolTypeCompiler: return eAddressClassDebug; case eSymbolTypeInstrumentation:return eAddressClassDebug; case eSymbolTypeUndefined: return eAddressClassUnknown; case eSymbolTypeObjCClass: return eAddressClassRuntime; case eSymbolTypeObjCMetaClass: return eAddressClassRuntime; case eSymbolTypeObjCIVar: return eAddressClassRuntime; } } } return eAddressClassUnknown; }
AddressClass ObjectFile::GetAddressClass(addr_t file_addr) { Symtab *symtab = GetSymtab(); if (symtab) { Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr); if (symbol) { if (symbol->ValueIsAddress()) { const SectionSP section_sp(symbol->GetAddressRef().GetSection()); if (section_sp) { const SectionType section_type = section_sp->GetType(); switch (section_type) { case eSectionTypeInvalid: return eAddressClassUnknown; case eSectionTypeCode: return eAddressClassCode; case eSectionTypeContainer: return eAddressClassUnknown; case eSectionTypeData: case eSectionTypeDataCString: case eSectionTypeDataCStringPointers: case eSectionTypeDataSymbolAddress: case eSectionTypeData4: case eSectionTypeData8: case eSectionTypeData16: case eSectionTypeDataPointers: case eSectionTypeZeroFill: case eSectionTypeDataObjCMessageRefs: case eSectionTypeDataObjCCFStrings: case eSectionTypeGoSymtab: return eAddressClassData; case eSectionTypeDebug: case eSectionTypeDWARFDebugAbbrev: case eSectionTypeDWARFDebugAddr: case eSectionTypeDWARFDebugAranges: case eSectionTypeDWARFDebugFrame: case eSectionTypeDWARFDebugInfo: case eSectionTypeDWARFDebugLine: case eSectionTypeDWARFDebugLoc: case eSectionTypeDWARFDebugMacInfo: case eSectionTypeDWARFDebugMacro: case eSectionTypeDWARFDebugPubNames: case eSectionTypeDWARFDebugPubTypes: case eSectionTypeDWARFDebugRanges: case eSectionTypeDWARFDebugStr: case eSectionTypeDWARFDebugStrOffsets: case eSectionTypeDWARFAppleNames: case eSectionTypeDWARFAppleTypes: case eSectionTypeDWARFAppleNamespaces: case eSectionTypeDWARFAppleObjC: return eAddressClassDebug; case eSectionTypeEHFrame: case eSectionTypeARMexidx: case eSectionTypeARMextab: case eSectionTypeCompactUnwind: return eAddressClassRuntime; case eSectionTypeELFSymbolTable: case eSectionTypeELFDynamicSymbols: case eSectionTypeELFRelocationEntries: case eSectionTypeELFDynamicLinkInfo: case eSectionTypeOther: return eAddressClassUnknown; case eSectionTypeAbsoluteAddress: // In case of absolute sections decide the address class based on // the symbol // type because the section type isn't specify if it is a code or a // data // section. break; } } } const SymbolType symbol_type = symbol->GetType(); switch (symbol_type) { case eSymbolTypeAny: return eAddressClassUnknown; case eSymbolTypeAbsolute: return eAddressClassUnknown; case eSymbolTypeCode: return eAddressClassCode; case eSymbolTypeTrampoline: return eAddressClassCode; case eSymbolTypeResolver: return eAddressClassCode; case eSymbolTypeData: return eAddressClassData; case eSymbolTypeRuntime: return eAddressClassRuntime; case eSymbolTypeException: return eAddressClassRuntime; case eSymbolTypeSourceFile: return eAddressClassDebug; case eSymbolTypeHeaderFile: return eAddressClassDebug; case eSymbolTypeObjectFile: return eAddressClassDebug; case eSymbolTypeCommonBlock: return eAddressClassDebug; case eSymbolTypeBlock: return eAddressClassDebug; case eSymbolTypeLocal: return eAddressClassData; case eSymbolTypeParam: return eAddressClassData; case eSymbolTypeVariable: return eAddressClassData; case eSymbolTypeVariableType: return eAddressClassDebug; case eSymbolTypeLineEntry: return eAddressClassDebug; case eSymbolTypeLineHeader: return eAddressClassDebug; case eSymbolTypeScopeBegin: return eAddressClassDebug; case eSymbolTypeScopeEnd: return eAddressClassDebug; case eSymbolTypeAdditional: return eAddressClassUnknown; case eSymbolTypeCompiler: return eAddressClassDebug; case eSymbolTypeInstrumentation: return eAddressClassDebug; case eSymbolTypeUndefined: return eAddressClassUnknown; case eSymbolTypeObjCClass: return eAddressClassRuntime; case eSymbolTypeObjCMetaClass: return eAddressClassRuntime; case eSymbolTypeObjCIVar: return eAddressClassRuntime; case eSymbolTypeReExported: return eAddressClassRuntime; } } } return eAddressClassUnknown; }