diff options
author | Zachary Turner <zturner@google.com> | 2017-06-07 03:48:56 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2017-06-07 03:48:56 +0000 |
commit | 264b5d9e8817fce8c47d2b06aba2d9244e426794 (patch) | |
tree | 234a31fd342ebd5f14a17da05bc7c3ca92cf25f1 /llvm/lib/Support | |
parent | b4b16556e348ef42e69aff3c9f4332afc8fae67b (diff) | |
download | bcm5719-llvm-264b5d9e8817fce8c47d2b06aba2d9244e426794.tar.gz bcm5719-llvm-264b5d9e8817fce8c47d2b06aba2d9244e426794.zip |
Move Object format code to lib/BinaryFormat.
This creates a new library called BinaryFormat that has all of
the headers from llvm/Support containing structure and layout
definitions for various types of binary formats like dwarf, coff,
elf, etc as well as the code for identifying a file from its
magic.
Differential Revision: https://reviews.llvm.org/D33843
llvm-svn: 304864
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r-- | llvm/lib/Support/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/Support/Dwarf.cpp | 541 | ||||
-rw-r--r-- | llvm/lib/Support/Path.cpp | 176 |
3 files changed, 2 insertions, 716 deletions
diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index 11c2a6bcf26..0a8e3897cce 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -58,7 +58,6 @@ add_llvm_library(LLVMSupport DebugCounter.cpp DeltaAlgorithm.cpp DAGDeltaAlgorithm.cpp - Dwarf.cpp Error.cpp ErrorHandling.cpp FileUtilities.cpp diff --git a/llvm/lib/Support/Dwarf.cpp b/llvm/lib/Support/Dwarf.cpp deleted file mode 100644 index 200546857de..00000000000 --- a/llvm/lib/Support/Dwarf.cpp +++ /dev/null @@ -1,541 +0,0 @@ -//===-- llvm/Support/Dwarf.cpp - Dwarf Framework ----------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains support for generic dwarf information. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/Dwarf.h" -#include "llvm/ADT/StringSwitch.h" -#include "llvm/Support/ErrorHandling.h" - -using namespace llvm; -using namespace dwarf; - -StringRef llvm::dwarf::TagString(unsigned Tag) { - switch (Tag) { - default: - return StringRef(); -#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \ - case DW_TAG_##NAME: \ - return "DW_TAG_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::getTag(StringRef TagString) { - return StringSwitch<unsigned>(TagString) -#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \ - .Case("DW_TAG_" #NAME, DW_TAG_##NAME) -#include "llvm/Support/Dwarf.def" - .Default(DW_TAG_invalid); -} - -unsigned llvm::dwarf::TagVersion(dwarf::Tag Tag) { - switch (Tag) { - default: - return 0; -#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \ - case DW_TAG_##NAME: \ - return VERSION; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::TagVendor(dwarf::Tag Tag) { - switch (Tag) { - default: - return 0; -#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \ - case DW_TAG_##NAME: \ - return DWARF_VENDOR_##VENDOR; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::ChildrenString(unsigned Children) { - switch (Children) { - case DW_CHILDREN_no: return "DW_CHILDREN_no"; - case DW_CHILDREN_yes: return "DW_CHILDREN_yes"; - } - return StringRef(); -} - -StringRef llvm::dwarf::AttributeString(unsigned Attribute) { - switch (Attribute) { - default: - return StringRef(); -#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ - case DW_AT_##NAME: \ - return "DW_AT_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::AttributeVersion(dwarf::Attribute Attribute) { - switch (Attribute) { - default: - return 0; -#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ - case DW_AT_##NAME: \ - return VERSION; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::AttributeVendor(dwarf::Attribute Attribute) { - switch (Attribute) { - default: - return 0; -#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ - case DW_AT_##NAME: \ - return DWARF_VENDOR_##VENDOR; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::FormEncodingString(unsigned Encoding) { - switch (Encoding) { - default: - return StringRef(); -#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ - case DW_FORM_##NAME: \ - return "DW_FORM_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::FormVersion(dwarf::Form Form) { - switch (Form) { - default: - return 0; -#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ - case DW_FORM_##NAME: \ - return VERSION; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::FormVendor(dwarf::Form Form) { - switch (Form) { - default: - return 0; -#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ - case DW_FORM_##NAME: \ - return DWARF_VENDOR_##VENDOR; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) { - switch (Encoding) { - default: - return StringRef(); -#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ - case DW_OP_##NAME: \ - return "DW_OP_" #NAME; -#include "llvm/Support/Dwarf.def" - case DW_OP_LLVM_fragment: - return "DW_OP_LLVM_fragment"; - } -} - -unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) { - return StringSwitch<unsigned>(OperationEncodingString) -#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ - .Case("DW_OP_" #NAME, DW_OP_##NAME) -#include "llvm/Support/Dwarf.def" - .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment) - .Default(0); -} - -unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) { - switch (Op) { - default: - return 0; -#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ - case DW_OP_##NAME: \ - return VERSION; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) { - switch (Op) { - default: - return 0; -#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ - case DW_OP_##NAME: \ - return DWARF_VENDOR_##VENDOR; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) { - switch (Encoding) { - default: - return StringRef(); -#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ - case DW_ATE_##NAME: \ - return "DW_ATE_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) { - return StringSwitch<unsigned>(EncodingString) -#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ - .Case("DW_ATE_" #NAME, DW_ATE_##NAME) -#include "llvm/Support/Dwarf.def" - .Default(0); -} - -unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) { - switch (ATE) { - default: - return 0; -#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ - case DW_ATE_##NAME: \ - return VERSION; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) { - switch (ATE) { - default: - return 0; -#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ - case DW_ATE_##NAME: \ - return DWARF_VENDOR_##VENDOR; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::DecimalSignString(unsigned Sign) { - switch (Sign) { - case DW_DS_unsigned: return "DW_DS_unsigned"; - case DW_DS_leading_overpunch: return "DW_DS_leading_overpunch"; - case DW_DS_trailing_overpunch: return "DW_DS_trailing_overpunch"; - case DW_DS_leading_separate: return "DW_DS_leading_separate"; - case DW_DS_trailing_separate: return "DW_DS_trailing_separate"; - } - return StringRef(); -} - -StringRef llvm::dwarf::EndianityString(unsigned Endian) { - switch (Endian) { - case DW_END_default: return "DW_END_default"; - case DW_END_big: return "DW_END_big"; - case DW_END_little: return "DW_END_little"; - case DW_END_lo_user: return "DW_END_lo_user"; - case DW_END_hi_user: return "DW_END_hi_user"; - } - return StringRef(); -} - -StringRef llvm::dwarf::AccessibilityString(unsigned Access) { - switch (Access) { - // Accessibility codes - case DW_ACCESS_public: return "DW_ACCESS_public"; - case DW_ACCESS_protected: return "DW_ACCESS_protected"; - case DW_ACCESS_private: return "DW_ACCESS_private"; - } - return StringRef(); -} - -StringRef llvm::dwarf::VisibilityString(unsigned Visibility) { - switch (Visibility) { - case DW_VIS_local: return "DW_VIS_local"; - case DW_VIS_exported: return "DW_VIS_exported"; - case DW_VIS_qualified: return "DW_VIS_qualified"; - } - return StringRef(); -} - -StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) { - switch (Virtuality) { - default: - return StringRef(); -#define HANDLE_DW_VIRTUALITY(ID, NAME) \ - case DW_VIRTUALITY_##NAME: \ - return "DW_VIRTUALITY_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) { - return StringSwitch<unsigned>(VirtualityString) -#define HANDLE_DW_VIRTUALITY(ID, NAME) \ - .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME) -#include "llvm/Support/Dwarf.def" - .Default(DW_VIRTUALITY_invalid); -} - -StringRef llvm::dwarf::LanguageString(unsigned Language) { - switch (Language) { - default: - return StringRef(); -#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \ - case DW_LANG_##NAME: \ - return "DW_LANG_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::getLanguage(StringRef LanguageString) { - return StringSwitch<unsigned>(LanguageString) -#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \ - .Case("DW_LANG_" #NAME, DW_LANG_##NAME) -#include "llvm/Support/Dwarf.def" - .Default(0); -} - -unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) { - switch (Lang) { - default: - return 0; -#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \ - case DW_LANG_##NAME: \ - return VERSION; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) { - switch (Lang) { - default: - return 0; -#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \ - case DW_LANG_##NAME: \ - return DWARF_VENDOR_##VENDOR; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::CaseString(unsigned Case) { - switch (Case) { - case DW_ID_case_sensitive: return "DW_ID_case_sensitive"; - case DW_ID_up_case: return "DW_ID_up_case"; - case DW_ID_down_case: return "DW_ID_down_case"; - case DW_ID_case_insensitive: return "DW_ID_case_insensitive"; - } - return StringRef(); -} - -StringRef llvm::dwarf::ConventionString(unsigned CC) { - switch (CC) { - default: - return StringRef(); -#define HANDLE_DW_CC(ID, NAME) \ - case DW_CC_##NAME: \ - return "DW_CC_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -unsigned llvm::dwarf::getCallingConvention(StringRef CCString) { - return StringSwitch<unsigned>(CCString) -#define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME) -#include "llvm/Support/Dwarf.def" - .Default(0); -} - -StringRef llvm::dwarf::InlineCodeString(unsigned Code) { - switch (Code) { - case DW_INL_not_inlined: return "DW_INL_not_inlined"; - case DW_INL_inlined: return "DW_INL_inlined"; - case DW_INL_declared_not_inlined: return "DW_INL_declared_not_inlined"; - case DW_INL_declared_inlined: return "DW_INL_declared_inlined"; - } - return StringRef(); -} - -StringRef llvm::dwarf::ArrayOrderString(unsigned Order) { - switch (Order) { - case DW_ORD_row_major: return "DW_ORD_row_major"; - case DW_ORD_col_major: return "DW_ORD_col_major"; - } - return StringRef(); -} - -StringRef llvm::dwarf::DiscriminantString(unsigned Discriminant) { - switch (Discriminant) { - case DW_DSC_label: return "DW_DSC_label"; - case DW_DSC_range: return "DW_DSC_range"; - } - return StringRef(); -} - -StringRef llvm::dwarf::LNStandardString(unsigned Standard) { - switch (Standard) { - default: - return StringRef(); -#define HANDLE_DW_LNS(ID, NAME) \ - case DW_LNS_##NAME: \ - return "DW_LNS_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) { - switch (Encoding) { - default: - return StringRef(); -#define HANDLE_DW_LNE(ID, NAME) \ - case DW_LNE_##NAME: \ - return "DW_LNE_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::MacinfoString(unsigned Encoding) { - switch (Encoding) { - // Macinfo Type Encodings - case DW_MACINFO_define: return "DW_MACINFO_define"; - case DW_MACINFO_undef: return "DW_MACINFO_undef"; - case DW_MACINFO_start_file: return "DW_MACINFO_start_file"; - case DW_MACINFO_end_file: return "DW_MACINFO_end_file"; - case DW_MACINFO_vendor_ext: return "DW_MACINFO_vendor_ext"; - case DW_MACINFO_invalid: return "DW_MACINFO_invalid"; - } - return StringRef(); -} - -unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) { - return StringSwitch<unsigned>(MacinfoString) - .Case("DW_MACINFO_define", DW_MACINFO_define) - .Case("DW_MACINFO_undef", DW_MACINFO_undef) - .Case("DW_MACINFO_start_file", DW_MACINFO_start_file) - .Case("DW_MACINFO_end_file", DW_MACINFO_end_file) - .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext) - .Default(DW_MACINFO_invalid); -} - -StringRef llvm::dwarf::CallFrameString(unsigned Encoding) { - switch (Encoding) { - default: - return StringRef(); -#define HANDLE_DW_CFA(ID, NAME) \ - case DW_CFA_##NAME: \ - return "DW_CFA_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) { - switch (Prop) { - default: - return StringRef(); -#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \ - case DW_APPLE_PROPERTY_##NAME: \ - return "DW_APPLE_PROPERTY_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::UnitTypeString(unsigned UT) { - switch (UT) { - default: - return StringRef(); -#define HANDLE_DW_UT(ID, NAME) \ - case DW_UT_##NAME: \ - return "DW_UT_" #NAME; -#include "llvm/Support/Dwarf.def" - } -} - -StringRef llvm::dwarf::AtomTypeString(unsigned AT) { - switch (AT) { - case dwarf::DW_ATOM_null: - return "DW_ATOM_null"; - case dwarf::DW_ATOM_die_offset: - return "DW_ATOM_die_offset"; - case DW_ATOM_cu_offset: - return "DW_ATOM_cu_offset"; - case DW_ATOM_die_tag: - return "DW_ATOM_die_tag"; - case DW_ATOM_type_flags: - return "DW_ATOM_type_flags"; - } - return StringRef(); -} - -StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) { - switch (Kind) { - case GIEK_NONE: - return "NONE"; - case GIEK_TYPE: - return "TYPE"; - case GIEK_VARIABLE: - return "VARIABLE"; - case GIEK_FUNCTION: - return "FUNCTION"; - case GIEK_OTHER: - return "OTHER"; - case GIEK_UNUSED5: - return "UNUSED5"; - case GIEK_UNUSED6: - return "UNUSED6"; - case GIEK_UNUSED7: - return "UNUSED7"; - } - llvm_unreachable("Unknown GDBIndexEntryKind value"); -} - -StringRef -llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) { - switch (Linkage) { - case GIEL_EXTERNAL: - return "EXTERNAL"; - case GIEL_STATIC: - return "STATIC"; - } - llvm_unreachable("Unknown GDBIndexEntryLinkage value"); -} - -StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) { - switch (Attr) { - case DW_AT_accessibility: - return AccessibilityString(Val); - case DW_AT_virtuality: - return VirtualityString(Val); - case DW_AT_language: - return LanguageString(Val); - case DW_AT_encoding: - return AttributeEncodingString(Val); - case DW_AT_decimal_sign: - return DecimalSignString(Val); - case DW_AT_endianity: - return EndianityString(Val); - case DW_AT_visibility: - return VisibilityString(Val); - case DW_AT_identifier_case: - return CaseString(Val); - case DW_AT_calling_convention: - return ConventionString(Val); - case DW_AT_inline: - return InlineCodeString(Val); - case DW_AT_ordering: - return ArrayOrderString(Val); - case DW_AT_discr_value: - return DiscriminantString(Val); - } - - return StringRef(); -} - -bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version, - bool ExtensionsOk) { - if (FormVendor(F) == DWARF_VENDOR_DWARF) { - unsigned FV = FormVersion(F); - return FV > 0 && FV <= Version; - } - return ExtensionsOk; -} diff --git a/llvm/lib/Support/Path.cpp b/llvm/lib/Support/Path.cpp index 80bef558258..e58f856ca24 100644 --- a/llvm/lib/Support/Path.cpp +++ b/llvm/lib/Support/Path.cpp @@ -13,12 +13,12 @@ #include "llvm/Support/Path.h" #include "llvm/ADT/ArrayRef.h" -#include "llvm/Support/COFF.h" +#include "llvm/BinaryFormat/COFF.h" +#include "llvm/BinaryFormat/MachO.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Errc.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" -#include "llvm/Support/MachO.h" #include "llvm/Support/Process.h" #include <cctype> #include <cstring> @@ -1027,178 +1027,6 @@ void directory_entry::replace_filename(const Twine &filename, file_status st) { Status = st; } -template <size_t N> -static bool startswith(StringRef Magic, const char (&S)[N]) { - return Magic.startswith(StringRef(S, N - 1)); -} - -/// @brief Identify the magic in magic. -file_magic identify_magic(StringRef Magic) { - if (Magic.size() < 4) - return file_magic::unknown; - switch ((unsigned char)Magic[0]) { - case 0x00: { - // COFF bigobj, CL.exe's LTO object file, or short import library file - if (startswith(Magic, "\0\0\xFF\xFF")) { - size_t MinSize = offsetof(COFF::BigObjHeader, UUID) + sizeof(COFF::BigObjMagic); - if (Magic.size() < MinSize) - return file_magic::coff_import_library; - - const char *Start = Magic.data() + offsetof(COFF::BigObjHeader, UUID); - if (memcmp(Start, COFF::BigObjMagic, sizeof(COFF::BigObjMagic)) == 0) - return file_magic::coff_object; - if (memcmp(Start, COFF::ClGlObjMagic, sizeof(COFF::BigObjMagic)) == 0) - return file_magic::coff_cl_gl_object; - return file_magic::coff_import_library; - } - // Windows resource file - if (startswith(Magic, "\0\0\0\0\x20\0\0\0\xFF")) - return file_magic::windows_resource; - // 0x0000 = COFF unknown machine type - if (Magic[1] == 0) - return file_magic::coff_object; - if (startswith(Magic, "\0asm")) - return file_magic::wasm_object; - break; - } - case 0xDE: // 0x0B17C0DE = BC wraper - if (startswith(Magic, "\xDE\xC0\x17\x0B")) - return file_magic::bitcode; - break; - case 'B': - if (startswith(Magic, "BC\xC0\xDE")) - return file_magic::bitcode; - break; - case '!': - if (startswith(Magic, "!<arch>\n") || startswith(Magic, "!<thin>\n")) - return file_magic::archive; - break; - - case '\177': - if (startswith(Magic, "\177ELF") && Magic.size() >= 18) { - bool Data2MSB = Magic[5] == 2; - unsigned high = Data2MSB ? 16 : 17; - unsigned low = Data2MSB ? 17 : 16; - if (Magic[high] == 0) { - switch (Magic[low]) { - default: return file_magic::elf; - case 1: return file_magic::elf_relocatable; - case 2: return file_magic::elf_executable; - case 3: return file_magic::elf_shared_object; - case 4: return file_magic::elf_core; - } - } - // It's still some type of ELF file. - return file_magic::elf; - } - break; - - case 0xCA: - if (startswith(Magic, "\xCA\xFE\xBA\xBE") || - startswith(Magic, "\xCA\xFE\xBA\xBF")) { - // This is complicated by an overlap with Java class files. - // See the Mach-O section in /usr/share/file/magic for details. - if (Magic.size() >= 8 && Magic[7] < 43) - return file_magic::macho_universal_binary; - } - break; - - // The two magic numbers for mach-o are: - // 0xfeedface - 32-bit mach-o - // 0xfeedfacf - 64-bit mach-o - case 0xFE: - case 0xCE: - case 0xCF: { - uint16_t type = 0; - if (startswith(Magic, "\xFE\xED\xFA\xCE") || - startswith(Magic, "\xFE\xED\xFA\xCF")) { - /* Native endian */ - size_t MinSize; - if (Magic[3] == char(0xCE)) - MinSize = sizeof(MachO::mach_header); - else - MinSize = sizeof(MachO::mach_header_64); - if (Magic.size() >= MinSize) - type = Magic[12] << 24 | Magic[13] << 12 | Magic[14] << 8 | Magic[15]; - } else if (startswith(Magic, "\xCE\xFA\xED\xFE") || - startswith(Magic, "\xCF\xFA\xED\xFE")) { - /* Reverse endian */ - size_t MinSize; - if (Magic[0] == char(0xCE)) - MinSize = sizeof(MachO::mach_header); - else - MinSize = sizeof(MachO::mach_header_64); - if (Magic.size() >= MinSize) - type = Magic[15] << 24 | Magic[14] << 12 |Magic[13] << 8 | Magic[12]; - } - switch (type) { - default: break; - case 1: return file_magic::macho_object; - case 2: return file_magic::macho_executable; - case 3: return file_magic::macho_fixed_virtual_memory_shared_lib; - case 4: return file_magic::macho_core; - case 5: return file_magic::macho_preload_executable; - case 6: return file_magic::macho_dynamically_linked_shared_lib; - case 7: return file_magic::macho_dynamic_linker; - case 8: return file_magic::macho_bundle; - case 9: return file_magic::macho_dynamically_linked_shared_lib_stub; - case 10: return file_magic::macho_dsym_companion; - case 11: return file_magic::macho_kext_bundle; - } - break; - } - case 0xF0: // PowerPC Windows - case 0x83: // Alpha 32-bit - case 0x84: // Alpha 64-bit - case 0x66: // MPS R4000 Windows - case 0x50: // mc68K - case 0x4c: // 80386 Windows - case 0xc4: // ARMNT Windows - if (Magic[1] == 0x01) - return file_magic::coff_object; - LLVM_FALLTHROUGH; - - case 0x90: // PA-RISC Windows - case 0x68: // mc68K Windows - if (Magic[1] == 0x02) - return file_magic::coff_object; - break; - - case 'M': // Possible MS-DOS stub on Windows PE file - if (startswith(Magic, "MZ")) { - uint32_t off = read32le(Magic.data() + 0x3c); - // PE/COFF file, either EXE or DLL. - if (off < Magic.size() && - memcmp(Magic.data()+off, COFF::PEMagic, sizeof(COFF::PEMagic)) == 0) - return file_magic::pecoff_executable; - } - break; - - case 0x64: // x86-64 Windows. - if (Magic[1] == char(0x86)) - return file_magic::coff_object; - break; - - default: - break; - } - return file_magic::unknown; -} - -std::error_code identify_magic(const Twine &Path, file_magic &Result) { - int FD; - if (std::error_code EC = openFileForRead(Path, FD)) - return EC; - - char Buffer[32]; - int Length = read(FD, Buffer, sizeof(Buffer)); - if (close(FD) != 0 || Length < 0) - return std::error_code(errno, std::generic_category()); - - Result = identify_magic(StringRef(Buffer, Length)); - return std::error_code(); -} - std::error_code directory_entry::status(file_status &result) const { return fs::status(Path, result, FollowSymlinks); } |