Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions llvm/include/llvm/BinaryFormat/GOFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,29 @@ enum ESDAlignment : uint8_t {
ESD_ALIGN_4Kpage = 12,
};

enum RLDReferenceType : uint8_t {
RLD_RT_RAddress = 0,
RLD_RT_ROffset = 1,
RLD_RT_RLength = 2,
RLD_RT_RRelativeImmediate = 6,
RLD_RT_RTypeConstant = 7,
RLD_RT_RLongDisplacement = 9,
};

enum RLDReferentType : uint8_t {
RLD_RO_Label = 0,
RLD_RO_Element = 1,
RLD_RO_Class = 2,
RLD_RO_Part = 3,
};

enum RLDAction : uint8_t {
RLD_ACT_Add = 0,
RLD_ACT_Subtract = 1,
};

enum RLDFetchStore : uint8_t { RLD_FS_Fetch = 0, RLD_FS_Store = 1 };

enum ENDEntryPointRequest : uint8_t {
END_EPR_None = 0,
END_EPR_EsdidOffset = 1,
Expand Down
48 changes: 47 additions & 1 deletion llvm/include/llvm/MC/MCGOFFObjectWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,88 @@
#ifndef LLVM_MC_MCGOFFOBJECTWRITER_H
#define LLVM_MC_MCGOFFOBJECTWRITER_H

#include "llvm/BinaryFormat/GOFF.h"
#include "llvm/MC/MCObjectWriter.h"
#include "llvm/MC/MCValue.h"
#include <memory>
#include <vector>

namespace llvm {
class MCObjectWriter;
class MCSectionGOFF;
class MCSymbolGOFF;
class raw_pwrite_stream;

class MCGOFFObjectTargetWriter : public MCObjectTargetWriter {
protected:
MCGOFFObjectTargetWriter() = default;

public:
enum RLDRelocationType {
Reloc_Type_ACon = 0x1, // General address.
Reloc_Type_RelImm = 0x2, // Relative-immediate address.
Reloc_Type_QCon = 0x3, // Offset of symbol in class.
Reloc_Type_VCon = 0x4, // Address of external symbol.
Reloc_Type_RCon = 0x5, // PSECT of symbol.
};

~MCGOFFObjectTargetWriter() override = default;

virtual unsigned getRelocType(const MCValue &Target,
const MCFixup &Fixup) const = 0;

Triple::ObjectFormatType getFormat() const override { return Triple::GOFF; }

static bool classof(const MCObjectTargetWriter *W) {
return W->getFormat() == Triple::GOFF;
}
};

// A GOFFRelocationEntry describes a single relocation.
// For the naming, see
// https://www.ibm.com/docs/en/zos/3.1.0?topic=record-relocation-directory-data-item.
struct GOFFRelocationEntry {
const MCSymbolGOFF *Rptr; // The R pointer.
const MCSectionGOFF *Pptr; // The P pointer.
uint32_t REsdId = 0; // The R pointer id.
uint32_t PEsdId = 0; // The P pointer id.
uint64_t POffset; // The offset within the element described by the P pointer.
uint32_t TargetLength; // The byte length of the target field.

// Details of the relocation.
GOFF::RLDReferenceType ReferenceType : 4;
GOFF::RLDReferentType ReferentType : 2;
GOFF::RLDAction Action : 1;
GOFF::RLDFetchStore FetchStore : 1;

GOFFRelocationEntry(const MCSectionGOFF *Pptr, const MCSymbolGOFF *Rptr,
GOFF::RLDReferenceType ReferenceType,
GOFF::RLDReferentType ReferentType,
GOFF::RLDAction Action, GOFF::RLDFetchStore FetchStore,
uint64_t POffset, uint32_t TargetLength)
: Rptr(Rptr), Pptr(Pptr), POffset(POffset), TargetLength(TargetLength),
ReferenceType(ReferenceType), ReferentType(ReferentType),
Action(Action), FetchStore(FetchStore) {}
};

class GOFFObjectWriter : public MCObjectWriter {
// The target specific GOFF writer instance.
std::unique_ptr<MCGOFFObjectTargetWriter> TargetObjectWriter;

// The stream used to write the GOFF records.
raw_pwrite_stream &OS;

// Saved relocation data.
std::vector<GOFFRelocationEntry> Relocations;

public:
GOFFObjectWriter(std::unique_ptr<MCGOFFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS);
~GOFFObjectWriter() override;

// Implementation of the MCObjectWriter interface.
void recordRelocation(const MCFragment &F, const MCFixup &Fixup,
MCValue Target, uint64_t &FixedValue) override {}
MCValue Target, uint64_t &FixedValue) override;

uint64_t writeObject() override;
};
Expand Down
Loading