diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-30 16:33:32 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-30 16:33:32 +0000 |
| commit | 51315c45ff5643a27f9c84b816db54ee870ba29b (patch) | |
| tree | 1d87443fa0e53d3e6b315ce25787e64be0906bf7 /contrib/llvm/lib/BinaryFormat/Magic.cpp | |
| parent | 6dfd050075216be8538ae375a22d30db72916f7e (diff) | |
| parent | eb11fae6d08f479c0799db45860a98af528fa6e7 (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/BinaryFormat/Magic.cpp')
| -rw-r--r-- | contrib/llvm/lib/BinaryFormat/Magic.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/contrib/llvm/lib/BinaryFormat/Magic.cpp b/contrib/llvm/lib/BinaryFormat/Magic.cpp index 42546eaa732b..5a339583fca1 100644 --- a/contrib/llvm/lib/BinaryFormat/Magic.cpp +++ b/contrib/llvm/lib/BinaryFormat/Magic.cpp @@ -14,6 +14,7 @@ #include "llvm/BinaryFormat/MachO.h" #include "llvm/Support/Endian.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/MemoryBuffer.h" #if !defined(_MSC_VER) && !defined(__MINGW32__) #include <unistd.h> @@ -30,7 +31,7 @@ static bool startswith(StringRef Magic, const char (&S)[N]) { return Magic.startswith(StringRef(S, N - 1)); } -/// @brief Identify the magic in magic. +/// Identify the magic in magic. file_magic llvm::identify_magic(StringRef Magic) { if (Magic.size() < 4) return file_magic::unknown; @@ -181,7 +182,7 @@ file_magic llvm::identify_magic(StringRef Magic) { return file_magic::coff_object; break; - case 'M': // Possible MS-DOS stub on Windows PE file + case 'M': // Possible MS-DOS stub on Windows PE file or MSF/PDB file. if (startswith(Magic, "MZ") && Magic.size() >= 0x3c + 4) { uint32_t off = read32le(Magic.data() + 0x3c); // PE/COFF file, either EXE or DLL. @@ -189,6 +190,8 @@ file_magic llvm::identify_magic(StringRef Magic) { StringRef(COFF::PEMagic, sizeof(COFF::PEMagic)))) return file_magic::pecoff_executable; } + if (Magic.startswith("Microsoft C/C++ MSF 7.00\r\n")) + return file_magic::pdb; break; case 0x64: // x86-64 or ARM64 Windows. @@ -203,15 +206,12 @@ file_magic llvm::identify_magic(StringRef Magic) { } std::error_code llvm::identify_magic(const Twine &Path, file_magic &Result) { - int FD; - if (std::error_code EC = openFileForRead(Path, FD)) - return EC; + auto FileOrError = MemoryBuffer::getFile(Path); + if (!FileOrError) + return FileOrError.getError(); - char Buffer[32]; - int Length = read(FD, Buffer, sizeof(Buffer)); - if (close(FD) != 0 || Length < 0) - return std::error_code(errno, std::generic_category()); + std::unique_ptr<MemoryBuffer> FileBuffer = std::move(*FileOrError); + Result = identify_magic(FileBuffer->getBuffer()); - Result = identify_magic(StringRef(Buffer, Length)); return std::error_code(); } |
