<div dir="ltr"><div dir="ltr">Hi Matthew,<div><br></div><div>A recent change (I strongly suspect it was this change) has broken the -disable-output flag for llvm-dis: it now (sometimes) creates the output file, but leaves it empty, when that flag is passed. This breaks two tests if the source tree is checked out into a read-only filesystem. Please can you take a look?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 14 Nov 2019 at 10:42, Matthew Voss via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Matthew Voss<br>
Date: 2019-11-14T10:40:41-08:00<br>
New Revision: 141bb5f308fa108045400622889a21a12c4ed41c<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/141bb5f308fa108045400622889a21a12c4ed41c" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/141bb5f308fa108045400622889a21a12c4ed41c</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/141bb5f308fa108045400622889a21a12c4ed41c.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/141bb5f308fa108045400622889a21a12c4ed41c.diff</a><br>
<br>
LOG: Add support for multi-module bitcode files to llvm-dis<br>
<br>
Summary:<br>
This change allows llvm-dis to disassemble multi-module bitcode<br>
files, including the associated module summary.<br>
<br>
Reviewers: tejohnson, pcc, mehdi_amini<br>
<br>
Subscribers: llvm-commits<br>
<br>
Tags: #llvm<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D70153" rel="noreferrer" target="_blank">https://reviews.llvm.org/D70153</a><br>
<br>
Added: <br>
    llvm/test/Assembler/multi-mod-disassemble.ll<br>
    llvm/test/Assembler/multi-summary-disassemble.ll<br>
<br>
Modified: <br>
    llvm/test/Bitcode/invalid.test<br>
    llvm/test/Bitcode/multi-module.ll<br>
    llvm/tools/llvm-dis/llvm-dis.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/test/Assembler/multi-mod-disassemble.ll b/llvm/test/Assembler/multi-mod-disassemble.ll<br>
new file mode 100644<br>
index 000000000000..58773b644572<br>
--- /dev/null<br>
+++ b/llvm/test/Assembler/multi-mod-disassemble.ll<br>
@@ -0,0 +1,15 @@<br>
+; RUN: llvm-as %s -o %t.o<br>
+; RUN: llvm-cat -b -o %t2.o %t.o %t.o<br>
+; RUN: llvm-dis -o %t3 %t2.o<br>
+; RUN: llvm-as -o %t4.o %t3.0<br>
+; RUN: llvm-as -o %t5.o %t3.1<br>
+; RUN: cmp %t4.o %t5.o<br>
+; RUN: llvm-cat -b -o %t6.o %t5.o %t4.o<br>
+; RUN: llvm-dis -o %t7.o %t6.o<br>
+; RUN: <br>
diff  %t7.o.0 %t7.o.1<br>
+; RUN: FileCheck < %t7.o.0 %s<br>
+; RUN: FileCheck < %t7.o.1 %s<br>
+<br>
+; CHECK: source_filename = "{{.*}}multi-mod-disassemble.ll"<br>
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-unknown-linux-gnu"<br>
<br>
diff  --git a/llvm/test/Assembler/multi-summary-disassemble.ll b/llvm/test/Assembler/multi-summary-disassemble.ll<br>
new file mode 100644<br>
index 000000000000..d49ca35beece<br>
--- /dev/null<br>
+++ b/llvm/test/Assembler/multi-summary-disassemble.ll<br>
@@ -0,0 +1,18 @@<br>
+; RUN: llvm-as %s -o %t.o<br>
+; RUN: llvm-cat -b -o %t2.o %t.o %t.o<br>
+; RUN: llvm-dis -o %t3 %t2.o<br>
+; RUN: llvm-as -o %t4.o %t3.0<br>
+; RUN: llvm-as -o %t5.o %t3.1<br>
+; RUN: cmp %t4.o %t5.o<br>
+; RUN: llvm-cat -b -o %t6.o %t5.o %t4.o<br>
+; RUN: llvm-dis -o %t7.o %t6.o<br>
+; RUN: <br>
diff  %t7.o.0 %t7.o.1<br>
+; RUN: FileCheck < %t7.o.0 %s<br>
+; RUN: FileCheck < %t7.o.1 %s<br>
+<br>
+; ModuleID = 'multi-summary-disassemble.o'<br>
+<br>
+^0 = module: (path: "multi-summary-disassemble.ll", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))<br>
+^1 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, notEligibleToImport: 0, live: 0, dsoLocal: 1), insts: 1)))<br>
+; CHECK: ^0 = module: (path:<br>
+; CHECK: ^1 = gv: (guid: 3, summaries: (function: (module: ^0,<br>
<br>
diff  --git a/llvm/test/Bitcode/invalid.test b/llvm/test/Bitcode/invalid.test<br>
index d1f9d7c08745..8260ac862576 100644<br>
--- a/llvm/test/Bitcode/invalid.test<br>
+++ b/llvm/test/Bitcode/invalid.test<br>
@@ -66,11 +66,6 @@ INSERT-ARRAY: INSERTVAL: Invalid array index<br>
 INSERT-STRUCT: INSERTVAL: Invalid struct index<br>
 INSERT-IDXS: INSERTVAL: Invalid type<br>
<br>
-RUN: not llvm-dis -disable-output %p/Inputs/invalid-no-proper-module.bc 2>&1 | \<br>
-RUN:   FileCheck --check-prefix=NO-MODULE %s<br>
-<br>
-NO-MODULE: Expected a single module<br>
-<br>
 RUN: not llvm-dis -disable-output %p/Inputs/invalid-fp-shift.bc 2>&1 | \<br>
 RUN:   FileCheck --check-prefix=FP-SHIFT %s<br>
<br>
<br>
diff  --git a/llvm/test/Bitcode/multi-module.ll b/llvm/test/Bitcode/multi-module.ll<br>
index 5f73240e8a02..b320bf1bfd32 100644<br>
--- a/llvm/test/Bitcode/multi-module.ll<br>
+++ b/llvm/test/Bitcode/multi-module.ll<br>
@@ -1,6 +1,4 @@<br>
 ; RUN: llvm-cat -o %t %s %S/Inputs/multi-module.ll<br>
-; RUN: not llvm-dis -o - %t 2>&1 | FileCheck --check-prefix=ERROR %s<br>
-; ERROR: Expected a single module<br>
<br>
 ; RUN: llvm-bcanalyzer -dump %t | FileCheck --check-prefix=BCA %s<br>
<br>
@@ -10,18 +8,15 @@<br>
 ; RUN: llvm-as -o %t1 %s<br>
 ; RUN: llvm-as -o %t2 %S/Inputs/multi-module.ll<br>
 ; RUN: llvm-cat -o %t %t1 %t2<br>
-; RUN: not llvm-dis -o - %t 2>&1 | FileCheck --check-prefix=ERROR %s<br>
 ; RUN: llvm-bcanalyzer -dump %t | FileCheck --check-prefix=BCA %s<br>
<br>
 ; RUN: llvm-cat -b -o %t %t1 %t2<br>
-; RUN: not llvm-dis -o - %t 2>&1 | FileCheck --check-prefix=ERROR %s<br>
 ; RUN: llvm-bcanalyzer -dump %t | FileCheck --check-prefix=BCA %s<br>
<br>
 ; RUN: llvm-modextract -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=IR1 %s<br>
 ; RUN: llvm-modextract -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=IR2 %s<br>
<br>
 ; RUN: llvm-cat -b -o %t3 %t %t<br>
-; RUN: not llvm-dis -o - %t3 2>&1 | FileCheck --check-prefix=ERROR %s<br>
 ; RUN: llvm-bcanalyzer -dump %t3 | FileCheck --check-prefix=BCA4 %s<br>
<br>
 ; RUN: llvm-modextract -n 0 -o - %t3 | llvm-dis | FileCheck --check-prefix=IR1 %s<br>
<br>
diff  --git a/llvm/tools/llvm-dis/llvm-dis.cpp b/llvm/tools/llvm-dis/llvm-dis.cpp<br>
index d66299cbf767..a0d9996da860 100644<br>
--- a/llvm/tools/llvm-dis/llvm-dis.cpp<br>
+++ b/llvm/tools/llvm-dis/llvm-dis.cpp<br>
@@ -158,53 +158,71 @@ int main(int argc, char **argv) {<br>
<br>
   std::unique_ptr<MemoryBuffer> MB =<br>
       ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFilename)));<br>
-  std::unique_ptr<Module> M = ExitOnErr(getLazyBitcodeModule(<br>
-      *MB, Context, /*ShouldLazyLoadMetadata=*/true, SetImporting));<br>
-  if (MaterializeMetadata)<br>
-    ExitOnErr(M->materializeMetadata());<br>
-  else<br>
-    ExitOnErr(M->materializeAll());<br>
-<br>
-  BitcodeLTOInfo LTOInfo = ExitOnErr(getBitcodeLTOInfo(*MB));<br>
-  std::unique_ptr<ModuleSummaryIndex> Index;<br>
-  if (LTOInfo.HasSummary)<br>
-    Index = ExitOnErr(getModuleSummaryIndex(*MB));<br>
-<br>
-  // Just use stdout.  We won't actually print anything on it.<br>
-  if (DontPrint)<br>
-    OutputFilename = "-";<br>
-<br>
-  if (OutputFilename.empty()) { // Unspecified output, infer it.<br>
-    if (InputFilename == "-") {<br>
-      OutputFilename = "-";<br>
+<br>
+  BitcodeFileContents IF = ExitOnErr(llvm::getBitcodeFileContents(*MB));<br>
+<br>
+  const size_t N = IF.Mods.size();<br>
+<br>
+  if (OutputFilename == "-" && N > 1)<br>
+      errs() << "only single module bitcode files can be written to stdout\n";<br>
+<br>
+  for (size_t i = 0; i < N; ++i) {<br>
+    BitcodeModule MB = IF.Mods[i];<br>
+    std::unique_ptr<Module> M = ExitOnErr(MB.getLazyModule(Context, MaterializeMetadata,<br>
+                                          SetImporting));<br>
+    if (MaterializeMetadata)<br>
+      ExitOnErr(M->materializeMetadata());<br>
+    else<br>
+      ExitOnErr(M->materializeAll());<br>
+<br>
+    BitcodeLTOInfo LTOInfo = ExitOnErr(MB.getLTOInfo());<br>
+    std::unique_ptr<ModuleSummaryIndex> Index;<br>
+    if (LTOInfo.HasSummary)<br>
+      Index = ExitOnErr(MB.getSummary());<br>
+<br>
+    std::string FinalFilename(OutputFilename);<br>
+<br>
+    // Just use stdout.  We won't actually print anything on it.<br>
+    if (DontPrint)<br>
+      FinalFilename = "-";<br>
+<br>
+    if (OutputFilename.empty()) { // Unspecified output, infer it.<br>
+      if (InputFilename == "-") {<br>
+        FinalFilename = "-";<br>
+      } else {<br>
+        StringRef IFN = InputFilename;<br>
+        FinalFilename = (IFN.endswith(".bc") ? IFN.drop_back(3) : IFN).str();<br>
+        if (N > 1)<br>
+          FinalFilename += std::string(".") + std::to_string(i);<br>
+        FinalFilename += ".ll";<br>
+      }<br>
     } else {<br>
-      StringRef IFN = InputFilename;<br>
-      OutputFilename = (IFN.endswith(".bc") ? IFN.drop_back(3) : IFN).str();<br>
-      OutputFilename += ".ll";<br>
+      if (N > 1)<br>
+        FinalFilename += std::string(".") + std::to_string(i);<br>
     }<br>
-  }<br>
<br>
-  std::error_code EC;<br>
-  std::unique_ptr<ToolOutputFile> Out(<br>
-      new ToolOutputFile(OutputFilename, EC, sys::fs::OF_Text));<br>
-  if (EC) {<br>
-    errs() << EC.message() << '\n';<br>
-    return 1;<br>
-  }<br>
+    std::error_code EC;<br>
+    std::unique_ptr<ToolOutputFile> Out(<br>
+        new ToolOutputFile(FinalFilename, EC, sys::fs::OF_Text));<br>
+    if (EC) {<br>
+      errs() << EC.message() << '\n';<br>
+      return 1;<br>
+    }<br>
<br>
-  std::unique_ptr<AssemblyAnnotationWriter> Annotator;<br>
-  if (ShowAnnotations)<br>
-    Annotator.reset(new CommentWriter());<br>
+    std::unique_ptr<AssemblyAnnotationWriter> Annotator;<br>
+    if (ShowAnnotations)<br>
+      Annotator.reset(new CommentWriter());<br>
<br>
-  // All that llvm-dis does is write the assembly to a file.<br>
-  if (!DontPrint) {<br>
-    M->print(Out->os(), Annotator.get(), PreserveAssemblyUseListOrder);<br>
-    if (Index)<br>
-      Index->print(Out->os());<br>
-  }<br>
+    // All that llvm-dis does is write the assembly to a file.<br>
+    if (!DontPrint) {<br>
+      M->print(Out->os(), Annotator.get(), PreserveAssemblyUseListOrder);<br>
+      if (Index)<br>
+        Index->print(Out->os());<br>
+    }<br>
<br>
-  // Declare success.<br>
-  Out->keep();<br>
+    // Declare success.<br>
+    Out->keep();<br>
+  }<br>
<br>
   return 0;<br>
 }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>