[llvm] r363198 - [llvm-readobj] Fix output interleaving issue caused by using multiple streams at the same time.
Jordan Rupprecht via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 12 13:16:22 PDT 2019
Author: rupprecht
Date: Wed Jun 12 13:16:22 2019
New Revision: 363198
URL: http://llvm.org/viewvc/llvm-project?rev=363198&view=rev
Log:
[llvm-readobj] Fix output interleaving issue caused by using multiple streams at the same time.
Summary:
Use llvm::fouts() as the default stream for outputing. No new stream
should be constructed to output at the same time.
https://bugs.llvm.org/show_bug.cgi?id=42140
Reviewers: jhenderson, grimar, MaskRay, phosek, rupprecht
Reviewed By: rupprecht
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D63115
Patch by Yuanfang Chen!
Added:
llvm/trunk/test/tools/llvm-readobj/check-output-order.test
Modified:
llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
llvm/trunk/tools/llvm-readobj/MachODumper.cpp
llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
Added: llvm/trunk/test/tools/llvm-readobj/check-output-order.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/check-output-order.test?rev=363198&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/check-output-order.test (added)
+++ llvm/trunk/test/tools/llvm-readobj/check-output-order.test Wed Jun 12 13:16:22 2019
@@ -0,0 +1,45 @@
+## This test checks that `--all --needed-libs` output is the same as the
+## printing order in code. One common reason the output could become
+## out-of-order is when more than one stream are printing at the same time.
+## https://bugs.llvm.org/show_bug.cgi?id=42140
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf --all --needed-libs %t | FileCheck %s
+
+# CHECK: ELF Header
+# CHECK: Section header string table index
+# CHECK: There are 5 section headers, starting at offset
+# CHECK: Section Headers:
+# CHECK: O (extra OS processing required) o (OS specific), p (processor specific)
+# CHECK: There are no relocations in this file.
+# CHECK: Symbol table '.symtab' contains 1 entries
+# CHECK: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
+# CHECK: Dynamic section at offset
+# CHECK: 0x0000000000000000 (NULL) 0x0
+# CHECK: NeededLibraries [
+# CHECK: ]
+# CHECK: Elf file type is DYN (Shared object file)
+# CHECK: Entry point 0x0
+# CHECK: There are 1 program headers, starting at offset 64
+# CHECK: DYNAMIC
+# CHECK: Section to Segment mapping:
+# CHECK: None .symtab .strtab .shstrtab
+# CHECK: There are no section groups in this file.
+
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_DYN
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_NULL
+ Value: 0
+ProgramHeaders:
+ - Type: PT_DYNAMIC
+ Sections:
+ - Section: .dynamic
Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=363198&r1=363197&r2=363198&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Wed Jun 12 13:16:22 2019
@@ -1565,7 +1565,7 @@ void COFFDumper::printNeededLibraries()
llvm::stable_sort(Libs);
for (const auto &L : Libs) {
- outs() << " " << L << "\n";
+ W.startLine() << L << "\n";
}
}
Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=363198&r1=363197&r2=363198&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Wed Jun 12 13:16:22 2019
@@ -382,13 +382,16 @@ private:
};
template <typename ELFT> class GNUStyle : public DumpStyle<ELFT> {
- formatted_raw_ostream OS;
+ formatted_raw_ostream &OS;
public:
TYPEDEF_ELF_TYPES(ELFT)
GNUStyle(ScopedPrinter &W, ELFDumper<ELFT> *Dumper)
- : DumpStyle<ELFT>(Dumper), OS(W.getOStream()) {}
+ : DumpStyle<ELFT>(Dumper),
+ OS(static_cast<formatted_raw_ostream&>(W.getOStream())) {
+ assert (&W.getOStream() == &llvm::fouts());
+ }
void printFileHeaders(const ELFO *Obj) override;
void printGroupSections(const ELFFile<ELFT> *Obj) override;
Modified: llvm/trunk/tools/llvm-readobj/MachODumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/MachODumper.cpp?rev=363198&r1=363197&r2=363198&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/MachODumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/MachODumper.cpp Wed Jun 12 13:16:22 2019
@@ -689,7 +689,7 @@ void MachODumper::printNeededLibraries()
llvm::stable_sort(Libs);
for (const auto &L : Libs) {
- outs() << " " << L << "\n";
+ W.startLine() << L << "\n";
}
}
Modified: llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp?rev=363198&r1=363197&r2=363198&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp Wed Jun 12 13:16:22 2019
@@ -615,8 +615,8 @@ static void dumpMachOUniversalBinary(con
}
/// Dumps \a WinRes, Windows Resource (.res) file;
-static void dumpWindowsResourceFile(WindowsResource *WinRes) {
- ScopedPrinter Printer{outs()};
+static void dumpWindowsResourceFile(WindowsResource *WinRes,
+ ScopedPrinter &Printer) {
WindowsRes::Dumper Dumper(WinRes, Printer);
if (auto Err = Dumper.printData())
reportError(WinRes->getFileName(), std::move(Err));
@@ -624,9 +624,7 @@ static void dumpWindowsResourceFile(Wind
/// Opens \a File and dumps it.
-static void dumpInput(StringRef File) {
- ScopedPrinter Writer(outs());
-
+static void dumpInput(StringRef File, ScopedPrinter &Writer) {
// Attempt to open the binary.
Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(File);
if (!BinaryOrErr)
@@ -643,7 +641,7 @@ static void dumpInput(StringRef File) {
else if (COFFImportFile *Import = dyn_cast<COFFImportFile>(&Binary))
dumpCOFFImportFile(Import, Writer);
else if (WindowsResource *WinRes = dyn_cast<WindowsResource>(&Binary))
- dumpWindowsResourceFile(WinRes);
+ dumpWindowsResourceFile(WinRes, Writer);
else
reportError(File, readobj_error::unrecognized_file_format);
@@ -733,15 +731,16 @@ int main(int argc, const char *argv[]) {
if (opts::InputFilenames.empty())
opts::InputFilenames.push_back("-");
- llvm::for_each(opts::InputFilenames, dumpInput);
+ ScopedPrinter Writer(fouts());
+ for (const std::string &I : opts::InputFilenames)
+ dumpInput(I, Writer);
if (opts::CodeViewMergedTypes) {
- ScopedPrinter W(outs());
if (opts::CodeViewEnableGHash)
- dumpCodeViewMergedTypes(W, CVTypes.GlobalIDTable.records(),
+ dumpCodeViewMergedTypes(Writer, CVTypes.GlobalIDTable.records(),
CVTypes.GlobalTypeTable.records());
else
- dumpCodeViewMergedTypes(W, CVTypes.IDTable.records(),
+ dumpCodeViewMergedTypes(Writer, CVTypes.IDTable.records(),
CVTypes.TypeTable.records());
}
More information about the llvm-commits
mailing list