124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFCompileUnit.cpp ------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFCompileUnit.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12e33bdd301b775bbcc4526d409bc37b435c02a843Greg Clayton#include "lldb/Core/Mangled.h" 1375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/Module.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 16be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton#include "lldb/Symbol/CompileUnit.h" 17be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton#include "lldb/Symbol/LineTable.h" 18500d8ca225282b7c483213beb1224d64df77b6f5Greg Clayton#include "lldb/Symbol/ObjectFile.h" 193ad4da0f2c2afdea3352deaaf9c044855dc5c95bJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugAbbrev.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugAranges.h" 2312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton#include "DWARFDebugInfo.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDIECollection.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFFormValue.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "LogChannelDWARF.h" 2774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton#include "NameToDIE.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 2900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata#include "SymbolFileDWARFDebugMap.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31c7bbd271fba425130f82dfa028d68c92282e4fdcGreg Claytonusing namespace lldb; 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace std; 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerextern int g_verbose; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg ClaytonDWARFCompileUnit::DWARFCompileUnit(SymbolFileDWARF* dwarf2Data) : 39144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_dwarf2Data (dwarf2Data), 40144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_abbrevs (NULL), 41144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_user_data (NULL), 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_die_array (), 43144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_func_aranges_ap (), 44144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_base_addr (0), 45144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_offset (DW_INVALID_OFFSET), 46144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_length (0), 47144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_version (0), 48e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_addr_size (DWARFCompileUnit::GetDefaultAddressSize()), 4914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer (eProducerInvalid), 5014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_major (0), 5114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_minor (0), 5214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_update (0) 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::Clear() 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset = DW_INVALID_OFFSET; 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_length = 0; 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_version = 0; 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abbrevs = NULL; 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr_size = DWARFCompileUnit::GetDefaultAddressSize(); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_base_addr = 0; 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_die_array.clear(); 66144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_func_aranges_ap.reset(); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_user_data = NULL; 68e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_producer = eProducerInvalid; 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 7236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFCompileUnit::Extract(const DataExtractor &debug_info, lldb::offset_t *offset_ptr) 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset = *offset_ptr; 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_info.ValidOffset(*offset_ptr)) 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_offset_t abbr_offset; 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugAbbrev *abbr = m_dwarf2Data->DebugAbbrev(); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_length = debug_info.GetU32(offset_ptr); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_version = debug_info.GetU16(offset_ptr); 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner abbr_offset = debug_info.GetU32(offset_ptr); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr_size = debug_info.GetU8 (offset_ptr); 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset()-1); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool version_OK = SymbolFileDWARF::SupportedVersion(m_version); 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool abbr_offset_OK = m_dwarf2Data->get_debug_abbrev_data().ValidOffset(abbr_offset); 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8)); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (length_OK && version_OK && addr_size_OK && abbr_offset_OK && abbr != NULL) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abbrevs = abbr->GetAbbreviationDeclarationSet(abbr_offset); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // reset the offset to where we tried to parse from if anything went wrong 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *offset_ptr = m_offset; 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdw_offset_t 10736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDWARFCompileUnit::Extract(lldb::offset_t offset, const DataExtractor& debug_info_data, const DWARFAbbreviationDeclarationSet* abbrevs) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset = offset; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debug_info_data.ValidOffset(offset)) 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_length = debug_info_data.GetU32(&offset); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_version = debug_info_data.GetU16(&offset); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool abbrevs_OK = debug_info_data.GetU32(&offset) == abbrevs->GetOffset(); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abbrevs = abbrevs; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr_size = debug_info_data.GetU8 (&offset); 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool version_OK = SymbolFileDWARF::SupportedVersion(m_version); 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8)); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (version_OK && addr_size_OK && abbrevs_OK && debug_info_data.ValidOffset(offset)) 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return offset; 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return DW_INVALID_OFFSET; 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::ClearDIEs(bool keep_compile_unit_die) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_die_array.size() > 1) 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // std::vectors never get any smaller when resized to a smaller size, 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // or when clear() or erase() are called, the size will report that it 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is smaller, but the memory allocated remains intact (call capacity() 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to see this). So we need to create a temporary vector and swap the 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // contents which will cause just the internal pointers to be swapped 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so that when "tmp_array" goes out of scope, it will destroy the 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // contents. 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save at least the compile unit DIE 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::collection tmp_array; 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_die_array.swap(tmp_array); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (keep_compile_unit_die) 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_die_array.push_back(tmp_array.front()); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ParseCompileUnitDIEsIfNeeded 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 154f9be01f34a0dfba22106652a687e3d7c4eebce00Johnny Chen// Parses a compile unit and indexes its DIEs if it hasn't already been 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// done. 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::ExtractDIEsIfNeeded (bool cu_die_only) 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_die_array_size = m_die_array.size(); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((cu_die_only && initial_die_array_size > 0) || initial_die_array_size > 1) 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; // Already parsed 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "%8.8x: DWARFCompileUnit::ExtractDIEsIfNeeded( cu_die_only = %i )", 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset, 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_die_only); 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1699f5082f85e6a879d236dbd038762651391353769Stephen Wilson // Set the offset to that of the first DIE and calculate the start of the 1709f5082f85e6a879d236dbd038762651391353769Stephen Wilson // next compilation unit header. 17136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = GetFirstDIEOffset(); 17236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t next_cu_offset = GetNextCompileUnitOffset(); 1739f5082f85e6a879d236dbd038762651391353769Stephen Wilson 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry die; 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Keep a flat array of the DIE for binary lookup by DIE offset 17675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (!cu_die_only) 17775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 178952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAny(DWARF_LOG_DEBUG_INFO | DWARF_LOG_LOOKUPS)); 17975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 18075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 181952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton m_dwarf2Data->GetObjectFile()->GetModule()->LogMessageVerboseBacktrace (log, 18273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton "DWARFCompileUnit::ExtractDIEsIfNeeded () for compile unit at .debug_info[0x%8.8x]", 18373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton GetOffset()); 18475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 18575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t depth = 0; 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We are in our compile unit, parse starting at the offset 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we were told to parse 1905fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const DataExtractor& debug_info_data = m_dwarf2Data->get_debug_info_data(); 191489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton std::vector<uint32_t> die_index_stack; 192489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton die_index_stack.reserve(32); 193489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton die_index_stack.push_back(0); 194489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton bool prev_die_had_children = false; 1955fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize()); 1969f5082f85e6a879d236dbd038762651391353769Stephen Wilson while (offset < next_cu_offset && 1979f5082f85e6a879d236dbd038762651391353769Stephen Wilson die.FastExtract (debug_info_data, this, fixed_form_sizes, &offset)) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1995fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton// if (log) 2005fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton// log->Printf("0x%8.8x: %*.*s%s%s", 2015fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton// die.GetOffset(), 2025fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton// depth * 2, depth * 2, "", 2035fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton// DW_TAG_value_to_name (die.Tag()), 2045fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton// die.HasChildren() ? " *" : ""); 2055fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 206489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton const bool null_die = die.IsNULL(); 2075fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton if (depth == 0) 2085fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton { 2095fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton uint64_t base_addr = die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_low_pc, LLDB_INVALID_ADDRESS); 2105fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton if (base_addr == LLDB_INVALID_ADDRESS) 2115fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton base_addr = die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_entry_pc, 0); 2125fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton SetBaseAddress (base_addr); 213489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (initial_die_array_size == 0) 214489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton AddDIE (die); 215489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (cu_die_only) 216489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton return 1; 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (null_die) 221489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton { 222489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (prev_die_had_children) 223489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton { 224489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton // This will only happen if a DIE says is has children 225489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton // but all it contains is a NULL tag. Since we are removing 226489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton // the NULL DIEs from the list (saves up to 25% in C++ code), 227489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton // we need a way to let the DIE know that it actually doesn't 228489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton // have children. 229489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (!m_die_array.empty()) 230489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton m_die_array.back().SetEmptyChildren(true); 231489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton } 232489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton } 233489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton else 234489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton { 235489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton die.SetParentIndex(m_die_array.size() - die_index_stack[depth-1]); 236489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton 237489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (die_index_stack.back()) 238489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton m_die_array[die_index_stack.back()].SetSiblingIndex(m_die_array.size()-die_index_stack.back()); 239489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton 240489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton // Only push the DIE if it isn't a NULL DIE 241489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton m_die_array.push_back(die); 242489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton } 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (null_die) 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NULL DIE. 248489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (!die_index_stack.empty()) 249489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton die_index_stack.pop_back(); 250489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (depth > 0) 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner --depth; 2535fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton if (depth == 0) 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; // We are done with this compile unit! 255489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton 256489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton prev_die_had_children = false; 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2580963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton else 2590963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton { 260489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton die_index_stack.back() = m_die_array.size() - 1; 2610963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton // Normal DIE 262489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton const bool die_has_children = die.HasChildren(); 263489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (die_has_children) 264489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton { 265489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton die_index_stack.push_back(0); 2660963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton ++depth; 267489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton } 268489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton prev_die_had_children = die_has_children; 2690963fdd2478c6404d11b96e7d5ae1f2de8b3bb1fGreg Clayton } 2709f5082f85e6a879d236dbd038762651391353769Stephen Wilson } 2719f5082f85e6a879d236dbd038762651391353769Stephen Wilson 2729f5082f85e6a879d236dbd038762651391353769Stephen Wilson // Give a little bit of info if we encounter corrupt DWARF (our offset 2739f5082f85e6a879d236dbd038762651391353769Stephen Wilson // should always terminate at or before the start of the next compilation 2749f5082f85e6a879d236dbd038762651391353769Stephen Wilson // unit header). 2759f5082f85e6a879d236dbd038762651391353769Stephen Wilson if (offset > next_cu_offset) 2769f5082f85e6a879d236dbd038762651391353769Stephen Wilson { 27736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton m_dwarf2Data->GetObjectFile()->GetModule()->ReportWarning ("DWARF compile unit extends beyond its bounds cu 0x%8.8x at 0x%8.8" PRIx64 "\n", 278df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetOffset(), 279df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton offset); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton 282c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton // Since std::vector objects will double their size, we really need to 283c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton // make a new array with the perfect size so we don't end up wasting 284c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton // space. So here we copy and swap to make sure we don't have any extra 285c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton // memory taken up. 286489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton 287c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton if (m_die_array.size () < m_die_array.capacity()) 288c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton { 289c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton DWARFDebugInfoEntry::collection exact_size_die_array (m_die_array.begin(), m_die_array.end()); 290c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton exact_size_die_array.swap (m_die_array); 291c5b3f5025871a8f359c08f242894af00178d08ddGreg Clayton } 292952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll (DWARF_LOG_DEBUG_INFO | DWARF_LOG_VERBOSE)); 293489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton if (log) 294489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton { 295489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton StreamString strm; 296489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton DWARFDebugInfoEntry::DumpDIECollection (strm, m_die_array); 297489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton log->PutCString (strm.GetString().c_str()); 298489575c164b3b3cfed2f80af6cc58848ad17ab5aGreg Clayton } 2999f5082f85e6a879d236dbd038762651391353769Stephen Wilson 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_die_array.size(); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdw_offset_t 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetAbbrevOffset() const 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_abbrevs ? m_abbrevs->GetOffset() : DW_INVALID_OFFSET; 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::Verify(Stream *s) const 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DataExtractor& debug_info = m_dwarf2Data->get_debug_info_data(); 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool valid_offset = debug_info.ValidOffset(m_offset); 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool length_OK = debug_info.ValidOffset(GetNextCompileUnitOffset()-1); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool version_OK = SymbolFileDWARF::SupportedVersion(m_version); 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool abbr_offset_OK = m_dwarf2Data->get_debug_abbrev_data().ValidOffset(GetAbbrevOffset()); 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool addr_size_OK = ((m_addr_size == 4) || (m_addr_size == 8)); 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verbose = s->GetVerbose(); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (valid_offset && length_OK && version_OK && addr_size_OK && abbr_offset_OK) 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verbose) 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" 0x%8.8x: OK\n", m_offset); 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" 0x%8.8x: ", m_offset); 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_dwarf2Data->get_debug_info_data().Dump (s, m_offset, lldb::eFormatHex, 1, Size(), 32, LLDB_INVALID_ADDRESS, 0, 0); 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->EOL(); 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (valid_offset) 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!length_OK) 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" The length (0x%8.8x) for this compile unit is too large for the .debug_info provided.\n", m_length); 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!version_OK) 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" The 16 bit compile unit header version is not supported.\n"); 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abbr_offset_OK) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" The offset into the .debug_abbrev section (0x%8.8x) is not valid.\n", GetAbbrevOffset()); 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!addr_size_OK) 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" The address size is unsupported: 0x%2.2x\n", m_addr_size); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" The start offset of the compile unit header in the .debug_info is invalid.\n"); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::Dump(Stream *s) const 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("0x%8.8x: Compile Unit: length = 0x%8.8x, version = 0x%4.4x, abbr_offset = 0x%8.8x, addr_size = 0x%2.2x (next CU at {0x%8.8x})\n", 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_offset, m_length, m_version, GetAbbrevOffset(), m_addr_size, GetNextCompileUnitOffset()); 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint8_t g_default_addr_size = 4; 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint8_t 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetAddressByteSize(const DWARFCompileUnit* cu) 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cu) 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu->GetAddressByteSize(); 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return DWARFCompileUnit::GetDefaultAddressSize(); 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint8_t 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetDefaultAddressSize() 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_default_addr_size; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::SetDefaultAddressSize(uint8_t addr_size) 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_default_addr_size = addr_size; 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 382144188bc458a35997d2f2e52206ab69747439073Greg Claytonvoid 383144188bc458a35997d2f2e52206ab69747439073Greg ClaytonDWARFCompileUnit::BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data, 384144188bc458a35997d2f2e52206ab69747439073Greg Clayton DWARFDebugAranges* debug_aranges, 385144188bc458a35997d2f2e52206ab69747439073Greg Clayton bool clear_dies_if_already_not_parsed) 386144188bc458a35997d2f2e52206ab69747439073Greg Clayton{ 387144188bc458a35997d2f2e52206ab69747439073Greg Clayton // This function is usually called if there in no .debug_aranges section 388144188bc458a35997d2f2e52206ab69747439073Greg Clayton // in order to produce a compile unit level set of address ranges that 389144188bc458a35997d2f2e52206ab69747439073Greg Clayton // is accurate. If the DIEs weren't parsed, then we don't want all dies for 390144188bc458a35997d2f2e52206ab69747439073Greg Clayton // all compile units to stay loaded when they weren't needed. So we can end 391144188bc458a35997d2f2e52206ab69747439073Greg Clayton // up parsing the DWARF and then throwing them all away to keep memory usage 392144188bc458a35997d2f2e52206ab69747439073Greg Clayton // down. 393144188bc458a35997d2f2e52206ab69747439073Greg Clayton const bool clear_dies = ExtractDIEsIfNeeded (false) > 1; 394144188bc458a35997d2f2e52206ab69747439073Greg Clayton 3956f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham const DWARFDebugInfoEntry* die = DIE(); 3966f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (die) 3976f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham die->BuildAddressRangeTable(dwarf2Data, this, debug_aranges); 398144188bc458a35997d2f2e52206ab69747439073Greg Clayton 399be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton if (debug_aranges->IsEmpty()) 400be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 401be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // We got nothing from the functions, maybe we have a line tables only 402be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton // situation. Check the line tables and build the arange table from this. 403be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton SymbolContext sc; 404be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton sc.comp_unit = dwarf2Data->GetCompUnitForDWARFCompUnit(this); 405be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton if (sc.comp_unit) 406be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 40700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata SymbolFileDWARFDebugMap *debug_map_sym_file = m_dwarf2Data->GetDebugMapSymfile(); 40800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata if (debug_map_sym_file == NULL) 409be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 41000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata LineTable *line_table = sc.comp_unit->GetLineTable(); 41100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata 41200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata if (line_table) 413be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton { 41400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata LineTable::FileAddressRanges file_ranges; 41500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata const bool append = true; 41600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata const size_t num_ranges = line_table->GetContiguousFileAddressRanges (file_ranges, append); 41700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata for (uint32_t idx=0; idx<num_ranges; ++idx) 41800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata { 41900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata const LineTable::FileAddressRanges::Entry &range = file_ranges.GetEntryRef(idx); 42000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata debug_aranges->AppendRange(GetOffset(), range.GetRangeBase(), range.GetRangeEnd()); 42100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata printf ("0x%8.8x: [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n", GetOffset(), range.GetRangeBase(), range.GetRangeEnd()); 42200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata } 423be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 424be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 42500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata else 42600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata debug_map_sym_file->AddOSOARanges(dwarf2Data,debug_aranges); 427be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 428be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton } 429be754e641cfee70cf7ab0c6d160e94a085416f26Greg Clayton 430144188bc458a35997d2f2e52206ab69747439073Greg Clayton // Keep memory down by clearing DIEs if this generate function 431144188bc458a35997d2f2e52206ab69747439073Greg Clayton // caused them to be parsed 432144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (clear_dies) 433144188bc458a35997d2f2e52206ab69747439073Greg Clayton ClearDIEs (true); 434144188bc458a35997d2f2e52206ab69747439073Greg Clayton 435144188bc458a35997d2f2e52206ab69747439073Greg Clayton} 436144188bc458a35997d2f2e52206ab69747439073Greg Clayton 437144188bc458a35997d2f2e52206ab69747439073Greg Clayton 438144188bc458a35997d2f2e52206ab69747439073Greg Claytonconst DWARFDebugAranges & 439144188bc458a35997d2f2e52206ab69747439073Greg ClaytonDWARFCompileUnit::GetFunctionAranges () 440144188bc458a35997d2f2e52206ab69747439073Greg Clayton{ 441144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (m_func_aranges_ap.get() == NULL) 442144188bc458a35997d2f2e52206ab69747439073Greg Clayton { 443144188bc458a35997d2f2e52206ab69747439073Greg Clayton m_func_aranges_ap.reset (new DWARFDebugAranges()); 444952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_ARANGES)); 445144188bc458a35997d2f2e52206ab69747439073Greg Clayton 446144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (log) 44775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 448952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage (log, 449df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "DWARFCompileUnit::GetFunctionAranges() for compile unit at .debug_info[0x%8.8x]", 450df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetOffset()); 45175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 4526f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham const DWARFDebugInfoEntry* die = DIE(); 4536f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (die) 4546f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham die->BuildFunctionAddressRangeTable (m_dwarf2Data, this, m_func_aranges_ap.get()); 455144188bc458a35997d2f2e52206ab69747439073Greg Clayton const bool minimize = false; 456257663e753af15633e48c7b00eb7b5880168090bGreg Clayton m_func_aranges_ap->Sort(minimize); 457144188bc458a35997d2f2e52206ab69747439073Greg Clayton } 458144188bc458a35997d2f2e52206ab69747439073Greg Clayton return *m_func_aranges_ap.get(); 459144188bc458a35997d2f2e52206ab69747439073Greg Clayton} 460144188bc458a35997d2f2e52206ab69747439073Greg Clayton 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::LookupAddress 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_addr_t address, 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry** function_die_handle, 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry** block_die_handle 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success = false; 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_die_handle != NULL && DIE()) 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 473144188bc458a35997d2f2e52206ab69747439073Greg Clayton 474144188bc458a35997d2f2e52206ab69747439073Greg Clayton const DWARFDebugAranges &func_aranges = GetFunctionAranges (); 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Re-check the aranges auto pointer contents in case it was created above 477144188bc458a35997d2f2e52206ab69747439073Greg Clayton if (!func_aranges.IsEmpty()) 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 479144188bc458a35997d2f2e52206ab69747439073Greg Clayton *function_die_handle = GetDIEPtr(func_aranges.FindAddress(address)); 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (*function_die_handle != NULL) 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner success = true; 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (block_die_handle != NULL) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry* child = (*function_die_handle)->GetFirstChild(); 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (child) 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child->LookupAddress(address, m_dwarf2Data, this, NULL, block_die_handle)) 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child = child->GetSibling(); 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return success; 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compare function DWARFDebugAranges::Range structures 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic bool CompareDIEOffset (const DWARFDebugInfoEntry& die1, const DWARFDebugInfoEntry& die2) 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return die1.GetOffset() < die2.GetOffset(); 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GetDIEPtr() 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the DIE (Debug Information Entry) with the specified offset. 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFDebugInfoEntry* 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetDIEPtr(dw_offset_t die_offset) 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die_offset != DW_INVALID_OFFSET) 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExtractDIEsIfNeeded (false); 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry compare_die; 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner compare_die.SetOffset(die_offset); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::iterator end = m_die_array.end(); 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, compare_die, CompareDIEOffset); 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != end) 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die_offset == (*pos).GetOffset()) 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &(*pos); 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; // Not found in any compile units 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GetDIEPtrContainingOffset() 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the DIE (Debug Information Entry) that contains the specified 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// .debug_info offset. 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DWARFDebugInfoEntry* 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::GetDIEPtrContainingOffset(dw_offset_t die_offset) 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die_offset != DW_INVALID_OFFSET) 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExtractDIEsIfNeeded (false); 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry compare_die; 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner compare_die.SetOffset(die_offset); 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::iterator end = m_die_array.end(); 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::iterator pos = lower_bound(m_die_array.begin(), end, compare_die, CompareDIEOffset); 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != end) 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die_offset >= (*pos).GetOffset()) 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::iterator next = pos + 1; 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (next != end) 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (die_offset < (*next).GetOffset()) 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &(*pos); 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; // Not found in any compile units 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDWARFCompileUnit::AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& dies, uint32_t depth) const 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t old_size = dies.Size(); 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::const_iterator pos; 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::const_iterator end = m_die_array.end(); 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_die_array.begin(); pos != end; ++pos) 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->Tag() == tag) 574b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton dies.Append (&(*pos)); 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of DIEs added to the collection 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return dies.Size() - old_size; 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//void 58274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//DWARFCompileUnit::AddGlobalDIEByIndex (uint32_t die_idx) 58374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//{ 58474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// m_global_die_indexes.push_back (die_idx); 58574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//} 58674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// 58774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// 58874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//void 58974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//DWARFCompileUnit::AddGlobal (const DWARFDebugInfoEntry* die) 59074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//{ 59174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// // Indexes to all file level global and static variables 59274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// m_global_die_indexes; 59374124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// 59474124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// if (m_die_array.empty()) 59574124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// return; 59674124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// 59774124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// const DWARFDebugInfoEntry* first_die = &m_die_array[0]; 59874124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// const DWARFDebugInfoEntry* end = first_die + m_die_array.size(); 59974124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// if (first_die <= die && die < end) 60074124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton// m_global_die_indexes.push_back (die - first_die); 60174124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton//} 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 605144188bc458a35997d2f2e52206ab69747439073Greg ClaytonDWARFCompileUnit::Index (const uint32_t cu_idx, 606144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& func_basenames, 607144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& func_fullnames, 608144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& func_methods, 609144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& func_selectors, 610144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& objc_class_selectors, 611144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& globals, 612144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& types, 613144188bc458a35997d2f2e52206ab69747439073Greg Clayton NameToDIE& namespaces) 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DataExtractor* debug_str = &m_dwarf2Data->get_debug_str_data(); 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6175fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (GetAddressByteSize()); 6185fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton 619952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll (DWARF_LOG_LOOKUPS)); 62075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 62175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton if (log) 62275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton { 623952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton m_dwarf2Data->GetObjectFile()->GetModule()->LogMessage (log, 624df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton "DWARFCompileUnit::Index() for compile unit at .debug_info[0x%8.8x]", 625df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton GetOffset()); 62675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton } 62775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::const_iterator pos; 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::const_iterator begin = m_die_array.begin(); 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::const_iterator end = m_die_array.end(); 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = begin; pos != end; ++pos) 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry &die = *pos; 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const dw_tag_t tag = die.Tag(); 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subprogram: 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_inlined_subroutine: 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_base_type: 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_class_type: 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_constant: 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_enumeration_type: 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_string_type: 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subroutine_type: 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_structure_type: 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_union_type: 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_typedef: 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_namespace: 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_variable: 65218fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton case DW_TAG_unspecified_type: 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFDebugInfoEntry::Attributes attributes; 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name = NULL; 661fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton const char *mangled_cstr = NULL; 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_declaration = false; 6634a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton //bool is_artificial = false; 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool has_address = false; 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool has_location = false; 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_global_or_static_variable = false; 66700db215522a0cf31082d26d7ab30d2aa30965acfGreg Clayton 66812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton dw_offset_t specification_die_offset = DW_INVALID_OFFSET; 6695fcff9ac1a713d5e814b4a05edef7544be470ad0Greg Clayton const size_t num_attributes = die.GetAttributes(m_dwarf2Data, this, fixed_form_sizes, attributes); 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_attributes > 0) 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 672bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton for (uint32_t i=0; i<num_attributes; ++i) 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dw_attr_t attr = attributes.AttributeAtIndex(i); 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DWARFFormValue form_value; 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (attr) 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_name: 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value)) 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name = form_value.AsCString(debug_str); 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_declaration: 684e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value)) 685e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton is_declaration = form_value.Unsigned() != 0; 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6884a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton// case DW_AT_artificial: 6894a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton// if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value)) 6904a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton// is_artificial = form_value.Unsigned() != 0; 6914a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton// break; 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_MIPS_linkage_name: 6946f3a711edcfaeca1efbb998cdea5d0a0782ddfa3Greg Clayton case DW_AT_linkage_name: 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value)) 696fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton mangled_cstr = form_value.AsCString(debug_str); 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_low_pc: 700178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton case DW_AT_high_pc: 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_ranges: 702178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton has_address = true; 703178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton break; 704178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_entry_pc: 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner has_address = true; 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_AT_location: 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner has_location = true; 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag == DW_TAG_variable) 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const DWARFDebugInfoEntry* parent_die = die.GetParent(); 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while ( parent_die != NULL ) 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (parent_die->Tag()) 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subprogram: 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_lexical_block: 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_inlined_subroutine: 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Even if this is a function level static, we don't add it. We could theoretically 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // add these if we wanted to by introspecting into the DW_AT_location and seeing 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if the location describes a hard coded address, but we dont want the performance 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // penalty of that right now. 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_global_or_static_variable = false; 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (attributes.ExtractFormValueAtIndex(dwarf2Data, i, form_value)) 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // If we have valid block data, then we have location expression bytes 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // that are fixed (not a location list). 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint8_t *block_data = form_value.BlockData(); 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (block_data) 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t block_length = form_value.Unsigned(); 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (block_length == 1 + attributes.CompileUnitAtIndex(i)->GetAddressByteSize()) 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (block_data[0] == DW_OP_addr) 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// add_die = true; 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_die = NULL; // Terminate the while loop. 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_compile_unit: 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_global_or_static_variable = true; 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_die = NULL; // Terminate the while loop. 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_die = parent_die->GetParent(); // Keep going in the while loop. 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 75612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 75712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton case DW_AT_specification: 75812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value)) 75912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton specification_die_offset = form_value.Reference(this); 76012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton break; 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (tag) 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subprogram: 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (has_address) 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (name) 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 772fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham // Note, this check is also done in ParseMethodName, but since this is a hot loop, we do the 773fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham // simple inlined check outside the call. 774f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ObjCLanguageRuntime::MethodName objc_method(name, true); 775f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (objc_method.IsValid(true)) 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 777f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ConstString objc_class_name_with_category (objc_method.GetClassNameWithCategory()); 778f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ConstString objc_selector_name (objc_method.GetSelector()); 779f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ConstString objc_fullname_no_category_name (objc_method.GetFullNameWithoutCategory(true)); 780f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton ConstString objc_class_name_no_category (objc_method.GetClassName()); 781f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton func_fullnames.Insert (ConstString(name), die.GetOffset()); 782f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (objc_class_name_with_category) 783f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton objc_class_selectors.Insert(objc_class_name_with_category, die.GetOffset()); 784f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (objc_class_name_no_category && objc_class_name_no_category != objc_class_name_with_category) 785f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton objc_class_selectors.Insert(objc_class_name_no_category, die.GetOffset()); 786f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (objc_selector_name) 787f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton func_selectors.Insert (objc_selector_name, die.GetOffset()); 788f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (objc_fullname_no_category_name) 789f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton func_fullnames.Insert (objc_fullname_no_category_name, die.GetOffset()); 79012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton } 79112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton // If we have a mangled name, then the DW_AT_name attribute 79212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton // is usually the method name without the class or any parameters 79312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton const DWARFDebugInfoEntry *parent = die.GetParent(); 79412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton bool is_method = false; 79512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (parent) 79612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton { 797bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton dw_tag_t parent_tag = parent->Tag(); 798bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton if (parent_tag == DW_TAG_class_type || parent_tag == DW_TAG_structure_type) 79912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton { 80012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton is_method = true; 80112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton } 80212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton else 80312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton { 804c5dca6c656ffc94d2f958c56d7bc9076eac90783Greg Clayton if (specification_die_offset != DW_INVALID_OFFSET) 80512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton { 806df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton const DWARFDebugInfoEntry *specification_die = m_dwarf2Data->DebugInfo()->GetDIEPtr (specification_die_offset, NULL); 80712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (specification_die) 80812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton { 80912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton parent = specification_die->GetParent(); 81012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (parent) 81112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton { 812bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton parent_tag = parent->Tag(); 81312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 814bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton if (parent_tag == DW_TAG_class_type || parent_tag == DW_TAG_structure_type) 81512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton is_method = true; 81612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton } 81712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton } 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton 82274124754d6d8ffda5bdaef8ac87e7faaeef3b358Greg Clayton 82312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (is_method) 824144188bc458a35997d2f2e52206ab69747439073Greg Clayton func_methods.Insert (ConstString(name), die.GetOffset()); 82512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton else 826144188bc458a35997d2f2e52206ab69747439073Greg Clayton func_basenames.Insert (ConstString(name), die.GetOffset()); 827c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec 828c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec if (!is_method && !mangled_cstr && !objc_method.IsValid(true)) 829c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec func_fullnames.Insert (ConstString(name), die.GetOffset()); 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 831fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton if (mangled_cstr) 832fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton { 833fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // Make sure our mangled name isn't the same string table entry 834fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // as our name. If it starts with '_', then it is ok, else compare 835fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // the string to make sure it isn't the same and we don't end up 836fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // with duplicate entries 8374a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (name && ::strcmp(name, mangled_cstr) != 0))) 838fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton { 839c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton Mangled mangled (ConstString(mangled_cstr), true); 840144188bc458a35997d2f2e52206ab69747439073Greg Clayton func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset()); 841fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton if (mangled.GetDemangledName()) 842144188bc458a35997d2f2e52206ab69747439073Greg Clayton func_fullnames.Insert (mangled.GetDemangledName(), die.GetOffset()); 843fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton } 844fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton } 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_inlined_subroutine: 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (has_address) 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton if (name) 852144188bc458a35997d2f2e52206ab69747439073Greg Clayton func_basenames.Insert (ConstString(name), die.GetOffset()); 853fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton if (mangled_cstr) 854fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton { 855fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // Make sure our mangled name isn't the same string table entry 856fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // as our name. If it starts with '_', then it is ok, else compare 857fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // the string to make sure it isn't the same and we don't end up 858fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // with duplicate entries 859fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0))) 860fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton { 861c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton Mangled mangled (ConstString(mangled_cstr), true); 862144188bc458a35997d2f2e52206ab69747439073Greg Clayton func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset()); 863fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton if (mangled.GetDemangledName()) 864144188bc458a35997d2f2e52206ab69747439073Greg Clayton func_fullnames.Insert (mangled.GetDemangledName(), die.GetOffset()); 865fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton } 866fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton } 867c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec else 868c1c3690a9f1d01fe103ff56baa4b36da99b6659eMatt Kopec func_fullnames.Insert (ConstString(name), die.GetOffset()); 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_base_type: 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_class_type: 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_constant: 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_enumeration_type: 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_string_type: 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_subroutine_type: 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_structure_type: 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_union_type: 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_typedef: 88118fedd7f4d22cf46d34698c1094ebc544a6f8bd8Greg Clayton case DW_TAG_unspecified_type: 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && is_declaration == false) 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 884144188bc458a35997d2f2e52206ab69747439073Greg Clayton types.Insert (ConstString(name), die.GetOffset()); 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 888fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton case DW_TAG_namespace: 889fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton if (name) 890144188bc458a35997d2f2e52206ab69747439073Greg Clayton namespaces.Insert (ConstString(name), die.GetOffset()); 891fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton break; 892fcf06fb0b608f09477d7984938255ebf8f92d0daGreg Clayton 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_TAG_variable: 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && has_location && is_global_or_static_variable) 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 896144188bc458a35997d2f2e52206ab69747439073Greg Clayton globals.Insert (ConstString(name), die.GetOffset()); 8973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Be sure to include variables by their mangled and demangled 8983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // names if they have any since a variable can have a basename 8993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // "i", a mangled named "_ZN12_GLOBAL__N_11iE" and a demangled 9003bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // mangled name "(anonymous namespace)::i"... 901fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton 902fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // Make sure our mangled name isn't the same string table entry 903fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // as our name. If it starts with '_', then it is ok, else compare 904fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // the string to make sure it isn't the same and we don't end up 905fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton // with duplicate entries 906fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton if (mangled_cstr && name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0))) 907fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton { 908c02400422d5e644a2a486bce5517d46d435a3f02Greg Clayton Mangled mangled (ConstString(mangled_cstr), true); 909144188bc458a35997d2f2e52206ab69747439073Greg Clayton globals.Insert (mangled.GetMangledName(), die.GetOffset()); 910fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton if (mangled.GetDemangledName()) 911144188bc458a35997d2f2e52206ab69747439073Greg Clayton globals.Insert (mangled.GetDemangledName(), die.GetOffset()); 912fc78af347a506115f1274213a829b200d1f58ebaGreg Clayton } 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 922e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool 92314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::Supports_unnamed_objc_bitfields () 92414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{ 92514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (GetProducer() == eProducerClang) 92614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton { 9272c825fbece34da5ef4ce0e3564c5d60c63bd51ddGreg Clayton const uint32_t major_version = GetProducerVersionMajor(); 9282c825fbece34da5ef4ce0e3564c5d60c63bd51ddGreg Clayton if (major_version > 425 || (major_version == 425 && GetProducerVersionUpdate() >= 13)) 92914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton return true; 93014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton else 93114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton return false; 93214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton } 93314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton return true; // Assume all other compilers didn't have incorrect ObjC bitfield info 93414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton} 93514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton 93614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonbool 937e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonDWARFCompileUnit::Supports_DW_AT_APPLE_objc_complete_type () 938e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{ 93914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (GetProducer() == eProducerLLVMGCC) 940e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton return false; 941e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton return true; 942e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton} 943e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 944e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool 945e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonDWARFCompileUnit::DW_AT_decl_file_attributes_are_invalid() 946e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{ 947e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton // llvm-gcc makes completely invalid decl file attributes and won't ever 948e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton // be fixed, so we need to know to ignore these. 94914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton return GetProducer() == eProducerLLVMGCC; 950e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton} 951e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 95214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonvoid 95314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::ParseProducerInfo () 954e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{ 95514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_major = UINT32_MAX; 95614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_minor = UINT32_MAX; 95714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_update = UINT32_MAX; 95814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton 95914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton const DWARFDebugInfoEntry *die = GetCompileUnitDIEOnly(); 96014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (die) 961e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 96214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton 96314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton const char *producer_cstr = die->GetAttributeValueAsString(m_dwarf2Data, this, DW_AT_producer, NULL); 96414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (producer_cstr) 965e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 96614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton RegularExpression llvm_gcc_regex("^4\\.[012]\\.[01] \\(Based on Apple Inc\\. build [0-9]+\\) \\(LLVM build [\\.0-9]+\\)$"); 96714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (llvm_gcc_regex.Execute (producer_cstr)) 968e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 96914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer = eProducerLLVMGCC; 970e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 97114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton else if (strstr(producer_cstr, "clang")) 97214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton { 97300af72e395d138f459192b7f5450fa4c7854f135Greg Clayton static RegularExpression g_clang_version_regex("clang-([0-9]+)\\.([0-9]+)\\.([0-9]+)"); 97400af72e395d138f459192b7f5450fa4c7854f135Greg Clayton RegularExpression::Match regex_match(3); 97500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (g_clang_version_regex.Execute (producer_cstr, ®ex_match)) 97614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton { 97714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton std::string str; 97800af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (regex_match.GetMatchAtIndex (producer_cstr, 1, str)) 97914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_major = Args::StringToUInt32(str.c_str(), UINT32_MAX, 10); 98000af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (regex_match.GetMatchAtIndex (producer_cstr, 2, str)) 98114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_minor = Args::StringToUInt32(str.c_str(), UINT32_MAX, 10); 98200af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (regex_match.GetMatchAtIndex (producer_cstr, 3, str)) 98314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer_version_update = Args::StringToUInt32(str.c_str(), UINT32_MAX, 10); 98414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton } 98514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer = eProducerClang; 98614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton } 98714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton else if (strstr(producer_cstr, "GNU")) 98814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer = eProducerGCC; 989e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 990e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 99114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (m_producer == eProducerInvalid) 99214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton m_producer = eProcucerOther; 99314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton} 99414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton 99514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::Producer 99614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducer () 99714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{ 99814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (m_producer == eProducerInvalid) 99914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton ParseProducerInfo (); 1000e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton return m_producer; 1001e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton} 1002e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 1003e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 100414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonuint32_t 100514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducerVersionMajor() 100614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{ 100714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (m_producer_version_major == 0) 100814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton ParseProducerInfo (); 100914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton return m_producer_version_major; 101014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton} 101114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton 101214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonuint32_t 101314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducerVersionMinor() 101414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{ 101514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (m_producer_version_minor == 0) 101614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton ParseProducerInfo (); 101714fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton return m_producer_version_minor; 101814fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton} 101914fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton 102014fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Claytonuint32_t 102114fe7f1de593ba562787481ecdc455e46fe8c3c9Greg ClaytonDWARFCompileUnit::GetProducerVersionUpdate() 102214fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton{ 102314fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton if (m_producer_version_update == 0) 102414fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton ParseProducerInfo (); 102514fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton return m_producer_version_update; 102614fe7f1de593ba562787481ecdc455e46fe8c3c9Greg Clayton} 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1028