[llvm] r316999 - [dsymutil] Implement the --threads option

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 2 13:25:02 PDT 2017


Copy-pasting is hard. I meant I've submitted a fix in r317263

On Thu, Nov 2, 2017 at 1:23 PM, Hans Wennborg <hans at chromium.org> wrote:
> This broke the tools/dsymutil/X86/alias.test test in builds using
> -DLLVM_ENABLE_THREADS=OFF
>
> I've submitted a fix in r316999 to try and unbreak things.
>
> On Tue, Oct 31, 2017 at 6:54 AM, Jonas Devlieghere via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> Author: jdevlieghere
>> Date: Tue Oct 31 06:54:15 2017
>> New Revision: 316999
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=316999&view=rev
>> Log:
>> [dsymutil] Implement the --threads option
>>
>> This patch adds the --threads option to dsymutil to process
>> architectures in parallel. The feature is already present in the version
>> distributed with Xcode, but was not yet upstreamed.
>>
>> This is NFC as far as the linking behavior is concerned. As threads are
>> used automatically, the current tests cover the change in
>> implementation.
>>
>> Differential revision: https://reviews.llvm.org/D39355
>>
>> Added:
>>     llvm/trunk/test/tools/dsymutil/cmdline.test
>> Modified:
>>     llvm/trunk/tools/dsymutil/DwarfLinker.cpp
>>     llvm/trunk/tools/dsymutil/dsymutil.cpp
>>
>> Added: llvm/trunk/test/tools/dsymutil/cmdline.test
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/cmdline.test?rev=316999&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/dsymutil/cmdline.test (added)
>> +++ llvm/trunk/test/tools/dsymutil/cmdline.test Tue Oct 31 06:54:15 2017
>> @@ -0,0 +1,21 @@
>> +RUN: llvm-dsymutil -help 2>&1 | FileCheck --check-prefix=HELP %s
>> +HELP: OVERVIEW: manipulate archived DWARF debug symbol files.
>> +HELP: USAGE: llvm-dsymutil [options] <input files>
>> +HELP-NOT: -reverse-iterate
>> +HELP: Specific Options:
>> +HELP: -arch=<string>
>> +HELP: -dump-debug-map
>> +HELP: -flat
>> +HELP: -no-odr
>> +HELP: -no-output
>> +HELP: -no-swiftmodule-timestamp
>> +HELP: -o=<filename>
>> +HELP: -oso-prepend-path=<path>
>> +HELP: -symtab
>> +HELP: -threads=<n>
>> +HELP: -verbose
>> +HELP: -y
>> +HELP-NOT: -reverse-iterate
>> +
>> +RUN: llvm-dsymutil --version 2>&1 | FileCheck --check-prefix=VERSION %s
>> +VERSION: {{ version }}
>>
>> Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=316999&r1=316998&r2=316999&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
>> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Tue Oct 31 06:54:15 2017
>> @@ -35,6 +35,7 @@
>>  #include "llvm/Object/MachO.h"
>>  #include "llvm/Support/LEB128.h"
>>  #include "llvm/Support/TargetRegistry.h"
>> +#include "llvm/Support/ToolOutputFile.h"
>>  #include "llvm/Target/TargetMachine.h"
>>  #include "llvm/Target/TargetOptions.h"
>>  #include <memory>
>> @@ -479,7 +480,7 @@ class DwarfStreamer {
>>    /// @}
>>
>>    /// The file we stream the linked Dwarf to.
>> -  std::unique_ptr<raw_fd_ostream> OutFile;
>> +  std::unique_ptr<ToolOutputFile> OutFile;
>>
>>    uint32_t RangesSectionSize;
>>    uint32_t LocSectionSize;
>> @@ -617,13 +618,13 @@ bool DwarfStreamer::init(Triple TheTripl
>>    // Create the output file.
>>    std::error_code EC;
>>    OutFile =
>> -      llvm::make_unique<raw_fd_ostream>(OutputFilename, EC, sys::fs::F_None);
>> +      llvm::make_unique<ToolOutputFile>(OutputFilename, EC, sys::fs::F_None);
>>    if (EC)
>>      return error(Twine(OutputFilename) + ": " + EC.message(), Context);
>>
>>    MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags();
>>    MS = TheTarget->createMCObjectStreamer(
>> -      TheTriple, *MC, std::unique_ptr<MCAsmBackend>(MAB), *OutFile,
>> +      TheTriple, *MC, std::unique_ptr<MCAsmBackend>(MAB), OutFile->os(),
>>        std::unique_ptr<MCCodeEmitter>(MCE), *MSTI, MCOptions.MCRelaxAll,
>>        MCOptions.MCIncrementalLinkerCompatible,
>>        /*DWARFMustBeAtTheEnd*/ false);
>> @@ -649,11 +650,16 @@ bool DwarfStreamer::init(Triple TheTripl
>>  }
>>
>>  bool DwarfStreamer::finish(const DebugMap &DM) {
>> +  bool Result = true;
>>    if (DM.getTriple().isOSDarwin() && !DM.getBinaryPath().empty())
>> -    return MachOUtils::generateDsymCompanion(DM, *MS, *OutFile);
>> +    Result = MachOUtils::generateDsymCompanion(DM, *MS, OutFile->os());
>> +  else
>> +    MS->Finish();
>>
>> -  MS->Finish();
>> -  return true;
>> +  // Declare success.
>> +  OutFile->keep();
>> +
>> +  return Result;
>>  }
>>
>>  /// Set the current output section to debug_info and change
>>
>> Modified: llvm/trunk/tools/dsymutil/dsymutil.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/dsymutil.cpp?rev=316999&r1=316998&r2=316999&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/dsymutil/dsymutil.cpp (original)
>> +++ llvm/trunk/tools/dsymutil/dsymutil.cpp Tue Oct 31 06:54:15 2017
>> @@ -12,9 +12,9 @@
>>  //
>>  //===----------------------------------------------------------------------===//
>>
>> +#include "dsymutil.h"
>>  #include "DebugMap.h"
>>  #include "MachOUtils.h"
>> -#include "dsymutil.h"
>>  #include "llvm/Object/MachO.h"
>>  #include "llvm/Support/FileSystem.h"
>>  #include "llvm/Support/FileUtilities.h"
>> @@ -22,8 +22,9 @@
>>  #include "llvm/Support/Options.h"
>>  #include "llvm/Support/PrettyStackTrace.h"
>>  #include "llvm/Support/Signals.h"
>> -#include "llvm/Support/raw_ostream.h"
>>  #include "llvm/Support/TargetSelect.h"
>> +#include "llvm/Support/ThreadPool.h"
>> +#include "llvm/Support/raw_ostream.h"
>>  #include <cstdint>
>>  #include <string>
>>
>> @@ -61,6 +62,13 @@ static opt<bool> FlatOut("flat",
>>                           init(false), cat(DsymCategory));
>>  static alias FlatOutA("f", desc("Alias for --flat"), aliasopt(FlatOut));
>>
>> +static opt<unsigned> Threads(
>> +    "threads",
>> +    desc("Specifies the maximum number (n) of simultaneous threads to use\n"
>> +         "when linking multiple architectures."),
>> +    value_desc("n"), init(0), cat(DsymCategory));
>> +static alias ThreadsA("t", desc("Alias for --threads"), aliasopt(Threads));
>> +
>>  static opt<bool> Verbose("verbose", desc("Verbosity level"), init(false),
>>                           cat(DsymCategory));
>>
>> @@ -316,6 +324,15 @@ int main(int argc, char **argv) {
>>        exitDsymutil(1);
>>      }
>>
>> +    unsigned NumThreads = Threads;
>> +    if (!NumThreads)
>> +      NumThreads = llvm::thread::hardware_concurrency();
>> +    if (DumpDebugMap || Verbose)
>> +      NumThreads = 1;
>> +    NumThreads = std::min(NumThreads, (unsigned)DebugMapPtrsOrErr->size());
>> +
>> +    llvm::ThreadPool Threads(NumThreads);
>> +
>>      // If there is more than one link to execute, we need to generate
>>      // temporary files.
>>      bool NeedsTempFiles = !DumpDebugMap && (*DebugMapPtrsOrErr).size() != 1;
>> @@ -333,14 +350,27 @@ int main(int argc, char **argv) {
>>                       << ")\n";
>>
>>        std::string OutputFile = getOutputFileName(InputFile, NeedsTempFiles);
>> -      if (OutputFile.empty() || !linkDwarf(OutputFile, *Map, Options))
>> -        exitDsymutil(1);
>> +
>> +      auto LinkLambda = [OutputFile, Options, &Map]() {
>> +        if (OutputFile.empty() || !linkDwarf(OutputFile, *Map, Options))
>> +          exitDsymutil(1);
>> +      };
>> +
>> +      // FIXME: The DwarfLinker can have some very deep recursion that can max
>> +      // out the (significantly smaller) stack when using threads. We don't
>> +      // want this limitation when we only have a single thread.
>> +      if (NumThreads == 1)
>> +        LinkLambda();
>> +      else
>> +        Threads.async(LinkLambda);
>>
>>        if (NeedsTempFiles)
>>          TempFiles.emplace_back(Map->getTriple().getArchName().str(),
>>                                 OutputFile);
>>      }
>>
>> +    Threads.wait();
>> +
>>      if (NeedsTempFiles &&
>>          !MachOUtils::generateUniversalBinary(
>>              TempFiles, getOutputFileName(InputFile), Options, SDKPath))
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list