diff options
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r-- | llvm/lib/Object/Binary.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Object/DXContainer.cpp | 181 | ||||
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Object/Object.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Object/ObjectFile.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Object/SymbolicFile.cpp | 2 |
6 files changed, 191 insertions, 4 deletions
diff --git a/llvm/lib/Object/Binary.cpp b/llvm/lib/Object/Binary.cpp index 2dfae8a..da2a7bb 100644 --- a/llvm/lib/Object/Binary.cpp +++ b/llvm/lib/Object/Binary.cpp @@ -75,6 +75,7 @@ Expected<std::unique_ptr<Binary>> object::createBinary(MemoryBufferRef Buffer, case file_magic::xcoff_object_32: case file_magic::xcoff_object_64: case file_magic::wasm_object: + case file_magic::dxcontainer_object: return ObjectFile::createSymbolicFile(Buffer, Type, Context, InitContent); case file_magic::macho_universal_binary: return MachOUniversalBinary::create(Buffer); @@ -87,7 +88,6 @@ Expected<std::unique_ptr<Binary>> object::createBinary(MemoryBufferRef Buffer, case file_magic::clang_ast: case file_magic::cuda_fatbinary: case file_magic::coff_cl_gl_object: - case file_magic::dxcontainer_object: case file_magic::offload_bundle: case file_magic::offload_bundle_compressed: case file_magic::spirv_object: diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 0b46ff7..031b941 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -11,6 +11,7 @@ #include "llvm/Object/Error.h" #include "llvm/Support/Endian.h" #include "llvm/Support/FormatVariadic.h" +#include "llvm/TargetParser/SubtargetFeature.h" using namespace llvm; using namespace llvm::object; @@ -515,3 +516,183 @@ uint8_t DirectX::PSVRuntimeInfo::getSigPatchOrPrimCount() const { return P->SigPatchOrPrimElements; return 0; } + +class DXNotSupportedError : public ErrorInfo<DXNotSupportedError> { +public: + static char ID; + + DXNotSupportedError(StringRef S) : FeatureString(S) {} + + void log(raw_ostream &OS) const override { + OS << "DXContainer does not support " << FeatureString; + } + + std::error_code convertToErrorCode() const override { + return inconvertibleErrorCode(); + } + +private: + StringRef FeatureString; +}; + +char DXNotSupportedError::ID = 0; + +Expected<section_iterator> +DXContainerObjectFile::getSymbolSection(DataRefImpl Symb) const { + return make_error<DXNotSupportedError>("Symbol sections"); +} + +Expected<StringRef> DXContainerObjectFile::getSymbolName(DataRefImpl) const { + return make_error<DXNotSupportedError>("Symbol names"); +} + +Expected<uint64_t> +DXContainerObjectFile::getSymbolAddress(DataRefImpl Symb) const { + return make_error<DXNotSupportedError>("Symbol addresses"); +} + +uint64_t DXContainerObjectFile::getSymbolValueImpl(DataRefImpl Symb) const { + llvm_unreachable("DXContainer does not support symbols"); +} +uint64_t +DXContainerObjectFile::getCommonSymbolSizeImpl(DataRefImpl Symb) const { + llvm_unreachable("DXContainer does not support symbols"); +} + +Expected<SymbolRef::Type> +DXContainerObjectFile::getSymbolType(DataRefImpl Symb) const { + return make_error<DXNotSupportedError>("Symbol types"); +} + +void DXContainerObjectFile::moveSectionNext(DataRefImpl &Sec) const { + PartIterator It = reinterpret_cast<PartIterator>(Sec.p); + if (It == Parts.end()) + return; + + ++It; + Sec.p = reinterpret_cast<uintptr_t>(It); +} + +Expected<StringRef> +DXContainerObjectFile::getSectionName(DataRefImpl Sec) const { + PartIterator It = reinterpret_cast<PartIterator>(Sec.p); + return StringRef(It->Part.getName()); +} + +uint64_t DXContainerObjectFile::getSectionAddress(DataRefImpl Sec) const { + PartIterator It = reinterpret_cast<PartIterator>(Sec.p); + return It->Offset; +} + +uint64_t DXContainerObjectFile::getSectionIndex(DataRefImpl Sec) const { + return (Sec.p - reinterpret_cast<uintptr_t>(Parts.begin())) / + sizeof(PartIterator); +} + +uint64_t DXContainerObjectFile::getSectionSize(DataRefImpl Sec) const { + PartIterator It = reinterpret_cast<PartIterator>(Sec.p); + return It->Data.size(); +} +Expected<ArrayRef<uint8_t>> +DXContainerObjectFile::getSectionContents(DataRefImpl Sec) const { + PartIterator It = reinterpret_cast<PartIterator>(Sec.p); + return ArrayRef<uint8_t>(It->Data.bytes_begin(), It->Data.size()); +} + +uint64_t DXContainerObjectFile::getSectionAlignment(DataRefImpl Sec) const { + return 1; +} + +bool DXContainerObjectFile::isSectionCompressed(DataRefImpl Sec) const { + return false; +} + +bool DXContainerObjectFile::isSectionText(DataRefImpl Sec) const { + return false; +} + +bool DXContainerObjectFile::isSectionData(DataRefImpl Sec) const { + return false; +} + +bool DXContainerObjectFile::isSectionBSS(DataRefImpl Sec) const { + return false; +} + +bool DXContainerObjectFile::isSectionVirtual(DataRefImpl Sec) const { + return false; +} + +relocation_iterator +DXContainerObjectFile::section_rel_begin(DataRefImpl Sec) const { + return relocation_iterator(RelocationRef()); +} + +relocation_iterator +DXContainerObjectFile::section_rel_end(DataRefImpl Sec) const { + return relocation_iterator(RelocationRef()); +} + +void DXContainerObjectFile::moveRelocationNext(DataRefImpl &Rel) const { + llvm_unreachable("DXContainer does not support relocations"); +} + +uint64_t DXContainerObjectFile::getRelocationOffset(DataRefImpl Rel) const { + llvm_unreachable("DXContainer does not support relocations"); +} + +symbol_iterator +DXContainerObjectFile::getRelocationSymbol(DataRefImpl Rel) const { + return symbol_iterator(SymbolRef()); +} + +uint64_t DXContainerObjectFile::getRelocationType(DataRefImpl Rel) const { + llvm_unreachable("DXContainer does not support relocations"); +} + +void DXContainerObjectFile::getRelocationTypeName( + DataRefImpl Rel, SmallVectorImpl<char> &Result) const { + llvm_unreachable("DXContainer does not support relocations"); +} + +section_iterator DXContainerObjectFile::section_begin() const { + DataRefImpl Sec; + Sec.p = reinterpret_cast<uintptr_t>(Parts.begin()); + return section_iterator(SectionRef(Sec, this)); +} +section_iterator DXContainerObjectFile::section_end() const { + DataRefImpl Sec; + Sec.p = reinterpret_cast<uintptr_t>(Parts.end()); + return section_iterator(SectionRef(Sec, this)); +} + +uint8_t DXContainerObjectFile::getBytesInAddress() const { return 4; } + +StringRef DXContainerObjectFile::getFileFormatName() const { + return "DirectX Container"; +} + +Triple::ArchType DXContainerObjectFile::getArch() const { return Triple::dxil; } + +Expected<SubtargetFeatures> DXContainerObjectFile::getFeatures() const { + return SubtargetFeatures(); +} + +Error DXContainerObjectFile::printSymbolName(raw_ostream &OS, + DataRefImpl Symb) const { + return make_error<DXNotSupportedError>("Symbol names"); +} + +Expected<uint32_t> +DXContainerObjectFile::getSymbolFlags(DataRefImpl Symb) const { + return make_error<DXNotSupportedError>("Symbol flags"); +} + +Expected<std::unique_ptr<DXContainerObjectFile>> +ObjectFile::createDXContainerObjectFile(MemoryBufferRef Object) { + auto ExC = DXContainer::create(Object); + if (!ExC) + return ExC.takeError(); + std::unique_ptr<DXContainerObjectFile> Obj(new DXContainerObjectFile(*ExC)); + return std::move(Obj); +} diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 5db2642..e09dc94 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -3115,7 +3115,7 @@ void ExportEntry::pushNode(uint64_t offset) { } State.ChildCount = *Children; if (State.ChildCount != 0 && Children + 1 >= Trie.end()) { - *E = malformedError("byte for count of childern in export trie data at " + *E = malformedError("byte for count of children in export trie data at " "node: 0x" + Twine::utohexstr(offset) + " extends past end of trie data"); @@ -3157,7 +3157,7 @@ void ExportEntry::pushDownUntilBottom() { } for (const NodeState &node : nodes()) { if (node.Start == Trie.begin() + childNodeIndex){ - *E = malformedError("loop in childern in export trie data at node: 0x" + + *E = malformedError("loop in children in export trie data at node: 0x" + Twine::utohexstr(Top.Start - Trie.begin()) + " back to node: 0x" + Twine::utohexstr(childNodeIndex)); diff --git a/llvm/lib/Object/Object.cpp b/llvm/lib/Object/Object.cpp index c62944a..112927e 100644 --- a/llvm/lib/Object/Object.cpp +++ b/llvm/lib/Object/Object.cpp @@ -124,6 +124,8 @@ LLVMBinaryType LLVMBinaryGetType(LLVMBinaryRef BR) { return LLVMBinaryTypeOffload; case ID_Wasm: return LLVMBinaryTypeWasm; + case ID_DXContainer: + return LLVMBinaryTypeDXcontainer; case ID_StartObjects: case ID_EndObjects: llvm_unreachable("Marker types are not valid binary kinds!"); diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp index 6a226a3..b0e4ea0 100644 --- a/llvm/lib/Object/ObjectFile.cpp +++ b/llvm/lib/Object/ObjectFile.cpp @@ -15,6 +15,7 @@ #include "llvm/BinaryFormat/Magic.h" #include "llvm/Object/Binary.h" #include "llvm/Object/COFF.h" +#include "llvm/Object/DXContainer.h" #include "llvm/Object/Error.h" #include "llvm/Object/MachO.h" #include "llvm/Object/Wasm.h" @@ -165,7 +166,6 @@ ObjectFile::createObjectFile(MemoryBufferRef Object, file_magic Type, case file_magic::goff_object: case file_magic::cuda_fatbinary: case file_magic::offload_binary: - case file_magic::dxcontainer_object: case file_magic::offload_bundle: case file_magic::offload_bundle_compressed: case file_magic::spirv_object: @@ -201,6 +201,8 @@ ObjectFile::createObjectFile(MemoryBufferRef Object, file_magic Type, return createXCOFFObjectFile(Object, Binary::ID_XCOFF64); case file_magic::wasm_object: return createWasmObjectFile(Object); + case file_magic::dxcontainer_object: + return createDXContainerObjectFile(Object); } llvm_unreachable("Unexpected Object File Type"); } diff --git a/llvm/lib/Object/SymbolicFile.cpp b/llvm/lib/Object/SymbolicFile.cpp index e87ecb1..47295e6 100644 --- a/llvm/lib/Object/SymbolicFile.cpp +++ b/llvm/lib/Object/SymbolicFile.cpp @@ -68,6 +68,7 @@ SymbolicFile::createSymbolicFile(MemoryBufferRef Object, file_magic Type, case file_magic::xcoff_object_32: case file_magic::xcoff_object_64: case file_magic::wasm_object: + case file_magic::dxcontainer_object: return ObjectFile::createObjectFile(Object, Type, InitContent); case file_magic::coff_import_library: return std::unique_ptr<SymbolicFile>(new COFFImportFile(Object)); @@ -123,6 +124,7 @@ bool SymbolicFile::isSymbolicFile(file_magic Type, const LLVMContext *Context) { case file_magic::elf_relocatable: case file_magic::macho_object: case file_magic::coff_object: + case file_magic::dxcontainer_object: return true; default: return false; |