blob: b079855ccbd9ac67e3bc55cb51b20cb9c99c54d5 [file] [log] [blame]
Eugene Zelenko0af149a2015-10-19 18:52:10 +00001//===-- SymbolFileDWARFDebugMap.cpp -----------------------------*- C++ -*-===//
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "SymbolFileDWARFDebugMap.h"
Enrico Granatac76e60b2013-06-27 01:43:09 +000010#include "DWARFDebugAranges.h"
11
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/Core/Module.h"
13#include "lldb/Core/ModuleList.h"
14#include "lldb/Core/PluginManager.h"
Greg Clayton1f746072012-08-29 21:13:06 +000015#include "lldb/Core/Section.h"
Pavel Labath1408bf72016-11-01 16:11:14 +000016#include "lldb/Host/FileSystem.h"
Pavel Labathb8093312019-03-06 14:41:43 +000017#include "lldb/Utility/RangeMap.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000018#include "lldb/Utility/RegularExpression.h"
Pavel Labath38d06322017-06-29 14:32:17 +000019#include "lldb/Utility/Timer.h"
Greg Clayton9422dd62013-03-04 21:46:16 +000020
21//#define DEBUG_OSO_DMAP // DO NOT CHECKIN WITH THIS NOT COMMENTED OUT
Greg Clayton1f746072012-08-29 21:13:06 +000022#if defined(DEBUG_OSO_DMAP)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Core/StreamFile.h"
Greg Clayton1f746072012-08-29 21:13:06 +000024#endif
Greg Clayton6beaaa62011-01-17 03:46:26 +000025
Greg Clayton1f746072012-08-29 21:13:06 +000026#include "lldb/Symbol/CompileUnit.h"
Greg Clayton9422dd62013-03-04 21:46:16 +000027#include "lldb/Symbol/LineTable.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Symbol/ObjectFile.h"
29#include "lldb/Symbol/SymbolVendor.h"
Ravitheja Addepally40697302015-10-08 09:45:41 +000030#include "lldb/Symbol/TypeMap.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031#include "lldb/Symbol/VariableList.h"
Pavel Labath7e2cfbf2016-11-09 09:59:18 +000032#include "llvm/Support/ScopedPrinter.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033
Sean Callanan60217122012-04-13 00:10:03 +000034#include "LogChannelDWARF.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035#include "SymbolFileDWARF.h"
36
Jonas Devlieghere796ac802019-02-11 23:13:08 +000037#include <memory>
38
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039using namespace lldb;
40using namespace lldb_private;
41
Kate Stoneb9c1b512016-09-06 20:57:50 +000042// Subclass lldb_private::Module so we can intercept the
Adrian Prantl05097242018-04-30 16:49:04 +000043// "Module::GetObjectFile()" (so we can fixup the object file sections) and
Pavel Labath579d6d12019-08-08 07:34:07 +000044// also for "Module::GetSymbolFile()" (so we can fixup the symbol file id.
Greg Clayton1f746072012-08-29 21:13:06 +000045
Greg Clayton9422dd62013-03-04 21:46:16 +000046const SymbolFileDWARFDebugMap::FileRangeMap &
Kate Stoneb9c1b512016-09-06 20:57:50 +000047SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap(
48 SymbolFileDWARFDebugMap *exe_symfile) {
49 if (file_range_map_valid)
Greg Clayton9422dd62013-03-04 21:46:16 +000050 return file_range_map;
Kate Stoneb9c1b512016-09-06 20:57:50 +000051
52 file_range_map_valid = true;
53
54 Module *oso_module = exe_symfile->GetModuleByCompUnitInfo(this);
55 if (!oso_module)
56 return file_range_map;
57
58 ObjectFile *oso_objfile = oso_module->GetObjectFile();
59 if (!oso_objfile)
60 return file_range_map;
61
62 Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +000063 LLDB_LOGF(
64 log,
65 "%p: SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap ('%s')",
66 static_cast<void *>(this),
67 oso_module->GetSpecificationDescription().c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +000068
69 std::vector<SymbolFileDWARFDebugMap::CompileUnitInfo *> cu_infos;
70 if (exe_symfile->GetCompUnitInfosForModule(oso_module, cu_infos)) {
71 for (auto comp_unit_info : cu_infos) {
72 Symtab *exe_symtab = exe_symfile->GetObjectFile()->GetSymtab();
73 ModuleSP oso_module_sp(oso_objfile->GetModule());
74 Symtab *oso_symtab = oso_objfile->GetSymtab();
75
76 /// const uint32_t fun_resolve_flags = SymbolContext::Module |
77 /// eSymbolContextCompUnit | eSymbolContextFunction;
78 // SectionList *oso_sections = oso_objfile->Sections();
Adrian Prantl05097242018-04-30 16:49:04 +000079 // Now we need to make sections that map from zero based object file
80 // addresses to where things ended up in the main executable.
Kate Stoneb9c1b512016-09-06 20:57:50 +000081
82 assert(comp_unit_info->first_symbol_index != UINT32_MAX);
83 // End index is one past the last valid symbol index
84 const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1;
85 for (uint32_t idx = comp_unit_info->first_symbol_index +
86 2; // Skip the N_SO and N_OSO
Jonas Devlieghere010b56b2018-11-27 15:25:58 +000087 idx < oso_end_idx; ++idx) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
89 if (exe_symbol) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +000090 if (!exe_symbol->IsDebug())
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 continue;
92
93 switch (exe_symbol->GetType()) {
94 default:
95 break;
96
97 case eSymbolTypeCode: {
Adrian Prantl05097242018-04-30 16:49:04 +000098 // For each N_FUN, or function that we run into in the debug map we
99 // make a new section that we add to the sections found in the .o
100 // file. This new section has the file address set to what the
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 // addresses are in the .o file, and the load address is adjusted
102 // to match where it ended up in the final executable! We do this
103 // before we parse any dwarf info so that when it goes get parsed
104 // all section/offset addresses that get registered will resolve
105 // correctly to the new addresses in the main executable.
106
107 // First we find the original symbol in the .o file's symbol table
108 Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(
109 exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown,
110 Mangled::ePreferMangled),
111 eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
112 if (oso_fun_symbol) {
113 // Add the inverse OSO file address to debug map entry mapping
114 exe_symfile->AddOSOFileRange(
115 this, exe_symbol->GetAddressRef().GetFileAddress(),
116 exe_symbol->GetByteSize(),
117 oso_fun_symbol->GetAddressRef().GetFileAddress(),
118 oso_fun_symbol->GetByteSize());
119 }
120 } break;
121
122 case eSymbolTypeData: {
Adrian Prantl05097242018-04-30 16:49:04 +0000123 // For each N_GSYM we remap the address for the global by making a
124 // new section that we add to the sections found in the .o file.
125 // This new section has the file address set to what the addresses
126 // are in the .o file, and the load address is adjusted to match
127 // where it ended up in the final executable! We do this before we
128 // parse any dwarf info so that when it goes get parsed all
129 // section/offset addresses that get registered will resolve
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 // correctly to the new addresses in the main executable. We
131 // initially set the section size to be 1 byte, but will need to
132 // fix up these addresses further after all globals have been
133 // parsed to span the gaps, or we can find the global variable
134 // sizes from the DWARF info as we are parsing.
135
Adrian Prantl05097242018-04-30 16:49:04 +0000136 // Next we find the non-stab entry that corresponds to the N_GSYM
137 // in the .o file
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138 Symbol *oso_gsym_symbol =
139 oso_symtab->FindFirstSymbolWithNameAndType(
140 exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown,
141 Mangled::ePreferMangled),
142 eSymbolTypeData, Symtab::eDebugNo, Symtab::eVisibilityAny);
143 if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() &&
144 oso_gsym_symbol->ValueIsAddress()) {
145 // Add the inverse OSO file address to debug map entry mapping
146 exe_symfile->AddOSOFileRange(
147 this, exe_symbol->GetAddressRef().GetFileAddress(),
148 exe_symbol->GetByteSize(),
149 oso_gsym_symbol->GetAddressRef().GetFileAddress(),
150 oso_gsym_symbol->GetByteSize());
151 }
152 } break;
153 }
154 }
155 }
156
157 exe_symfile->FinalizeOSOFileRanges(this);
158 // We don't need the symbols anymore for the .o files
159 oso_objfile->ClearSymtab();
160 }
161 }
162 return file_range_map;
Greg Clayton9422dd62013-03-04 21:46:16 +0000163}
164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165class DebugMapModule : public Module {
Greg Clayton1f746072012-08-29 21:13:06 +0000166public:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 DebugMapModule(const ModuleSP &exe_module_sp, uint32_t cu_idx,
168 const FileSpec &file_spec, const ArchSpec &arch,
169 const ConstString *object_name, off_t object_offset,
Pavel Labath7e2cfbf2016-11-09 09:59:18 +0000170 const llvm::sys::TimePoint<> object_mod_time)
171 : Module(file_spec, arch, object_name, object_offset, object_mod_time),
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 m_exe_module_wp(exe_module_sp), m_cu_idx(cu_idx) {}
Greg Clayton1f746072012-08-29 21:13:06 +0000173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174 ~DebugMapModule() override = default;
Greg Clayton9ba42d12012-10-08 22:48:57 +0000175
Pavel Labath579d6d12019-08-08 07:34:07 +0000176 SymbolFile *
177 GetSymbolFile(bool can_create = true,
178 lldb_private::Stream *feedback_strm = nullptr) override {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179 // Scope for locker
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000180 if (m_symfile_up.get() || !can_create)
Pavel Labath579d6d12019-08-08 07:34:07 +0000181 return m_symfile_up ? m_symfile_up->GetSymbolFile() : nullptr;
Greg Clayton1f746072012-08-29 21:13:06 +0000182
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 ModuleSP exe_module_sp(m_exe_module_wp.lock());
184 if (exe_module_sp) {
185 // Now get the object file outside of a locking scope
186 ObjectFile *oso_objfile = GetObjectFile();
187 if (oso_objfile) {
188 std::lock_guard<std::recursive_mutex> guard(m_mutex);
Pavel Labath579d6d12019-08-08 07:34:07 +0000189 if (SymbolFile *symfile =
190 Module::GetSymbolFile(can_create, feedback_strm)) {
Adrian Prantl05097242018-04-30 16:49:04 +0000191 // Set a pointer to this class to set our OSO DWARF file know that
192 // the DWARF is being used along with a debug map and that it will
193 // have the remapped sections that we do below.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194 SymbolFileDWARF *oso_symfile =
Pavel Labath579d6d12019-08-08 07:34:07 +0000195 SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF(symfile);
Greg Clayton1f746072012-08-29 21:13:06 +0000196
Kate Stoneb9c1b512016-09-06 20:57:50 +0000197 if (!oso_symfile)
Konrad Kleine248a1302019-05-23 11:14:47 +0000198 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000199
200 ObjectFile *exe_objfile = exe_module_sp->GetObjectFile();
Pavel Labath579d6d12019-08-08 07:34:07 +0000201 SymbolFile *exe_symfile = exe_module_sp->GetSymbolFile();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202
Pavel Labath579d6d12019-08-08 07:34:07 +0000203 if (exe_objfile && exe_symfile) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204 oso_symfile->SetDebugMapModule(exe_module_sp);
205 // Set the ID of the symbol file DWARF to the index of the OSO
206 // shifted left by 32 bits to provide a unique prefix for any
207 // UserID's that get created in the symbol file.
208 oso_symfile->SetID(((uint64_t)m_cu_idx + 1ull) << 32ull);
209 }
Pavel Labath579d6d12019-08-08 07:34:07 +0000210 return symfile;
Greg Clayton1f746072012-08-29 21:13:06 +0000211 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 }
Greg Clayton1f746072012-08-29 21:13:06 +0000213 }
Konrad Kleine248a1302019-05-23 11:14:47 +0000214 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215 }
Greg Clayton1f746072012-08-29 21:13:06 +0000216
217protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218 ModuleWP m_exe_module_wp;
219 const uint32_t m_cu_idx;
Greg Clayton1f746072012-08-29 21:13:06 +0000220};
221
Kate Stoneb9c1b512016-09-06 20:57:50 +0000222void SymbolFileDWARFDebugMap::Initialize() {
223 PluginManager::RegisterPlugin(GetPluginNameStatic(),
224 GetPluginDescriptionStatic(), CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000225}
226
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227void SymbolFileDWARFDebugMap::Terminate() {
228 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000229}
230
Kate Stoneb9c1b512016-09-06 20:57:50 +0000231lldb_private::ConstString SymbolFileDWARFDebugMap::GetPluginNameStatic() {
232 static ConstString g_name("dwarf-debugmap");
233 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000234}
235
Kate Stoneb9c1b512016-09-06 20:57:50 +0000236const char *SymbolFileDWARFDebugMap::GetPluginDescriptionStatic() {
237 return "DWARF and DWARF3 debug symbol file reader (debug map).";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000238}
239
Pavel Labathd2deeb42019-07-31 08:25:25 +0000240SymbolFile *SymbolFileDWARFDebugMap::CreateInstance(ObjectFileSP objfile_sp) {
241 return new SymbolFileDWARFDebugMap(std::move(objfile_sp));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242}
243
Pavel Labathd2deeb42019-07-31 08:25:25 +0000244SymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap(ObjectFileSP objfile_sp)
245 : SymbolFile(std::move(objfile_sp)), m_flags(), m_compile_unit_infos(),
246 m_func_indexes(), m_glob_indexes(),
Kate Stoneb9c1b512016-09-06 20:57:50 +0000247 m_supports_DW_AT_APPLE_objc_complete_type(eLazyBoolCalculate) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000248
Kate Stoneb9c1b512016-09-06 20:57:50 +0000249SymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap() {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000250
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251void SymbolFileDWARFDebugMap::InitializeObject() {}
Greg Clayton2d95dc9b2010-11-10 04:57:04 +0000252
Kate Stoneb9c1b512016-09-06 20:57:50 +0000253void SymbolFileDWARFDebugMap::InitOSO() {
254 if (m_flags.test(kHaveInitializedOSOs))
255 return;
Greg Clayton3046e662013-07-10 01:23:25 +0000256
Kate Stoneb9c1b512016-09-06 20:57:50 +0000257 m_flags.set(kHaveInitializedOSOs);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000258
Kate Stoneb9c1b512016-09-06 20:57:50 +0000259 // If the object file has been stripped, there is no sense in looking further
260 // as all of the debug symbols for the debug map will not be available
Pavel Labathd2deeb42019-07-31 08:25:25 +0000261 if (m_objfile_sp->IsStripped())
Kate Stoneb9c1b512016-09-06 20:57:50 +0000262 return;
Sean Callanan60217122012-04-13 00:10:03 +0000263
Kate Stoneb9c1b512016-09-06 20:57:50 +0000264 // Also make sure the file type is some sort of executable. Core files, debug
265 // info files (dSYM), object files (.o files), and stub libraries all can
Pavel Labathd2deeb42019-07-31 08:25:25 +0000266 switch (m_objfile_sp->GetType()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000267 case ObjectFile::eTypeInvalid:
268 case ObjectFile::eTypeCoreFile:
269 case ObjectFile::eTypeDebugInfo:
270 case ObjectFile::eTypeObjectFile:
271 case ObjectFile::eTypeStubLibrary:
272 case ObjectFile::eTypeUnknown:
273 case ObjectFile::eTypeJIT:
274 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000275
Kate Stoneb9c1b512016-09-06 20:57:50 +0000276 case ObjectFile::eTypeExecutable:
277 case ObjectFile::eTypeDynamicLinker:
278 case ObjectFile::eTypeSharedLibrary:
279 break;
280 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000281
Kate Stoneb9c1b512016-09-06 20:57:50 +0000282 // In order to get the abilities of this plug-in, we look at the list of
283 // N_OSO entries (object files) from the symbol table and make sure that
Adrian Prantl05097242018-04-30 16:49:04 +0000284 // these files exist and also contain valid DWARF. If we get any of that then
285 // we return the abilities of the first N_OSO's DWARF.
Greg Clayton16b2d2b2011-01-20 06:08:59 +0000286
Pavel Labathd2deeb42019-07-31 08:25:25 +0000287 Symtab *symtab = m_objfile_sp->GetSymtab();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000288 if (symtab) {
289 Log *log(LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
Greg Clayton16b2d2b2011-01-20 06:08:59 +0000290
Kate Stoneb9c1b512016-09-06 20:57:50 +0000291 std::vector<uint32_t> oso_indexes;
292 // When a mach-o symbol is encoded, the n_type field is encoded in bits
293 // 23:16, and the n_desc field is encoded in bits 15:0.
294 //
Adrian Prantl05097242018-04-30 16:49:04 +0000295 // To find all N_OSO entries that are part of the DWARF + debug map we find
296 // only object file symbols with the flags value as follows: bits 23:16 ==
297 // 0x66 (N_OSO) bits 15: 0 == 0x0001 (specifies this is a debug map object
298 // file)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000299 const uint32_t k_oso_symbol_flags_value = 0x660001u;
Greg Clayton9422dd62013-03-04 21:46:16 +0000300
Kate Stoneb9c1b512016-09-06 20:57:50 +0000301 const uint32_t oso_index_count =
302 symtab->AppendSymbolIndexesWithTypeAndFlagsValue(
303 eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000304
Kate Stoneb9c1b512016-09-06 20:57:50 +0000305 if (oso_index_count > 0) {
306 symtab->AppendSymbolIndexesWithType(eSymbolTypeCode, Symtab::eDebugYes,
307 Symtab::eVisibilityAny,
308 m_func_indexes);
309 symtab->AppendSymbolIndexesWithType(eSymbolTypeData, Symtab::eDebugYes,
310 Symtab::eVisibilityAny,
311 m_glob_indexes);
312
313 symtab->SortSymbolIndexesByValue(m_func_indexes, true);
314 symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
315
316 for (uint32_t sym_idx : m_func_indexes) {
317 const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
318 lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
319 lldb::addr_t byte_size = symbol->GetByteSize();
320 DebugMap::Entry debug_map_entry(
321 file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
322 m_debug_map.Append(debug_map_entry);
323 }
324 for (uint32_t sym_idx : m_glob_indexes) {
325 const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
326 lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
327 lldb::addr_t byte_size = symbol->GetByteSize();
328 DebugMap::Entry debug_map_entry(
329 file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
330 m_debug_map.Append(debug_map_entry);
331 }
332 m_debug_map.Sort();
333
334 m_compile_unit_infos.resize(oso_index_count);
335
336 for (uint32_t i = 0; i < oso_index_count; ++i) {
337 const uint32_t so_idx = oso_indexes[i] - 1;
338 const uint32_t oso_idx = oso_indexes[i];
339 const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx);
340 const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx);
341 if (so_symbol && oso_symbol &&
342 so_symbol->GetType() == eSymbolTypeSourceFile &&
343 oso_symbol->GetType() == eSymbolTypeObjectFile) {
344 m_compile_unit_infos[i].so_file.SetFile(
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +0000345 so_symbol->GetName().AsCString(), FileSpec::Style::native);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000346 m_compile_unit_infos[i].oso_path = oso_symbol->GetName();
Pavel Labath7e2cfbf2016-11-09 09:59:18 +0000347 m_compile_unit_infos[i].oso_mod_time =
348 llvm::sys::toTimePoint(oso_symbol->GetIntegerValue(0));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000349 uint32_t sibling_idx = so_symbol->GetSiblingIndex();
350 // The sibling index can't be less that or equal to the current index
351 // "i"
352 if (sibling_idx == UINT32_MAX) {
Pavel Labathd2deeb42019-07-31 08:25:25 +0000353 m_objfile_sp->GetModule()->ReportError(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000354 "N_SO in symbol with UID %u has invalid sibling in debug map, "
355 "please file a bug and attach the binary listed in this error",
356 so_symbol->GetID());
357 } else {
358 const Symbol *last_symbol = symtab->SymbolAtIndex(sibling_idx - 1);
359 m_compile_unit_infos[i].first_symbol_index = so_idx;
360 m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1;
361 m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
362 m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
363
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000364 LLDB_LOGF(log, "Initialized OSO 0x%8.8x: file=%s", i,
365 oso_symbol->GetName().GetCString());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000366 }
367 } else {
Konrad Kleine248a1302019-05-23 11:14:47 +0000368 if (oso_symbol == nullptr)
Pavel Labathd2deeb42019-07-31 08:25:25 +0000369 m_objfile_sp->GetModule()->ReportError(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000370 "N_OSO symbol[%u] can't be found, please file a bug and attach "
371 "the binary listed in this error",
372 oso_idx);
Konrad Kleine248a1302019-05-23 11:14:47 +0000373 else if (so_symbol == nullptr)
Pavel Labathd2deeb42019-07-31 08:25:25 +0000374 m_objfile_sp->GetModule()->ReportError(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000375 "N_SO not found for N_OSO symbol[%u], please file a bug and "
376 "attach the binary listed in this error",
377 oso_idx);
378 else if (so_symbol->GetType() != eSymbolTypeSourceFile)
Pavel Labathd2deeb42019-07-31 08:25:25 +0000379 m_objfile_sp->GetModule()->ReportError(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000380 "N_SO has incorrect symbol type (%u) for N_OSO symbol[%u], "
381 "please file a bug and attach the binary listed in this error",
382 so_symbol->GetType(), oso_idx);
383 else if (oso_symbol->GetType() != eSymbolTypeSourceFile)
Pavel Labathd2deeb42019-07-31 08:25:25 +0000384 m_objfile_sp->GetModule()->ReportError(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000385 "N_OSO has incorrect symbol type (%u) for N_OSO symbol[%u], "
386 "please file a bug and attach the binary listed in this error",
387 oso_symbol->GetType(), oso_idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000388 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000389 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000391 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000392}
393
Kate Stoneb9c1b512016-09-06 20:57:50 +0000394Module *SymbolFileDWARFDebugMap::GetModuleByOSOIndex(uint32_t oso_idx) {
395 const uint32_t cu_count = GetNumCompileUnits();
396 if (oso_idx < cu_count)
397 return GetModuleByCompUnitInfo(&m_compile_unit_infos[oso_idx]);
Konrad Kleine248a1302019-05-23 11:14:47 +0000398 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000399}
400
Kate Stoneb9c1b512016-09-06 20:57:50 +0000401Module *SymbolFileDWARFDebugMap::GetModuleByCompUnitInfo(
402 CompileUnitInfo *comp_unit_info) {
403 if (!comp_unit_info->oso_sp) {
James Y Knight9c2d5202018-06-02 02:44:10 +0000404 auto pos = m_oso_map.find(
405 {comp_unit_info->oso_path, comp_unit_info->oso_mod_time});
Kate Stoneb9c1b512016-09-06 20:57:50 +0000406 if (pos != m_oso_map.end()) {
407 comp_unit_info->oso_sp = pos->second;
408 } else {
409 ObjectFile *obj_file = GetObjectFile();
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000410 comp_unit_info->oso_sp = std::make_shared<OSOInfo>();
James Y Knight9c2d5202018-06-02 02:44:10 +0000411 m_oso_map[{comp_unit_info->oso_path, comp_unit_info->oso_mod_time}] =
412 comp_unit_info->oso_sp;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000413 const char *oso_path = comp_unit_info->oso_path.GetCString();
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +0000414 FileSpec oso_file(oso_path);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000415 ConstString oso_object;
Jonas Devliegheredbd7fab2018-11-01 17:09:25 +0000416 if (FileSystem::Instance().Exists(oso_file)) {
Jonas Devlieghere010b56b2018-11-27 15:25:58 +0000417 // The modification time returned by the FS can have a higher precision
418 // than the one from the CU.
419 auto oso_mod_time = std::chrono::time_point_cast<std::chrono::seconds>(
420 FileSystem::Instance().GetModificationTime(oso_file));
Nico Weber8883ec72019-08-07 19:29:04 +0000421 // A timestamp of 0 means that the linker was in deterministic mode. In
422 // that case, we should skip the check against the filesystem last
423 // modification timestamp, since it will never match.
424 if (comp_unit_info->oso_mod_time != llvm::sys::TimePoint<>() &&
425 oso_mod_time != comp_unit_info->oso_mod_time) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000426 obj_file->GetModule()->ReportError(
427 "debug map object file '%s' has changed (actual time is "
Pavel Labath7e2cfbf2016-11-09 09:59:18 +0000428 "%s, debug map time is %s"
Kate Stoneb9c1b512016-09-06 20:57:50 +0000429 ") since this executable was linked, file will be ignored",
Pavel Labath7e2cfbf2016-11-09 09:59:18 +0000430 oso_file.GetPath().c_str(), llvm::to_string(oso_mod_time).c_str(),
431 llvm::to_string(comp_unit_info->oso_mod_time).c_str());
Konrad Kleine248a1302019-05-23 11:14:47 +0000432 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433 }
Greg Clayton57abc5d2013-05-10 21:47:16 +0000434
Kate Stoneb9c1b512016-09-06 20:57:50 +0000435 } else {
436 const bool must_exist = true;
Greg Clayton906ba472013-02-06 00:38:25 +0000437
Kate Stoneb9c1b512016-09-06 20:57:50 +0000438 if (!ObjectFile::SplitArchivePathWithObject(oso_path, oso_file,
439 oso_object, must_exist)) {
Konrad Kleine248a1302019-05-23 11:14:47 +0000440 return nullptr;
Greg Clayton906ba472013-02-06 00:38:25 +0000441 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000442 }
Adrian Prantl05097242018-04-30 16:49:04 +0000443 // Always create a new module for .o files. Why? Because we use the debug
444 // map, to add new sections to each .o file and even though a .o file
445 // might not have changed, the sections that get added to the .o file can
446 // change.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000447 ArchSpec oso_arch;
448 // Only adopt the architecture from the module (not the vendor or OS)
Adrian Prantl05097242018-04-30 16:49:04 +0000449 // since .o files for "i386-apple-ios" will historically show up as "i386
450 // -apple-macosx" due to the lack of a LC_VERSION_MIN_MACOSX or
451 // LC_VERSION_MIN_IPHONEOS load command...
Pavel Labathd2deeb42019-07-31 08:25:25 +0000452 oso_arch.SetTriple(m_objfile_sp->GetModule()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000453 ->GetArchitecture()
454 .GetTriple()
455 .getArchName()
456 .str()
457 .c_str());
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000458 comp_unit_info->oso_sp->module_sp = std::make_shared<DebugMapModule>(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000459 obj_file->GetModule(), GetCompUnitInfoIndex(comp_unit_info), oso_file,
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000460 oso_arch, oso_object ? &oso_object : nullptr, 0,
461 oso_object ? comp_unit_info->oso_mod_time : llvm::sys::TimePoint<>());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000463 }
464 if (comp_unit_info->oso_sp)
465 return comp_unit_info->oso_sp->module_sp.get();
Konrad Kleine248a1302019-05-23 11:14:47 +0000466 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000467}
468
Kate Stoneb9c1b512016-09-06 20:57:50 +0000469bool SymbolFileDWARFDebugMap::GetFileSpecForSO(uint32_t oso_idx,
470 FileSpec &file_spec) {
471 if (oso_idx < m_compile_unit_infos.size()) {
472 if (m_compile_unit_infos[oso_idx].so_file) {
473 file_spec = m_compile_unit_infos[oso_idx].so_file;
474 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000476 }
477 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000478}
479
Kate Stoneb9c1b512016-09-06 20:57:50 +0000480ObjectFile *SymbolFileDWARFDebugMap::GetObjectFileByOSOIndex(uint32_t oso_idx) {
481 Module *oso_module = GetModuleByOSOIndex(oso_idx);
482 if (oso_module)
483 return oso_module->GetObjectFile();
Konrad Kleine248a1302019-05-23 11:14:47 +0000484 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000485}
486
487SymbolFileDWARF *
Kate Stoneb9c1b512016-09-06 20:57:50 +0000488SymbolFileDWARFDebugMap::GetSymbolFile(const SymbolContext &sc) {
Zachary Turner863f8c12019-01-11 18:03:20 +0000489 return GetSymbolFile(*sc.comp_unit);
490}
491
492SymbolFileDWARF *
493SymbolFileDWARFDebugMap::GetSymbolFile(const CompileUnit &comp_unit) {
494 CompileUnitInfo *comp_unit_info = GetCompUnitInfo(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000495 if (comp_unit_info)
496 return GetSymbolFileByCompUnitInfo(comp_unit_info);
Konrad Kleine248a1302019-05-23 11:14:47 +0000497 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498}
499
Kate Stoneb9c1b512016-09-06 20:57:50 +0000500ObjectFile *SymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo(
501 CompileUnitInfo *comp_unit_info) {
502 Module *oso_module = GetModuleByCompUnitInfo(comp_unit_info);
503 if (oso_module)
504 return oso_module->GetObjectFile();
Konrad Kleine248a1302019-05-23 11:14:47 +0000505 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000506}
507
Kate Stoneb9c1b512016-09-06 20:57:50 +0000508uint32_t SymbolFileDWARFDebugMap::GetCompUnitInfoIndex(
509 const CompileUnitInfo *comp_unit_info) {
510 if (!m_compile_unit_infos.empty()) {
511 const CompileUnitInfo *first_comp_unit_info = &m_compile_unit_infos.front();
512 const CompileUnitInfo *last_comp_unit_info = &m_compile_unit_infos.back();
513 if (first_comp_unit_info <= comp_unit_info &&
514 comp_unit_info <= last_comp_unit_info)
515 return comp_unit_info - first_comp_unit_info;
516 }
517 return UINT32_MAX;
518}
519
520SymbolFileDWARF *
521SymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex(uint32_t oso_idx) {
Adrian Prantleca07c52018-11-05 20:49:07 +0000522 unsigned size = m_compile_unit_infos.size();
523 if (oso_idx < size)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000524 return GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[oso_idx]);
Konrad Kleine248a1302019-05-23 11:14:47 +0000525 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000526}
527
528SymbolFileDWARF *
529SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF(SymbolFile *sym_file) {
530 if (sym_file &&
531 sym_file->GetPluginName() == SymbolFileDWARF::GetPluginNameStatic())
532 return (SymbolFileDWARF *)sym_file;
Konrad Kleine248a1302019-05-23 11:14:47 +0000533 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000534}
535
536SymbolFileDWARF *SymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo(
537 CompileUnitInfo *comp_unit_info) {
Pavel Labath579d6d12019-08-08 07:34:07 +0000538 if (Module *oso_module = GetModuleByCompUnitInfo(comp_unit_info))
539 return GetSymbolFileAsSymbolFileDWARF(oso_module->GetSymbolFile());
Konrad Kleine248a1302019-05-23 11:14:47 +0000540 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000541}
542
543uint32_t SymbolFileDWARFDebugMap::CalculateAbilities() {
544 // In order to get the abilities of this plug-in, we look at the list of
545 // N_OSO entries (object files) from the symbol table and make sure that
Adrian Prantl05097242018-04-30 16:49:04 +0000546 // these files exist and also contain valid DWARF. If we get any of that then
547 // we return the abilities of the first N_OSO's DWARF.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000548
549 const uint32_t oso_index_count = GetNumCompileUnits();
550 if (oso_index_count > 0) {
551 InitOSO();
552 if (!m_compile_unit_infos.empty()) {
553 return SymbolFile::CompileUnits | SymbolFile::Functions |
554 SymbolFile::Blocks | SymbolFile::GlobalVariables |
555 SymbolFile::LocalVariables | SymbolFile::VariableTypes |
556 SymbolFile::LineTables;
Greg Clayton81c22f62011-10-19 18:09:39 +0000557 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000558 }
559 return 0;
Greg Clayton81c22f62011-10-19 18:09:39 +0000560}
561
Pavel Labathe0119902019-07-23 09:24:02 +0000562uint32_t SymbolFileDWARFDebugMap::CalculateNumCompileUnits() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000563 InitOSO();
564 return m_compile_unit_infos.size();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000565}
566
Kate Stoneb9c1b512016-09-06 20:57:50 +0000567CompUnitSP SymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx) {
568 CompUnitSP comp_unit_sp;
569 const uint32_t cu_count = GetNumCompileUnits();
Greg Clayton57abc5d2013-05-10 21:47:16 +0000570
Kate Stoneb9c1b512016-09-06 20:57:50 +0000571 if (cu_idx < cu_count) {
572 Module *oso_module = GetModuleByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
573 if (oso_module) {
574 FileSpec so_file_spec;
575 if (GetFileSpecForSO(cu_idx, so_file_spec)) {
Adrian Prantl05097242018-04-30 16:49:04 +0000576 // User zero as the ID to match the compile unit at offset zero in each
577 // .o file since each .o file can only have one compile unit for now.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000578 lldb::user_id_t cu_id = 0;
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000579 m_compile_unit_infos[cu_idx].compile_unit_sp =
580 std::make_shared<CompileUnit>(
Pavel Labathd2deeb42019-07-31 08:25:25 +0000581 m_objfile_sp->GetModule(), nullptr, so_file_spec, cu_id,
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000582 eLanguageTypeUnknown, eLazyBoolCalculate);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000583
Kate Stoneb9c1b512016-09-06 20:57:50 +0000584 if (m_compile_unit_infos[cu_idx].compile_unit_sp) {
Pavel Labathe0119902019-07-23 09:24:02 +0000585 SetCompileUnitAtIndex(cu_idx,
586 m_compile_unit_infos[cu_idx].compile_unit_sp);
Greg Clayton3046e662013-07-10 01:23:25 +0000587 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000588 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000589 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000590 comp_unit_sp = m_compile_unit_infos[cu_idx].compile_unit_sp;
591 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000592
Kate Stoneb9c1b512016-09-06 20:57:50 +0000593 return comp_unit_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000594}
595
596SymbolFileDWARFDebugMap::CompileUnitInfo *
Kate Stoneb9c1b512016-09-06 20:57:50 +0000597SymbolFileDWARFDebugMap::GetCompUnitInfo(const SymbolContext &sc) {
Zachary Turner863f8c12019-01-11 18:03:20 +0000598 return GetCompUnitInfo(*sc.comp_unit);
599}
600
601SymbolFileDWARFDebugMap::CompileUnitInfo *
602SymbolFileDWARFDebugMap::GetCompUnitInfo(const CompileUnit &comp_unit) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000603 const uint32_t cu_count = GetNumCompileUnits();
604 for (uint32_t i = 0; i < cu_count; ++i) {
Zachary Turner863f8c12019-01-11 18:03:20 +0000605 if (comp_unit == m_compile_unit_infos[i].compile_unit_sp.get())
Kate Stoneb9c1b512016-09-06 20:57:50 +0000606 return &m_compile_unit_infos[i];
607 }
Konrad Kleine248a1302019-05-23 11:14:47 +0000608 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000609}
610
Kate Stoneb9c1b512016-09-06 20:57:50 +0000611size_t SymbolFileDWARFDebugMap::GetCompUnitInfosForModule(
612 const lldb_private::Module *module,
613 std::vector<CompileUnitInfo *> &cu_infos) {
614 const uint32_t cu_count = GetNumCompileUnits();
615 for (uint32_t i = 0; i < cu_count; ++i) {
616 if (module == GetModuleByCompUnitInfo(&m_compile_unit_infos[i]))
617 cu_infos.push_back(&m_compile_unit_infos[i]);
618 }
619 return cu_infos.size();
Greg Clayton1f746072012-08-29 21:13:06 +0000620}
621
622lldb::LanguageType
Zachary Turner863f8c12019-01-11 18:03:20 +0000623SymbolFileDWARFDebugMap::ParseLanguage(CompileUnit &comp_unit) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000624 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turner863f8c12019-01-11 18:03:20 +0000625 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000626 if (oso_dwarf)
Zachary Turner863f8c12019-01-11 18:03:20 +0000627 return oso_dwarf->ParseLanguage(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000628 return eLanguageTypeUnknown;
Greg Clayton1f746072012-08-29 21:13:06 +0000629}
630
Zachary Turner863f8c12019-01-11 18:03:20 +0000631size_t SymbolFileDWARFDebugMap::ParseFunctions(CompileUnit &comp_unit) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000632 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turner863f8c12019-01-11 18:03:20 +0000633 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000634 if (oso_dwarf)
Zachary Turner863f8c12019-01-11 18:03:20 +0000635 return oso_dwarf->ParseFunctions(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000636 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000637}
638
Zachary Turner863f8c12019-01-11 18:03:20 +0000639bool SymbolFileDWARFDebugMap::ParseLineTable(CompileUnit &comp_unit) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000640 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turner863f8c12019-01-11 18:03:20 +0000641 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000642 if (oso_dwarf)
Zachary Turner863f8c12019-01-11 18:03:20 +0000643 return oso_dwarf->ParseLineTable(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000644 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000645}
646
Zachary Turner863f8c12019-01-11 18:03:20 +0000647bool SymbolFileDWARFDebugMap::ParseDebugMacros(CompileUnit &comp_unit) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000648 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turner863f8c12019-01-11 18:03:20 +0000649 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000650 if (oso_dwarf)
Zachary Turner863f8c12019-01-11 18:03:20 +0000651 return oso_dwarf->ParseDebugMacros(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000652 return false;
Siva Chandrad8335e92015-12-16 00:22:08 +0000653}
654
Raphael Isemann9379d192019-09-24 10:08:18 +0000655void SymbolFileDWARFDebugMap::ForEachExternalModule(
656 CompileUnit &comp_unit, llvm::function_ref<void(ModuleSP)> f) {
657 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
658 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
659 if (oso_dwarf)
660 oso_dwarf->ForEachExternalModule(comp_unit, f);
661}
662
Zachary Turner863f8c12019-01-11 18:03:20 +0000663bool SymbolFileDWARFDebugMap::ParseSupportFiles(CompileUnit &comp_unit,
664 FileSpecList &support_files) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000665 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turner863f8c12019-01-11 18:03:20 +0000666 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000667 if (oso_dwarf)
Zachary Turner863f8c12019-01-11 18:03:20 +0000668 return oso_dwarf->ParseSupportFiles(comp_unit, support_files);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000669 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000670}
671
Zachary Turner863f8c12019-01-11 18:03:20 +0000672bool SymbolFileDWARFDebugMap::ParseIsOptimized(CompileUnit &comp_unit) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000673 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turner863f8c12019-01-11 18:03:20 +0000674 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000675 if (oso_dwarf)
Zachary Turner863f8c12019-01-11 18:03:20 +0000676 return oso_dwarf->ParseIsOptimized(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000677 return false;
Greg Claytonad2b63c2016-07-05 23:01:20 +0000678}
679
Kate Stoneb9c1b512016-09-06 20:57:50 +0000680bool SymbolFileDWARFDebugMap::ParseImportedModules(
Adrian Prantl0f30a3b2019-02-13 18:10:41 +0000681 const SymbolContext &sc, std::vector<SourceModule> &imported_modules) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000682 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000683 SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
684 if (oso_dwarf)
685 return oso_dwarf->ParseImportedModules(sc, imported_modules);
686 return false;
687}
688
Zachary Turnerffc1b8f2019-01-14 22:40:41 +0000689size_t SymbolFileDWARFDebugMap::ParseBlocksRecursive(Function &func) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000690 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turnerffc1b8f2019-01-14 22:40:41 +0000691 CompileUnit *comp_unit = func.GetCompileUnit();
692 if (!comp_unit)
693 return 0;
694
695 SymbolFileDWARF *oso_dwarf = GetSymbolFile(*comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000696 if (oso_dwarf)
Zachary Turnerffc1b8f2019-01-14 22:40:41 +0000697 return oso_dwarf->ParseBlocksRecursive(func);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000698 return 0;
699}
700
Zachary Turner863f8c12019-01-11 18:03:20 +0000701size_t SymbolFileDWARFDebugMap::ParseTypes(CompileUnit &comp_unit) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000702 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Zachary Turner863f8c12019-01-11 18:03:20 +0000703 SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000704 if (oso_dwarf)
Zachary Turner863f8c12019-01-11 18:03:20 +0000705 return oso_dwarf->ParseTypes(comp_unit);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000706 return 0;
Sean Callananf0c5aeb2015-04-20 16:31:29 +0000707}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000708
709size_t
Kate Stoneb9c1b512016-09-06 20:57:50 +0000710SymbolFileDWARFDebugMap::ParseVariablesForContext(const SymbolContext &sc) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000711 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000712 SymbolFileDWARF *oso_dwarf = GetSymbolFile(sc);
713 if (oso_dwarf)
714 return oso_dwarf->ParseVariablesForContext(sc);
715 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000716}
717
Kate Stoneb9c1b512016-09-06 20:57:50 +0000718Type *SymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000719 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000720 const uint64_t oso_idx = GetOSOIndexFromUserID(type_uid);
721 SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
722 if (oso_dwarf)
723 return oso_dwarf->ResolveTypeUID(type_uid);
Konrad Kleine248a1302019-05-23 11:14:47 +0000724 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000725}
726
Adrian Prantleca07c52018-11-05 20:49:07 +0000727llvm::Optional<SymbolFile::ArrayInfo>
728SymbolFileDWARFDebugMap::GetDynamicArrayInfoForUID(
729 lldb::user_id_t type_uid, const lldb_private::ExecutionContext *exe_ctx) {
730 const uint64_t oso_idx = GetOSOIndexFromUserID(type_uid);
731 SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
732 if (oso_dwarf)
733 return oso_dwarf->GetDynamicArrayInfoForUID(type_uid, exe_ctx);
734 return llvm::None;
735}
736
Kate Stoneb9c1b512016-09-06 20:57:50 +0000737bool SymbolFileDWARFDebugMap::CompleteType(CompilerType &compiler_type) {
738 bool success = false;
739 if (compiler_type) {
740 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
741 if (oso_dwarf->HasForwardDeclForClangType(compiler_type)) {
742 oso_dwarf->CompleteType(compiler_type);
743 success = true;
744 return true;
745 }
746 return false;
747 });
748 }
749 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000750}
751
Zachary Turner991e4452018-10-25 20:45:19 +0000752uint32_t
753SymbolFileDWARFDebugMap::ResolveSymbolContext(const Address &exe_so_addr,
754 SymbolContextItem resolve_scope,
755 SymbolContext &sc) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000756 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000757 uint32_t resolved_flags = 0;
Pavel Labathd2deeb42019-07-31 08:25:25 +0000758 Symtab *symtab = m_objfile_sp->GetSymtab();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000759 if (symtab) {
760 const addr_t exe_file_addr = exe_so_addr.GetFileAddress();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761
Kate Stoneb9c1b512016-09-06 20:57:50 +0000762 const DebugMap::Entry *debug_map_entry =
763 m_debug_map.FindEntryThatContains(exe_file_addr);
764 if (debug_map_entry) {
765
766 sc.symbol =
767 symtab->SymbolAtIndex(debug_map_entry->data.GetExeSymbolIndex());
768
Konrad Kleine248a1302019-05-23 11:14:47 +0000769 if (sc.symbol != nullptr) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000770 resolved_flags |= eSymbolContextSymbol;
771
772 uint32_t oso_idx = 0;
773 CompileUnitInfo *comp_unit_info =
774 GetCompileUnitInfoForSymbolWithID(sc.symbol->GetID(), &oso_idx);
775 if (comp_unit_info) {
776 comp_unit_info->GetFileRangeMap(this);
777 Module *oso_module = GetModuleByCompUnitInfo(comp_unit_info);
778 if (oso_module) {
779 lldb::addr_t oso_file_addr =
780 exe_file_addr - debug_map_entry->GetRangeBase() +
781 debug_map_entry->data.GetOSOFileAddress();
782 Address oso_so_addr;
783 if (oso_module->ResolveFileAddress(oso_file_addr, oso_so_addr)) {
784 resolved_flags |=
Pavel Labath465eae32019-08-06 09:12:42 +0000785 oso_module->GetSymbolFile()->ResolveSymbolContext(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000786 oso_so_addr, resolve_scope, sc);
Greg Clayton6dc8d582015-08-18 22:32:36 +0000787 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000788 }
789 }
790 }
Greg Clayton6dc8d582015-08-18 22:32:36 +0000791 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000792 }
793 return resolved_flags;
Greg Clayton1be10fc2010-09-29 01:12:09 +0000794}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795
Kate Stoneb9c1b512016-09-06 20:57:50 +0000796uint32_t SymbolFileDWARFDebugMap::ResolveSymbolContext(
797 const FileSpec &file_spec, uint32_t line, bool check_inlines,
Zachary Turner991e4452018-10-25 20:45:19 +0000798 SymbolContextItem resolve_scope, SymbolContextList &sc_list) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000799 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000800 const uint32_t initial = sc_list.GetSize();
801 const uint32_t cu_count = GetNumCompileUnits();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000802
Kate Stoneb9c1b512016-09-06 20:57:50 +0000803 for (uint32_t i = 0; i < cu_count; ++i) {
Adrian Prantl05097242018-04-30 16:49:04 +0000804 // If we are checking for inlines, then we need to look through all compile
805 // units no matter if "file_spec" matches.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000806 bool resolve = check_inlines;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000807
Kate Stoneb9c1b512016-09-06 20:57:50 +0000808 if (!resolve) {
809 FileSpec so_file_spec;
810 if (GetFileSpecForSO(i, so_file_spec)) {
811 // Match the full path if the incoming file_spec has a directory (not
812 // just a basename)
813 const bool full_match = (bool)file_spec.GetDirectory();
814 resolve = FileSpec::Equal(file_spec, so_file_spec, full_match);
815 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000816 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000817 if (resolve) {
818 SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(i);
819 if (oso_dwarf)
820 oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines,
821 resolve_scope, sc_list);
822 }
823 }
824 return sc_list.GetSize() - initial;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000825}
826
Kate Stoneb9c1b512016-09-06 20:57:50 +0000827uint32_t SymbolFileDWARFDebugMap::PrivateFindGlobalVariables(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000828 ConstString name, const CompilerDeclContext *parent_decl_ctx,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000829 const std::vector<uint32_t>
830 &indexes, // Indexes into the symbol table that match "name"
Jonas Devlieghere010b56b2018-11-27 15:25:58 +0000831 uint32_t max_matches, VariableList &variables) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000832 const uint32_t original_size = variables.GetSize();
833 const size_t match_count = indexes.size();
834 for (size_t i = 0; i < match_count; ++i) {
835 uint32_t oso_idx;
836 CompileUnitInfo *comp_unit_info =
837 GetCompileUnitInfoForSymbolWithIndex(indexes[i], &oso_idx);
838 if (comp_unit_info) {
839 SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
840 if (oso_dwarf) {
Pavel Labath34cda142018-05-31 09:46:26 +0000841 if (oso_dwarf->FindGlobalVariables(name, parent_decl_ctx, max_matches,
842 variables))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000843 if (variables.GetSize() > max_matches)
844 break;
845 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000846 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000847 }
848 return variables.GetSize() - original_size;
849}
850
851uint32_t SymbolFileDWARFDebugMap::FindGlobalVariables(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000852 ConstString name, const CompilerDeclContext *parent_decl_ctx,
Pavel Labath34cda142018-05-31 09:46:26 +0000853 uint32_t max_matches, VariableList &variables) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000854 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000855
Pavel Labath34cda142018-05-31 09:46:26 +0000856 // Remember how many variables are in the list before we search.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000857 const uint32_t original_size = variables.GetSize();
858
859 uint32_t total_matches = 0;
860
861 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
862 const uint32_t oso_matches = oso_dwarf->FindGlobalVariables(
Pavel Labath34cda142018-05-31 09:46:26 +0000863 name, parent_decl_ctx, max_matches, variables);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000864 if (oso_matches > 0) {
865 total_matches += oso_matches;
866
867 // Are we getting all matches?
868 if (max_matches == UINT32_MAX)
869 return false; // Yep, continue getting everything
870
871 // If we have found enough matches, lets get out
872 if (max_matches >= total_matches)
873 return true;
874
Adrian Prantl05097242018-04-30 16:49:04 +0000875 // Update the max matches for any subsequent calls to find globals in any
876 // other object files with DWARF
Kate Stoneb9c1b512016-09-06 20:57:50 +0000877 max_matches -= oso_matches;
878 }
879
880 return false;
881 });
882
883 // Return the number of variable that were appended to the list
884 return variables.GetSize() - original_size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000885}
886
887uint32_t
Kate Stoneb9c1b512016-09-06 20:57:50 +0000888SymbolFileDWARFDebugMap::FindGlobalVariables(const RegularExpression &regex,
Pavel Labath34cda142018-05-31 09:46:26 +0000889 uint32_t max_matches,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000890 VariableList &variables) {
Pavel Labath656ddeb2019-07-30 08:20:05 +0000891 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Pavel Labath34cda142018-05-31 09:46:26 +0000892 // Remember how many variables are in the list before we search.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000893 const uint32_t original_size = variables.GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000894
Kate Stoneb9c1b512016-09-06 20:57:50 +0000895 uint32_t total_matches = 0;
896 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
897 const uint32_t oso_matches =
Pavel Labath34cda142018-05-31 09:46:26 +0000898 oso_dwarf->FindGlobalVariables(regex, max_matches, variables);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000899 if (oso_matches > 0) {
900 total_matches += oso_matches;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000901
Kate Stoneb9c1b512016-09-06 20:57:50 +0000902 // Are we getting all matches?
903 if (max_matches == UINT32_MAX)
904 return false; // Yep, continue getting everything
Sean Callanan0dc848c2015-04-01 20:43:23 +0000905
Kate Stoneb9c1b512016-09-06 20:57:50 +0000906 // If we have found enough matches, lets get out
907 if (max_matches >= total_matches)
908 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000909
Adrian Prantl05097242018-04-30 16:49:04 +0000910 // Update the max matches for any subsequent calls to find globals in any
911 // other object files with DWARF
Kate Stoneb9c1b512016-09-06 20:57:50 +0000912 max_matches -= oso_matches;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000913 }
914
Kate Stoneb9c1b512016-09-06 20:57:50 +0000915 return false;
916 });
917
918 // Return the number of variable that were appended to the list
919 return variables.GetSize() - original_size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000920}
921
Kate Stoneb9c1b512016-09-06 20:57:50 +0000922int SymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex(
923 uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) {
924 const uint32_t symbol_idx = *symbol_idx_ptr;
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000925
Kate Stoneb9c1b512016-09-06 20:57:50 +0000926 if (symbol_idx < comp_unit_info->first_symbol_index)
927 return -1;
928
929 if (symbol_idx <= comp_unit_info->last_symbol_index)
930 return 0;
931
932 return 1;
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000933}
934
Kate Stoneb9c1b512016-09-06 20:57:50 +0000935int SymbolFileDWARFDebugMap::SymbolContainsSymbolWithID(
936 user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) {
937 const user_id_t symbol_id = *symbol_idx_ptr;
938
939 if (symbol_id < comp_unit_info->first_symbol_id)
940 return -1;
941
942 if (symbol_id <= comp_unit_info->last_symbol_id)
943 return 0;
944
945 return 1;
Greg Clayton3ef3fc62010-08-17 23:16:15 +0000946}
947
Kate Stoneb9c1b512016-09-06 20:57:50 +0000948SymbolFileDWARFDebugMap::CompileUnitInfo *
949SymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex(
950 uint32_t symbol_idx, uint32_t *oso_idx_ptr) {
951 const uint32_t oso_index_count = m_compile_unit_infos.size();
Konrad Kleine248a1302019-05-23 11:14:47 +0000952 CompileUnitInfo *comp_unit_info = nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000953 if (oso_index_count) {
954 comp_unit_info = (CompileUnitInfo *)bsearch(
955 &symbol_idx, &m_compile_unit_infos[0], m_compile_unit_infos.size(),
956 sizeof(CompileUnitInfo),
957 (ComparisonFunction)SymbolContainsSymbolWithIndex);
958 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000959
Kate Stoneb9c1b512016-09-06 20:57:50 +0000960 if (oso_idx_ptr) {
Konrad Kleine248a1302019-05-23 11:14:47 +0000961 if (comp_unit_info != nullptr)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000962 *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000963 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000964 *oso_idx_ptr = UINT32_MAX;
965 }
966 return comp_unit_info;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000967}
968
Kate Stoneb9c1b512016-09-06 20:57:50 +0000969SymbolFileDWARFDebugMap::CompileUnitInfo *
970SymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID(
971 user_id_t symbol_id, uint32_t *oso_idx_ptr) {
972 const uint32_t oso_index_count = m_compile_unit_infos.size();
Konrad Kleine248a1302019-05-23 11:14:47 +0000973 CompileUnitInfo *comp_unit_info = nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000974 if (oso_index_count) {
975 comp_unit_info = (CompileUnitInfo *)::bsearch(
976 &symbol_id, &m_compile_unit_infos[0], m_compile_unit_infos.size(),
977 sizeof(CompileUnitInfo),
978 (ComparisonFunction)SymbolContainsSymbolWithID);
979 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980
Kate Stoneb9c1b512016-09-06 20:57:50 +0000981 if (oso_idx_ptr) {
Konrad Kleine248a1302019-05-23 11:14:47 +0000982 if (comp_unit_info != nullptr)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000983 *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0];
Greg Clayton57a6b992010-08-17 00:35:34 +0000984 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000985 *oso_idx_ptr = UINT32_MAX;
986 }
987 return comp_unit_info;
988}
Greg Clayton57a6b992010-08-17 00:35:34 +0000989
Kate Stoneb9c1b512016-09-06 20:57:50 +0000990static void RemoveFunctionsWithModuleNotEqualTo(const ModuleSP &module_sp,
991 SymbolContextList &sc_list,
992 uint32_t start_idx) {
Adrian Prantl05097242018-04-30 16:49:04 +0000993 // We found functions in .o files. Not all functions in the .o files will
994 // have made it into the final output file. The ones that did make it into
995 // the final output file will have a section whose module matches the module
996 // from the ObjectFile for this SymbolFile. When the modules don't match,
997 // then we have something that was in a .o file, but doesn't map to anything
998 // in the final executable.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000999 uint32_t i = start_idx;
1000 while (i < sc_list.GetSize()) {
1001 SymbolContext sc;
1002 sc_list.GetContextAtIndex(i, sc);
1003 if (sc.function) {
1004 const SectionSP section_sp(
1005 sc.function->GetAddressRange().GetBaseAddress().GetSection());
1006 if (section_sp->GetModule() != module_sp) {
1007 sc_list.RemoveContextAtIndex(i);
1008 continue;
1009 }
1010 }
1011 ++i;
1012 }
1013}
1014
1015uint32_t SymbolFileDWARFDebugMap::FindFunctions(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001016 ConstString name, const CompilerDeclContext *parent_decl_ctx,
Zachary Turner117b1fa2018-10-25 20:45:40 +00001017 FunctionNameType name_type_mask, bool include_inlines, bool append,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001018 SymbolContextList &sc_list) {
Pavel Labath656ddeb2019-07-30 08:20:05 +00001019 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Pavel Labathf9d16472017-05-15 13:02:37 +00001020 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
1021 Timer scoped_timer(func_cat,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001022 "SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
1023 name.GetCString());
1024
1025 uint32_t initial_size = 0;
1026 if (append)
1027 initial_size = sc_list.GetSize();
1028 else
1029 sc_list.Clear();
1030
1031 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
1032 uint32_t sc_idx = sc_list.GetSize();
1033 if (oso_dwarf->FindFunctions(name, parent_decl_ctx, name_type_mask,
1034 include_inlines, true, sc_list)) {
Pavel Labathd2deeb42019-07-31 08:25:25 +00001035 RemoveFunctionsWithModuleNotEqualTo(m_objfile_sp->GetModule(), sc_list,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001036 sc_idx);
1037 }
1038 return false;
1039 });
1040
1041 return sc_list.GetSize() - initial_size;
1042}
1043
1044uint32_t SymbolFileDWARFDebugMap::FindFunctions(const RegularExpression &regex,
1045 bool include_inlines,
1046 bool append,
1047 SymbolContextList &sc_list) {
Pavel Labath656ddeb2019-07-30 08:20:05 +00001048 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Pavel Labathf9d16472017-05-15 13:02:37 +00001049 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
1050 Timer scoped_timer(func_cat,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001051 "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')",
Zachary Turner95eae422016-09-21 16:01:28 +00001052 regex.GetText().str().c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001053
1054 uint32_t initial_size = 0;
1055 if (append)
1056 initial_size = sc_list.GetSize();
1057 else
1058 sc_list.Clear();
1059
1060 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
1061 uint32_t sc_idx = sc_list.GetSize();
1062
1063 if (oso_dwarf->FindFunctions(regex, include_inlines, true, sc_list)) {
Pavel Labathd2deeb42019-07-31 08:25:25 +00001064 RemoveFunctionsWithModuleNotEqualTo(m_objfile_sp->GetModule(), sc_list,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001065 sc_idx);
1066 }
1067 return false;
1068 });
1069
1070 return sc_list.GetSize() - initial_size;
1071}
1072
1073size_t SymbolFileDWARFDebugMap::GetTypes(SymbolContextScope *sc_scope,
Zachary Turner117b1fa2018-10-25 20:45:40 +00001074 lldb::TypeClass type_mask,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001075 TypeList &type_list) {
Pavel Labath656ddeb2019-07-30 08:20:05 +00001076 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Pavel Labathf9d16472017-05-15 13:02:37 +00001077 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
1078 Timer scoped_timer(func_cat,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001079 "SymbolFileDWARFDebugMap::GetTypes (type_mask = 0x%8.8x)",
1080 type_mask);
1081
1082 uint32_t initial_size = type_list.GetSize();
Konrad Kleine248a1302019-05-23 11:14:47 +00001083 SymbolFileDWARF *oso_dwarf = nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001084 if (sc_scope) {
1085 SymbolContext sc;
1086 sc_scope->CalculateSymbolContext(&sc);
1087
1088 CompileUnitInfo *cu_info = GetCompUnitInfo(sc);
1089 if (cu_info) {
1090 oso_dwarf = GetSymbolFileByCompUnitInfo(cu_info);
1091 if (oso_dwarf)
1092 oso_dwarf->GetTypes(sc_scope, type_mask, type_list);
1093 }
1094 } else {
Sean Callanan0dc848c2015-04-01 20:43:23 +00001095 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001096 oso_dwarf->GetTypes(sc_scope, type_mask, type_list);
1097 return false;
Sean Callanan0dc848c2015-04-01 20:43:23 +00001098 });
Kate Stoneb9c1b512016-09-06 20:57:50 +00001099 }
1100 return type_list.GetSize() - initial_size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001101}
1102
Vedant Kumar4b36f792018-10-05 23:23:15 +00001103std::vector<lldb_private::CallEdge>
1104SymbolFileDWARFDebugMap::ParseCallEdgesInFunction(UserID func_id) {
1105 uint32_t oso_idx = GetOSOIndexFromUserID(func_id.GetID());
1106 SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
1107 if (oso_dwarf)
1108 return oso_dwarf->ParseCallEdgesInFunction(func_id);
1109 return {};
1110}
1111
Kate Stoneb9c1b512016-09-06 20:57:50 +00001112TypeSP SymbolFileDWARFDebugMap::FindDefinitionTypeForDWARFDeclContext(
1113 const DWARFDeclContext &die_decl_ctx) {
1114 TypeSP type_sp;
1115 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
1116 type_sp = oso_dwarf->FindDefinitionTypeForDWARFDeclContext(die_decl_ctx);
1117 return ((bool)type_sp);
1118 });
1119 return type_sp;
Greg Claytonf02500c2013-06-18 22:51:05 +00001120}
1121
Kate Stoneb9c1b512016-09-06 20:57:50 +00001122bool SymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type(
1123 SymbolFileDWARF *skip_dwarf_oso) {
1124 if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate) {
1125 m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
Sean Callanan0dc848c2015-04-01 20:43:23 +00001126 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001127 if (skip_dwarf_oso != oso_dwarf &&
Konrad Kleine248a1302019-05-23 11:14:47 +00001128 oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(nullptr)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001129 m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
1130 return true;
1131 }
1132 return false;
Sean Callanan0dc848c2015-04-01 20:43:23 +00001133 });
Kate Stoneb9c1b512016-09-06 20:57:50 +00001134 }
1135 return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
Greg Clayton2ccf8cf2010-11-07 21:02:03 +00001136}
Greg Claytonb0b9fe62010-08-03 00:35:52 +00001137
Kate Stoneb9c1b512016-09-06 20:57:50 +00001138TypeSP SymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001139 const DWARFDIE &die, ConstString type_name,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001140 bool must_be_implementation) {
Adrian Prantl4e8be2c2018-06-13 16:21:24 +00001141 // If we have a debug map, we will have an Objective-C symbol whose name is
Kate Stoneb9c1b512016-09-06 20:57:50 +00001142 // the type name and whose type is eSymbolTypeObjCClass. If we can find that
1143 // symbol and find its containing parent, we can locate the .o file that will
1144 // contain the implementation definition since it will be scoped inside the
Adrian Prantl05097242018-04-30 16:49:04 +00001145 // N_SO and we can then locate the SymbolFileDWARF that corresponds to that
1146 // N_SO.
Konrad Kleine248a1302019-05-23 11:14:47 +00001147 SymbolFileDWARF *oso_dwarf = nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001148 TypeSP type_sp;
Pavel Labathd2deeb42019-07-31 08:25:25 +00001149 ObjectFile *module_objfile = m_objfile_sp->GetModule()->GetObjectFile();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001150 if (module_objfile) {
1151 Symtab *symtab = module_objfile->GetSymtab();
1152 if (symtab) {
1153 Symbol *objc_class_symbol = symtab->FindFirstSymbolWithNameAndType(
1154 type_name, eSymbolTypeObjCClass, Symtab::eDebugAny,
1155 Symtab::eVisibilityAny);
1156 if (objc_class_symbol) {
1157 // Get the N_SO symbol that contains the objective C class symbol as
Adrian Prantl05097242018-04-30 16:49:04 +00001158 // this should be the .o file that contains the real definition...
Kate Stoneb9c1b512016-09-06 20:57:50 +00001159 const Symbol *source_file_symbol = symtab->GetParent(objc_class_symbol);
Greg Claytonc7f03b62012-01-12 04:33:28 +00001160
Kate Stoneb9c1b512016-09-06 20:57:50 +00001161 if (source_file_symbol &&
1162 source_file_symbol->GetType() == eSymbolTypeSourceFile) {
1163 const uint32_t source_file_symbol_idx =
1164 symtab->GetIndexForSymbol(source_file_symbol);
1165 if (source_file_symbol_idx != UINT32_MAX) {
1166 CompileUnitInfo *compile_unit_info =
1167 GetCompileUnitInfoForSymbolWithIndex(source_file_symbol_idx,
Konrad Kleine248a1302019-05-23 11:14:47 +00001168 nullptr);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001169 if (compile_unit_info) {
1170 oso_dwarf = GetSymbolFileByCompUnitInfo(compile_unit_info);
1171 if (oso_dwarf) {
1172 TypeSP type_sp(oso_dwarf->FindCompleteObjCDefinitionTypeForDIE(
1173 die, type_name, must_be_implementation));
1174 if (type_sp) {
1175 return type_sp;
Greg Claytonbc63aac2015-02-25 22:41:34 +00001176 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001177 }
Greg Claytonbc63aac2015-02-25 22:41:34 +00001178 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001179 }
Greg Claytonbc63aac2015-02-25 22:41:34 +00001180 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001181 }
Greg Clayton901c5ca2011-12-03 04:40:03 +00001182 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001183 }
Greg Claytonbc63aac2015-02-25 22:41:34 +00001184
Kate Stoneb9c1b512016-09-06 20:57:50 +00001185 // Only search all .o files for the definition if we don't need the
Adrian Prantl05097242018-04-30 16:49:04 +00001186 // implementation because otherwise, with a valid debug map we should have
1187 // the ObjC class symbol and the code above should have found it.
Jonas Devliegherea6682a42018-12-15 00:15:33 +00001188 if (!must_be_implementation) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001189 TypeSP type_sp;
1190
1191 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
1192 type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE(
1193 die, type_name, must_be_implementation);
1194 return (bool)type_sp;
1195 });
1196
1197 return type_sp;
1198 }
1199 return TypeSP();
Greg Clayton901c5ca2011-12-03 04:40:03 +00001200}
1201
Kate Stoneb9c1b512016-09-06 20:57:50 +00001202uint32_t SymbolFileDWARFDebugMap::FindTypes(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001203 ConstString name, const CompilerDeclContext *parent_decl_ctx,
Zachary Turner576495e2019-01-14 22:41:21 +00001204 bool append, uint32_t max_matches,
Greg Claytonae088e52016-02-10 21:28:13 +00001205 llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001206 TypeMap &types) {
Pavel Labath656ddeb2019-07-30 08:20:05 +00001207 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001208 if (!append)
1209 types.Clear();
Greg Clayton6dbd3982010-09-15 05:51:24 +00001210
Kate Stoneb9c1b512016-09-06 20:57:50 +00001211 const uint32_t initial_types_size = types.GetSize();
Greg Clayton6dbd3982010-09-15 05:51:24 +00001212
Zachary Turner576495e2019-01-14 22:41:21 +00001213 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
1214 oso_dwarf->FindTypes(name, parent_decl_ctx, append, max_matches,
1215 searched_symbol_files, types);
1216 return types.GetSize() >= max_matches;
1217 });
Greg Clayton6dbd3982010-09-15 05:51:24 +00001218
Kate Stoneb9c1b512016-09-06 20:57:50 +00001219 return types.GetSize() - initial_types_size;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00001220}
1221
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001222//
Kate Stoneb9c1b512016-09-06 20:57:50 +00001223// uint32_t
1224// SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const
1225// RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding
1226// encoding, lldb::user_id_t udt_uid, TypeList& types)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001227//{
1228// SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc);
1229// if (oso_dwarf)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001230// return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding,
1231// udt_uid, types);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001232// return 0;
1233//}
1234
Kate Stoneb9c1b512016-09-06 20:57:50 +00001235CompilerDeclContext SymbolFileDWARFDebugMap::FindNamespace(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001236 lldb_private::ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001237 const CompilerDeclContext *parent_decl_ctx) {
Pavel Labath656ddeb2019-07-30 08:20:05 +00001238 std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001239 CompilerDeclContext matching_namespace;
Greg Clayton96d7d742010-11-10 23:42:09 +00001240
Zachary Turnerc0a246a2019-01-14 22:41:00 +00001241 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
1242 matching_namespace = oso_dwarf->FindNamespace(name, parent_decl_ctx);
Greg Clayton96d7d742010-11-10 23:42:09 +00001243
Zachary Turnerc0a246a2019-01-14 22:41:00 +00001244 return (bool)matching_namespace;
1245 });
Greg Clayton96d7d742010-11-10 23:42:09 +00001246
Kate Stoneb9c1b512016-09-06 20:57:50 +00001247 return matching_namespace;
Greg Clayton96d7d742010-11-10 23:42:09 +00001248}
1249
Zachary Turner49110232018-11-05 17:40:28 +00001250void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s) {
1251 ForEachSymbolFile([&s](SymbolFileDWARF *oso_dwarf) -> bool {
1252 oso_dwarf->DumpClangAST(s);
1253 return true;
1254 });
1255}
1256
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001257// PluginInterface protocol
Kate Stoneb9c1b512016-09-06 20:57:50 +00001258lldb_private::ConstString SymbolFileDWARFDebugMap::GetPluginName() {
1259 return GetPluginNameStatic();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001260}
1261
Kate Stoneb9c1b512016-09-06 20:57:50 +00001262uint32_t SymbolFileDWARFDebugMap::GetPluginVersion() { return 1; }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001263
Greg Clayton1f746072012-08-29 21:13:06 +00001264lldb::CompUnitSP
Kate Stoneb9c1b512016-09-06 20:57:50 +00001265SymbolFileDWARFDebugMap::GetCompileUnit(SymbolFileDWARF *oso_dwarf) {
1266 if (oso_dwarf) {
1267 const uint32_t cu_count = GetNumCompileUnits();
1268 for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) {
1269 SymbolFileDWARF *oso_symfile =
1270 GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
1271 if (oso_symfile == oso_dwarf) {
1272 if (!m_compile_unit_infos[cu_idx].compile_unit_sp)
1273 m_compile_unit_infos[cu_idx].compile_unit_sp =
1274 ParseCompileUnitAtIndex(cu_idx);
Greg Clayton1f746072012-08-29 21:13:06 +00001275
Kate Stoneb9c1b512016-09-06 20:57:50 +00001276 return m_compile_unit_infos[cu_idx].compile_unit_sp;
1277 }
Greg Clayton1f746072012-08-29 21:13:06 +00001278 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001279 }
David Blaikiea322f362017-01-06 00:38:06 +00001280 llvm_unreachable("this shouldn't happen");
Greg Clayton1f746072012-08-29 21:13:06 +00001281}
1282
Greg Clayton9422dd62013-03-04 21:46:16 +00001283SymbolFileDWARFDebugMap::CompileUnitInfo *
Kate Stoneb9c1b512016-09-06 20:57:50 +00001284SymbolFileDWARFDebugMap::GetCompileUnitInfo(SymbolFileDWARF *oso_dwarf) {
1285 if (oso_dwarf) {
1286 const uint32_t cu_count = GetNumCompileUnits();
1287 for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) {
1288 SymbolFileDWARF *oso_symfile =
1289 GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
1290 if (oso_symfile == oso_dwarf) {
1291 return &m_compile_unit_infos[cu_idx];
1292 }
Greg Clayton9422dd62013-03-04 21:46:16 +00001293 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001294 }
Konrad Kleine248a1302019-05-23 11:14:47 +00001295 return nullptr;
Greg Clayton9422dd62013-03-04 21:46:16 +00001296}
1297
Kate Stoneb9c1b512016-09-06 20:57:50 +00001298void SymbolFileDWARFDebugMap::SetCompileUnit(SymbolFileDWARF *oso_dwarf,
1299 const CompUnitSP &cu_sp) {
1300 if (oso_dwarf) {
1301 const uint32_t cu_count = GetNumCompileUnits();
1302 for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) {
1303 SymbolFileDWARF *oso_symfile =
1304 GetSymbolFileByCompUnitInfo(&m_compile_unit_infos[cu_idx]);
1305 if (oso_symfile == oso_dwarf) {
1306 if (m_compile_unit_infos[cu_idx].compile_unit_sp) {
1307 assert(m_compile_unit_infos[cu_idx].compile_unit_sp.get() ==
1308 cu_sp.get());
1309 } else {
1310 m_compile_unit_infos[cu_idx].compile_unit_sp = cu_sp;
Pavel Labathe0119902019-07-23 09:24:02 +00001311 SetCompileUnitAtIndex(cu_idx, cu_sp);
Greg Clayton450e3f32010-10-12 02:24:53 +00001312 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001313 }
Greg Clayton450e3f32010-10-12 02:24:53 +00001314 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001315 }
Greg Clayton450e3f32010-10-12 02:24:53 +00001316}
1317
Greg Clayton99558cc42015-08-24 23:46:31 +00001318CompilerDeclContext
Kate Stoneb9c1b512016-09-06 20:57:50 +00001319SymbolFileDWARFDebugMap::GetDeclContextForUID(lldb::user_id_t type_uid) {
1320 const uint64_t oso_idx = GetOSOIndexFromUserID(type_uid);
1321 SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
1322 if (oso_dwarf)
1323 return oso_dwarf->GetDeclContextForUID(type_uid);
1324 return CompilerDeclContext();
Greg Clayton81c22f62011-10-19 18:09:39 +00001325}
1326
Greg Clayton99558cc42015-08-24 23:46:31 +00001327CompilerDeclContext
Kate Stoneb9c1b512016-09-06 20:57:50 +00001328SymbolFileDWARFDebugMap::GetDeclContextContainingUID(lldb::user_id_t type_uid) {
1329 const uint64_t oso_idx = GetOSOIndexFromUserID(type_uid);
1330 SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex(oso_idx);
1331 if (oso_dwarf)
1332 return oso_dwarf->GetDeclContextContainingUID(type_uid);
1333 return CompilerDeclContext();
Greg Clayton81c22f62011-10-19 18:09:39 +00001334}
1335
Kate Stoneb9c1b512016-09-06 20:57:50 +00001336void SymbolFileDWARFDebugMap::ParseDeclsForContext(
1337 lldb_private::CompilerDeclContext decl_ctx) {
1338 ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
1339 oso_dwarf->ParseDeclsForContext(decl_ctx);
1340 return true; // Keep iterating
1341 });
Greg Clayton2bd8e7b2015-10-07 22:07:33 +00001342}
1343
Kate Stoneb9c1b512016-09-06 20:57:50 +00001344bool SymbolFileDWARFDebugMap::AddOSOFileRange(CompileUnitInfo *cu_info,
1345 lldb::addr_t exe_file_addr,
1346 lldb::addr_t exe_byte_size,
1347 lldb::addr_t oso_file_addr,
1348 lldb::addr_t oso_byte_size) {
1349 const uint32_t debug_map_idx =
1350 m_debug_map.FindEntryIndexThatContains(exe_file_addr);
1351 if (debug_map_idx != UINT32_MAX) {
1352 DebugMap::Entry *debug_map_entry =
1353 m_debug_map.FindEntryThatContains(exe_file_addr);
1354 debug_map_entry->data.SetOSOFileAddress(oso_file_addr);
1355 addr_t range_size = std::min<addr_t>(exe_byte_size, oso_byte_size);
1356 if (range_size == 0) {
1357 range_size = std::max<addr_t>(exe_byte_size, oso_byte_size);
1358 if (range_size == 0)
1359 range_size = 1;
Greg Clayton9422dd62013-03-04 21:46:16 +00001360 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001361 cu_info->file_range_map.Append(
1362 FileRangeMap::Entry(oso_file_addr, range_size, exe_file_addr));
1363 return true;
1364 }
1365 return false;
Greg Clayton9422dd62013-03-04 21:46:16 +00001366}
1367
Kate Stoneb9c1b512016-09-06 20:57:50 +00001368void SymbolFileDWARFDebugMap::FinalizeOSOFileRanges(CompileUnitInfo *cu_info) {
1369 cu_info->file_range_map.Sort();
Greg Clayton9422dd62013-03-04 21:46:16 +00001370#if defined(DEBUG_OSO_DMAP)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001371 const FileRangeMap &oso_file_range_map = cu_info->GetFileRangeMap(this);
1372 const size_t n = oso_file_range_map.GetSize();
1373 printf("SymbolFileDWARFDebugMap::FinalizeOSOFileRanges (cu_info = %p) %s\n",
1374 cu_info, cu_info->oso_sp->module_sp->GetFileSpec().GetPath().c_str());
1375 for (size_t i = 0; i < n; ++i) {
1376 const FileRangeMap::Entry &entry = oso_file_range_map.GetEntryRef(i);
1377 printf("oso [0x%16.16" PRIx64 " - 0x%16.16" PRIx64
1378 ") ==> exe [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n",
1379 entry.GetRangeBase(), entry.GetRangeEnd(), entry.data,
1380 entry.data + entry.GetByteSize());
1381 }
Greg Clayton9422dd62013-03-04 21:46:16 +00001382#endif
1383}
1384
1385lldb::addr_t
Kate Stoneb9c1b512016-09-06 20:57:50 +00001386SymbolFileDWARFDebugMap::LinkOSOFileAddress(SymbolFileDWARF *oso_symfile,
1387 lldb::addr_t oso_file_addr) {
1388 CompileUnitInfo *cu_info = GetCompileUnitInfo(oso_symfile);
1389 if (cu_info) {
1390 const FileRangeMap::Entry *oso_range_entry =
1391 cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
1392 if (oso_range_entry) {
1393 const DebugMap::Entry *debug_map_entry =
1394 m_debug_map.FindEntryThatContains(oso_range_entry->data);
1395 if (debug_map_entry) {
1396 const lldb::addr_t offset =
1397 oso_file_addr - oso_range_entry->GetRangeBase();
1398 const lldb::addr_t exe_file_addr =
1399 debug_map_entry->GetRangeBase() + offset;
1400 return exe_file_addr;
1401 }
Greg Clayton9422dd62013-03-04 21:46:16 +00001402 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001403 }
1404 return LLDB_INVALID_ADDRESS;
Greg Clayton9422dd62013-03-04 21:46:16 +00001405}
1406
Kate Stoneb9c1b512016-09-06 20:57:50 +00001407bool SymbolFileDWARFDebugMap::LinkOSOAddress(Address &addr) {
1408 // Make sure this address hasn't been fixed already
1409 Module *exe_module = GetObjectFile()->GetModule().get();
1410 Module *addr_module = addr.GetModule().get();
1411 if (addr_module == exe_module)
1412 return true; // Address is already in terms of the main executable module
Greg Clayton9422dd62013-03-04 21:46:16 +00001413
Pavel Labath465eae32019-08-06 09:12:42 +00001414 CompileUnitInfo *cu_info = GetCompileUnitInfo(
1415 GetSymbolFileAsSymbolFileDWARF(addr_module->GetSymbolFile()));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001416 if (cu_info) {
1417 const lldb::addr_t oso_file_addr = addr.GetFileAddress();
1418 const FileRangeMap::Entry *oso_range_entry =
1419 cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr);
1420 if (oso_range_entry) {
1421 const DebugMap::Entry *debug_map_entry =
1422 m_debug_map.FindEntryThatContains(oso_range_entry->data);
1423 if (debug_map_entry) {
1424 const lldb::addr_t offset =
1425 oso_file_addr - oso_range_entry->GetRangeBase();
1426 const lldb::addr_t exe_file_addr =
1427 debug_map_entry->GetRangeBase() + offset;
1428 return exe_module->ResolveFileAddress(exe_file_addr, addr);
1429 }
Greg Clayton9422dd62013-03-04 21:46:16 +00001430 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001431 }
1432 return true;
Greg Clayton9422dd62013-03-04 21:46:16 +00001433}
1434
Kate Stoneb9c1b512016-09-06 20:57:50 +00001435LineTable *SymbolFileDWARFDebugMap::LinkOSOLineTable(SymbolFileDWARF *oso_dwarf,
1436 LineTable *line_table) {
1437 CompileUnitInfo *cu_info = GetCompileUnitInfo(oso_dwarf);
1438 if (cu_info)
1439 return line_table->LinkLineTable(cu_info->GetFileRangeMap(this));
Konrad Kleine248a1302019-05-23 11:14:47 +00001440 return nullptr;
Greg Clayton9422dd62013-03-04 21:46:16 +00001441}
1442
Enrico Granatac76e60b2013-06-27 01:43:09 +00001443size_t
Kate Stoneb9c1b512016-09-06 20:57:50 +00001444SymbolFileDWARFDebugMap::AddOSOARanges(SymbolFileDWARF *dwarf2Data,
1445 DWARFDebugAranges *debug_aranges) {
1446 size_t num_line_entries_added = 0;
1447 if (debug_aranges && dwarf2Data) {
1448 CompileUnitInfo *compile_unit_info = GetCompileUnitInfo(dwarf2Data);
1449 if (compile_unit_info) {
1450 const FileRangeMap &file_range_map =
1451 compile_unit_info->GetFileRangeMap(this);
1452 for (size_t idx = 0; idx < file_range_map.GetSize(); idx++) {
1453 const FileRangeMap::Entry *entry = file_range_map.GetEntryAtIndex(idx);
1454 if (entry) {
1455 debug_aranges->AppendRange(dwarf2Data->GetID(), entry->GetRangeBase(),
1456 entry->GetRangeEnd());
1457 num_line_entries_added++;
Enrico Granatac76e60b2013-06-27 01:43:09 +00001458 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001459 }
Enrico Granatac76e60b2013-06-27 01:43:09 +00001460 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001461 }
1462 return num_line_entries_added;
Enrico Granatac76e60b2013-06-27 01:43:09 +00001463}