clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
158 lines
5.8 KiB
C++
158 lines
5.8 KiB
C++
//===- 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 {
|
|
friend class GOFFSymbolRef;
|
|
|
|
IndexedMap<const uint8_t *> EsdPtrs; // Indexed by EsdId.
|
|
SmallVector<const uint8_t *, 256> TextPtrs;
|
|
|
|
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, SmallVector<uint8_t>> 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;
|
|
}
|
|
|
|
bool isSectionNoLoad(DataRefImpl Sec) const;
|
|
bool isSectionReadOnlyData(DataRefImpl Sec) const;
|
|
bool isSectionZeroInit(DataRefImpl Sec) const;
|
|
|
|
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;
|
|
uint64_t getSymbolSize(DataRefImpl Symb) const;
|
|
|
|
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;
|
|
uint64_t getSectionAddress(DataRefImpl Sec) const override;
|
|
uint64_t getSectionSize(DataRefImpl Sec) const override;
|
|
virtual Expected<ArrayRef<uint8_t>>
|
|
getSectionContents(DataRefImpl Sec) const override;
|
|
uint64_t getSectionIndex(DataRefImpl Sec) const override { return Sec.d.a; }
|
|
uint64_t getSectionAlignment(DataRefImpl Sec) const override;
|
|
bool isSectionCompressed(DataRefImpl Sec) const override { return false; }
|
|
bool isSectionText(DataRefImpl Sec) const override;
|
|
bool isSectionData(DataRefImpl Sec) const override;
|
|
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;
|
|
uint32_t getSectionDefEsdId(DataRefImpl &Sec) 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 {}
|
|
};
|
|
|
|
class GOFFSymbolRef : public SymbolRef {
|
|
public:
|
|
GOFFSymbolRef(const SymbolRef &B) : SymbolRef(B) {
|
|
assert(isa<GOFFObjectFile>(SymbolRef::getObject()));
|
|
}
|
|
|
|
const GOFFObjectFile *getObject() const {
|
|
return cast<GOFFObjectFile>(BasicSymbolRef::getObject());
|
|
}
|
|
|
|
Expected<uint32_t> getSymbolGOFFFlags() const {
|
|
return getObject()->getSymbolFlags(getRawDataRefImpl());
|
|
}
|
|
|
|
Expected<SymbolRef::Type> getSymbolGOFFType() const {
|
|
return getObject()->getSymbolType(getRawDataRefImpl());
|
|
}
|
|
|
|
uint64_t getSize() const {
|
|
return getObject()->getSymbolSize(getRawDataRefImpl());
|
|
}
|
|
};
|
|
|
|
} // namespace object
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|