Index: include/lldb/Core/Module.h =================================================================== --- include/lldb/Core/Module.h +++ include/lldb/Core/Module.h @@ -237,10 +237,12 @@ //------------------------------------------------------------------ const Symbol * FindFirstSymbolWithNameAndType (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, lldb::SymbolType symbol_type = lldb::eSymbolTypeAny); size_t FindSymbolsWithNameAndType (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, lldb::SymbolType symbol_type, SymbolContextList &sc_list); @@ -255,6 +257,9 @@ /// @param[in] name /// The name of the symbol that we are looking for. /// + /// @param[in] rewriter + /// A symbol name rewriter. + /// /// @param[in] name_type_mask /// A mask that has one or more bitwise OR'ed values from the /// lldb::FunctionNameType enumeration type that indicate what @@ -268,6 +273,7 @@ //------------------------------------------------------------------ size_t FindFunctionSymbols (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, uint32_t name_type_mask, SymbolContextList& sc_list); @@ -330,6 +336,7 @@ //------------------------------------------------------------------ size_t FindFunctions (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, const CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool symbols_ok, @@ -1003,7 +1010,7 @@ { return m_source_mappings; } - + //------------------------------------------------------------------ /// Finds a source file given a file spec using the module source /// path remappings (if any). Index: include/lldb/Core/ModuleList.h =================================================================== --- include/lldb/Core/ModuleList.h +++ include/lldb/Core/ModuleList.h @@ -269,6 +269,7 @@ //------------------------------------------------------------------ size_t FindFunctions (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, uint32_t name_type_mask, bool include_symbols, bool include_inlines, @@ -280,6 +281,7 @@ //------------------------------------------------------------------ size_t FindFunctionSymbols (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, uint32_t name_type_mask, SymbolContextList& sc_list); @@ -403,6 +405,7 @@ size_t FindSymbolsWithNameAndType (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, lldb::SymbolType symbol_type, SymbolContextList &sc_list, bool append = false) const; Index: include/lldb/Symbol/SymbolRewriter.h =================================================================== --- /dev/null +++ include/lldb/Symbol/SymbolRewriter.h @@ -0,0 +1,65 @@ +//===-- SymbolRewriter.h ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_SymbolRewriter_h_ +#define liblldb_SymbolRewriter_h_ + +#include "lldb/Core/ConstString.h" +#include "lldb/Host/FileSpec.h" +#include "lldb/lldb-defines.h" +#include +#include +#include +#include + +namespace lldb_private { + +//----------------------------------------------------------------------- +/// @class SymbolRewriter SymbolRewriter.h "lldb/Symbol/SymbolRewriter.h" +/// @brief Implementation of the symbol rewrite mechanism. +//----------------------------------------------------------------------- +class SymbolRewriter +{ +private: + struct RewriteMap + { + std::map m_direct_map; + std::map m_transform_map; + }; + + typedef std::shared_ptr RewriteMapSP; + +public: + SymbolRewriter (); + + virtual + ~SymbolRewriter() {} + + // Load a rewrite map and add its contents to the list of rewrites. + void + LoadMap (const FileSpec &path); + + std::list::size_type + GetMapCount() const + { + return m_rewrite_maps.size (); + } + + ConstString + Rewrite (const ConstString &name); + +private: + std::list m_rewrite_maps; + + DISALLOW_COPY_AND_ASSIGN (SymbolRewriter); +}; + +} // namespace lldb_private + +#endif // liblldb_SymbolRewriter_h_ Index: include/lldb/Symbol/Symtab.h =================================================================== --- include/lldb/Symbol/Symtab.h +++ include/lldb/Symbol/Symtab.h @@ -76,14 +76,14 @@ uint32_t AppendSymbolIndexesWithNameAndType (const ConstString& symbol_name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& matches); uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, std::vector& indexes); uint32_t AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& indexes); - size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, std::vector& symbol_indexes); - size_t FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& symbol_indexes); + size_t FindAllSymbolsWithNameAndType (const ConstString &name, const lldb::SymbolRewriterSP &rewriter, lldb::SymbolType symbol_type, std::vector& symbol_indexes); + size_t FindAllSymbolsWithNameAndType (const ConstString &name, const lldb::SymbolRewriterSP &rewriter, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& symbol_indexes); size_t FindAllSymbolsMatchingRexExAndType (const RegularExpression ®ex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& symbol_indexes); - Symbol * FindFirstSymbolWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility); + Symbol * FindFirstSymbolWithNameAndType (const ConstString &name, const lldb::SymbolRewriterSP &rewriter, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility); Symbol * FindSymbolAtFileAddress (lldb::addr_t file_addr); Symbol * FindSymbolContainingFileAddress (lldb::addr_t file_addr); void ForEachSymbolContainingFileAddress(lldb::addr_t file_addr, std::function const &callback); - size_t FindFunctionSymbols (const ConstString &name, uint32_t name_type_mask, SymbolContextList& sc_list); + size_t FindFunctionSymbols (const ConstString &name, const lldb::SymbolRewriterSP &rewriter, uint32_t name_type_mask, SymbolContextList& sc_list); void CalculateSymbolSizes (); void SortSymbolIndexesByValue (std::vector& indexes, bool remove_duplicates) const; @@ -167,6 +167,9 @@ SymbolIndicesToSymbolContextList (std::vector &symbol_indexes, SymbolContextList &sc_list); + ConstString + RewriteName (const lldb::SymbolRewriterSP &rewriter, ConstString name); + DISALLOW_COPY_AND_ASSIGN (Symtab); }; Index: include/lldb/Target/Target.h =================================================================== --- include/lldb/Target/Target.h +++ include/lldb/Target/Target.h @@ -29,6 +29,7 @@ #include "lldb/Core/ModuleList.h" #include "lldb/Core/UserSettingsController.h" #include "lldb/Expression/Expression.h" +#include "lldb/Symbol/SymbolRewriter.h" #include "lldb/Symbol/TypeSystem.h" #include "lldb/Target/ExecutionContextScope.h" #include "lldb/Target/PathMappingList.h" @@ -1134,6 +1135,17 @@ { return m_images; } + + lldb::SymbolRewriterSP + GetSymbolRewriter () + { + if (!m_symbol_rewriter) + { + m_symbol_rewriter = std::make_shared(); + } + + return m_symbol_rewriter; + } //------------------------------------------------------------------ /// Return whether this FileSpec corresponds to a module that should be considered for general searches. @@ -1611,6 +1623,7 @@ m_mutex; ///< An API mutex that is used by the lldb::SB* classes make the SB interface thread safe ArchSpec m_arch; ModuleList m_images; ///< The list of images for this process (shared libraries and anything dynamically loaded). + lldb::SymbolRewriterSP m_symbol_rewriter; ///< Symbol rewriter for the target. SectionLoadHistory m_section_load_history; BreakpointList m_breakpoint_list; BreakpointList m_internal_breakpoint_list; Index: include/lldb/lldb-forward.h =================================================================== --- include/lldb/lldb-forward.h +++ include/lldb/lldb-forward.h @@ -225,6 +225,7 @@ class SymbolContextSpecifier; class SymbolFile; class SymbolFileType; +class SymbolRewriter; class SymbolVendor; class Symtab; class SyntheticChildren; @@ -419,6 +420,7 @@ typedef std::shared_ptr SymbolFileTypeSP; typedef std::weak_ptr SymbolFileTypeWP; typedef std::shared_ptr SymbolContextSpecifierSP; + typedef std::shared_ptr SymbolRewriterSP; typedef std::unique_ptr SymbolVendorUP; typedef std::shared_ptr SyntheticChildrenSP; typedef std::shared_ptr SyntheticChildrenFrontEndSP; Index: lldb.xcodeproj/project.pbxproj =================================================================== --- lldb.xcodeproj/project.pbxproj +++ lldb.xcodeproj/project.pbxproj @@ -744,6 +744,7 @@ 6D9AB3DD1BB2B74E003F2289 /* TypeMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D9AB3DC1BB2B74E003F2289 /* TypeMap.cpp */; }; 6DEC6F391BD66D750091ABA6 /* TaskPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DEC6F381BD66D750091ABA6 /* TaskPool.cpp */; }; 8C26C4261C3EA5F90031DF7C /* ThreadSanitizerRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C26C4241C3EA4340031DF7C /* ThreadSanitizerRuntime.cpp */; }; + 5AB29E881AD3510900C69791 /* SymbolRewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5AB29E871AD3510900C69791 /* SymbolRewriter.cpp */; }; 8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; }; 8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; }; 8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */; }; @@ -2461,6 +2462,7 @@ 4CEDAED311754F5E00E875A6 /* ThreadPlanStepUntil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadPlanStepUntil.h; path = include/lldb/Target/ThreadPlanStepUntil.h; sourceTree = ""; }; 4CF52AF41428291E0051E832 /* SBFileSpecList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBFileSpecList.h; path = include/lldb/API/SBFileSpecList.h; sourceTree = ""; }; 4CF52AF7142829390051E832 /* SBFileSpecList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBFileSpecList.cpp; path = source/API/SBFileSpecList.cpp; sourceTree = ""; }; + 5AB29E871AD3510900C69791 /* SymbolRewriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SymbolRewriter.cpp; path = source/Symbol/SymbolRewriter.cpp; sourceTree = ""; }; 69A01E1B1236C5D400C660B5 /* Condition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Condition.cpp; sourceTree = ""; }; 69A01E1C1236C5D400C660B5 /* Host.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Host.cpp; sourceTree = ""; }; 69A01E1E1236C5D400C660B5 /* Mutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mutex.cpp; sourceTree = ""; }; @@ -4481,6 +4483,7 @@ 6D9AB3DC1BB2B74E003F2289 /* TypeMap.cpp */, 6D99A3621BBC2F3200979793 /* ArmUnwindInfo.cpp */, 6D99A3611BBC2F1600979793 /* ArmUnwindInfo.h */, + 5AB29E871AD3510900C69791 /* SymbolRewriter.cpp */, 26BC7C5510F1B6E900F91463 /* Block.h */, 26BC7F1310F1B8EC00F91463 /* Block.cpp */, 26BC7C5610F1B6E900F91463 /* ClangASTContext.h */, @@ -6618,6 +6621,7 @@ 449ACC98197DEA0B008D175E /* FastDemangle.cpp in Sources */, 2689000513353DB600698AC0 /* BreakpointResolverName.cpp in Sources */, 6D762BEE1B1605D2006C929D /* LLDBServerUtilities.cpp in Sources */, + 5AB29E881AD3510900C69791 /* SymbolRewriter.cpp in Sources */, 2689000713353DB600698AC0 /* BreakpointSite.cpp in Sources */, 2689000913353DB600698AC0 /* BreakpointSiteList.cpp in Sources */, 26474CC918D0CB5B0073DEBA /* RegisterContextMemory.cpp in Sources */, Index: packages/Python/lldbsuite/test/lang/c/symbol_rewriter/Makefile =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/lang/c/symbol_rewriter/Makefile @@ -0,0 +1,7 @@ +LEVEL = ../../../make + +C_SOURCES := main.c + +CFLAGS_EXTRAS += -frewrite-map-file=rewrite.map -g0 + +include $(LEVEL)/Makefile.rules Index: packages/Python/lldbsuite/test/lang/c/symbol_rewriter/TestSymbolRewriter.py =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/lang/c/symbol_rewriter/TestSymbolRewriter.py @@ -0,0 +1,48 @@ +"""Check that compiler-generated constant values work correctly""" + +from __future__ import print_function + +import os, time +import subprocess + +import lldb + +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class SymbolRewriterTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + # We need the -frewrite-map-file clang flag to build + @skipIf(compiler="clang", compiler_version=["<", "3.7"]) + @skipIf(compiler='gcc') + @skipIf(debug_info=no_match(["dwarf"])) + def test_and_run_command(self): + """Test the lldb symbol rewriter""" + self.build() + exe = os.path.join(os.getcwd(), "a.out") + + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) + + # Break inside the main. + lldbutil.run_break_set_by_symbol (self, "main") + + self.runCmd("run", RUN_SUCCEEDED) + + # The stop reason of the thread should be breakpoint. + self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, + substrs = ['stopped', + 'stop reason = breakpoint']) + + # Before adding the rewrite map, we will call the system putchar() + self.expect("expr (int)putchar('a')", substrs = ['(int) $0 = 97']) + + rewrite_map = os.path.join(os.getcwd(), "rewrite.map") + self.runCmd("target symbols rewrite " + rewrite_map) + + # After adding the rewrite map, we will call our re-written putchar() + self.expect("expr (int)putchar('a')", substrs = ['(int) $1 = 12345']) + + self.runCmd("kill") Index: packages/Python/lldbsuite/test/lang/c/symbol_rewriter/main.c =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/lang/c/symbol_rewriter/main.c @@ -0,0 +1,11 @@ +#include + +int putchar(int c) +{ + return 12345; +} + +int main() +{ + return putchar('a'); +} Index: packages/Python/lldbsuite/test/lang/c/symbol_rewriter/rewrite.map =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/lang/c/symbol_rewriter/rewrite.map @@ -0,0 +1 @@ +function: { source: putchar, target: __my_putchar,} Index: source/API/SBModule.cpp =================================================================== --- source/API/SBModule.cpp +++ source/API/SBModule.cpp @@ -376,7 +376,7 @@ ModuleSP module_sp (GetSP ()); Symtab *symtab = GetUnifiedSymbolTable (module_sp); if (symtab) - sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(ConstString(name), symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny)); + sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(ConstString(name), nullptr, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny)); } return sb_symbol; } @@ -393,7 +393,7 @@ if (symtab) { std::vector matching_symbol_indexes; - const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, matching_symbol_indexes); + const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(ConstString(name), nullptr, symbol_type, matching_symbol_indexes); if (num_matches) { SymbolContext sc; @@ -458,6 +458,7 @@ const bool symbols_ok = true; const bool inlines_ok = true; module_sp->FindFunctions (ConstString(name), + nullptr, NULL, name_type_mask, symbols_ok, Index: source/API/SBTarget.cpp =================================================================== --- source/API/SBTarget.cpp +++ source/API/SBTarget.cpp @@ -1803,6 +1803,7 @@ const bool inlines_ok = true; const bool append = true; target_sp->GetImages().FindFunctions (ConstString(name), + target_sp->GetSymbolRewriter(), name_type_mask, symbols_ok, inlines_ok, @@ -1833,7 +1834,7 @@ target_sp->GetImages().FindFunctions(RegularExpression(regexstr.c_str()), true, true, true, *sb_sc_list); break; default: - target_sp->GetImages().FindFunctions(ConstString(name), eFunctionNameTypeAny, true, true, true, *sb_sc_list); + target_sp->GetImages().FindFunctions(ConstString(name), target_sp->GetSymbolRewriter(), eFunctionNameTypeAny, true, true, true, *sb_sc_list); break; } } @@ -2387,6 +2388,7 @@ { bool append = true; target_sp->GetImages().FindSymbolsWithNameAndType (ConstString(name), + target_sp->GetSymbolRewriter(), symbol_type, *sb_sc_list, append); Index: source/Breakpoint/BreakpointResolverName.cpp =================================================================== --- source/Breakpoint/BreakpointResolverName.cpp +++ source/Breakpoint/BreakpointResolverName.cpp @@ -21,6 +21,7 @@ #include "lldb/Symbol/Function.h" #include "lldb/Symbol/Symbol.h" #include "lldb/Symbol/SymbolContext.h" +#include "lldb/Target/Target.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" using namespace lldb; @@ -233,7 +234,9 @@ for (const LookupInfo &lookup : m_lookups) { const size_t start_func_idx = func_list.GetSize(); + const lldb::SymbolRewriterSP &rewriter = context.target_sp ? context.target_sp->GetSymbolRewriter() : nullptr; context.module_sp->FindFunctions(lookup.lookup_name, + rewriter, nullptr, lookup.name_type_mask, include_symbols, Index: source/Commands/CommandObjectSource.cpp =================================================================== --- source/Commands/CommandObjectSource.cpp +++ source/Commands/CommandObjectSource.cpp @@ -426,6 +426,7 @@ ModuleList module_list = (m_module_list.GetSize() > 0) ? m_module_list : target->GetImages(); size_t num_matches = module_list.FindFunctions(name, + target->GetSymbolRewriter(), eFunctionNameTypeAuto, /*include_symbols=*/false, /*include_inlines=*/true, @@ -437,6 +438,7 @@ // symbols that line up exactly with function addresses. SymbolContextList sc_list_symbols; size_t num_symbol_matches = module_list.FindFunctionSymbols(name, + target->GetSymbolRewriter(), eFunctionNameTypeAuto, sc_list_symbols); for (size_t i = 0; i < num_symbol_matches; i++) @@ -1042,13 +1044,13 @@ ModuleSpec module_spec (module_file_spec); matching_modules.Clear(); target->GetImages().FindModules (module_spec, matching_modules); - num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list); + num_matches += matching_modules.FindFunctions (name, target->GetSymbolRewriter(), eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list); } } } else { - num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list); + num_matches = target->GetImages().FindFunctions (name, target->GetSymbolRewriter(), eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list); } return num_matches; } @@ -1068,13 +1070,13 @@ ModuleSpec module_spec (module_file_spec); matching_modules.Clear(); target->GetImages().FindModules (module_spec, matching_modules); - num_matches += matching_modules.FindFunctionSymbols (name, eFunctionNameTypeAuto, sc_list); + num_matches += matching_modules.FindFunctionSymbols (name, target->GetSymbolRewriter(), eFunctionNameTypeAuto, sc_list); } } } else { - num_matches = target->GetImages().FindFunctionSymbols (name, eFunctionNameTypeAuto, sc_list); + num_matches = target->GetImages().FindFunctionSymbols (name, target->GetSymbolRewriter(), eFunctionNameTypeAuto, sc_list); } return num_matches; } Index: source/Commands/CommandObjectTarget.cpp =================================================================== --- source/Commands/CommandObjectTarget.cpp +++ source/Commands/CommandObjectTarget.cpp @@ -45,6 +45,7 @@ #include "lldb/Symbol/LineTable.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolFile.h" +#include "lldb/Symbol/SymbolRewriter.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/UnwindPlan.h" #include "lldb/Symbol/VariableList.h" @@ -1811,7 +1812,10 @@ else { ConstString function_name (name); + Target *target = interpreter.GetExecutionContext().GetTargetPtr(); + const lldb::SymbolRewriterSP &rewriter = target ? target->GetSymbolRewriter() : nullptr; num_matches = module->FindFunctions(function_name, + rewriter, nullptr, eFunctionNameTypeAuto, include_symbols, @@ -3724,7 +3728,7 @@ if (m_options.m_type == eLookupTypeFunctionOrSymbol) { ConstString function_name (m_options.m_str.c_str()); - target->GetImages().FindFunctions (function_name, eFunctionNameTypeAuto, true, false, true, sc_list); + target->GetImages().FindFunctions (function_name, target->GetSymbolRewriter(), eFunctionNameTypeAuto, true, false, true, sc_list); } else if (m_options.m_type == eLookupTypeAddress && target) { @@ -4810,6 +4814,46 @@ OptionGroupBoolean m_current_frame_option; }; +class CommandObjectTargetSymbolsRewrite : public CommandObjectParsed +{ +public: + CommandObjectTargetSymbolsRewrite (CommandInterpreter &interpreter) : + CommandObjectParsed (interpreter, + "target symbols rewrite", + "Add a symbol rewrite file to the target by specifying a path to a rewrite map file.", + "target symbols rewrite []", eCommandRequiresTarget) {} + +protected: + virtual bool + DoExecute (Args& args, + CommandReturnObject &result) + { + Target *target = m_exe_ctx.GetTargetPtr(); + const char *path = args.GetArgumentAtIndex(0); + + if (!path) + { + result.AppendMessageWithFormat ("A symbol file path must be provided\n"); + result.SetStatus (eReturnStatusFailed); + return false; + } + + FileSpec fspec; + fspec.SetFile (path, true); + + if (!fspec.Exists()) + { + result.AppendMessageWithFormat ("%s: File not found\n", path); + result.SetStatus (eReturnStatusFailed); + return false; + } + target->GetSymbolRewriter()->LoadMap (fspec); + + result.SetStatus (eReturnStatusSuccessFinishResult); + return true; + } +}; + #pragma mark CommandObjectTargetSymbols //------------------------------------------------------------------------- @@ -4829,6 +4873,7 @@ "target symbols ...") { LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetSymbolsAdd (interpreter))); + LoadSubCommand ("rewrite", CommandObjectSP (new CommandObjectTargetSymbolsRewrite (interpreter))); } ~CommandObjectTargetSymbols() override = default; Index: source/Core/AddressResolverName.cpp =================================================================== --- source/Core/AddressResolverName.cpp +++ source/Core/AddressResolverName.cpp @@ -19,6 +19,7 @@ #include "lldb/Symbol/Function.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/Symbol.h" +#include "lldb/Target/Target.h" using namespace lldb; using namespace lldb_private; @@ -100,10 +101,13 @@ case AddressResolver::Exact: if (context.module_sp) { + const lldb::SymbolRewriterSP &rewriter = context.target_sp ? context.target_sp->GetSymbolRewriter() : nullptr; context.module_sp->FindSymbolsWithNameAndType (m_func_name, + rewriter, eSymbolTypeCode, sym_list); context.module_sp->FindFunctions(m_func_name, + rewriter, nullptr, eFunctionNameTypeAuto, include_symbols, Index: source/Core/Disassembler.cpp =================================================================== --- source/Core/Disassembler.cpp +++ source/Core/Disassembler.cpp @@ -184,9 +184,12 @@ { const bool include_symbols = true; const bool include_inlines = true; + Target *target = exe_ctx.GetTargetPtr(); + const lldb::SymbolRewriterSP &rewriter = target ? target->GetSymbolRewriter() : nullptr; if (module) { module->FindFunctions(name, + rewriter, nullptr, eFunctionNameTypeAuto, include_symbols, @@ -197,6 +200,7 @@ else if (exe_ctx.GetTargetPtr()) { exe_ctx.GetTargetPtr()->GetImages().FindFunctions (name, + rewriter, eFunctionNameTypeAuto, include_symbols, include_inlines, Index: source/Core/Module.cpp =================================================================== --- source/Core/Module.cpp +++ source/Core/Module.cpp @@ -736,6 +736,7 @@ size_t Module::FindFunctions (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, const CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool include_symbols, @@ -777,7 +778,7 @@ { Symtab *symtab = symbols->GetSymtab(); if (symtab) - symtab->FindFunctionSymbols(lookup_name, lookup_name_type_mask, sc_list); + symtab->FindFunctionSymbols(lookup_name, rewriter, lookup_name_type_mask, sc_list); } } @@ -813,7 +814,7 @@ { Symtab *symtab = symbols->GetSymtab(); if (symtab) - symtab->FindFunctionSymbols(name, name_type_mask, sc_list); + symtab->FindFunctionSymbols(name, rewriter, name_type_mask, sc_list); } } } @@ -1351,7 +1352,7 @@ } const Symbol * -Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) +Module::FindFirstSymbolWithNameAndType (const ConstString &name, const lldb::SymbolRewriterSP &rewriter, SymbolType symbol_type) { Timer scoped_timer(__PRETTY_FUNCTION__, "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", @@ -1362,7 +1363,7 @@ { Symtab *symtab = sym_vendor->GetSymtab(); if (symtab) - return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); + return symtab->FindFirstSymbolWithNameAndType (name, rewriter, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); } return nullptr; } @@ -1388,6 +1389,7 @@ size_t Module::FindFunctionSymbols (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, uint32_t name_type_mask, SymbolContextList& sc_list) { @@ -1400,13 +1402,13 @@ { Symtab *symtab = sym_vendor->GetSymtab(); if (symtab) - return symtab->FindFunctionSymbols (name, name_type_mask, sc_list); + return symtab->FindFunctionSymbols (name, rewriter, name_type_mask, sc_list); } return 0; } size_t -Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) +Module::FindSymbolsWithNameAndType (const ConstString &name, const lldb::SymbolRewriterSP &rewriter, SymbolType symbol_type, SymbolContextList &sc_list) { // No need to protect this call using m_mutex all other method calls are // already thread safe. @@ -1423,7 +1425,7 @@ if (symtab) { std::vector symbol_indexes; - symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); + symtab->FindAllSymbolsWithNameAndType (name, rewriter, symbol_type, symbol_indexes); SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); } } Index: source/Core/ModuleList.cpp =================================================================== --- source/Core/ModuleList.cpp +++ source/Core/ModuleList.cpp @@ -331,6 +331,7 @@ size_t ModuleList::FindFunctions (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, uint32_t name_type_mask, bool include_symbols, bool include_inlines, @@ -358,6 +359,7 @@ for (pos = m_modules.begin(); pos != end; ++pos) { (*pos)->FindFunctions(lookup_name, + rewriter, nullptr, lookup_name_type_mask, include_symbols, @@ -393,7 +395,7 @@ collection::const_iterator pos, end = m_modules.end(); for (pos = m_modules.begin(); pos != end; ++pos) { - (*pos)->FindFunctions(name, nullptr, name_type_mask, include_symbols, include_inlines, true, sc_list); + (*pos)->FindFunctions(name, rewriter, nullptr, name_type_mask, include_symbols, include_inlines, true, sc_list); } } return sc_list.GetSize() - old_size; @@ -401,6 +403,7 @@ size_t ModuleList::FindFunctionSymbols (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, uint32_t name_type_mask, SymbolContextList& sc_list) { @@ -422,8 +425,9 @@ for (pos = m_modules.begin(); pos != end; ++pos) { (*pos)->FindFunctionSymbols (lookup_name, - lookup_name_type_mask, - sc_list); + rewriter, + lookup_name_type_mask, + sc_list); } if (match_name_after_lookup) @@ -453,7 +457,7 @@ collection::const_iterator pos, end = m_modules.end(); for (pos = m_modules.begin(); pos != end; ++pos) { - (*pos)->FindFunctionSymbols (name, name_type_mask, sc_list); + (*pos)->FindFunctionSymbols (name, rewriter, name_type_mask, sc_list); } } @@ -531,6 +535,7 @@ size_t ModuleList::FindSymbolsWithNameAndType (const ConstString &name, + const lldb::SymbolRewriterSP &rewriter, SymbolType symbol_type, SymbolContextList &sc_list, bool append) const @@ -542,7 +547,7 @@ collection::const_iterator pos, end = m_modules.end(); for (pos = m_modules.begin(); pos != end; ++pos) - (*pos)->FindSymbolsWithNameAndType (name, symbol_type, sc_list); + (*pos)->FindSymbolsWithNameAndType (name, rewriter, symbol_type, sc_list); return sc_list.GetSize() - initial_size; } Index: source/Core/SourceManager.cpp =================================================================== --- source/Core/SourceManager.cpp +++ source/Core/SourceManager.cpp @@ -291,6 +291,7 @@ bool inlines_okay = true; bool append = false; size_t num_matches = executable_ptr->FindFunctions (main_name, + target_sp->GetSymbolRewriter(), NULL, lldb::eFunctionNameTypeBase, inlines_okay, Index: source/Expression/IRExecutionUnit.cpp =================================================================== --- source/Expression/IRExecutionUnit.cpp +++ source/Expression/IRExecutionUnit.cpp @@ -918,6 +918,7 @@ if (sc.module_sp) { sc.module_sp->FindFunctions(spec.name, + target->GetSymbolRewriter(), NULL, spec.mask, true, // include_symbols @@ -940,6 +941,7 @@ if (sc_list.GetSize() == 0 && sc.target_sp) { sc.target_sp->GetImages().FindFunctions(spec.name, + target->GetSymbolRewriter(), spec.mask, true, // include_symbols false, // include_inlines @@ -958,7 +960,7 @@ if (sc_list.GetSize() == 0 && sc.target_sp) { - sc.target_sp->GetImages().FindSymbolsWithNameAndType(spec.name, lldb::eSymbolTypeAny, sc_list); + sc.target_sp->GetImages().FindSymbolsWithNameAndType(spec.name, sc.target_sp->GetSymbolRewriter(), lldb::eSymbolTypeAny, sc_list); } if (get_external_load_address(load_address, sc_list, sc)) Index: source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp =================================================================== --- source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp +++ source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp @@ -1024,8 +1024,10 @@ { if (!m_kext_summary_header_ptr_addr.IsValid()) { + Target &target = m_process->GetTarget(); + m_kernel.Clear(); - m_kernel.SetModule (m_process->GetTarget().GetExecutableModule()); + m_kernel.SetModule (target.GetExecutableModule()); m_kernel.SetIsKernel(true); ConstString kernel_name("mach_kernel"); @@ -1048,7 +1050,7 @@ ObjectFile *kernel_object_file = m_kernel.GetModule()->GetObjectFile(); if (kernel_object_file) { - addr_t load_address = kernel_object_file->GetHeaderAddress().GetLoadAddress(&m_process->GetTarget()); + addr_t load_address = kernel_object_file->GetHeaderAddress().GetLoadAddress(&target); addr_t file_address = kernel_object_file->GetHeaderAddress().GetFileAddress(); if (load_address != LLDB_INVALID_ADDRESS && load_address != 0) { @@ -1080,7 +1082,7 @@ if (m_kernel.IsLoaded() && m_kernel.GetModule()) { static ConstString kext_summary_symbol ("gLoadedKextSummaries"); - const Symbol *symbol = m_kernel.GetModule()->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData); + const Symbol *symbol = m_kernel.GetModule()->FindFirstSymbolWithNameAndType (kext_summary_symbol, target.GetSymbolRewriter(), eSymbolTypeData); if (symbol) { m_kext_summary_header_ptr_addr = symbol->GetAddress(); Index: source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.cpp =================================================================== --- source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.cpp +++ source/Plugins/DynamicLoader/Hexagon-DYLD/DynamicLoaderHexagonDYLD.cpp @@ -497,7 +497,7 @@ Target &target = thread.GetProcess()->GetTarget(); const ModuleList &images = target.GetImages(); - images.FindSymbolsWithNameAndType(sym_name, eSymbolTypeCode, target_symbols); + images.FindSymbolsWithNameAndType(sym_name, target.GetSymbolRewriter(), eSymbolTypeCode, target_symbols); size_t num_targets = target_symbols.GetSize(); if (!num_targets) return thread_plan_sp; Index: source/Plugins/DynamicLoader/Hexagon-DYLD/HexagonDYLDRendezvous.cpp =================================================================== --- source/Plugins/DynamicLoader/Hexagon-DYLD/HexagonDYLDRendezvous.cpp +++ source/Plugins/DynamicLoader/Hexagon-DYLD/HexagonDYLDRendezvous.cpp @@ -329,7 +329,7 @@ Target& target = m_process->GetTarget(); SymbolContextList list; - if (!target.GetImages().FindSymbolsWithNameAndType (ConstString(name), eSymbolTypeAny, list)) + if (!target.GetImages().FindSymbolsWithNameAndType (ConstString(name), target.GetSymbolRewriter(), eSymbolTypeAny, list)) return false; Address address = list[0].symbol->GetAddress(); Index: source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp =================================================================== --- source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp +++ source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp @@ -422,7 +422,7 @@ if (m_dyld_all_image_infos_addr == LLDB_INVALID_ADDRESS && dyld_module_sp.get()) { static ConstString g_dyld_all_image_infos ("dyld_all_image_infos"); - const Symbol *symbol = dyld_module_sp->FindFirstSymbolWithNameAndType (g_dyld_all_image_infos, eSymbolTypeData); + const Symbol *symbol = dyld_module_sp->FindFirstSymbolWithNameAndType (g_dyld_all_image_infos, target.GetSymbolRewriter(), eSymbolTypeData); if (symbol) m_dyld_all_image_infos_addr = symbol->GetLoadAddress(&target); } @@ -1814,7 +1814,7 @@ const ModuleList &images = target_sp->GetImages(); SymbolContextList code_symbols; - images.FindSymbolsWithNameAndType(trampoline_name, eSymbolTypeCode, code_symbols); + images.FindSymbolsWithNameAndType(trampoline_name, target_sp->GetSymbolRewriter(), eSymbolTypeCode, code_symbols); size_t num_code_symbols = code_symbols.GetSize(); if (num_code_symbols > 0) @@ -1838,7 +1838,7 @@ } SymbolContextList reexported_symbols; - images.FindSymbolsWithNameAndType(trampoline_name, eSymbolTypeReExported, reexported_symbols); + images.FindSymbolsWithNameAndType(trampoline_name, target_sp->GetSymbolRewriter(), eSymbolTypeReExported, reexported_symbols); size_t num_reexported_symbols = reexported_symbols.GetSize(); if (num_reexported_symbols > 0) { @@ -1870,7 +1870,7 @@ } SymbolContextList indirect_symbols; - images.FindSymbolsWithNameAndType(trampoline_name, eSymbolTypeResolver, indirect_symbols); + images.FindSymbolsWithNameAndType(trampoline_name, target_sp->GetSymbolRewriter(), eSymbolTypeResolver, indirect_symbols); size_t num_indirect_symbols = indirect_symbols.GetSize(); if (num_indirect_symbols > 0) { @@ -2027,7 +2027,7 @@ if (module_sp) { lldb_private::SymbolContextList sc_list; - module_sp->FindSymbolsWithNameAndType(ConstString("pthread_getspecific"), eSymbolTypeCode, sc_list); + module_sp->FindSymbolsWithNameAndType(ConstString("pthread_getspecific"), m_process->GetTarget().GetSymbolRewriter(), eSymbolTypeCode, sc_list); SymbolContext sc; if (sc_list.GetContextAtIndex(0, sc)) { Index: source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp =================================================================== --- source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp +++ source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp @@ -585,7 +585,7 @@ Target& target = m_process->GetTarget(); SymbolContextList list; - if (!target.GetImages().FindSymbolsWithNameAndType (ConstString(name), eSymbolTypeAny, list)) + if (!target.GetImages().FindSymbolsWithNameAndType (ConstString(name), target.GetSymbolRewriter(), eSymbolTypeAny, list)) return false; Address address = list[0].symbol->GetAddress(); Index: source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp =================================================================== --- source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -454,7 +454,7 @@ Target &target = thread.GetProcess()->GetTarget(); const ModuleList &images = target.GetImages(); - images.FindSymbolsWithNameAndType(sym_name, eSymbolTypeCode, target_symbols); + images.FindSymbolsWithNameAndType(sym_name, target.GetSymbolRewriter(), eSymbolTypeCode, target_symbols); size_t num_targets = target_symbols.GetSize(); if (!num_targets) return thread_plan_sp; Index: source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp +++ source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp @@ -1140,7 +1140,9 @@ ms.Flush(); ConstString instance_method_name(ms.GetData()); - m_target->GetImages().FindFunctions(instance_method_name, lldb::eFunctionNameTypeFull, include_symbols, include_inlines, append, sc_list); + const lldb::SymbolRewriterSP &rewriter = m_target->GetSymbolRewriter(); + + m_target->GetImages().FindFunctions(instance_method_name, rewriter, lldb::eFunctionNameTypeFull, include_symbols, include_inlines, append, sc_list); if (sc_list.GetSize()) break; @@ -1150,7 +1152,7 @@ ms.Flush(); ConstString class_method_name(ms.GetData()); - m_target->GetImages().FindFunctions(class_method_name, lldb::eFunctionNameTypeFull, include_symbols, include_inlines, append, sc_list); + m_target->GetImages().FindFunctions(class_method_name, rewriter, lldb::eFunctionNameTypeFull, include_symbols, include_inlines, append, sc_list); if (sc_list.GetSize()) break; @@ -1160,7 +1162,7 @@ SymbolContextList candidate_sc_list; - m_target->GetImages().FindFunctions(selector_name, lldb::eFunctionNameTypeSelector, include_symbols, include_inlines, append, candidate_sc_list); + m_target->GetImages().FindFunctions(selector_name, rewriter, lldb::eFunctionNameTypeSelector, include_symbols, include_inlines, append, candidate_sc_list); for (uint32_t ci = 0, ce = candidate_sc_list.GetSize(); ci != ce; Index: source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp =================================================================== --- source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -525,9 +525,9 @@ SymbolContextList sc_list; if (module) - module->FindSymbolsWithNameAndType(name, symbol_type, sc_list); + module->FindSymbolsWithNameAndType(name, target.GetSymbolRewriter(), symbol_type, sc_list); else - target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list); + target.GetImages().FindSymbolsWithNameAndType(name, target.GetSymbolRewriter(), symbol_type, sc_list); const uint32_t num_matches = sc_list.GetSize(); addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; @@ -637,9 +637,9 @@ SymbolContextList sc_list; if (module) - module->FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); + module->FindSymbolsWithNameAndType(name, target.GetSymbolRewriter(), eSymbolTypeAny, sc_list); else - target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); + target.GetImages().FindSymbolsWithNameAndType(name, target.GetSymbolRewriter(), eSymbolTypeAny, sc_list); const uint32_t matches = sc_list.GetSize(); for (uint32_t i=0; iGetSymbolRewriter() : nullptr; if (namespace_decl && module_sp) { const bool include_symbols = false; module_sp->FindFunctions(name, + rewriter, &namespace_decl, eFunctionNameTypeBase, include_symbols, @@ -1334,6 +1336,7 @@ // instance methods for eFunctionNameTypeBase. target->GetImages().FindFunctions(name, + rewriter, eFunctionNameTypeFull, include_symbols, include_inlines, Index: source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp =================================================================== --- source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp +++ source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp @@ -79,10 +79,11 @@ Deactivate(); } -bool ModuleContainsASanRuntime(Module * module) +bool ModuleContainsASanRuntime(Module * module, const lldb::SymbolRewriterSP &rewriter) { const Symbol* symbol = module->FindFirstSymbolWithNameAndType( ConstString("__asan_get_alloc_stack"), + rewriter, lldb::eSymbolTypeAny); return symbol != nullptr; @@ -111,7 +112,9 @@ static RegularExpression g_asan_runtime_regex("libclang_rt.asan_(.*)_dynamic\\.dylib"); if (g_asan_runtime_regex.Execute (file_spec.GetFilename().GetCString()) || module_pointer->IsExecutable()) { - if (ModuleContainsASanRuntime(module_pointer)) + ProcessSP process_sp = GetProcessSP(); + const lldb::SymbolRewriterSP &rewriter = process_sp ? process_sp->GetTarget().GetSymbolRewriter() : nullptr; + if (ModuleContainsASanRuntime(module_pointer, rewriter)) { m_runtime_module = module_pointer->shared_from_this(); Activate(); @@ -314,7 +317,7 @@ return; ConstString symbol_name ("__asan::AsanDie()"); - const Symbol *symbol = m_runtime_module->FindFirstSymbolWithNameAndType (symbol_name, eSymbolTypeCode); + const Symbol *symbol = m_runtime_module->FindFirstSymbolWithNameAndType (symbol_name, process_sp->GetTarget().GetSymbolRewriter(), eSymbolTypeCode); if (symbol == NULL) return; Index: source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp =================================================================== --- source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp +++ source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp @@ -84,10 +84,10 @@ } static bool -ModuleContainsTSanRuntime(ModuleSP module_sp) +ModuleContainsTSanRuntime(ModuleSP module_sp, const lldb::SymbolRewriterSP &rewriter) { static ConstString g_tsan_get_current_report("__tsan_get_current_report"); - const Symbol* symbol = module_sp->FindFirstSymbolWithNameAndType(g_tsan_get_current_report, lldb::eSymbolTypeAny); + const Symbol* symbol = module_sp->FindFirstSymbolWithNameAndType(g_tsan_get_current_report, rewriter, lldb::eSymbolTypeAny); return symbol != nullptr; } @@ -111,7 +111,9 @@ llvm::StringRef module_basename(file_spec.GetFilename().GetStringRef()); if (module_sp->IsExecutable() || module_basename.startswith("libclang_rt.tsan_")) { - if (ModuleContainsTSanRuntime(module_sp)) + ProcessSP process_sp = GetProcessSP(); + const lldb::SymbolRewriterSP &rewriter = process_sp ? process_sp->GetTarget().GetSymbolRewriter() : nullptr; + if (ModuleContainsTSanRuntime(module_sp, rewriter)) { m_runtime_module_wp = module_sp; Activate(); @@ -739,7 +741,7 @@ return; ConstString symbol_name ("__tsan_on_report"); - const Symbol *symbol = GetRuntimeModuleSP()->FindFirstSymbolWithNameAndType (symbol_name, eSymbolTypeCode); + const Symbol *symbol = GetRuntimeModuleSP()->FindFirstSymbolWithNameAndType (symbol_name, process_sp->GetTarget().GetSymbolRewriter(), eSymbolTypeCode); if (symbol == NULL) return; Index: source/Plugins/JITLoader/GDB/JITLoaderGDB.cpp =================================================================== --- source/Plugins/JITLoader/GDB/JITLoaderGDB.cpp +++ source/Plugins/JITLoader/GDB/JITLoaderGDB.cpp @@ -525,8 +525,8 @@ SymbolContextList target_symbols; Target &target = m_process->GetTarget(); - if (!module_list.FindSymbolsWithNameAndType(name, symbol_type, - target_symbols)) + if (!module_list.FindSymbolsWithNameAndType(name, target.GetSymbolRewriter(), + symbol_type, target_symbols)) return LLDB_INVALID_ADDRESS; SymbolContext sym_ctx; Index: source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp =================================================================== --- source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp +++ source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp @@ -240,13 +240,14 @@ { if (!m_PrintForDebugger_addr.get()) { - const ModuleList &modules = m_process->GetTarget().GetImages(); + Target &target = m_process->GetTarget(); + const ModuleList &modules = target.GetImages(); SymbolContextList contexts; SymbolContext context; - if ((!modules.FindSymbolsWithNameAndType(ConstString ("_NSPrintForDebugger"), eSymbolTypeCode, contexts)) && - (!modules.FindSymbolsWithNameAndType(ConstString ("_CFPrintForDebugger"), eSymbolTypeCode, contexts))) + if ((!modules.FindSymbolsWithNameAndType(ConstString ("_NSPrintForDebugger"), target.GetSymbolRewriter(), eSymbolTypeCode, contexts)) && + (!modules.FindSymbolsWithNameAndType(ConstString ("_CFPrintForDebugger"), target.GetSymbolRewriter(), eSymbolTypeCode, contexts))) return NULL; contexts.GetContextAtIndex(0, context); @@ -314,7 +315,7 @@ { const FileSpec &module_file_spec = module_sp->GetFileSpec(); static ConstString ObjCName ("libobjc.A.dylib"); - + if (module_file_spec) { if (module_file_spec.GetFilename() == ObjCName) @@ -495,8 +496,8 @@ SymbolContextList sc_list; - if (target.GetImages().FindSymbolsWithNameAndType(s_method_signature, eSymbolTypeCode, sc_list) || - target.GetImages().FindSymbolsWithNameAndType(s_arclite_method_signature, eSymbolTypeCode, sc_list)) + if (target.GetImages().FindSymbolsWithNameAndType(s_method_signature, target.GetSymbolRewriter(), eSymbolTypeCode, sc_list) || + target.GetImages().FindSymbolsWithNameAndType(s_arclite_method_signature, target.GetSymbolRewriter(), eSymbolTypeCode, sc_list)) return true; else return false; Index: source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp =================================================================== --- source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp +++ source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp @@ -303,13 +303,12 @@ static ConstString g_objc_debug_class_hash("_objc_debug_class_hash"); - const Symbol *symbol = objc_module_sp->FindFirstSymbolWithNameAndType(g_objc_debug_class_hash, lldb::eSymbolTypeData); - if (symbol && symbol->ValueIsAddress()) + Process *process = GetProcess(); + if (process) { - Process *process = GetProcess(); - if (process) + const Symbol *symbol = objc_module_sp->FindFirstSymbolWithNameAndType(g_objc_debug_class_hash, process->GetTarget().GetSymbolRewriter(), lldb::eSymbolTypeData); + if (symbol && symbol->ValueIsAddress()) { - lldb::addr_t objc_debug_class_hash_addr = symbol->GetAddressRef().GetLoadAddress(&process->GetTarget()); if (objc_debug_class_hash_addr != LLDB_INVALID_ADDRESS) Index: source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp =================================================================== --- source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp +++ source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp @@ -355,7 +355,7 @@ } if (!byte_size) byte_size = process->GetAddressByteSize(); - const Symbol *symbol = module_sp->FindFirstSymbolWithNameAndType(name, lldb::eSymbolTypeData); + const Symbol *symbol = module_sp->FindFirstSymbolWithNameAndType(name, process->GetTarget().GetSymbolRewriter(), lldb::eSymbolTypeData); if (symbol && symbol->ValueIsAddress()) { lldb::addr_t symbol_load_addr = symbol->GetAddressRef().GetLoadAddress(&process->GetTarget()); @@ -397,9 +397,11 @@ m_encoding_to_type_sp(), m_noclasses_warning_emitted(false) { + const lldb::SymbolRewriterSP &rewriter = process ? process->GetTarget().GetSymbolRewriter() : nullptr; + static const ConstString g_gdb_object_getClass("gdb_object_getClass"); m_has_object_getClass = - (objc_module_sp->FindFirstSymbolWithNameAndType(g_gdb_object_getClass, eSymbolTypeCode) != NULL); + (objc_module_sp->FindFirstSymbolWithNameAndType(g_gdb_object_getClass, rewriter, eSymbolTypeCode) != NULL); } bool @@ -962,7 +964,7 @@ //---------------------------------------------------------------------- SymbolContextList sc_list; Target &target = m_process->GetTarget(); - target.GetImages().FindSymbolsWithNameAndType(ivar_const_str, eSymbolTypeObjCIVar, sc_list); + target.GetImages().FindSymbolsWithNameAndType(ivar_const_str, target.GetSymbolRewriter(), eSymbolTypeObjCIVar, sc_list); addr_t ivar_offset_address = LLDB_INVALID_ADDRESS; @@ -1333,6 +1335,7 @@ if (m_isa_hash_table_ptr == LLDB_INVALID_ADDRESS) { Process *process = GetProcess(); + Target &target = process->GetTarget(); ModuleSP objc_module_sp(GetObjCModule()); @@ -1341,10 +1344,10 @@ static ConstString g_gdb_objc_realized_classes("gdb_objc_realized_classes"); - const Symbol *symbol = objc_module_sp->FindFirstSymbolWithNameAndType(g_gdb_objc_realized_classes, lldb::eSymbolTypeAny); + const Symbol *symbol = objc_module_sp->FindFirstSymbolWithNameAndType(g_gdb_objc_realized_classes, target.GetSymbolRewriter(), lldb::eSymbolTypeAny); if (symbol) { - lldb::addr_t gdb_objc_realized_classes_ptr = symbol->GetLoadAddress(&process->GetTarget()); + lldb::addr_t gdb_objc_realized_classes_ptr = symbol->GetLoadAddress(&target); if (gdb_objc_realized_classes_ptr != LLDB_INVALID_ADDRESS) { Index: source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp =================================================================== --- source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp +++ source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp @@ -479,6 +479,7 @@ { ConstString trampoline_name ("gdb_objc_trampolines"); const Symbol *trampoline_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (trampoline_name, + target.GetSymbolRewriter(), eSymbolTypeData); if (trampoline_symbol != NULL) { @@ -489,6 +490,7 @@ // Next look up the "changed" symbol and set a breakpoint on that... ConstString changed_name ("gdb_objc_trampolines_changed"); const Symbol *changed_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (changed_name, + target.GetSymbolRewriter(), eSymbolTypeCode); if (changed_symbol != NULL) { @@ -672,10 +674,11 @@ ConstString msg_forward_stret_name("_objc_msgForward_stret"); Target *target = process_sp ? &process_sp->GetTarget() : NULL; - const Symbol *class_getMethodImplementation = m_objc_module_sp->FindFirstSymbolWithNameAndType (get_impl_name, eSymbolTypeCode); - const Symbol *class_getMethodImplementation_stret = m_objc_module_sp->FindFirstSymbolWithNameAndType (get_impl_stret_name, eSymbolTypeCode); - const Symbol *msg_forward = m_objc_module_sp->FindFirstSymbolWithNameAndType (msg_forward_name, eSymbolTypeCode); - const Symbol *msg_forward_stret = m_objc_module_sp->FindFirstSymbolWithNameAndType (msg_forward_stret_name, eSymbolTypeCode); + const lldb::SymbolRewriterSP &rewriter = target ? target->GetSymbolRewriter() : nullptr; + const Symbol *class_getMethodImplementation = m_objc_module_sp->FindFirstSymbolWithNameAndType (get_impl_name, rewriter, eSymbolTypeCode); + const Symbol *class_getMethodImplementation_stret = m_objc_module_sp->FindFirstSymbolWithNameAndType (get_impl_stret_name, rewriter, eSymbolTypeCode); + const Symbol *msg_forward = m_objc_module_sp->FindFirstSymbolWithNameAndType (msg_forward_name, rewriter, eSymbolTypeCode); + const Symbol *msg_forward_stret = m_objc_module_sp->FindFirstSymbolWithNameAndType (msg_forward_stret_name, rewriter, eSymbolTypeCode); if (class_getMethodImplementation) m_impl_fn_addr = class_getMethodImplementation->GetAddress().GetOpcodeLoadAddress (target); @@ -719,7 +722,7 @@ for (size_t i = 0; i != llvm::array_lengthof(g_dispatch_functions); i++) { ConstString name_const_str(g_dispatch_functions[i].name); - const Symbol *msgSend_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (name_const_str, eSymbolTypeCode); + const Symbol *msgSend_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (name_const_str, rewriter, eSymbolTypeCode); if (msgSend_symbol && msgSend_symbol->ValueIsAddress()) { // FixMe: Make g_dispatch_functions static table of DispatchFunctions, and have the map be address->index. Index: source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp =================================================================== --- source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp +++ source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp @@ -782,20 +782,22 @@ if (!module) return Searcher::eCallbackReturnContinue; + const lldb::SymbolRewriterSP &rewriter = context.target_sp ? context.target_sp->GetSymbolRewriter() : nullptr; + // Is this a module containing renderscript kernels? - if (nullptr == module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData)) + if (nullptr == module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), rewriter, eSymbolTypeData)) return Searcher::eCallbackReturnContinue; // Attempt to set a breakpoint on the kernel name symbol within the module library. // If it's not found, it's likely debug info is unavailable - try to set a // breakpoint on .expand. - const Symbol *kernel_sym = module->FindFirstSymbolWithNameAndType(m_kernel_name, eSymbolTypeCode); + const Symbol *kernel_sym = module->FindFirstSymbolWithNameAndType(m_kernel_name, rewriter, eSymbolTypeCode); if (!kernel_sym) { std::string kernel_name_expanded(m_kernel_name.AsCString()); kernel_name_expanded.append(".expand"); - kernel_sym = module->FindFirstSymbolWithNameAndType(ConstString(kernel_name_expanded.c_str()), eSymbolTypeCode); + kernel_sym = module->FindFirstSymbolWithNameAndType(ConstString(kernel_name_expanded.c_str()), rewriter, eSymbolTypeCode); } if (kernel_sym) @@ -834,7 +836,7 @@ if (module_sp) { // Is this a module containing renderscript kernels? - const Symbol *info_sym = module_sp->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData); + const Symbol *info_sym = module_sp->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), nullptr, eSymbolTypeData); if (info_sym) { return eModuleKindKernelObj; @@ -1364,7 +1366,7 @@ const char *symbol_name = (archByteSize == 4) ? hook_defn->symbol_name_m32 : hook_defn->symbol_name_m64; - const Symbol *sym = module->FindFirstSymbolWithNameAndType(ConstString(symbol_name), eSymbolTypeCode); + const Symbol *sym = module->FindFirstSymbolWithNameAndType(ConstString(symbol_name), target.GetSymbolRewriter(), eSymbolTypeCode); if (!sym) { if (log) @@ -2612,14 +2614,14 @@ if (!m_libRS) { m_libRS = module_sp; + Target &target = GetProcess()->GetTarget(); static ConstString gDbgPresentStr("gDebuggerPresent"); const Symbol *debug_present = - m_libRS->FindFirstSymbolWithNameAndType(gDbgPresentStr, eSymbolTypeData); + m_libRS->FindFirstSymbolWithNameAndType(gDbgPresentStr, target.GetSymbolRewriter(), eSymbolTypeData); if (debug_present) { Error error; uint32_t flag = 0x00000001U; - Target &target = GetProcess()->GetTarget(); addr_t addr = debug_present->GetLoadAddress(&target); GetProcess()->WriteMemory(addr, &flag, sizeof(flag), error); if (error.Success()) @@ -2676,7 +2678,7 @@ RSModuleDescriptor::ParseRSInfo() { assert(m_module); - const Symbol *info_sym = m_module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData); + const Symbol *info_sym = m_module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), nullptr, eSymbolTypeData); if (!info_sym) return false; @@ -3551,7 +3553,7 @@ else { strm.Printf(" - variable identified, but not found in binary"); - const Symbol *s = m_module->m_module->FindFirstSymbolWithNameAndType(m_name, eSymbolTypeData); + const Symbol *s = m_module->m_module->FindFirstSymbolWithNameAndType(m_name, nullptr, eSymbolTypeData); if (s) { strm.Printf(" (symbol exists) "); Index: source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp =================================================================== --- source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp +++ source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp @@ -46,6 +46,7 @@ const Symbol* symbol = module_pointer->FindFirstSymbolWithNameAndType( ConstString("__asan_get_alloc_stack"), + target.GetSymbolRewriter(), lldb::eSymbolTypeAny); if (symbol != nullptr) Index: source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp =================================================================== --- source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -5179,7 +5179,7 @@ { SymbolContextList contexts; SymbolContext context; - if (module_sp->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts)) + if (module_sp->FindSymbolsWithNameAndType(ConstString ("start"), nullptr, eSymbolTypeCode, contexts)) { if (contexts.GetContextAtIndex(0, context)) m_entry_point_address = context.symbol->GetAddress(); Index: source/Plugins/Process/Utility/InferiorCallPOSIX.cpp =================================================================== --- source/Plugins/Process/Utility/InferiorCallPOSIX.cpp +++ source/Plugins/Process/Utility/InferiorCallPOSIX.cpp @@ -48,17 +48,20 @@ if (thread == NULL) return false; + Target &target = process->GetTarget(); + const bool append = true; const bool include_symbols = true; const bool include_inlines = false; SymbolContextList sc_list; const uint32_t count - = process->GetTarget().GetImages().FindFunctions (ConstString ("mmap"), - eFunctionNameTypeFull, - include_symbols, - include_inlines, - append, - sc_list); + = target.GetImages().FindFunctions (ConstString ("mmap"), + target.GetSymbolRewriter(), + eFunctionNameTypeFull, + include_symbols, + include_inlines, + append, + sc_list); if (count > 0) { SymbolContext sc; @@ -88,13 +91,13 @@ prot_arg |= PROT_WRITE; } - const ArchSpec arch = process->GetTarget().GetArchitecture(); - flags_arg = process->GetTarget().GetPlatform()->ConvertMmapFlagsToPlatform(arch,flags); + const ArchSpec arch = target.GetArchitecture(); + flags_arg = target.GetPlatform()->ConvertMmapFlagsToPlatform(arch,flags); AddressRange mmap_range; if (sc.GetAddressRange(range_scope, 0, use_inline_block_range, mmap_range)) { - ClangASTContext *clang_ast_context = process->GetTarget().GetScratchClangASTContext(); + ClangASTContext *clang_ast_context = target.GetScratchClangASTContext(); CompilerType clang_void_ptr_type = clang_ast_context->GetBasicType(eBasicTypeVoid).GetPointerType(); lldb::addr_t args[] = { addr, length, prot_arg, flags_arg, fd, offset }; lldb::ThreadPlanSP call_plan_sp(new ThreadPlanCallFunction(*thread, mmap_range.GetBaseAddress(), @@ -142,18 +145,21 @@ Thread *thread = process->GetThreadList().GetExpressionExecutionThread().get(); if (thread == NULL) return false; - + + Target &target = process->GetTarget(); + const bool append = true; const bool include_symbols = true; const bool include_inlines = false; SymbolContextList sc_list; const uint32_t count - = process->GetTarget().GetImages().FindFunctions (ConstString ("munmap"), - eFunctionNameTypeFull, - include_symbols, - include_inlines, - append, - sc_list); + = target.GetImages().FindFunctions (ConstString ("munmap"), + target.GetSymbolRewriter(), + eFunctionNameTypeFull, + include_symbols, + include_inlines, + append, + sc_list); if (count > 0) { SymbolContext sc; Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp =================================================================== --- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -4544,7 +4544,8 @@ addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; lldb_private::SymbolContextList sc_list; - if (process->GetTarget().GetImages().FindSymbolsWithNameAndType(ConstString(symbol_name), eSymbolTypeAny, sc_list)) + Target &target = process->GetTarget(); + if (target.GetImages().FindSymbolsWithNameAndType(ConstString(symbol_name), target.GetSymbolRewriter(), eSymbolTypeAny, sc_list)) { const size_t num_scs = sc_list.GetSize(); for (size_t sc_idx=0; sc_idxGetLoadAddress(&process->GetTarget()); + symbol_load_addr = sc.symbol->GetLoadAddress(&target); break; } } Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -3523,7 +3523,8 @@ Symtab *symtab = m_obj_file->GetSymtab (); if (symtab) { - objc_class_symbol = symtab->FindFirstSymbolWithNameAndType (objc_class_name, + objc_class_symbol = symtab->FindFirstSymbolWithNameAndType (objc_class_name, + nullptr, eSymbolTypeObjCClass, Symtab::eDebugNo, Symtab::eVisibilityAny); @@ -4461,6 +4462,7 @@ if (debug_map_symtab) { Symbol *exe_symbol = debug_map_symtab->FindFirstSymbolWithNameAndType (const_name, + nullptr, eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityExtern); Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -115,6 +115,7 @@ // First we find the original symbol in the .o file's symbol table Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown, Mangled::ePreferMangled), + nullptr, eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny); @@ -148,6 +149,7 @@ // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown, Mangled::ePreferMangled), + nullptr, eSymbolTypeData, Symtab::eDebugNo, Symtab::eVisibilityAny); @@ -1228,7 +1230,7 @@ Symtab *symtab = module_objfile->GetSymtab(); if (symtab) { - Symbol *objc_class_symbol = symtab->FindFirstSymbolWithNameAndType(type_name, eSymbolTypeObjCClass, Symtab::eDebugAny, Symtab::eVisibilityAny); + Symbol *objc_class_symbol = symtab->FindFirstSymbolWithNameAndType(type_name, nullptr, eSymbolTypeObjCClass, Symtab::eDebugAny, Symtab::eVisibilityAny); if (objc_class_symbol) { // Get the N_SO symbol that contains the objective C class symbol as this Index: source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp =================================================================== --- source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp +++ source/Plugins/SystemRuntime/MacOSX/SystemRuntimeMacOSX.cpp @@ -301,22 +301,24 @@ static ConstString g_dispatch_queue_offsets_symbol_name ("dispatch_queue_offsets"); const Symbol *dispatch_queue_offsets_symbol = NULL; + Target &target = m_process->GetTarget(); + // libdispatch symbols were in libSystem.B.dylib up through Mac OS X 10.6 ("Snow Leopard") ModuleSpec libSystem_module_spec (FileSpec("libSystem.B.dylib", false)); - ModuleSP module_sp(m_process->GetTarget().GetImages().FindFirstModule (libSystem_module_spec)); + ModuleSP module_sp(target.GetImages().FindFirstModule (libSystem_module_spec)); if (module_sp) - dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData); + dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, target.GetSymbolRewriter(), eSymbolTypeData); // libdispatch symbols are in their own dylib as of Mac OS X 10.7 ("Lion") and later if (dispatch_queue_offsets_symbol == NULL) { ModuleSpec libdispatch_module_spec (FileSpec("libdispatch.dylib", false)); - module_sp = m_process->GetTarget().GetImages().FindFirstModule (libdispatch_module_spec); + module_sp = target.GetImages().FindFirstModule (libdispatch_module_spec); if (module_sp) - dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData); + dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, target.GetSymbolRewriter(), eSymbolTypeData); } if (dispatch_queue_offsets_symbol) - m_dispatch_queue_offsets_addr = dispatch_queue_offsets_symbol->GetLoadAddress(&m_process->GetTarget()); + m_dispatch_queue_offsets_addr = dispatch_queue_offsets_symbol->GetLoadAddress(&target); } void @@ -353,15 +355,17 @@ static ConstString g_libpthread_layout_offsets_symbol_name ("pthread_layout_offsets"); const Symbol *libpthread_layout_offsets_symbol = NULL; + Target &target = m_process->GetTarget(); + ModuleSpec libpthread_module_spec (FileSpec("libsystem_pthread.dylib", false)); - ModuleSP module_sp (m_process->GetTarget().GetImages().FindFirstModule (libpthread_module_spec)); + ModuleSP module_sp (target.GetImages().FindFirstModule (libpthread_module_spec)); if (module_sp) { libpthread_layout_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType - (g_libpthread_layout_offsets_symbol_name, eSymbolTypeData); + (g_libpthread_layout_offsets_symbol_name, target.GetSymbolRewriter(), eSymbolTypeData); if (libpthread_layout_offsets_symbol) { - m_libpthread_layout_offsets_addr = libpthread_layout_offsets_symbol->GetLoadAddress(&m_process->GetTarget()); + m_libpthread_layout_offsets_addr = libpthread_layout_offsets_symbol->GetLoadAddress(&target); } } } @@ -402,15 +406,17 @@ static ConstString g_libdispatch_tsd_indexes_symbol_name ("dispatch_tsd_indexes"); const Symbol *libdispatch_tsd_indexes_symbol = NULL; + Target &target = m_process->GetTarget(); + ModuleSpec libpthread_module_spec (FileSpec("libdispatch.dylib", false)); - ModuleSP module_sp (m_process->GetTarget().GetImages().FindFirstModule (libpthread_module_spec)); + ModuleSP module_sp (target.GetImages().FindFirstModule (libpthread_module_spec)); if (module_sp) { libdispatch_tsd_indexes_symbol = module_sp->FindFirstSymbolWithNameAndType - (g_libdispatch_tsd_indexes_symbol_name, eSymbolTypeData); + (g_libdispatch_tsd_indexes_symbol_name, target.GetSymbolRewriter(), eSymbolTypeData); if (libdispatch_tsd_indexes_symbol) { - m_dispatch_tsd_indexes_addr = libdispatch_tsd_indexes_symbol->GetLoadAddress(&m_process->GetTarget()); + m_dispatch_tsd_indexes_addr = libdispatch_tsd_indexes_symbol->GetLoadAddress(&target); } } } @@ -600,7 +606,7 @@ static ConstString introspection_dispatch_queue_info_version ("__introspection_dispatch_queue_info_version"); SymbolContextList sc_list; - if (m_process->GetTarget().GetImages().FindSymbolsWithNameAndType (introspection_dispatch_queue_info_version, eSymbolTypeData, sc_list) > 0) + if (target.GetImages().FindSymbolsWithNameAndType (introspection_dispatch_queue_info_version, target.GetSymbolRewriter(), eSymbolTypeData, sc_list) > 0) { SymbolContext sc; sc_list.GetContextAtIndex (0, sc); @@ -611,7 +617,7 @@ sc_list.Clear(); static ConstString introspection_dispatch_queue_info_data_offset ("__introspection_dispatch_queue_info_data_offset"); - if (m_process->GetTarget().GetImages().FindSymbolsWithNameAndType (introspection_dispatch_queue_info_data_offset, eSymbolTypeData, sc_list) > 0) + if (target.GetImages().FindSymbolsWithNameAndType (introspection_dispatch_queue_info_data_offset, target.GetSymbolRewriter(), eSymbolTypeData, sc_list) > 0) { SymbolContext sc; sc_list.GetContextAtIndex (0, sc); @@ -622,7 +628,7 @@ sc_list.Clear(); static ConstString introspection_dispatch_item_info_version ("__introspection_dispatch_item_info_version"); - if (m_process->GetTarget().GetImages().FindSymbolsWithNameAndType (introspection_dispatch_item_info_version, eSymbolTypeData, sc_list) > 0) + if (target.GetImages().FindSymbolsWithNameAndType (introspection_dispatch_item_info_version, target.GetSymbolRewriter(), eSymbolTypeData, sc_list) > 0) { SymbolContext sc; sc_list.GetContextAtIndex (0, sc); @@ -633,7 +639,7 @@ sc_list.Clear(); static ConstString introspection_dispatch_item_info_data_offset ("__introspection_dispatch_item_info_data_offset"); - if (m_process->GetTarget().GetImages().FindSymbolsWithNameAndType (introspection_dispatch_item_info_data_offset, eSymbolTypeData, sc_list) > 0) + if (target.GetImages().FindSymbolsWithNameAndType (introspection_dispatch_item_info_data_offset, target.GetSymbolRewriter(), eSymbolTypeData, sc_list) > 0) { SymbolContext sc; sc_list.GetContextAtIndex (0, sc); Index: source/Symbol/CMakeLists.txt =================================================================== --- source/Symbol/CMakeLists.txt +++ source/Symbol/CMakeLists.txt @@ -24,6 +24,7 @@ Symbol.cpp SymbolContext.cpp SymbolFile.cpp + SymbolRewriter.cpp SymbolVendor.cpp Symtab.cpp Type.cpp Index: source/Symbol/Symbol.cpp =================================================================== --- source/Symbol/Symbol.cpp +++ source/Symbol/Symbol.cpp @@ -575,7 +575,7 @@ return nullptr; lldb_private::SymbolContextList sc_list; - module_sp->FindSymbolsWithNameAndType(reexport_name, eSymbolTypeAny, sc_list); + module_sp->FindSymbolsWithNameAndType(reexport_name, target.GetSymbolRewriter(), eSymbolTypeAny, sc_list); const size_t num_scs = sc_list.GetSize(); if (num_scs > 0) { Index: source/Symbol/SymbolRewriter.cpp =================================================================== --- /dev/null +++ source/Symbol/SymbolRewriter.cpp @@ -0,0 +1,193 @@ +//===-- SymbolRewriter.cpp --------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Core/Log.h" +#include "lldb/Symbol/SymbolRewriter.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Support/Casting.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Regex.h" +#include "llvm/Support/SourceMgr.h" +#include "llvm/Support/YAMLParser.h" + +using namespace llvm; +using namespace lldb; +using namespace lldb_private; + +SymbolRewriter::SymbolRewriter() +{ +} + +static std::string +getString(yaml::ScalarNode *n) +{ + SmallString<32> storage; + StringRef ref; + + ref = n->getValue(storage); + + return ref.str (); +} + +void +SymbolRewriter::LoadMap(const FileSpec &path) +{ + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS)); + auto str_path = path.GetPath (); + + if (log) + { + log->Printf("loading rewrite maps from %s", str_path.c_str ()); + } + + ErrorOr> mem_buffer_or_err = MemoryBuffer::getFile (str_path); + if (std::error_code err = mem_buffer_or_err.getError()) + { + report_fatal_error ("Unable to read rewrite map '" + str_path + + "': " + err.message()); + return; + } + std::unique_ptr mem_buffer = std::move(mem_buffer_or_err.get()); + + SourceMgr source_mgr; + yaml::Stream yaml_stream(mem_buffer->getBuffer (), source_mgr); + + for (auto &stream : yaml_stream) + { +#define PARSE_CHECK(COND, MESSAGE) \ + if (COND) \ + { \ + report_fatal_error ("Unable to parse rewrite map '" + str_path + \ + "': " + MESSAGE); \ + continue; \ + } + + auto root_map = dyn_cast(stream.getRoot()); + PARSE_CHECK (!root_map, "root element is not a map") + + auto map = std::make_shared (); + m_rewrite_maps.push_back (map); + + for (auto &entry : *root_map) + { + static const std::string rewrite_type_function = "function"; + static const std::string rewrite_type_global_variable = "global variable"; + static const std::string rewrite_type_global_alias = "global alias"; + + auto key = dyn_cast(entry.getKey ()); + PARSE_CHECK(!key, "malformed rewrite entry") + + auto value = dyn_cast(entry.getValue ()); + PARSE_CHECK(!value, "malformed rewrite entry") + + auto rewrite_type = getString (key); + + if (rewrite_type == rewrite_type_global_alias) + { + if (log) + log->Printf("ignoring rewrite type 'global alias' in '%s'", str_path.c_str()); + continue; + } + + PARSE_CHECK (rewrite_type != rewrite_type_function && + rewrite_type != rewrite_type_global_variable, + "'" + rewrite_type + "' is not a valid rewrite type") + + static const std::string descriptor_field_source = "source"; + static const std::string descriptor_field_target = "target"; + static const std::string descriptor_field_transform = "transform"; + static const std::string descriptor_field_naked = "naked"; + std::string source; + std::string target; + std::string transform; + std::string naked; + + for (auto &field : *value) + { + auto field_key = dyn_cast (field.getKey ()); + PARSE_CHECK(!field_key, "malformed rewrite entry") + + auto field_value = dyn_cast (field.getValue ()); + PARSE_CHECK(!field_value, "malformed rewrite entry") + + auto str_key = getString (field_key); + auto str_value = getString (field_value); + + if (str_key == descriptor_field_source) + source = str_value; + else if (str_key == descriptor_field_target) + target = str_value; + else if (str_key == descriptor_field_transform) + transform = str_value; + else if (str_key == descriptor_field_naked) + naked = str_value; + else + PARSE_CHECK (true, "'" + str_key + "' is not a valid key in a rewrite entry") + } + + PARSE_CHECK (source.size () == 0, "missing source in rewrite entry") + + if (!target.empty ()) + map->m_direct_map[ConstString(source)] = ConstString(target); + else if (!transform.empty ()) + map->m_transform_map[ConstString(source)] = ConstString(transform); + else + PARSE_CHECK (true, "target and transform are missing in rewrite entry for '" + source + "'") + } +#undef PARSE_CHECK + } + + if (log) + { + log->Printf("loaded rewrite maps from %s", str_path.c_str ()); + } +} + +ConstString +SymbolRewriter::Rewrite(const ConstString& name) +{ + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS)); + ConstString result = name; + + for (auto &map : m_rewrite_maps) + { + auto entry_it = map->m_direct_map.find(result); + if (entry_it != map->m_direct_map.end ()) + { + result = entry_it->second; + continue; + } + + for (const auto &entry : map->m_transform_map) + { + std::string error; + std::string trans; + + trans = Regex (entry.first.AsCString ()).sub (entry.second.AsCString(), + result.AsCString (), + &error); + + if (strcmp (trans.c_str (), result.AsCString ()) != 0) + { + /* Cache entry in direct rewrite map for faster lookups. */ + auto new_result = ConstString (trans.c_str ()); + map->m_direct_map[result] = new_result; + result = new_result; + break; + } + } + } + + if (log) + { + log->Printf("rewrote symbol %s to %s", name.AsCString (), result.AsCString ()); + } + + return result; +} Index: source/Symbol/Symtab.cpp =================================================================== --- source/Symbol/Symtab.cpp +++ source/Symbol/Symtab.cpp @@ -18,6 +18,7 @@ #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/Symbol.h" #include "lldb/Symbol/SymbolContext.h" +#include "lldb/Symbol/SymbolRewriter.h" #include "lldb/Symbol/Symtab.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" @@ -806,11 +807,14 @@ } size_t -Symtab::FindAllSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, std::vector& symbol_indexes) +Symtab::FindAllSymbolsWithNameAndType (const ConstString &name, const SymbolRewriterSP &rewriter, SymbolType symbol_type, std::vector& symbol_indexes) { std::lock_guard guard(m_mutex); Timer scoped_timer (__PRETTY_FUNCTION__, "%s", __PRETTY_FUNCTION__); + + ConstString rewrittenName = RewriteName(rewriter, name); + // Initialize all of the lookup by name indexes before converting NAME // to a uniqued string NAME_STR below. if (!m_name_indexes_computed) @@ -820,17 +824,20 @@ { // The string table did have a string that matched, but we need // to check the symbols and match the symbol_type if any was given. - AppendSymbolIndexesWithNameAndType (name, symbol_type, symbol_indexes); + AppendSymbolIndexesWithNameAndType (rewrittenName, symbol_type, symbol_indexes); } return symbol_indexes.size(); } size_t -Symtab::FindAllSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& symbol_indexes) +Symtab::FindAllSymbolsWithNameAndType (const ConstString &name, const SymbolRewriterSP &rewriter, SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector& symbol_indexes) { std::lock_guard guard(m_mutex); Timer scoped_timer (__PRETTY_FUNCTION__, "%s", __PRETTY_FUNCTION__); + + ConstString rewrittenName = RewriteName(rewriter, name); + // Initialize all of the lookup by name indexes before converting NAME // to a uniqued string NAME_STR below. if (!m_name_indexes_computed) @@ -840,7 +847,7 @@ { // The string table did have a string that matched, but we need // to check the symbols and match the symbol_type if any was given. - AppendSymbolIndexesWithNameAndType (name, symbol_type, symbol_debug_type, symbol_visibility, symbol_indexes); + AppendSymbolIndexesWithNameAndType (rewrittenName, symbol_type, symbol_debug_type, symbol_visibility, symbol_indexes); } return symbol_indexes.size(); } @@ -855,11 +862,14 @@ } Symbol * -Symtab::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility) +Symtab::FindFirstSymbolWithNameAndType (const ConstString &name, const SymbolRewriterSP &rewriter, SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility) { std::lock_guard guard(m_mutex); Timer scoped_timer (__PRETTY_FUNCTION__, "%s", __PRETTY_FUNCTION__); + + ConstString rewrittenName = RewriteName (rewriter, name); + if (!m_name_indexes_computed) InitNameIndexes(); @@ -868,14 +878,14 @@ std::vector matching_indexes; // The string table did have a string that matched, but we need // to check the symbols and match the symbol_type if any was given. - if (AppendSymbolIndexesWithNameAndType (name, symbol_type, symbol_debug_type, symbol_visibility, matching_indexes)) + if (AppendSymbolIndexesWithNameAndType (rewrittenName, symbol_type, symbol_debug_type, symbol_visibility, matching_indexes)) { std::vector::const_iterator pos, end = matching_indexes.end(); for (pos = matching_indexes.begin(); pos != end; ++pos) { Symbol *symbol = SymbolAtIndex(*pos); - if (symbol->Compare(name, symbol_type)) + if (symbol->Compare(rewrittenName, symbol_type)) return symbol; } } @@ -1138,6 +1148,7 @@ size_t Symtab::FindFunctionSymbols (const ConstString &name, + const SymbolRewriterSP &rewriter, uint32_t name_type_mask, SymbolContextList& sc_list) { @@ -1152,7 +1163,7 @@ if (name_type_mask & (eFunctionNameTypeBase | eFunctionNameTypeFull)) { std::vector temp_symbol_indexes; - FindAllSymbolsWithNameAndType (name, eSymbolTypeAny, temp_symbol_indexes); + FindAllSymbolsWithNameAndType (name, rewriter, eSymbolTypeAny, temp_symbol_indexes); unsigned temp_symbol_indexes_size = temp_symbol_indexes.size(); if (temp_symbol_indexes_size > 0) @@ -1260,3 +1271,14 @@ } return NULL; } + +ConstString +Symtab::RewriteName (const SymbolRewriterSP &rewriter, ConstString name) +{ + if (rewriter) + { + return rewriter->Rewrite (name); + } + + return name; +} Index: source/Target/ObjCLanguageRuntime.cpp =================================================================== --- source/Target/ObjCLanguageRuntime.cpp +++ source/Target/ObjCLanguageRuntime.cpp @@ -105,6 +105,7 @@ SymbolContextList sc_list; const size_t matching_symbols = modules.FindSymbolsWithNameAndType (name, + m_process->GetTarget().GetSymbolRewriter(), eSymbolTypeObjCClass, sc_list); Index: source/Target/Target.cpp =================================================================== --- source/Target/Target.cpp +++ source/Target/Target.cpp @@ -78,6 +78,7 @@ m_mutex(), m_arch(target_arch), m_images(this), + m_symbol_rewriter(), m_section_load_history(), m_breakpoint_list(false), m_internal_breakpoint_list(true),