1 | //===-- SymbolVendor.cpp --------------------------------------------------===// |
2 | // |
3 | // 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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "lldb/Symbol/SymbolVendor.h" |
10 | |
11 | #include "lldb/Core/Module.h" |
12 | #include "lldb/Core/PluginManager.h" |
13 | #include "lldb/Symbol/CompileUnit.h" |
14 | #include "lldb/Symbol/ObjectFile.h" |
15 | #include "lldb/Symbol/SymbolFile.h" |
16 | #include "lldb/Utility/Stream.h" |
17 | |
18 | using namespace lldb; |
19 | using namespace lldb_private; |
20 | |
21 | // FindPlugin |
22 | // |
23 | // Platforms can register a callback to use when creating symbol vendors to |
24 | // allow for complex debug information file setups, and to also allow for |
25 | // finding separate debug information files. |
26 | SymbolVendor *SymbolVendor::FindPlugin(const lldb::ModuleSP &module_sp, |
27 | lldb_private::Stream *feedback_strm) { |
28 | std::unique_ptr<SymbolVendor> instance_up; |
29 | SymbolVendorCreateInstance create_callback; |
30 | |
31 | for (size_t idx = 0; |
32 | (create_callback = PluginManager::GetSymbolVendorCreateCallbackAtIndex( |
33 | idx)) != nullptr; |
34 | ++idx) { |
35 | instance_up.reset(p: create_callback(module_sp, feedback_strm)); |
36 | |
37 | if (instance_up) { |
38 | return instance_up.release(); |
39 | } |
40 | } |
41 | // The default implementation just tries to create debug information using |
42 | // the file representation for the module. |
43 | ObjectFileSP sym_objfile_sp; |
44 | FileSpec sym_spec = module_sp->GetSymbolFileFileSpec(); |
45 | if (sym_spec && sym_spec != module_sp->GetObjectFile()->GetFileSpec()) { |
46 | DataBufferSP data_sp; |
47 | offset_t data_offset = 0; |
48 | sym_objfile_sp = ObjectFile::FindPlugin( |
49 | module_sp, file_spec: &sym_spec, file_offset: 0, file_size: FileSystem::Instance().GetByteSize(file_spec: sym_spec), |
50 | data_sp, data_offset); |
51 | } |
52 | if (!sym_objfile_sp) |
53 | sym_objfile_sp = module_sp->GetObjectFile()->shared_from_this(); |
54 | instance_up = std::make_unique<SymbolVendor>(args: module_sp); |
55 | instance_up->AddSymbolFileRepresentation(objfile_sp: sym_objfile_sp); |
56 | return instance_up.release(); |
57 | } |
58 | |
59 | // SymbolVendor constructor |
60 | SymbolVendor::SymbolVendor(const lldb::ModuleSP &module_sp) |
61 | : ModuleChild(module_sp), m_sym_file_up() {} |
62 | |
63 | // Add a representation given an object file. |
64 | void SymbolVendor::AddSymbolFileRepresentation(const ObjectFileSP &objfile_sp) { |
65 | ModuleSP module_sp(GetModule()); |
66 | if (module_sp) { |
67 | std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex()); |
68 | if (objfile_sp) |
69 | m_sym_file_up.reset(p: SymbolFile::FindPlugin(objfile_sp)); |
70 | } |
71 | } |
72 | |