aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-readobj/llvm-readobj.cpp
diff options
context:
space:
mode:
authorGeorgii Rymar <grimar@accesssoftek.com>2021-01-28 13:28:55 +0300
committerGeorgii Rymar <grimar@accesssoftek.com>2021-01-29 12:04:41 +0300
commita5154ab9b0c162cadea70d870884a70032c747c1 (patch)
tree82f375aa5ba2b2207cecf9b335908ea46a0eb6cb /llvm/tools/llvm-readobj/llvm-readobj.cpp
parent4ad41f1daf0fa98a2c23fdf57390df0948164a2f (diff)
downloadllvm-a5154ab9b0c162cadea70d870884a70032c747c1.zip
llvm-a5154ab9b0c162cadea70d870884a70032c747c1.tar.gz
llvm-a5154ab9b0c162cadea70d870884a70032c747c1.tar.bz2
[llvm-readobj/elf] - Report "bitcode files are not supported" warning for bitcode files.
Fixes https://bugs.llvm.org/show_bug.cgi?id=43543 Currently we report "The file was not recognized as a valid object file" for BC files. Also, we terminate dumping. Instead we could report a better warning and try to continue dumping other files. This is what this patch implements. Differential revision: https://reviews.llvm.org/D95605
Diffstat (limited to 'llvm/tools/llvm-readobj/llvm-readobj.cpp')
-rw-r--r--llvm/tools/llvm-readobj/llvm-readobj.cpp35
1 files changed, 25 insertions, 10 deletions
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index 41cd441..841313e 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp
@@ -646,28 +646,43 @@ static void dumpWindowsResourceFile(WindowsResource *WinRes,
/// Opens \a File and dumps it.
static void dumpInput(StringRef File, ScopedPrinter &Writer) {
- // Attempt to open the binary.
- Expected<OwningBinary<Binary>> BinaryOrErr =
- createBinary(File, /*Context=*/nullptr, /*InitContent=*/false);
+ ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
+ MemoryBuffer::getFileOrSTDIN(File, /*FileSize=*/-1,
+ /*RequiresNullTerminator=*/false);
+ if (std::error_code EC = FileOrErr.getError())
+ return reportError(errorCodeToError(EC), File);
+
+ std::unique_ptr<MemoryBuffer> &Buffer = FileOrErr.get();
+ file_magic Type = identify_magic(Buffer->getBuffer());
+ if (Type == file_magic::bitcode) {
+ reportWarning(createStringError(errc::invalid_argument,
+ "bitcode files are not supported"),
+ File);
+ return;
+ }
+
+ Expected<std::unique_ptr<Binary>> BinaryOrErr = createBinary(
+ Buffer->getMemBufferRef(), /*Context=*/nullptr, /*InitContent=*/false);
if (!BinaryOrErr)
reportError(BinaryOrErr.takeError(), File);
- Binary &Binary = *BinaryOrErr.get().getBinary();
- if (Archive *Arc = dyn_cast<Archive>(&Binary))
+ std::unique_ptr<Binary> Bin = std::move(*BinaryOrErr);
+ if (Archive *Arc = dyn_cast<Archive>(Bin.get()))
dumpArchive(Arc, Writer);
else if (MachOUniversalBinary *UBinary =
- dyn_cast<MachOUniversalBinary>(&Binary))
+ dyn_cast<MachOUniversalBinary>(Bin.get()))
dumpMachOUniversalBinary(UBinary, Writer);
- else if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary))
+ else if (ObjectFile *Obj = dyn_cast<ObjectFile>(Bin.get()))
dumpObject(*Obj, Writer);
- else if (COFFImportFile *Import = dyn_cast<COFFImportFile>(&Binary))
+ else if (COFFImportFile *Import = dyn_cast<COFFImportFile>(Bin.get()))
dumpCOFFImportFile(Import, Writer);
- else if (WindowsResource *WinRes = dyn_cast<WindowsResource>(&Binary))
+ else if (WindowsResource *WinRes = dyn_cast<WindowsResource>(Bin.get()))
dumpWindowsResourceFile(WinRes, Writer);
else
llvm_unreachable("unrecognized file type");
- CVTypes.Binaries.push_back(std::move(*BinaryOrErr));
+ CVTypes.Binaries.push_back(
+ OwningBinary<Binary>(std::move(Bin), std::move(Buffer)));
}
/// Registers aliases that should only be allowed by readobj.