diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
commit | eb11fae6d08f479c0799db45860a98af528fa6e7 (patch) | |
tree | 44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /lib/BinaryFormat | |
parent | b8a2042aa938069e862750553db0e4d82d25822c (diff) |
Notes
Diffstat (limited to 'lib/BinaryFormat')
-rw-r--r-- | lib/BinaryFormat/CMakeLists.txt | 3 | ||||
-rw-r--r-- | lib/BinaryFormat/Dwarf.cpp | 147 | ||||
-rw-r--r-- | lib/BinaryFormat/Magic.cpp | 20 | ||||
-rw-r--r-- | lib/BinaryFormat/Wasm.cpp | 34 |
4 files changed, 175 insertions, 29 deletions
diff --git a/lib/BinaryFormat/CMakeLists.txt b/lib/BinaryFormat/CMakeLists.txt index cb78ea6fdf92..06826010c762 100644 --- a/lib/BinaryFormat/CMakeLists.txt +++ b/lib/BinaryFormat/CMakeLists.txt @@ -1,8 +1,9 @@ add_llvm_library(LLVMBinaryFormat Dwarf.cpp Magic.cpp + Wasm.cpp ADDITIONAL_HEADER_DIRS ${LLVM_MAIN_INCLUDE_DIR}/llvm/BinaryFormat ) -
\ No newline at end of file + diff --git a/lib/BinaryFormat/Dwarf.cpp b/lib/BinaryFormat/Dwarf.cpp index 86e3b02577fd..5984de73ae63 100644 --- a/lib/BinaryFormat/Dwarf.cpp +++ b/lib/BinaryFormat/Dwarf.cpp @@ -393,16 +393,6 @@ StringRef llvm::dwarf::ArrayOrderString(unsigned Order) { 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: @@ -454,6 +444,17 @@ unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) { .Default(DW_MACINFO_invalid); } +StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) { + switch (Encoding) { + default: + return StringRef(); +#define HANDLE_DW_RLE(ID, NAME) \ + case DW_RLE_##NAME: \ + return "DW_RLE_" #NAME; +#include "llvm/BinaryFormat/Dwarf.def" + } +} + StringRef llvm::dwarf::CallFrameString(unsigned Encoding) { switch (Encoding) { default: @@ -498,7 +499,10 @@ StringRef llvm::dwarf::AtomTypeString(unsigned AT) { case DW_ATOM_die_tag: return "DW_ATOM_die_tag"; case DW_ATOM_type_flags: + case DW_ATOM_type_type_flags: return "DW_ATOM_type_flags"; + case DW_ATOM_qual_name_hash: + return "DW_ATOM_qual_name_hash"; } return StringRef(); } @@ -560,13 +564,122 @@ StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) { return InlineCodeString(Val); case DW_AT_ordering: return ArrayOrderString(Val); - case DW_AT_discr_value: - return DiscriminantString(Val); + case DW_AT_APPLE_runtime_class: + return LanguageString(Val); + } + + return StringRef(); +} + +StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) { + switch (Atom) { + case DW_ATOM_null: + return "NULL"; + case DW_ATOM_die_tag: + return TagString(Val); } return StringRef(); } +StringRef llvm::dwarf::IndexString(unsigned Idx) { + switch (Idx) { + default: + return StringRef(); +#define HANDLE_DW_IDX(ID, NAME) \ + case DW_IDX_##NAME: \ + return "DW_IDX_" #NAME; +#include "llvm/BinaryFormat/Dwarf.def" + } +} + +Optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form, + FormParams Params) { + switch (Form) { + case DW_FORM_addr: + if (Params) + return Params.AddrSize; + return None; + + case DW_FORM_block: // ULEB128 length L followed by L bytes. + case DW_FORM_block1: // 1 byte length L followed by L bytes. + case DW_FORM_block2: // 2 byte length L followed by L bytes. + case DW_FORM_block4: // 4 byte length L followed by L bytes. + case DW_FORM_string: // C-string with null terminator. + case DW_FORM_sdata: // SLEB128. + case DW_FORM_udata: // ULEB128. + case DW_FORM_ref_udata: // ULEB128. + case DW_FORM_indirect: // ULEB128. + case DW_FORM_exprloc: // ULEB128 length L followed by L bytes. + case DW_FORM_strx: // ULEB128. + case DW_FORM_addrx: // ULEB128. + case DW_FORM_loclistx: // ULEB128. + case DW_FORM_rnglistx: // ULEB128. + case DW_FORM_GNU_addr_index: // ULEB128. + case DW_FORM_GNU_str_index: // ULEB128. + return None; + + case DW_FORM_ref_addr: + if (Params) + return Params.getRefAddrByteSize(); + return None; + + case DW_FORM_flag: + case DW_FORM_data1: + case DW_FORM_ref1: + case DW_FORM_strx1: + case DW_FORM_addrx1: + return 1; + + case DW_FORM_data2: + case DW_FORM_ref2: + case DW_FORM_strx2: + case DW_FORM_addrx2: + return 2; + + case DW_FORM_strx3: + return 3; + + case DW_FORM_data4: + case DW_FORM_ref4: + case DW_FORM_ref_sup4: + case DW_FORM_strx4: + case DW_FORM_addrx4: + return 4; + + case DW_FORM_strp: + case DW_FORM_GNU_ref_alt: + case DW_FORM_GNU_strp_alt: + case DW_FORM_line_strp: + case DW_FORM_sec_offset: + case DW_FORM_strp_sup: + if (Params) + return Params.getDwarfOffsetByteSize(); + return None; + + case DW_FORM_data8: + case DW_FORM_ref8: + case DW_FORM_ref_sig8: + case DW_FORM_ref_sup8: + return 8; + + case DW_FORM_flag_present: + return 0; + + case DW_FORM_data16: + return 16; + + case DW_FORM_implicit_const: + // The implicit value is stored in the abbreviation as a SLEB128, and + // there no data in debug info. + return 0; + + default: + break; + } + return None; +} + bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version, bool ExtensionsOk) { if (FormVendor(F) == DWARF_VENDOR_DWARF) { @@ -576,9 +689,7 @@ bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version, return ExtensionsOk; } -uint32_t llvm::dwarf::djbHash(StringRef Buffer) { - uint32_t H = 5381; - for (char C : Buffer.bytes()) - H = ((H << 5) + H) + C; - return H; -} +constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[]; +constexpr char llvm::dwarf::EnumTraits<Form>::Type[]; +constexpr char llvm::dwarf::EnumTraits<Index>::Type[]; +constexpr char llvm::dwarf::EnumTraits<Tag>::Type[]; diff --git a/lib/BinaryFormat/Magic.cpp b/lib/BinaryFormat/Magic.cpp index 42546eaa732b..5a339583fca1 100644 --- a/lib/BinaryFormat/Magic.cpp +++ b/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(); } diff --git a/lib/BinaryFormat/Wasm.cpp b/lib/BinaryFormat/Wasm.cpp new file mode 100644 index 000000000000..35360d0ae4f0 --- /dev/null +++ b/lib/BinaryFormat/Wasm.cpp @@ -0,0 +1,34 @@ +//===-- llvm/BinaryFormat/Wasm.cpp -------------------------------*- C++-*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/BinaryFormat/Wasm.h" + +std::string llvm::wasm::toString(wasm::WasmSymbolType type) { + switch (type) { + case wasm::WASM_SYMBOL_TYPE_FUNCTION: + return "WASM_SYMBOL_TYPE_FUNCTION"; + case wasm::WASM_SYMBOL_TYPE_GLOBAL: + return "WASM_SYMBOL_TYPE_GLOBAL"; + case wasm::WASM_SYMBOL_TYPE_DATA: + return "WASM_SYMBOL_TYPE_DATA"; + case wasm::WASM_SYMBOL_TYPE_SECTION: + return "WASM_SYMBOL_TYPE_SECTION"; + } + llvm_unreachable("unknown symbol type"); +} + +std::string llvm::wasm::relocTypetoString(uint32_t type) { + switch (type) { +#define WASM_RELOC(NAME, VALUE) case VALUE: return #NAME; +#include "llvm/BinaryFormat/WasmRelocs.def" +#undef WASM_RELOC + default: + llvm_unreachable("unknown reloc type"); + } +} |