diff --git a/llvm/tools/dsymutil/DebugMap.cpp b/llvm/tools/dsymutil/DebugMap.cpp index 8724b70422f32..b38d502dda7c9 100644 --- a/llvm/tools/dsymutil/DebugMap.cpp +++ b/llvm/tools/dsymutil/DebugMap.cpp @@ -126,6 +126,9 @@ void DebugMap::dump() const { print(errs()); } namespace { struct YAMLContext { + YAMLContext(BinaryHolder &BinHolder, StringRef PrependPath) + : BinHolder(BinHolder), PrependPath(PrependPath) {} + BinaryHolder &BinHolder; StringRef PrependPath; Triple BinaryTriple; }; @@ -133,15 +136,13 @@ struct YAMLContext { } // end anonymous namespace ErrorOr>> -DebugMap::parseYAMLDebugMap(StringRef InputFile, StringRef PrependPath, - bool Verbose) { +DebugMap::parseYAMLDebugMap(BinaryHolder &BinHolder, StringRef InputFile, + StringRef PrependPath, bool Verbose) { auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(InputFile); if (auto Err = ErrOrFile.getError()) return Err; - YAMLContext Ctxt; - - Ctxt.PrependPath = PrependPath; + YAMLContext Ctxt(BinHolder, PrependPath); std::unique_ptr Res; yaml::Input yin((*ErrOrFile)->getBuffer(), &Ctxt); @@ -244,14 +245,13 @@ MappingTraits::YamlDMO::YamlDMO( dsymutil::DebugMapObject MappingTraits::YamlDMO::denormalize(IO &IO) { - BinaryHolder BinHolder(vfs::getRealFileSystem(), /* Verbose =*/false); const auto &Ctxt = *reinterpret_cast(IO.getContext()); SmallString<80> Path(Ctxt.PrependPath); StringMap SymbolAddresses; sys::path::append(Path, Filename); - auto ObjectEntry = BinHolder.getObjectEntry(Path); + auto ObjectEntry = Ctxt.BinHolder.getObjectEntry(Path); if (!ObjectEntry) { auto Err = ObjectEntry.takeError(); WithColor::warning() << "Unable to open " << Path << " " diff --git a/llvm/tools/dsymutil/DebugMap.h b/llvm/tools/dsymutil/DebugMap.h index 9c3a698fa1191..8e2a4de94c89e 100644 --- a/llvm/tools/dsymutil/DebugMap.h +++ b/llvm/tools/dsymutil/DebugMap.h @@ -21,6 +21,7 @@ #ifndef LLVM_TOOLS_DSYMUTIL_DEBUGMAP_H #define LLVM_TOOLS_DSYMUTIL_DEBUGMAP_H +#include "BinaryHolder.h" #include "RelocationMap.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringMap.h" @@ -127,7 +128,8 @@ class DebugMap { /// Read a debug map for \a InputFile. static ErrorOr>> - parseYAMLDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose); + parseYAMLDebugMap(BinaryHolder &BinHolder, StringRef InputFile, + StringRef PrependPath, bool Verbose); }; /// The DebugMapObject represents one object file described by the DebugMap. It diff --git a/llvm/tools/dsymutil/MachODebugMapParser.cpp b/llvm/tools/dsymutil/MachODebugMapParser.cpp index 4a06731946b97..a0ba2512e12f2 100644 --- a/llvm/tools/dsymutil/MachODebugMapParser.cpp +++ b/llvm/tools/dsymutil/MachODebugMapParser.cpp @@ -27,14 +27,14 @@ using namespace llvm::object; class MachODebugMapParser { public: - MachODebugMapParser(llvm::IntrusiveRefCntPtr VFS, - StringRef BinaryPath, ArrayRef Archs, + MachODebugMapParser(BinaryHolder &BinHolder, StringRef BinaryPath, + ArrayRef Archs, ArrayRef DSYMSearchPaths, StringRef PathPrefix = "", StringRef VariantSuffix = "", bool Verbose = false) : BinaryPath(std::string(BinaryPath)), Archs(Archs), DSYMSearchPaths(DSYMSearchPaths), PathPrefix(std::string(PathPrefix)), - VariantSuffix(std::string(VariantSuffix)), BinHolder(VFS, Verbose), + VariantSuffix(std::string(VariantSuffix)), BinHolder(BinHolder), CurrentDebugMapObject(nullptr), SkipDebugMapObject(false) {} /// Parses and returns the DebugMaps of the input binary. The binary contains @@ -56,7 +56,7 @@ class MachODebugMapParser { std::string VariantSuffix; /// Owns the MemoryBuffer for the main binary. - BinaryHolder BinHolder; + BinaryHolder &BinHolder; /// Map of the binary symbol addresses. StringMap MainBinarySymbolAddresses; StringRef MainBinaryStrings; @@ -854,24 +854,25 @@ void MachODebugMapParser::loadMainBinarySymbols( namespace llvm { namespace dsymutil { llvm::ErrorOr>> -parseDebugMap(llvm::IntrusiveRefCntPtr VFS, - StringRef InputFile, ArrayRef Archs, +parseDebugMap(BinaryHolder &BinHolder, StringRef InputFile, + ArrayRef Archs, ArrayRef DSYMSearchPaths, StringRef PrependPath, StringRef VariantSuffix, bool Verbose, bool InputIsYAML) { if (InputIsYAML) - return DebugMap::parseYAMLDebugMap(InputFile, PrependPath, Verbose); + return DebugMap::parseYAMLDebugMap(BinHolder, InputFile, PrependPath, + Verbose); - MachODebugMapParser Parser(VFS, InputFile, Archs, DSYMSearchPaths, + MachODebugMapParser Parser(BinHolder, InputFile, Archs, DSYMSearchPaths, PrependPath, VariantSuffix, Verbose); return Parser.parse(); } -bool dumpStab(llvm::IntrusiveRefCntPtr VFS, - StringRef InputFile, ArrayRef Archs, +bool dumpStab(BinaryHolder &BinHolder, StringRef InputFile, + ArrayRef Archs, ArrayRef DSYMSearchPaths, StringRef PrependPath, StringRef VariantSuffix) { - MachODebugMapParser Parser(VFS, InputFile, Archs, DSYMSearchPaths, + MachODebugMapParser Parser(BinHolder, InputFile, Archs, DSYMSearchPaths, PrependPath, VariantSuffix, false); return Parser.dumpStab(); } diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp index 364a7d63d486e..f510fa7f75bd8 100644 --- a/llvm/tools/dsymutil/dsymutil.cpp +++ b/llvm/tools/dsymutil/dsymutil.cpp @@ -180,17 +180,6 @@ static Error verifyOptions(const DsymutilOptions &Options) { errc::invalid_argument); } - if (Options.LinkOpts.Update && llvm::is_contained(Options.InputFiles, "-")) { - // FIXME: We cannot use stdin for an update because stdin will be - // consumed by the BinaryHolder during the debugmap parsing, and - // then we will want to consume it again in DwarfLinker. If we - // used a unique BinaryHolder object that could cache multiple - // binaries this restriction would go away. - return make_error( - "standard input cannot be used as input for a dSYM update.", - errc::invalid_argument); - } - if (!Options.Flat && Options.OutputFile == "-") return make_error( "cannot emit to standard output without --flat.", @@ -674,9 +663,12 @@ int dsymutil_main(int argc, char **argv, const llvm::ToolContext &) { } for (auto &InputFile : Options.InputFiles) { + // Shared a single binary holder for all the link steps. + BinaryHolder BinHolder(Options.LinkOpts.VFS, Options.LinkOpts.Verbose); + // Dump the symbol table for each input file and requested arch if (Options.DumpStab) { - if (!dumpStab(Options.LinkOpts.VFS, InputFile, Options.Archs, + if (!dumpStab(BinHolder, InputFile, Options.Archs, Options.LinkOpts.DSYMSearchPaths, Options.LinkOpts.PrependPath, Options.LinkOpts.BuildVariantSuffix)) @@ -685,10 +677,9 @@ int dsymutil_main(int argc, char **argv, const llvm::ToolContext &) { } auto DebugMapPtrsOrErr = parseDebugMap( - Options.LinkOpts.VFS, InputFile, Options.Archs, - Options.LinkOpts.DSYMSearchPaths, Options.LinkOpts.PrependPath, - Options.LinkOpts.BuildVariantSuffix, Options.LinkOpts.Verbose, - Options.InputIsYAMLDebugMap); + BinHolder, InputFile, Options.Archs, Options.LinkOpts.DSYMSearchPaths, + Options.LinkOpts.PrependPath, Options.LinkOpts.BuildVariantSuffix, + Options.LinkOpts.Verbose, Options.InputIsYAMLDebugMap); if (auto EC = DebugMapPtrsOrErr.getError()) { WithColor::error() << "cannot parse the debug map for '" << InputFile @@ -714,9 +705,6 @@ int dsymutil_main(int argc, char **argv, const llvm::ToolContext &) { return EXIT_FAILURE; } - // Shared a single binary holder for all the link steps. - BinaryHolder BinHolder(Options.LinkOpts.VFS); - // Compute the output location and update the resource directory. Expected OutputLocationOrErr = getOutputFileName(InputFile, Options); diff --git a/llvm/tools/dsymutil/dsymutil.h b/llvm/tools/dsymutil/dsymutil.h index 5504dd57c7e55..7b97b8bcd3a25 100644 --- a/llvm/tools/dsymutil/dsymutil.h +++ b/llvm/tools/dsymutil/dsymutil.h @@ -16,6 +16,7 @@ #ifndef LLVM_TOOLS_DSYMUTIL_DSYMUTIL_H #define LLVM_TOOLS_DSYMUTIL_DSYMUTIL_H +#include "BinaryHolder.h" #include "DebugMap.h" #include "LinkUtils.h" #include "llvm/ADT/ArrayRef.h" @@ -33,14 +34,14 @@ namespace dsymutil { /// The file has to be a MachO object file. Multiple debug maps can be /// returned when the file is universal (aka fat) binary. ErrorOr>> -parseDebugMap(llvm::IntrusiveRefCntPtr VFS, - StringRef InputFile, ArrayRef Archs, +parseDebugMap(BinaryHolder &BinHolder, StringRef InputFile, + ArrayRef Archs, ArrayRef DSYMSearchPaths, StringRef PrependPath, StringRef VariantSuffix, bool Verbose, bool InputIsYAML); /// Dump the symbol table. -bool dumpStab(llvm::IntrusiveRefCntPtr VFS, - StringRef InputFile, ArrayRef Archs, +bool dumpStab(BinaryHolder &BinHolder, StringRef InputFile, + ArrayRef Archs, ArrayRef DSYMSearchPaths, StringRef PrependPath = "", StringRef VariantSuffix = "");