SymbolVendor: Introduce Module::GetSymbolFile

Summary:
This is the next step in avoiding funneling all SymbolFile calls through
the SymbolVendor. Right now, it is just a convenience function, but it
allows us to update all calls to SymbolVendor functions to access the
SymbolFile directly. Once all call sites have been updated, we can
remove the GetSymbolVendor member function.

This patch just updates the calls to GetSymbolVendor, which were calling
it just so they could fetch the underlying symbol file. Other calls will
be done in follow-ups.

Reviewers: JDevlieghere, clayborg, jingham

Subscribers: lldb-commits

Differential Revision: https://reviews.llvm.org/D65435

llvm-svn: 367664
This commit is contained in:
Pavel Labath 2019-08-02 08:16:35 +00:00
parent 9eedbc4f26
commit 23f70e8359
9 changed files with 186 additions and 221 deletions

View File

@ -653,6 +653,9 @@ public:
GetSymbolVendor(bool can_create = true,
lldb_private::Stream *feedback_strm = nullptr);
SymbolFile *GetSymbolFile(bool can_create = true,
Stream *feedback_strm = nullptr);
/// Get a reference to the UUID value contained in this object.
///
/// If the executable image file doesn't not have a UUID value built into

View File

@ -2259,8 +2259,8 @@ protected:
if (m_interpreter.WasInterrupted())
break;
Module *m = target->GetImages().GetModulePointerAtIndex(image_idx);
SymbolFile *sf = m->GetSymbolVendor()->GetSymbolFile();
sf->DumpClangAST(result.GetOutputStream());
if (SymbolFile *sf = m->GetSymbolFile())
sf->DumpClangAST(result.GetOutputStream());
}
result.SetStatus(eReturnStatusSuccessFinishResult);
return true;
@ -2285,8 +2285,8 @@ protected:
if (m_interpreter.WasInterrupted())
break;
Module *m = module_list.GetModulePointerAtIndex(i);
SymbolFile *sf = m->GetSymbolVendor()->GetSymbolFile();
sf->DumpClangAST(result.GetOutputStream());
if (SymbolFile *sf = m->GetSymbolFile())
sf->DumpClangAST(result.GetOutputStream());
}
}
result.SetStatus(eReturnStatusSuccessFinishResult);
@ -3272,9 +3272,9 @@ protected:
case 's':
case 'S': {
const SymbolVendor *symbol_vendor = module->GetSymbolVendor();
if (symbol_vendor) {
const FileSpec symfile_spec = symbol_vendor->GetMainFileSpec();
if (const SymbolFile *symbol_file = module->GetSymbolFile()) {
const FileSpec symfile_spec =
symbol_file->GetObjectFile()->GetFileSpec();
if (format_char == 'S') {
// Dump symbol file only if different from module file
if (!symfile_spec || symfile_spec == module->GetFileSpec()) {
@ -4207,48 +4207,44 @@ protected:
// decides to create it!
module_sp->SetSymbolFileFileSpec(symbol_fspec);
SymbolVendor *symbol_vendor =
module_sp->GetSymbolVendor(true, &result.GetErrorStream());
if (symbol_vendor) {
SymbolFile *symbol_file = symbol_vendor->GetSymbolFile();
SymbolFile *symbol_file =
module_sp->GetSymbolFile(true, &result.GetErrorStream());
if (symbol_file) {
ObjectFile *object_file = symbol_file->GetObjectFile();
if (symbol_file) {
ObjectFile *object_file = symbol_file->GetObjectFile();
if (object_file && object_file->GetFileSpec() == symbol_fspec) {
// Provide feedback that the symfile has been successfully added.
const FileSpec &module_fs = module_sp->GetFileSpec();
result.AppendMessageWithFormat(
"symbol file '%s' has been added to '%s'\n", symfile_path,
module_fs.GetPath().c_str());
if (object_file && object_file->GetFileSpec() == symbol_fspec) {
// Provide feedback that the symfile has been successfully added.
const FileSpec &module_fs = module_sp->GetFileSpec();
result.AppendMessageWithFormat(
"symbol file '%s' has been added to '%s'\n", symfile_path,
module_fs.GetPath().c_str());
// Let clients know something changed in the module if it is
// currently loaded
ModuleList module_list;
module_list.Append(module_sp);
target->SymbolsDidLoad(module_list);
// Let clients know something changed in the module if it is
// currently loaded
ModuleList module_list;
module_list.Append(module_sp);
target->SymbolsDidLoad(module_list);
// Make sure we load any scripting resources that may be embedded
// in the debug info files in case the platform supports that.
Status error;
StreamString feedback_stream;
module_sp->LoadScriptingResourceInTarget(target, error,
&feedback_stream);
if (error.Fail() && error.AsCString())
result.AppendWarningWithFormat(
"unable to load scripting data for module %s - error "
"reported was %s",
module_sp->GetFileSpec()
.GetFileNameStrippingExtension()
.GetCString(),
error.AsCString());
else if (feedback_stream.GetSize())
result.AppendWarningWithFormat("%s", feedback_stream.GetData());
// Make sure we load any scripting resources that may be embedded
// in the debug info files in case the platform supports that.
Status error;
StreamString feedback_stream;
module_sp->LoadScriptingResourceInTarget(target, error,
&feedback_stream);
if (error.Fail() && error.AsCString())
result.AppendWarningWithFormat(
"unable to load scripting data for module %s - error "
"reported was %s",
module_sp->GetFileSpec()
.GetFileNameStrippingExtension()
.GetCString(),
error.AsCString());
else if (feedback_stream.GetSize())
result.AppendWarningWithFormat("%s", feedback_stream.GetData());
flush = true;
result.SetStatus(eReturnStatusSuccessFinishResult);
return true;
}
flush = true;
result.SetStatus(eReturnStatusSuccessFinishResult);
return true;
}
}
// Clear the symbol file spec if anything went wrong

View File

@ -366,7 +366,7 @@ void Module::ParseAllDebugSymbols() {
SymbolContext sc;
sc.module_sp = shared_from_this();
SymbolVendor *symbols = GetSymbolVendor();
SymbolFile *symbols = GetSymbolFile();
for (size_t cu_idx = 0; cu_idx < num_comp_units; cu_idx++) {
sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
@ -406,8 +406,7 @@ size_t Module::GetNumCompileUnits() {
static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Timer scoped_timer(func_cat, "Module::GetNumCompileUnits (module = %p)",
static_cast<void *>(this));
SymbolVendor *symbols = GetSymbolVendor();
if (symbols)
if (SymbolFile *symbols = GetSymbolFile())
return symbols->GetNumCompileUnits();
return 0;
}
@ -418,8 +417,7 @@ CompUnitSP Module::GetCompileUnitAtIndex(size_t index) {
CompUnitSP cu_sp;
if (index < num_comp_units) {
SymbolVendor *symbols = GetSymbolVendor();
if (symbols)
if (SymbolFile *symbols = GetSymbolFile())
cu_sp = symbols->GetCompileUnitAtIndex(index);
}
return cu_sp;
@ -457,8 +455,8 @@ uint32_t Module::ResolveSymbolContextForAddress(
sc.module_sp = shared_from_this();
resolved_flags |= eSymbolContextModule;
SymbolVendor *sym_vendor = GetSymbolVendor();
if (!sym_vendor)
SymbolFile *symfile = GetSymbolFile();
if (!symfile)
return resolved_flags;
// Resolve the compile unit, function, block, line table or line entry if
@ -469,14 +467,14 @@ uint32_t Module::ResolveSymbolContextForAddress(
resolve_scope & eSymbolContextLineEntry ||
resolve_scope & eSymbolContextVariable) {
resolved_flags |=
sym_vendor->ResolveSymbolContext(so_addr, resolve_scope, sc);
symfile->ResolveSymbolContext(so_addr, resolve_scope, sc);
}
// Resolve the symbol if requested, but don't re-look it up if we've
// already found it.
if (resolve_scope & eSymbolContextSymbol &&
!(resolved_flags & eSymbolContextSymbol)) {
Symtab *symtab = sym_vendor->GetSymtab();
Symtab *symtab = symfile->GetSymtab();
if (symtab && so_addr.IsSectionOffset()) {
Symbol *matching_symbol = nullptr;
@ -509,18 +507,15 @@ uint32_t Module::ResolveSymbolContextForAddress(
// files on MacOSX have an unstripped symbol table inside of them.
ObjectFile *symtab_objfile = symtab->GetObjectFile();
if (symtab_objfile && symtab_objfile->IsStripped()) {
SymbolFile *symfile = sym_vendor->GetSymbolFile();
if (symfile) {
ObjectFile *symfile_objfile = symfile->GetObjectFile();
if (symfile_objfile != symtab_objfile) {
Symtab *symfile_symtab = symfile_objfile->GetSymtab();
if (symfile_symtab) {
Symbol *symbol =
symfile_symtab->FindSymbolContainingFileAddress(
so_addr.GetFileAddress());
if (symbol && !symbol->IsSynthetic()) {
sc.symbol = symbol;
}
ObjectFile *symfile_objfile = symfile->GetObjectFile();
if (symfile_objfile != symtab_objfile) {
Symtab *symfile_symtab = symfile_objfile->GetSymtab();
if (symfile_symtab) {
Symbol *symbol =
symfile_symtab->FindSymbolContainingFileAddress(
so_addr.GetFileAddress());
if (symbol && !symbol->IsSynthetic()) {
sc.symbol = symbol;
}
}
}
@ -592,8 +587,7 @@ uint32_t Module::ResolveSymbolContextsForFileSpec(
const uint32_t initial_count = sc_list.GetSize();
SymbolVendor *symbols = GetSymbolVendor();
if (symbols)
if (SymbolFile *symbols = GetSymbolFile())
symbols->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope,
sc_list);
@ -604,8 +598,7 @@ size_t Module::FindGlobalVariables(ConstString name,
const CompilerDeclContext *parent_decl_ctx,
size_t max_matches,
VariableList &variables) {
SymbolVendor *symbols = GetSymbolVendor();
if (symbols)
if (SymbolFile *symbols = GetSymbolFile())
return symbols->FindGlobalVariables(name, parent_decl_ctx, max_matches,
variables);
return 0;
@ -614,7 +607,7 @@ size_t Module::FindGlobalVariables(ConstString name,
size_t Module::FindGlobalVariables(const RegularExpression &regex,
size_t max_matches,
VariableList &variables) {
SymbolVendor *symbols = GetSymbolVendor();
SymbolFile *symbols = GetSymbolFile();
if (symbols)
return symbols->FindGlobalVariables(regex, max_matches, variables);
return 0;
@ -811,7 +804,7 @@ size_t Module::FindFunctions(ConstString name,
const size_t old_size = sc_list.GetSize();
// Find all the functions (not symbols, but debug information functions...
SymbolVendor *symbols = GetSymbolVendor();
SymbolFile *symbols = GetSymbolFile();
if (name_type_mask & eFunctionNameTypeAuto) {
LookupInfo lookup_info(name, name_type_mask, eLanguageTypeUnknown);
@ -861,8 +854,7 @@ size_t Module::FindFunctions(const RegularExpression &regex,
const size_t start_size = sc_list.GetSize();
SymbolVendor *symbols = GetSymbolVendor();
if (symbols) {
if (SymbolFile *symbols = GetSymbolFile()) {
symbols->FindFunctions(regex, include_inlines, append, sc_list);
// Now check our symbol table for symbols that are code symbols if
@ -954,8 +946,7 @@ size_t Module::FindTypes_Impl(
TypeMap &types) {
static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
SymbolVendor *symbols = GetSymbolVendor();
if (symbols)
if (SymbolFile *symbols = GetSymbolFile())
return symbols->FindTypes(name, parent_decl_ctx, append, max_matches,
searched_symbol_files, types);
return 0;
@ -1064,6 +1055,12 @@ SymbolVendor *Module::GetSymbolVendor(bool can_create,
return m_symfile_up.get();
}
SymbolFile *Module::GetSymbolFile(bool can_create, Stream *feedback_strm) {
if (SymbolVendor *vendor = GetSymbolVendor(can_create, feedback_strm))
return vendor->GetSymbolFile();
return nullptr;
}
void Module::SetFileSpecAndObjectName(const FileSpec &file,
ConstString object_name) {
// Container objects whose paths do not specify a file directly can call this
@ -1290,9 +1287,8 @@ void Module::SectionFileAddressesChanged() {
ObjectFile *obj_file = GetObjectFile();
if (obj_file)
obj_file->SectionFileAddressesChanged();
SymbolVendor *sym_vendor = GetSymbolVendor();
if (sym_vendor != nullptr)
sym_vendor->SectionFileAddressesChanged();
if (SymbolFile *symbols = GetSymbolFile())
symbols->SectionFileAddressesChanged();
}
UnwindTable &Module::GetUnwindTable() {
@ -1407,18 +1403,16 @@ size_t Module::FindSymbolsMatchingRegExAndType(const RegularExpression &regex,
void Module::PreloadSymbols() {
std::lock_guard<std::recursive_mutex> guard(m_mutex);
SymbolVendor * sym_vendor = GetSymbolVendor();
if (!sym_vendor) {
SymbolFile *sym_file = GetSymbolFile();
if (!sym_file)
return;
}
// Prime the symbol file first, since it adds symbols to the symbol table.
if (SymbolFile *symbol_file = sym_vendor->GetSymbolFile()) {
symbol_file->PreloadSymbols();
}
sym_file->PreloadSymbols();
// Now we can prime the symbol table.
if (Symtab * symtab = sym_vendor->GetSymtab()) {
if (Symtab *symtab = sym_file->GetSymtab())
symtab->PreloadSymbols();
}
}
void Module::SetSymbolFileFileSpec(const FileSpec &file) {
@ -1428,7 +1422,7 @@ void Module::SetSymbolFileFileSpec(const FileSpec &file) {
// Remove any sections in the unified section list that come from the
// current symbol vendor.
SectionList *section_list = GetSectionList();
SymbolFile *symbol_file = m_symfile_up->GetSymbolFile();
SymbolFile *symbol_file = GetSymbolFile();
if (section_list && symbol_file) {
ObjectFile *obj_file = symbol_file->GetObjectFile();
// Make sure we have an object file and that the symbol vendor's objfile

View File

@ -658,11 +658,7 @@ FindBestAlternateMangledName(ConstString demangled,
if (!sym_ctx.module_sp)
return ConstString();
SymbolVendor *sym_vendor = sym_ctx.module_sp->GetSymbolVendor();
if (!sym_vendor)
return ConstString();
lldb_private::SymbolFile *sym_file = sym_vendor->GetSymbolFile();
lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
if (!sym_file)
return ConstString();

View File

@ -72,112 +72,106 @@ FileSpecList PlatformDarwin::LocateExecutableScriptingResources(
FileSpec module_spec = module.GetFileSpec();
if (module_spec) {
SymbolVendor *symbols = module.GetSymbolVendor();
if (symbols) {
SymbolFile *symfile = symbols->GetSymbolFile();
if (symfile) {
ObjectFile *objfile = symfile->GetObjectFile();
if (objfile) {
FileSpec symfile_spec(objfile->GetFileSpec());
if (symfile_spec &&
strcasestr (symfile_spec.GetPath().c_str(),
".dSYM/Contents/Resources/DWARF") != nullptr &&
FileSystem::Instance().Exists(symfile_spec)) {
while (module_spec.GetFilename()) {
std::string module_basename(
module_spec.GetFilename().GetCString());
std::string original_module_basename(module_basename);
if (SymbolFile *symfile = module.GetSymbolFile()) {
ObjectFile *objfile = symfile->GetObjectFile();
if (objfile) {
FileSpec symfile_spec(objfile->GetFileSpec());
if (symfile_spec &&
strcasestr(symfile_spec.GetPath().c_str(),
".dSYM/Contents/Resources/DWARF") != nullptr &&
FileSystem::Instance().Exists(symfile_spec)) {
while (module_spec.GetFilename()) {
std::string module_basename(
module_spec.GetFilename().GetCString());
std::string original_module_basename(module_basename);
bool was_keyword = false;
bool was_keyword = false;
// FIXME: for Python, we cannot allow certain characters in
// module
// filenames we import. Theoretically, different scripting
// languages may have different sets of forbidden tokens in
// filenames, and that should be dealt with by each
// ScriptInterpreter. For now, we just replace dots with
// underscores, but if we ever support anything other than
// Python we will need to rework this
std::replace(module_basename.begin(), module_basename.end(),
'.', '_');
std::replace(module_basename.begin(), module_basename.end(),
' ', '_');
std::replace(module_basename.begin(), module_basename.end(),
'-', '_');
ScriptInterpreter *script_interpreter =
target->GetDebugger().GetScriptInterpreter();
if (script_interpreter &&
script_interpreter->IsReservedWord(
module_basename.c_str())) {
module_basename.insert(module_basename.begin(), '_');
was_keyword = true;
}
StreamString path_string;
StreamString original_path_string;
// for OSX we are going to be in
// .dSYM/Contents/Resources/DWARF/<basename> let us go to
// .dSYM/Contents/Resources/Python/<basename>.py and see if the
// file exists
path_string.Printf("%s/../Python/%s.py",
symfile_spec.GetDirectory().GetCString(),
module_basename.c_str());
original_path_string.Printf(
"%s/../Python/%s.py",
symfile_spec.GetDirectory().GetCString(),
original_module_basename.c_str());
FileSpec script_fspec(path_string.GetString());
FileSystem::Instance().Resolve(script_fspec);
FileSpec orig_script_fspec(original_path_string.GetString());
FileSystem::Instance().Resolve(orig_script_fspec);
// if we did some replacements of reserved characters, and a
// file with the untampered name exists, then warn the user
// that the file as-is shall not be loaded
if (feedback_stream) {
if (module_basename != original_module_basename &&
FileSystem::Instance().Exists(orig_script_fspec)) {
const char *reason_for_complaint =
was_keyword ? "conflicts with a keyword"
: "contains reserved characters";
if (FileSystem::Instance().Exists(script_fspec))
feedback_stream->Printf(
"warning: the symbol file '%s' contains a debug "
"script. However, its name"
" '%s' %s and as such cannot be loaded. LLDB will"
" load '%s' instead. Consider removing the file with "
"the malformed name to"
" eliminate this warning.\n",
symfile_spec.GetPath().c_str(),
original_path_string.GetData(), reason_for_complaint,
path_string.GetData());
else
feedback_stream->Printf(
"warning: the symbol file '%s' contains a debug "
"script. However, its name"
" %s and as such cannot be loaded. If you intend"
" to have this script loaded, please rename '%s' to "
"'%s' and retry.\n",
symfile_spec.GetPath().c_str(), reason_for_complaint,
original_path_string.GetData(),
path_string.GetData());
}
}
if (FileSystem::Instance().Exists(script_fspec)) {
file_list.Append(script_fspec);
break;
}
// If we didn't find the python file, then keep stripping the
// extensions and try again
ConstString filename_no_extension(
module_spec.GetFileNameStrippingExtension());
if (module_spec.GetFilename() == filename_no_extension)
break;
module_spec.GetFilename() = filename_no_extension;
// FIXME: for Python, we cannot allow certain characters in
// module
// filenames we import. Theoretically, different scripting
// languages may have different sets of forbidden tokens in
// filenames, and that should be dealt with by each
// ScriptInterpreter. For now, we just replace dots with
// underscores, but if we ever support anything other than
// Python we will need to rework this
std::replace(module_basename.begin(), module_basename.end(), '.',
'_');
std::replace(module_basename.begin(), module_basename.end(), ' ',
'_');
std::replace(module_basename.begin(), module_basename.end(), '-',
'_');
ScriptInterpreter *script_interpreter =
target->GetDebugger().GetScriptInterpreter();
if (script_interpreter &&
script_interpreter->IsReservedWord(module_basename.c_str())) {
module_basename.insert(module_basename.begin(), '_');
was_keyword = true;
}
StreamString path_string;
StreamString original_path_string;
// for OSX we are going to be in
// .dSYM/Contents/Resources/DWARF/<basename> let us go to
// .dSYM/Contents/Resources/Python/<basename>.py and see if the
// file exists
path_string.Printf("%s/../Python/%s.py",
symfile_spec.GetDirectory().GetCString(),
module_basename.c_str());
original_path_string.Printf(
"%s/../Python/%s.py",
symfile_spec.GetDirectory().GetCString(),
original_module_basename.c_str());
FileSpec script_fspec(path_string.GetString());
FileSystem::Instance().Resolve(script_fspec);
FileSpec orig_script_fspec(original_path_string.GetString());
FileSystem::Instance().Resolve(orig_script_fspec);
// if we did some replacements of reserved characters, and a
// file with the untampered name exists, then warn the user
// that the file as-is shall not be loaded
if (feedback_stream) {
if (module_basename != original_module_basename &&
FileSystem::Instance().Exists(orig_script_fspec)) {
const char *reason_for_complaint =
was_keyword ? "conflicts with a keyword"
: "contains reserved characters";
if (FileSystem::Instance().Exists(script_fspec))
feedback_stream->Printf(
"warning: the symbol file '%s' contains a debug "
"script. However, its name"
" '%s' %s and as such cannot be loaded. LLDB will"
" load '%s' instead. Consider removing the file with "
"the malformed name to"
" eliminate this warning.\n",
symfile_spec.GetPath().c_str(),
original_path_string.GetData(), reason_for_complaint,
path_string.GetData());
else
feedback_stream->Printf(
"warning: the symbol file '%s' contains a debug "
"script. However, its name"
" %s and as such cannot be loaded. If you intend"
" to have this script loaded, please rename '%s' to "
"'%s' and retry.\n",
symfile_spec.GetPath().c_str(), reason_for_complaint,
original_path_string.GetData(), path_string.GetData());
}
}
if (FileSystem::Instance().Exists(script_fspec)) {
file_list.Append(script_fspec);
break;
}
// If we didn't find the python file, then keep stripping the
// extensions and try again
ConstString filename_no_extension(
module_spec.GetFileNameStrippingExtension());
if (module_spec.GetFilename() == filename_no_extension)
break;
module_spec.GetFilename() = filename_no_extension;
}
}
}

View File

@ -3749,10 +3749,8 @@ SymbolFileDWARFDebugMap *SymbolFileDWARF::GetDebugMapSymfile() {
if (m_debug_map_symfile == nullptr && !m_debug_map_module_wp.expired()) {
lldb::ModuleSP module_sp(m_debug_map_module_wp.lock());
if (module_sp) {
SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
if (sym_vendor)
m_debug_map_symfile =
(SymbolFileDWARFDebugMap *)sym_vendor->GetSymbolFile();
m_debug_map_symfile =
(SymbolFileDWARFDebugMap *)module_sp->GetSymbolFile();
}
}
return m_debug_map_symfile;

View File

@ -464,8 +464,7 @@ uint32_t Block::AppendVariables(bool can_create, bool get_parent_variables,
SymbolFile *Block::GetSymbolFile() {
if (ModuleSP module_sp = CalculateSymbolContextModule())
if (SymbolVendor *sym_vendor = module_sp->GetSymbolVendor())
return sym_vendor->GetSymbolFile();
return module_sp->GetSymbolFile();
return nullptr;
}

View File

@ -428,14 +428,8 @@ CompilerDeclContext Function::GetDeclContext() {
ModuleSP module_sp = CalculateSymbolContextModule();
if (module_sp) {
SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
if (sym_vendor) {
SymbolFile *sym_file = sym_vendor->GetSymbolFile();
if (sym_file)
return sym_file->GetDeclContextForUID(GetID());
}
if (SymbolFile *sym_file = module_sp->GetSymbolFile())
return sym_file->GetDeclContextForUID(GetID());
}
return CompilerDeclContext();
}
@ -449,12 +443,7 @@ Type *Function::GetType() {
if (!sc.module_sp)
return nullptr;
SymbolVendor *sym_vendor = sc.module_sp->GetSymbolVendor();
if (sym_vendor == nullptr)
return nullptr;
SymbolFile *sym_file = sym_vendor->GetSymbolFile();
SymbolFile *sym_file = sc.module_sp->GetSymbolFile();
if (sym_file == nullptr)
return nullptr;

View File

@ -182,11 +182,7 @@ ArmUnwindInfo *UnwindTable::GetArmUnwindInfo() {
return m_arm_unwind_up.get();
}
SymbolFile *UnwindTable::GetSymbolFile() {
if (SymbolVendor *vendor = m_module.GetSymbolVendor())
return vendor->GetSymbolFile();
return nullptr;
}
SymbolFile *UnwindTable::GetSymbolFile() { return m_module.GetSymbolFile(); }
ArchSpec UnwindTable::GetArchitecture() { return m_module.GetArchitecture(); }