| //===- GOFFObjectFile.h - GOFF object file implementation -------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file declares the GOFFObjectFile class. |
| // Record classes and derivatives are also declared and implemented. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_OBJECT_GOFFOBJECTFILE_H |
| #define LLVM_OBJECT_GOFFOBJECTFILE_H |
| |
| #include "llvm/ADT/DenseMap.h" |
| #include "llvm/ADT/IndexedMap.h" |
| #include "llvm/BinaryFormat/GOFF.h" |
| #include "llvm/Object/ObjectFile.h" |
| #include "llvm/Support/ConvertEBCDIC.h" |
| #include "llvm/Support/Debug.h" |
| #include "llvm/Support/Endian.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include "llvm/TargetParser/SubtargetFeature.h" |
| #include "llvm/TargetParser/Triple.h" |
| |
| namespace llvm { |
| |
| namespace object { |
| |
| class GOFFObjectFile : public ObjectFile { |
| IndexedMap<const uint8_t *> EsdPtrs; // Indexed by EsdId. |
| |
| mutable DenseMap<uint32_t, std::pair<size_t, std::unique_ptr<char[]>>> |
| EsdNamesCache; |
| |
| typedef DataRefImpl SectionEntryImpl; |
| // (EDID, 0) code, r/o data section |
| // (EDID,PRID) r/w data section |
| SmallVector<SectionEntryImpl, 256> SectionList; |
| mutable DenseMap<uint32_t, std::string> SectionDataCache; |
| |
| public: |
| Expected<StringRef> getSymbolName(SymbolRef Symbol) const; |
| |
| GOFFObjectFile(MemoryBufferRef Object, Error &Err); |
| static inline bool classof(const Binary *V) { return V->isGOFF(); } |
| section_iterator section_begin() const override; |
| section_iterator section_end() const override; |
| |
| uint8_t getBytesInAddress() const override { return 8; } |
| |
| StringRef getFileFormatName() const override { return "GOFF-SystemZ"; } |
| |
| Triple::ArchType getArch() const override { return Triple::systemz; } |
| |
| Expected<SubtargetFeatures> getFeatures() const override { return SubtargetFeatures(); } |
| |
| bool isRelocatableObject() const override { return true; } |
| |
| void moveSymbolNext(DataRefImpl &Symb) const override; |
| basic_symbol_iterator symbol_begin() const override; |
| basic_symbol_iterator symbol_end() const override; |
| |
| bool is64Bit() const override { |
| return true; |
| } |
| |
| private: |
| // SymbolRef. |
| Expected<StringRef> getSymbolName(DataRefImpl Symb) const override; |
| Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override; |
| uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; |
| uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override; |
| Expected<uint32_t> getSymbolFlags(DataRefImpl Symb) const override; |
| Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const override; |
| Expected<section_iterator> getSymbolSection(DataRefImpl Symb) const override; |
| |
| const uint8_t *getSymbolEsdRecord(DataRefImpl Symb) const; |
| bool isSymbolUnresolved(DataRefImpl Symb) const; |
| bool isSymbolIndirect(DataRefImpl Symb) const; |
| |
| // SectionRef. |
| void moveSectionNext(DataRefImpl &Sec) const override {} |
| virtual Expected<StringRef> getSectionName(DataRefImpl Sec) const override { |
| return StringRef(); |
| } |
| uint64_t getSectionAddress(DataRefImpl Sec) const override { return 0; } |
| uint64_t getSectionSize(DataRefImpl Sec) const override { return 0; } |
| virtual Expected<ArrayRef<uint8_t>> |
| getSectionContents(DataRefImpl Sec) const override { |
| return ArrayRef<uint8_t>(); |
| } |
| uint64_t getSectionIndex(DataRefImpl Sec) const override { return 0; } |
| uint64_t getSectionAlignment(DataRefImpl Sec) const override { return 0; } |
| bool isSectionCompressed(DataRefImpl Sec) const override { return false; } |
| bool isSectionText(DataRefImpl Sec) const override { return false; } |
| bool isSectionData(DataRefImpl Sec) const override { return false; } |
| bool isSectionBSS(DataRefImpl Sec) const override { return false; } |
| bool isSectionVirtual(DataRefImpl Sec) const override { return false; } |
| relocation_iterator section_rel_begin(DataRefImpl Sec) const override { |
| return relocation_iterator(RelocationRef(Sec, this)); |
| } |
| relocation_iterator section_rel_end(DataRefImpl Sec) const override { |
| return relocation_iterator(RelocationRef(Sec, this)); |
| } |
| |
| const uint8_t *getSectionEdEsdRecord(DataRefImpl &Sec) const; |
| const uint8_t *getSectionPrEsdRecord(DataRefImpl &Sec) const; |
| const uint8_t *getSectionEdEsdRecord(uint32_t SectionIndex) const; |
| const uint8_t *getSectionPrEsdRecord(uint32_t SectionIndex) const; |
| |
| // RelocationRef. |
| void moveRelocationNext(DataRefImpl &Rel) const override {} |
| uint64_t getRelocationOffset(DataRefImpl Rel) const override { return 0; } |
| symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override { |
| DataRefImpl Temp; |
| return basic_symbol_iterator(SymbolRef(Temp, this)); |
| } |
| uint64_t getRelocationType(DataRefImpl Rel) const override { return 0; } |
| void getRelocationTypeName(DataRefImpl Rel, |
| SmallVectorImpl<char> &Result) const override {} |
| }; |
| |
| } // namespace object |
| |
| } // namespace llvm |
| |
| #endif |