From d353c91d497390c44db1f21c584abb0fbc4064de Mon Sep 17 00:00:00 2001 From: Frederic Riss Date: Fri, 31 Jul 2015 20:22:20 +0000 Subject: [PATCH] [dsymutil] Support multiple input files on the command line git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243777 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/dsymutil/X86/multiple-inputs.test | 12 +++++ test/tools/dsymutil/basic-linking.test | 1 + tools/dsymutil/dsymutil.cpp | 56 ++++++++++++-------- 3 files changed, 46 insertions(+), 23 deletions(-) create mode 100644 test/tools/dsymutil/X86/multiple-inputs.test diff --git a/test/tools/dsymutil/X86/multiple-inputs.test b/test/tools/dsymutil/X86/multiple-inputs.test new file mode 100644 index 00000000000..a3b0aa9ed14 --- /dev/null +++ b/test/tools/dsymutil/X86/multiple-inputs.test @@ -0,0 +1,12 @@ +REQUIRES: shell +RUN: cat %p/../Inputs/basic.macho.x86_64 > %t1 +RUN: cat %p/../Inputs/basic-archive.macho.x86_64 > %t2 +RUN: cat %p/../Inputs/basic-lto.macho.x86_64 > %t3 +RUN: cat %p/../Inputs/basic-lto-dw4.macho.x86_64 > %t4 +RUN: llvm-dsymutil -oso-prepend-path=%p/.. %t1 %t2 %t3 %t4 +RUN: llvm-dwarfdump %t1.dwarf \ + | FileCheck %S/basic-linking-x86.test --check-prefix=CHECK --check-prefix=BASIC +RUN: llvm-dwarfdump %t2.dwarf \ + | FileCheck %S/basic-linking-x86.test --check-prefix=CHECK --check-prefix=ARCHIVE +RUN: llvm-dwarfdump %t3.dwarf | FileCheck %S/basic-lto-linking-x86.test +RUN: llvm-dwarfdump %t4.dwarf | FileCheck %S/basic-lto-dw4-linking-x86.test diff --git a/test/tools/dsymutil/basic-linking.test b/test/tools/dsymutil/basic-linking.test index 362df19a024..bff5b5df9e6 100644 --- a/test/tools/dsymutil/basic-linking.test +++ b/test/tools/dsymutil/basic-linking.test @@ -1,6 +1,7 @@ RUN: llvm-dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 | FileCheck %s RUN: llvm-dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic-lto.macho.x86_64 | FileCheck %s --check-prefix=CHECK-LTO RUN: llvm-dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic-archive.macho.x86_64 | FileCheck %s --check-prefix=CHECK-ARCHIVE +RUN: llvm-dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 %p/Inputs/basic-lto.macho.x86_64 %p/Inputs/basic-archive.macho.x86_64 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LTO --check-prefix=CHECK-ARCHIVE This test check the basic Dwarf linking process through the debug dumps. diff --git a/tools/dsymutil/dsymutil.cpp b/tools/dsymutil/dsymutil.cpp index 1d5fb0ff8cf..a473c405ea8 100644 --- a/tools/dsymutil/dsymutil.cpp +++ b/tools/dsymutil/dsymutil.cpp @@ -31,8 +31,8 @@ OptionCategory DsymCategory("Specific Options"); static opt Help("h", desc("Alias for -help"), Hidden); static opt Version("v", desc("Alias for -version"), Hidden); -static opt InputFile(Positional, desc(""), - init("a.out"), cat(DsymCategory)); +static list InputFiles(Positional, OneOrMore, + desc(""), cat(DsymCategory)); static opt OutputFileOpt("o", @@ -90,9 +90,6 @@ int main(int argc, char **argv) { return 0; } - auto DebugMapPtrOrErr = - parseDebugMap(InputFile, OsoPrependPath, Verbose, InputIsYAMLDebugMap); - Options.Verbose = Verbose; Options.NoOutput = NoOutput; Options.NoODR = NoODR; @@ -102,27 +99,40 @@ int main(int argc, char **argv) { llvm::InitializeAllTargets(); llvm::InitializeAllAsmPrinters(); - if (auto EC = DebugMapPtrOrErr.getError()) { - llvm::errs() << "error: cannot parse the debug map for \"" << InputFile - << "\": " << EC.message() << '\n'; + if (InputFiles.size() > 1 && !OutputFileOpt.empty()) { + llvm::errs() << "error: cannot use -o with multiple inputs\n"; return 1; } - if (Verbose || DumpDebugMap) - (*DebugMapPtrOrErr)->print(llvm::outs()); - - if (DumpDebugMap) - return 0; - - std::string OutputFile; - if (OutputFileOpt.empty()) { - if (InputFile == "-") - OutputFile = "a.out.dwarf"; - else - OutputFile = InputFile + ".dwarf"; - } else { - OutputFile = OutputFileOpt; + for (auto &InputFile : InputFiles) { + auto DebugMapPtrOrErr = + parseDebugMap(InputFile, OsoPrependPath, Verbose, InputIsYAMLDebugMap); + + if (auto EC = DebugMapPtrOrErr.getError()) { + llvm::errs() << "error: cannot parse the debug map for \"" << InputFile + << "\": " << EC.message() << '\n'; + return 1; + } + + if (Verbose || DumpDebugMap) + (*DebugMapPtrOrErr)->print(llvm::outs()); + + if (DumpDebugMap) + continue; + + std::string OutputFile; + if (OutputFileOpt.empty()) { + if (InputFile == "-") + OutputFile = "a.out.dwarf"; + else + OutputFile = InputFile + ".dwarf"; + } else { + OutputFile = OutputFileOpt; + } + + if (!linkDwarf(OutputFile, **DebugMapPtrOrErr, Options)) + return 1; } - return !linkDwarf(OutputFile, **DebugMapPtrOrErr, Options); + return 0; } -- 2.34.1