diff options
author | Georgii Rymar <grimar@accesssoftek.com> | 2021-01-28 13:28:55 +0300 |
---|---|---|
committer | Georgii Rymar <grimar@accesssoftek.com> | 2021-01-29 12:04:41 +0300 |
commit | a5154ab9b0c162cadea70d870884a70032c747c1 (patch) | |
tree | 82f375aa5ba2b2207cecf9b335908ea46a0eb6cb /llvm/tools/llvm-readobj/llvm-readobj.cpp | |
parent | 4ad41f1daf0fa98a2c23fdf57390df0948164a2f (diff) | |
download | llvm-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.cpp | 35 |
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. |