1 //===-- DIERef.cpp ----------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "DIERef.h" 11 #include "DWARFCompileUnit.h" 12 #include "DWARFDebugInfo.h" 13 #include "DWARFFormValue.h" 14 #include "SymbolFileDWARF.h" 15 #include "SymbolFileDWARFDebugMap.h" 16 17 DIERef::DIERef() 18 : cu_offset(DW_INVALID_OFFSET), die_offset(DW_INVALID_OFFSET) {} 19 20 DIERef::DIERef(dw_offset_t c, dw_offset_t d) : cu_offset(c), die_offset(d) {} 21 22 DIERef::DIERef(lldb::user_id_t uid, SymbolFileDWARF *dwarf) 23 : cu_offset(DW_INVALID_OFFSET), die_offset(uid & 0xffffffff) { 24 SymbolFileDWARFDebugMap *debug_map = dwarf->GetDebugMapSymfile(); 25 if (debug_map) { 26 const uint32_t oso_idx = debug_map->GetOSOIndexFromUserID(uid); 27 SymbolFileDWARF *actual_dwarf = debug_map->GetSymbolFileByOSOIndex(oso_idx); 28 if (actual_dwarf) { 29 DWARFDebugInfo *debug_info = actual_dwarf->DebugInfo(); 30 if (debug_info) { 31 DWARFCompileUnit *dwarf_cu = 32 debug_info->GetCompileUnitContainingDIEOffset(die_offset); 33 if (dwarf_cu) { 34 cu_offset = dwarf_cu->GetOffset(); 35 return; 36 } 37 } 38 } 39 die_offset = DW_INVALID_OFFSET; 40 } else { 41 cu_offset = uid >> 32; 42 } 43 } 44 45 DIERef::DIERef(const DWARFFormValue &form_value) 46 : cu_offset(DW_INVALID_OFFSET), die_offset(DW_INVALID_OFFSET) { 47 if (form_value.IsValid()) { 48 const DWARFCompileUnit *dwarf_cu = form_value.GetCompileUnit(); 49 if (dwarf_cu) { 50 if (dwarf_cu->GetBaseObjOffset() != DW_INVALID_OFFSET) 51 cu_offset = dwarf_cu->GetBaseObjOffset(); 52 else 53 cu_offset = dwarf_cu->GetOffset(); 54 } 55 die_offset = form_value.Reference(); 56 } 57 } 58 59 lldb::user_id_t DIERef::GetUID(SymbolFileDWARF *dwarf) const { 60 //---------------------------------------------------------------------- 61 // Each SymbolFileDWARF will set its ID to what is expected. 62 // 63 // SymbolFileDWARF, when used for DWARF with .o files on MacOSX, has the 64 // ID set to the compile unit index. 65 // 66 // SymbolFileDWARFDwo sets the ID to the compile unit offset. 67 //---------------------------------------------------------------------- 68 if (dwarf) 69 return dwarf->GetID() | die_offset; 70 else 71 return LLDB_INVALID_UID; 72 } 73