class MachObjectWriter

Declaration

class MachObjectWriter : public MCObjectWriter { /* full declaration omitted */ };

Description

Defines the object file and target independent interfaces used by the assembler backend to write native file format object files. The object writer contains a few callbacks used by the assembler to allow the object writer to modify the assembler data structures at appropriate points. Once assembly is complete, the object writer is given the MCAssembler instance, which contains all the symbol and section data which should be emitted as part of writeObject().

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:84

Inherits from: MCObjectWriter

Member Variables

private std::unique_ptr<MCMachObjectTargetWriter> TargetObjectWriter
The target specific Mach-O writer instance.
private DenseMap<const llvm::MCSection*, std::vector<RelAndSymbol>> Relocations
private DenseMap<const llvm::MCSection*, unsigned int> IndirectSymBase
private llvm::SectionAddrMap SectionAddress
private llvm::StringTableBuilder StringTable
@ {
private std::vector<MachSymbolData> LocalSymbolData
private std::vector<MachSymbolData> ExternalSymbolData
private std::vector<MachSymbolData> UndefinedSymbolData
public support::endian::Writer W

Inherited from MCObjectWriter:

protected AddrsigSyms
protected EmitAddrsigSection = false

Method Overview

  • public MachObjectWriter(std::unique_ptr<MCMachObjectTargetWriter> MOTW, llvm::raw_pwrite_stream & OS, bool IsLittleEndian)
  • public void addRelocation(const llvm::MCSymbol * RelSymbol, const llvm::MCSection * Sec, MachO::any_relocation_info & MRE)
  • public void bindIndirectSymbols(llvm::MCAssembler & Asm)
  • public void computeSectionAddresses(const llvm::MCAssembler & Asm, const llvm::MCAsmLayout & Layout)
  • public void computeSymbolTable(llvm::MCAssembler & Asm, std::vector<MachSymbolData> & LocalSymbolData, std::vector<MachSymbolData> & ExternalSymbolData, std::vector<MachSymbolData> & UndefinedSymbolData)
  • public bool doesSymbolRequireExternRelocation(const llvm::MCSymbol & S)
  • public void executePostLayoutBinding(llvm::MCAssembler & Asm, const llvm::MCAsmLayout & Layout)
  • public const llvm::MCSymbol & findAliasedSymbol(const llvm::MCSymbol & Sym) const
  • private llvm::MachObjectWriter::MachSymbolData * findSymbolData(const llvm::MCSymbol & Sym)
  • public uint64_t getFragmentAddress(const llvm::MCFragment * Fragment, const llvm::MCAsmLayout & Layout) const
  • public uint64_t getPaddingSize(const llvm::MCSection * SD, const llvm::MCAsmLayout & Layout) const
  • public uint64_t getSectionAddress(const llvm::MCSection * Sec) const
  • public llvm::SectionAddrMap & getSectionAddressMap()
  • public uint64_t getSymbolAddress(const llvm::MCSymbol & S, const llvm::MCAsmLayout & Layout) const
  • public bool is64Bit() const
  • public bool isFixupKindPCRel(const llvm::MCAssembler & Asm, unsigned int Kind)
  • public bool isSymbolRefDifferenceFullyResolvedImpl(const llvm::MCAssembler & Asm, const llvm::MCSymbol & A, const llvm::MCSymbol & B, bool InSet) const
  • public bool isSymbolRefDifferenceFullyResolvedImpl(const llvm::MCAssembler & Asm, const llvm::MCSymbol & SymA, const llvm::MCFragment & FB, bool InSet, bool IsPCRel) const
  • public bool isX86_64() const
  • public void populateAddrSigSection(llvm::MCAssembler & Asm)
  • public void recordRelocation(llvm::MCAssembler & Asm, const llvm::MCAsmLayout & Layout, const llvm::MCFragment * Fragment, const llvm::MCFixup & Fixup, llvm::MCValue Target, uint64_t & FixedValue)
  • public void reset()
  • public void writeDysymtabLoadCommand(uint32_t FirstLocalSymbol, uint32_t NumLocalSymbols, uint32_t FirstExternalSymbol, uint32_t NumExternalSymbols, uint32_t FirstUndefinedSymbol, uint32_t NumUndefinedSymbols, uint32_t IndirectSymbolOffset, uint32_t NumIndirectSymbols)
  • public void writeHeader(MachO::HeaderFileType Type, unsigned int NumLoadCommands, unsigned int LoadCommandsSize, bool SubsectionsViaSymbols)
  • public void writeLinkeditLoadCommand(uint32_t Type, uint32_t DataOffset, uint32_t DataSize)
  • public void writeLinkerOptionsLoadCommand(const std::vector<std::string> & Options)
  • public void writeNlist(llvm::MachObjectWriter::MachSymbolData & MSD, const llvm::MCAsmLayout & Layout)
  • public uint64_t writeObject(llvm::MCAssembler & Asm, const llvm::MCAsmLayout & Layout)
  • public void writeSection(const llvm::MCAsmLayout & Layout, const llvm::MCSection & Sec, uint64_t VMAddr, uint64_t FileOffset, unsigned int Flags, uint64_t RelocationsStart, unsigned int NumRelocations)
  • public void writeSegmentLoadCommand(llvm::StringRef Name, unsigned int NumSections, uint64_t VMAddr, uint64_t VMSize, uint64_t SectionDataStartOffset, uint64_t SectionDataSize, uint32_t MaxProt, uint32_t InitProt)
  • public void writeSymtabLoadCommand(uint32_t SymbolOffset, uint32_t NumSymbols, uint32_t StringTableOffset, uint32_t StringTableSize)
  • private void writeWithPadding(llvm::StringRef Str, uint64_t Size)

Inherited from MCObjectWriter:

Methods

MachObjectWriter(
    std::unique_ptr<MCMachObjectTargetWriter>
        MOTW,
    llvm::raw_pwrite_stream& OS,
    bool IsLittleEndian)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:129

Parameters

std::unique_ptr<MCMachObjectTargetWriter> MOTW
llvm::raw_pwrite_stream& OS
bool IsLittleEndian

void addRelocation(
    const llvm::MCSymbol* RelSymbol,
    const llvm::MCSection* Sec,
    MachO::any_relocation_info& MRE)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:232

Parameters

const llvm::MCSymbol* RelSymbol
const llvm::MCSection* Sec
MachO::any_relocation_info& MRE

void bindIndirectSymbols(llvm::MCAssembler& Asm)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:242

Parameters

llvm::MCAssembler& Asm

void computeSectionAddresses(
    const llvm::MCAssembler& Asm,
    const llvm::MCAsmLayout& Layout)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:250

Parameters

const llvm::MCAssembler& Asm
const llvm::MCAsmLayout& Layout

void computeSymbolTable(
    llvm::MCAssembler& Asm,
    std::vector<MachSymbolData>& LocalSymbolData,
    std::vector<MachSymbolData>&
        ExternalSymbolData,
    std::vector<MachSymbolData>&
        UndefinedSymbolData)

Description

Compute the symbol table data.

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:245

Parameters

llvm::MCAssembler& Asm
std::vector<MachSymbolData>& LocalSymbolData
std::vector<MachSymbolData>& ExternalSymbolData
std::vector<MachSymbolData>& UndefinedSymbolData

bool doesSymbolRequireExternRelocation(
    const llvm::MCSymbol& S)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:164

Parameters

const llvm::MCSymbol& S

void executePostLayoutBinding(
    llvm::MCAssembler& Asm,
    const llvm::MCAsmLayout& Layout)

Description

Perform any late binding of symbols (for example, to assign symbol indices for use when generating relocations). This routine is called by the assembler after layout and relaxation is complete.

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:253

Parameters

llvm::MCAssembler& Asm
const llvm::MCAsmLayout& Layout

const llvm::MCSymbol& findAliasedSymbol(
    const llvm::MCSymbol& Sym) const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:138

Parameters

const llvm::MCSymbol& Sym

llvm::MachObjectWriter::MachSymbolData*
findSymbolData(const llvm::MCSymbol& Sym)

Description

@ }

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:124

Parameters

const llvm::MCSymbol& Sym

uint64_t getFragmentAddress(
    const llvm::MCFragment* Fragment,
    const llvm::MCAsmLayout& Layout) const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:159

Parameters

const llvm::MCFragment* Fragment
const llvm::MCAsmLayout& Layout

uint64_t getPaddingSize(
    const llvm::MCSection* SD,
    const llvm::MCAsmLayout& Layout) const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:162

Parameters

const llvm::MCSection* SD
const llvm::MCAsmLayout& Layout

uint64_t getSectionAddress(
    const llvm::MCSection* Sec) const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:154

Parameters

const llvm::MCSection* Sec

llvm::SectionAddrMap& getSectionAddressMap()

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:152

uint64_t getSymbolAddress(
    const llvm::MCSymbol& S,
    const llvm::MCAsmLayout& Layout) const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:157

Parameters

const llvm::MCSymbol& S
const llvm::MCAsmLayout& Layout

bool is64Bit() const

Description

@ {

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:171

bool isFixupKindPCRel(
    const llvm::MCAssembler& Asm,
    unsigned int Kind)

Description

@ {

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:150

Parameters

const llvm::MCAssembler& Asm
unsigned int Kind

bool isSymbolRefDifferenceFullyResolvedImpl(
    const llvm::MCAssembler& Asm,
    const llvm::MCSymbol& A,
    const llvm::MCSymbol& B,
    bool InSet) const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:256

Parameters

const llvm::MCAssembler& Asm
const llvm::MCSymbol& A
const llvm::MCSymbol& B
bool InSet

bool isSymbolRefDifferenceFullyResolvedImpl(
    const llvm::MCAssembler& Asm,
    const llvm::MCSymbol& SymA,
    const llvm::MCFragment& FB,
    bool InSet,
    bool IsPCRel) const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:261

Parameters

const llvm::MCAssembler& Asm
const llvm::MCSymbol& SymA
const llvm::MCFragment& FB
bool InSet
bool IsPCRel

bool isX86_64() const

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:172

void populateAddrSigSection(
    llvm::MCAssembler& Asm)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:266

Parameters

llvm::MCAssembler& Asm

void recordRelocation(
    llvm::MCAssembler& Asm,
    const llvm::MCAsmLayout& Layout,
    const llvm::MCFragment* Fragment,
    const llvm::MCFixup& Fixup,
    llvm::MCValue Target,
    uint64_t& FixedValue)

Description

Record a relocation entry. This routine is called by the assembler after layout and relaxation, and post layout binding. The implementation is responsible for storing information about the relocation so that it can be emitted during writeObject().

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:238

Parameters

llvm::MCAssembler& Asm
const llvm::MCAsmLayout& Layout
const llvm::MCFragment* Fragment
const llvm::MCFixup& Fixup
llvm::MCValue Target
uint64_t& FixedValue

void reset()

Description

@ {

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:143

void writeDysymtabLoadCommand(
    uint32_t FirstLocalSymbol,
    uint32_t NumLocalSymbols,
    uint32_t FirstExternalSymbol,
    uint32_t NumExternalSymbols,
    uint32_t FirstUndefinedSymbol,
    uint32_t NumUndefinedSymbols,
    uint32_t IndirectSymbolOffset,
    uint32_t NumIndirectSymbols)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:200

Parameters

uint32_t FirstLocalSymbol
uint32_t NumLocalSymbols
uint32_t FirstExternalSymbol
uint32_t NumExternalSymbols
uint32_t FirstUndefinedSymbol
uint32_t NumUndefinedSymbols
uint32_t IndirectSymbolOffset
uint32_t NumIndirectSymbols

void writeHeader(MachO::HeaderFileType Type,
                 unsigned int NumLoadCommands,
                 unsigned int LoadCommandsSize,
                 bool SubsectionsViaSymbols)

Description

@ }

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:179

Parameters

MachO::HeaderFileType Type
unsigned int NumLoadCommands
unsigned int LoadCommandsSize
bool SubsectionsViaSymbols

void writeLinkeditLoadCommand(uint32_t Type,
                              uint32_t DataOffset,
                              uint32_t DataSize)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:208

Parameters

uint32_t Type
uint32_t DataOffset
uint32_t DataSize

void writeLinkerOptionsLoadCommand(
    const std::vector<std::string>& Options)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:211

Parameters

const std::vector<std::string>& Options

void writeNlist(
    llvm::MachObjectWriter::MachSymbolData& MSD,
    const llvm::MCAsmLayout& Layout)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:206

Parameters

llvm::MachObjectWriter::MachSymbolData& MSD
const llvm::MCAsmLayout& Layout

uint64_t writeObject(
    llvm::MCAssembler& Asm,
    const llvm::MCAsmLayout& Layout)

Description

Write the object file and returns the number of bytes written. This routine is called by the assembler after layout and relaxation is complete, fixups have been evaluated and applied, and relocations generated.

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:268

Parameters

llvm::MCAssembler& Asm
const llvm::MCAsmLayout& Layout

void writeSection(const llvm::MCAsmLayout& Layout,
                  const llvm::MCSection& Sec,
                  uint64_t VMAddr,
                  uint64_t FileOffset,
                  unsigned int Flags,
                  uint64_t RelocationsStart,
                  unsigned int NumRelocations)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:192

Parameters

const llvm::MCAsmLayout& Layout
const llvm::MCSection& Sec
uint64_t VMAddr
uint64_t FileOffset
unsigned int Flags
uint64_t RelocationsStart
unsigned int NumRelocations

void writeSegmentLoadCommand(
    llvm::StringRef Name,
    unsigned int NumSections,
    uint64_t VMAddr,
    uint64_t VMSize,
    uint64_t SectionDataStartOffset,
    uint64_t SectionDataSize,
    uint32_t MaxProt,
    uint32_t InitProt)

Description

Write a segment load command.

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:186

Parameters

llvm::StringRef Name
unsigned int NumSections
The number of sections in this segment.
uint64_t VMAddr
uint64_t VMSize
uint64_t SectionDataStartOffset
uint64_t SectionDataSize
The total size of the sections.
uint32_t MaxProt
uint32_t InitProt

void writeSymtabLoadCommand(
    uint32_t SymbolOffset,
    uint32_t NumSymbols,
    uint32_t StringTableOffset,
    uint32_t StringTableSize)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:196

Parameters

uint32_t SymbolOffset
uint32_t NumSymbols
uint32_t StringTableOffset
uint32_t StringTableSize

void writeWithPadding(llvm::StringRef Str,
                      uint64_t Size)

Declared at: llvm/include/llvm/MC/MCMachObjectWriter.h:126

Parameters

llvm::StringRef Str
uint64_t Size