forked from OSchip/llvm-project
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:
parent
9eedbc4f26
commit
23f70e8359
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ®ex,
|
||||
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 ®ex,
|
|||
|
||||
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 ®ex,
|
|||
|
||||
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
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(); }
|
||||
|
||||
|
|
Loading…
Reference in New Issue