//===- 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/raw_ostream.h" #include "llvm/TargetParser/SubtargetFeature.h" #include "llvm/TargetParser/Triple.h" namespace llvm { namespace object { class GOFFObjectFile : public ObjectFile { IndexedMap EsdPtrs; // Indexed by EsdId. mutable DenseMap>> EsdNamesCache; typedef DataRefImpl SectionEntryImpl; // (EDID, 0) code, r/o data section // (EDID,PRID) r/w data section SmallVector SectionList; mutable DenseMap SectionDataCache; public: Expected 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 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 getSymbolName(DataRefImpl Symb) const override; Expected getSymbolAddress(DataRefImpl Symb) const override; uint64_t getSymbolValueImpl(DataRefImpl Symb) const override; uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override; Expected getSymbolFlags(DataRefImpl Symb) const override; Expected getSymbolType(DataRefImpl Symb) const override; Expected 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 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> getSectionContents(DataRefImpl Sec) const override { return ArrayRef(); } 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 &Result) const override {} }; } // namespace object } // namespace llvm #endif