[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