diff options
Diffstat (limited to 'include/llvm/Object')
-rw-r--r-- | include/llvm/Object/Archive.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/COFF.h | 9 | ||||
-rw-r--r-- | include/llvm/Object/COFFModuleDefinition.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/Decompressor.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/ELF.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/ELFObjectFile.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/ELFTypes.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/IRObjectFile.h | 15 | ||||
-rw-r--r-- | include/llvm/Object/IRSymtab.h | 15 | ||||
-rw-r--r-- | include/llvm/Object/MachO.h | 6 | ||||
-rw-r--r-- | include/llvm/Object/MachOUniversal.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/ObjectFile.h | 10 | ||||
-rw-r--r-- | include/llvm/Object/RelocVisitor.h | 4 | ||||
-rw-r--r-- | include/llvm/Object/SymbolicFile.h | 7 | ||||
-rw-r--r-- | include/llvm/Object/Wasm.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/WindowsResource.h | 74 |
16 files changed, 125 insertions, 31 deletions
diff --git a/include/llvm/Object/Archive.h b/include/llvm/Object/Archive.h index 807508107c56..6c5fb9d5c92b 100644 --- a/include/llvm/Object/Archive.h +++ b/include/llvm/Object/Archive.h @@ -14,9 +14,9 @@ #ifndef LLVM_OBJECT_ARCHIVE_H #define LLVM_OBJECT_ARCHIVE_H -#include "llvm/ADT/iterator_range.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/iterator_range.h" #include "llvm/Object/Binary.h" #include "llvm/Support/Chrono.h" #include "llvm/Support/Error.h" diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index dafd1a43cb59..ae695a529597 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -15,13 +15,13 @@ #define LLVM_OBJECT_COFF_H #include "llvm/ADT/iterator_range.h" +#include "llvm/BinaryFormat/COFF.h" #include "llvm/DebugInfo/CodeView/CVDebugRecord.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/Object/Binary.h" #include "llvm/Object/Error.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/BinaryByteStream.h" -#include "llvm/Support/COFF.h" #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/ErrorHandling.h" @@ -646,6 +646,13 @@ struct coff_resource_dir_entry { } Offset; }; +struct coff_resource_data_entry { + support::ulittle32_t DataRVA; + support::ulittle32_t DataSize; + support::ulittle32_t Codepage; + support::ulittle32_t Reserved; +}; + struct coff_resource_dir_table { support::ulittle32_t Characteristics; support::ulittle32_t TimeDateStamp; diff --git a/include/llvm/Object/COFFModuleDefinition.h b/include/llvm/Object/COFFModuleDefinition.h index 0428283fdc88..a0e8eacdb7a3 100644 --- a/include/llvm/Object/COFFModuleDefinition.h +++ b/include/llvm/Object/COFFModuleDefinition.h @@ -20,8 +20,8 @@ #ifndef LLVM_OBJECT_COFF_MODULE_DEFINITION_H #define LLVM_OBJECT_COFF_MODULE_DEFINITION_H -#include "llvm/Object/COFFImportFile.h" #include "llvm/Object/COFF.h" +#include "llvm/Object/COFFImportFile.h" namespace llvm { namespace object { diff --git a/include/llvm/Object/Decompressor.h b/include/llvm/Object/Decompressor.h index 0f63f8b821b7..c8e888d285e4 100644 --- a/include/llvm/Object/Decompressor.h +++ b/include/llvm/Object/Decompressor.h @@ -10,8 +10,8 @@ #ifndef LLVM_OBJECT_DECOMPRESSOR_H #define LLVM_OBJECT_DECOMPRESSOR_H -#include "llvm/ADT/StringRef.h" #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Object/ObjectFile.h" namespace llvm { diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index a4d431b6cbe7..670c0bbce3ac 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -17,9 +17,9 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/Object/ELFTypes.h" #include "llvm/Object/Error.h" -#include "llvm/Support/ELF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" #include <cassert> diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index ef2abd8c52ce..2ba3b13f49da 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -19,6 +19,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" #include "llvm/ADT/iterator_range.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/Object/Binary.h" #include "llvm/Object/ELF.h" @@ -29,7 +30,6 @@ #include "llvm/Support/ARMAttributeParser.h" #include "llvm/Support/ARMBuildAttributes.h" #include "llvm/Support/Casting.h" -#include "llvm/Support/ELF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" #include "llvm/Support/ErrorHandling.h" diff --git a/include/llvm/Object/ELFTypes.h b/include/llvm/Object/ELFTypes.h index 99346fe1a882..808144694acb 100644 --- a/include/llvm/Object/ELFTypes.h +++ b/include/llvm/Object/ELFTypes.h @@ -12,8 +12,8 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/Object/Error.h" -#include "llvm/Support/ELF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" #include <cassert> diff --git a/include/llvm/Object/IRObjectFile.h b/include/llvm/Object/IRObjectFile.h index 0ea89011e883..3bce7813ee93 100644 --- a/include/llvm/Object/IRObjectFile.h +++ b/include/llvm/Object/IRObjectFile.h @@ -15,10 +15,12 @@ #define LLVM_OBJECT_IROBJECTFILE_H #include "llvm/ADT/PointerUnion.h" +#include "llvm/Object/IRSymtab.h" #include "llvm/Object/ModuleSymbolTable.h" #include "llvm/Object/SymbolicFile.h" namespace llvm { +class BitcodeModule; class Mangler; class Module; class GlobalValue; @@ -61,7 +63,20 @@ public: static Expected<std::unique_ptr<IRObjectFile>> create(MemoryBufferRef Object, LLVMContext &Context); }; + +/// The contents of a bitcode file and its irsymtab. Any underlying data +/// for the irsymtab are owned by Symtab and Strtab. +struct IRSymtabFile { + std::vector<BitcodeModule> Mods; + SmallVector<char, 0> Symtab, Strtab; + irsymtab::Reader TheReader; +}; + +/// Reads a bitcode file, creating its irsymtab if necessary. +Expected<IRSymtabFile> readIRSymtab(MemoryBufferRef MBRef); + } + } #endif diff --git a/include/llvm/Object/IRSymtab.h b/include/llvm/Object/IRSymtab.h index b425543bf637..5b832141a865 100644 --- a/include/llvm/Object/IRSymtab.h +++ b/include/llvm/Object/IRSymtab.h @@ -25,8 +25,8 @@ #define LLVM_OBJECT_IRSYMTAB_H #include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/iterator_range.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/iterator_range.h" #include "llvm/IR/GlobalValue.h" #include "llvm/Object/SymbolicFile.h" #include "llvm/Support/Endian.h" @@ -36,6 +36,9 @@ #include <vector> namespace llvm { + +struct BitcodeFileContents; + namespace irsymtab { namespace storage { @@ -314,6 +317,16 @@ inline Reader::symbol_range Reader::module_symbols(unsigned I) const { SymbolRef(MEnd, MEnd, nullptr, this)}; } +/// The contents of the irsymtab in a bitcode file. Any underlying data for the +/// irsymtab are owned by Symtab and Strtab. +struct FileContents { + SmallVector<char, 0> Symtab, Strtab; + Reader TheReader; +}; + +/// Reads the contents of a bitcode file, creating its irsymtab if necessary. +Expected<FileContents> readBitcode(const BitcodeFileContents &BFC); + } // end namespace irsymtab } // end namespace llvm diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index a4356d5977b2..3fc726f4ccb8 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -16,19 +16,19 @@ #define LLVM_OBJECT_MACHO_H #include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/iterator_range.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" +#include "llvm/ADT/iterator_range.h" +#include "llvm/BinaryFormat/MachO.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/Object/Binary.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Object/SymbolicFile.h" #include "llvm/Support/Error.h" #include "llvm/Support/Format.h" -#include "llvm/Support/MachO.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include <cstdint> @@ -550,6 +550,8 @@ public: bool isRelocatableObject() const override; + StringRef mapDebugSectionName(StringRef Name) const override; + bool hasPageZeroSegment() const { return HasPageZeroSegment; } static bool classof(const Binary *v) { diff --git a/include/llvm/Object/MachOUniversal.h b/include/llvm/Object/MachOUniversal.h index a14c4ca01223..8a6f0fc56971 100644 --- a/include/llvm/Object/MachOUniversal.h +++ b/include/llvm/Object/MachOUniversal.h @@ -16,10 +16,10 @@ #include "llvm/ADT/Triple.h" #include "llvm/ADT/iterator_range.h" +#include "llvm/BinaryFormat/MachO.h" #include "llvm/Object/Archive.h" #include "llvm/Object/Binary.h" #include "llvm/Object/MachO.h" -#include "llvm/Support/MachO.h" namespace llvm { class StringRef; diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index ea6a9049bc1b..6b5b9d95fcf3 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -14,8 +14,9 @@ #ifndef LLVM_OBJECT_OBJECTFILE_H #define LLVM_OBJECT_OBJECTFILE_H -#include "llvm/ADT/iterator_range.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/iterator_range.h" +#include "llvm/BinaryFormat/Magic.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/Object/Binary.h" #include "llvm/Object/Error.h" @@ -292,6 +293,9 @@ public: return std::error_code(); } + /// Maps a debug section name to a standard DWARF section name. + virtual StringRef mapDebugSectionName(StringRef Name) const { return Name; } + /// True if this is a relocatable object (.o/.obj). virtual bool isRelocatableObject() const = 0; @@ -303,10 +307,10 @@ public: createObjectFile(StringRef ObjectPath); static Expected<std::unique_ptr<ObjectFile>> - createObjectFile(MemoryBufferRef Object, sys::fs::file_magic Type); + createObjectFile(MemoryBufferRef Object, llvm::file_magic Type); static Expected<std::unique_ptr<ObjectFile>> createObjectFile(MemoryBufferRef Object) { - return createObjectFile(Object, sys::fs::file_magic::unknown); + return createObjectFile(Object, llvm::file_magic::unknown); } static inline bool classof(const Binary *v) { diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index 348179860f3e..c358d3996435 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -17,15 +17,15 @@ #define LLVM_OBJECT_RELOCVISITOR_H #include "llvm/ADT/Triple.h" +#include "llvm/BinaryFormat/ELF.h" +#include "llvm/BinaryFormat/MachO.h" #include "llvm/Object/COFF.h" #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/MachO.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Casting.h" -#include "llvm/Support/ELF.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorOr.h" -#include "llvm/Support/MachO.h" #include <cstdint> #include <system_error> diff --git a/include/llvm/Object/SymbolicFile.h b/include/llvm/Object/SymbolicFile.h index f4be4bfdb1a3..97eeba6611a2 100644 --- a/include/llvm/Object/SymbolicFile.h +++ b/include/llvm/Object/SymbolicFile.h @@ -14,8 +14,9 @@ #ifndef LLVM_OBJECT_SYMBOLICFILE_H #define LLVM_OBJECT_SYMBOLICFILE_H -#include "llvm/ADT/iterator_range.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/iterator_range.h" +#include "llvm/BinaryFormat/Magic.h" #include "llvm/Object/Binary.h" #include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" @@ -162,12 +163,12 @@ public: // construction aux. static Expected<std::unique_ptr<SymbolicFile>> - createSymbolicFile(MemoryBufferRef Object, sys::fs::file_magic Type, + createSymbolicFile(MemoryBufferRef Object, llvm::file_magic Type, LLVMContext *Context); static Expected<std::unique_ptr<SymbolicFile>> createSymbolicFile(MemoryBufferRef Object) { - return createSymbolicFile(Object, sys::fs::file_magic::unknown, nullptr); + return createSymbolicFile(Object, llvm::file_magic::unknown, nullptr); } static Expected<OwningBinary<SymbolicFile>> createSymbolicFile(StringRef ObjectPath); diff --git a/include/llvm/Object/Wasm.h b/include/llvm/Object/Wasm.h index de54a4928cce..10edc461b9e9 100644 --- a/include/llvm/Object/Wasm.h +++ b/include/llvm/Object/Wasm.h @@ -19,11 +19,11 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" +#include "llvm/BinaryFormat/Wasm.h" #include "llvm/Object/Binary.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Error.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Wasm.h" #include <cstddef> #include <cstdint> #include <vector> diff --git a/include/llvm/Object/WindowsResource.h b/include/llvm/Object/WindowsResource.h index 2484f551aee0..c5189329d3ec 100644 --- a/include/llvm/Object/WindowsResource.h +++ b/include/llvm/Object/WindowsResource.h @@ -31,11 +31,11 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/BinaryFormat/COFF.h" #include "llvm/Object/Binary.h" #include "llvm/Object/Error.h" #include "llvm/Support/BinaryByteStream.h" #include "llvm/Support/BinaryStreamReader.h" -#include "llvm/Support/COFF.h" #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" @@ -44,10 +44,15 @@ #include <map> namespace llvm { + +class FileOutputBuffer; + namespace object { class WindowsResource; +enum class Machine { UNKNOWN, ARM, X64, X86 }; + class ResourceEntryRef { public: Error moveNext(bool &End); @@ -58,6 +63,10 @@ public: ArrayRef<UTF16> getNameString() const { return Name; } uint16_t getNameID() const { return NameID; } uint16_t getLanguage() const { return Suffix->Language; } + uint16_t getMajorVersion() const { return Suffix->Version >> 16; } + uint16_t getMinorVersion() const { return Suffix->Version; } + uint32_t getCharacteristics() const { return Suffix->Characteristics; } + ArrayRef<uint8_t> getData() const { return Data; } private: friend class WindowsResource; @@ -106,34 +115,77 @@ private: class WindowsResourceParser { public: + class TreeNode; WindowsResourceParser(); - Error parse(WindowsResource *WR); - void printTree() const; + const TreeNode &getTree() const { return Root; } + const ArrayRef<std::vector<uint8_t>> getData() const { return Data; } + const ArrayRef<std::vector<UTF16>> getStringTable() const { + return StringTable; + } -private: class TreeNode { public: - TreeNode() = default; - explicit TreeNode(ArrayRef<UTF16> Ref); - void addEntry(const ResourceEntryRef &Entry); + template <typename T> + using Children = std::map<T, std::unique_ptr<TreeNode>>; + void print(ScopedPrinter &Writer, StringRef Name) const; + uint32_t getTreeSize() const; + uint32_t getStringIndex() const { return StringIndex; } + uint32_t getDataIndex() const { return DataIndex; } + uint16_t getMajorVersion() const { return MajorVersion; } + uint16_t getMinorVersion() const { return MinorVersion; } + uint32_t getCharacteristics() const { return Characteristics; } + bool checkIsDataNode() const { return IsDataNode; } + const Children<uint32_t> &getIDChildren() const { return IDChildren; } + const Children<std::string> &getStringChildren() const { + return StringChildren; + } private: + friend class WindowsResourceParser; + + static uint32_t StringCount; + static uint32_t DataCount; + + static std::unique_ptr<TreeNode> createStringNode(); + static std::unique_ptr<TreeNode> createIDNode(); + static std::unique_ptr<TreeNode> createDataNode(uint16_t MajorVersion, + uint16_t MinorVersion, + uint32_t Characteristics); + + explicit TreeNode(bool IsStringNode); + TreeNode(uint16_t MajorVersion, uint16_t MinorVersion, + uint32_t Characteristics); + + void addEntry(const ResourceEntryRef &Entry); TreeNode &addTypeNode(const ResourceEntryRef &Entry); TreeNode &addNameNode(const ResourceEntryRef &Entry); TreeNode &addLanguageNode(const ResourceEntryRef &Entry); - TreeNode &addChild(uint32_t ID); + TreeNode &addChild(uint32_t ID, bool IsDataNode = false, + uint16_t MajorVersion = 0, uint16_t MinorVersion = 0, + uint32_t Characteristics = 0); TreeNode &addChild(ArrayRef<UTF16> NameRef); - std::vector<UTF16> Name; - std::map<uint32_t, std::unique_ptr<TreeNode>> IDChildren; - std::map<std::string, std::unique_ptr<TreeNode>> StringChildren; + bool IsDataNode = false; + uint32_t StringIndex; + uint32_t DataIndex; + Children<uint32_t> IDChildren; + Children<std::string> StringChildren; + uint16_t MajorVersion = 0; + uint16_t MinorVersion = 0; + uint32_t Characteristics = 0; }; +private: TreeNode Root; + std::vector<std::vector<uint8_t>> Data; + std::vector<std::vector<UTF16>> StringTable; }; +Error writeWindowsResourceCOFF(StringRef OutputFile, Machine MachineType, + const WindowsResourceParser &Parser); + } // namespace object } // namespace llvm |