X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FPath.cpp;h=e5b7cd3bfbc233f78ddccbbf7f586b9a50fd81d2;hb=317eaf19937813d630166bfec7b933a98ea89aa5;hp=3e0ee8dd86d07abd9d3ec6171d5e47b3ba9f8d4b;hpb=4213618088b0c0c85b208a01b45d89972984831b;p=oota-llvm.git diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp index 3e0ee8dd86d..e5b7cd3bfbc 100644 --- a/lib/Support/Path.cpp +++ b/lib/Support/Path.cpp @@ -12,12 +12,18 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/Path.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Config/config.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/Endian.h" #include #include #include using namespace llvm; using namespace sys; +namespace { +using support::ulittle32_t; +} //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system @@ -86,15 +92,21 @@ sys::IdentifyFileType(const char *magic, unsigned length) { } break; + // The two magic numbers for mach-o are: + // 0xfeedface - 32-bit mach-o + // 0xfeedfacf - 64-bit mach-o case 0xFE: - case 0xCE: { + case 0xCE: + case 0xCF: { uint16_t type = 0; if (magic[0] == char(0xFE) && magic[1] == char(0xED) && - magic[2] == char(0xFA) && magic[3] == char(0xCE)) { + magic[2] == char(0xFA) && + (magic[3] == char(0xCE) || magic[3] == char(0xCF))) { /* Native endian */ if (length >= 16) type = magic[14] << 8 | magic[15]; - } else if (magic[0] == char(0xCE) && magic[1] == char(0xFA) && - magic[2] == char(0xED) && magic[3] == char(0xFE)) { + } else if ((magic[0] == char(0xCE) || magic[0] == char(0xCF)) && + magic[1] == char(0xFA) && magic[2] == char(0xED) && + magic[3] == char(0xFE)) { /* Reverse endian */ if (length >= 14) type = magic[13] << 8 | magic[12]; } @@ -109,7 +121,7 @@ sys::IdentifyFileType(const char *magic, unsigned length) { case 7: return Mach_O_DynamicLinker_FileType; case 8: return Mach_O_Bundle_FileType; case 9: return Mach_O_DynamicallyLinkedSharedLibStub_FileType; - case 10: break; // FIXME: MH_DSYM companion file with only debug. + case 10: return Mach_O_DSYMCompanion_FileType; } break; } @@ -127,6 +139,16 @@ sys::IdentifyFileType(const char *magic, unsigned length) { if (magic[1] == 0x02) return COFF_FileType; break; + + case 0x4d: // Possible MS-DOS stub on Windows PE file + if (magic[1] == 0x5a) { + uint32_t off = *reinterpret_cast(magic + 0x3c); + // PE/COFF file, either EXE or DLL. + if (off < length && memcmp(magic + off, "PE\0\0",4) == 0) + return COFF_FileType; + } + break; + case 0x64: // x86-64 Windows. if (magic[1] == char(0x86)) return COFF_FileType; @@ -140,42 +162,33 @@ sys::IdentifyFileType(const char *magic, unsigned length) { bool Path::isArchive() const { - std::string Magic; - if (getMagicNumber(Magic, 8)) - if (IdentifyFileType(Magic.c_str(), Magic.length()) == Archive_FileType) - return true; - return false; + LLVMFileType type; + if (fs::identify_magic(str(), type)) + return false; + return type == Archive_FileType; } bool Path::isDynamicLibrary() const { - std::string Magic; - if (getMagicNumber(Magic, 64)) - switch (IdentifyFileType(Magic.c_str(), - static_cast(Magic.length()))) { - default: return false; - case Mach_O_FixedVirtualMemorySharedLib_FileType: - case Mach_O_DynamicallyLinkedSharedLib_FileType: - case Mach_O_DynamicallyLinkedSharedLibStub_FileType: - case ELF_SharedObject_FileType: - case COFF_FileType: return true; - } - - return false; + LLVMFileType type; + if (fs::identify_magic(str(), type)) + return false; + switch (type) { + default: return false; + case Mach_O_FixedVirtualMemorySharedLib_FileType: + case Mach_O_DynamicallyLinkedSharedLib_FileType: + case Mach_O_DynamicallyLinkedSharedLibStub_FileType: + case ELF_SharedObject_FileType: + case COFF_FileType: return true; + } } bool Path::isObjectFile() const { - std::string Magic; - if (getMagicNumber(Magic, 64)) - if (IdentifyFileType(Magic.c_str(), - static_cast(Magic.length())) - != Unknown_FileType) { - // Everything in LLVMFileType is currently an object file. - return true; - } - - return false; + LLVMFileType type; + if (fs::identify_magic(str(), type) || type == Unknown_FileType) + return false; + return true; } Path @@ -209,13 +222,10 @@ Path::appendSuffix(StringRef suffix) { bool Path::isBitcodeFile() const { - std::string actualMagic; - if (!getMagicNumber(actualMagic, 4)) + LLVMFileType type; + if (fs::identify_magic(str(), type)) return false; - LLVMFileType FT = - IdentifyFileType(actualMagic.c_str(), - static_cast(actualMagic.length())); - return FT == Bitcode_FileType; + return type == Bitcode_FileType; } bool Path::hasMagicNumber(StringRef Magic) const {