DIERef.cpp revision 327952
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 17DIERef::DIERef() 18 : cu_offset(DW_INVALID_OFFSET), die_offset(DW_INVALID_OFFSET) {} 19 20DIERef::DIERef(dw_offset_t c, dw_offset_t d) : cu_offset(c), die_offset(d) {} 21 22DIERef::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 45DIERef::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 59lldb::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 && die_offset != DW_INVALID_OFFSET) 69 return dwarf->GetID() | die_offset; 70 else 71 return LLDB_INVALID_UID; 72} 73