LLVM API Documentation
#include <MCMachObjectWriter.h>
Public Member Functions | |
MachObjectWriter (MCMachObjectTargetWriter *MOTW, raw_ostream &_OS, bool _IsLittleEndian) | |
void | WriteHeader (unsigned NumLoadCommands, unsigned LoadCommandsSize, bool SubsectionsViaSymbols) |
void | WriteSegmentLoadCommand (unsigned NumSections, uint64_t VMSize, uint64_t SectionDataStartOffset, uint64_t SectionDataSize) |
void | WriteSection (const MCAssembler &Asm, const MCAsmLayout &Layout, const MCSectionData &SD, uint64_t FileOffset, uint64_t RelocationsStart, unsigned NumRelocations) |
void | WriteSymtabLoadCommand (uint32_t SymbolOffset, uint32_t NumSymbols, uint32_t StringTableOffset, uint32_t StringTableSize) |
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) |
void | WriteNlist (MachSymbolData &MSD, const MCAsmLayout &Layout) |
void | WriteLinkeditLoadCommand (uint32_t Type, uint32_t DataOffset, uint32_t DataSize) |
void | WriteLinkerOptionsLoadCommand (const std::vector< std::string > &Options) |
void | addRelocation (const MCSectionData *SD, MachO::any_relocation_info &MRE) |
void | RecordScatteredRelocation (const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, unsigned Log2Size, uint64_t &FixedValue) |
void | RecordTLVPRelocation (const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue) |
void | RecordRelocation (const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue) |
Record a relocation entry. More... | |
void | BindIndirectSymbols (MCAssembler &Asm) |
void | ComputeSymbolTable (MCAssembler &Asm, SmallString< 256 > &StringTable, std::vector< MachSymbolData > &LocalSymbolData, std::vector< MachSymbolData > &ExternalSymbolData, std::vector< MachSymbolData > &UndefinedSymbolData) |
void | computeSectionAddresses (const MCAssembler &Asm, const MCAsmLayout &Layout) |
void | markAbsoluteVariableSymbols (MCAssembler &Asm, const MCAsmLayout &Layout) |
void | ExecutePostLayoutBinding (MCAssembler &Asm, const MCAsmLayout &Layout) |
Perform any late binding of symbols (for example, to assign symbol indices for use when generating relocations). More... | |
virtual bool | IsSymbolRefDifferenceFullyResolvedImpl (const MCAssembler &Asm, const MCSymbolData &DataA, const MCFragment &FB, bool InSet, bool IsPCRel) const |
void | WriteObject (MCAssembler &Asm, const MCAsmLayout &Layout) |
Write the object file. More... | |
Lifetime management Methods | |
virtual void | reset () |
lifetime management More... | |
Target Writer Proxy Accessors | |
bool | is64Bit () const |
bool | isARM () const |
![]() | |
virtual | ~MCObjectWriter () |
bool | isLittleEndian () const |
raw_ostream & | getStream () |
bool | IsSymbolRefDifferenceFullyResolved (const MCAssembler &Asm, const MCSymbolRefExpr *A, const MCSymbolRefExpr *B, bool InSet) const |
Check whether the difference (A - B) between two symbol references is fully resolved. More... | |
void | Write8 (uint8_t Value) |
void | WriteLE16 (uint16_t Value) |
void | WriteLE32 (uint32_t Value) |
void | WriteLE64 (uint64_t Value) |
void | WriteBE16 (uint16_t Value) |
void | WriteBE32 (uint32_t Value) |
void | WriteBE64 (uint64_t Value) |
void | Write16 (uint16_t Value) |
void | Write32 (uint32_t Value) |
void | Write64 (uint64_t Value) |
void | WriteZeros (unsigned N) |
void | WriteBytes (const SmallVectorImpl< char > &ByteVec, unsigned ZeroFillSize=0) |
void | WriteBytes (StringRef Str, unsigned ZeroFillSize=0) |
Utility Methods | |
SectionAddrMap | SectionAddress |
bool | isFixupKindPCRel (const MCAssembler &Asm, unsigned Kind) |
SectionAddrMap & | getSectionAddressMap () |
uint64_t | getSectionAddress (const MCSectionData *SD) const |
uint64_t | getSymbolAddress (const MCSymbolData *SD, const MCAsmLayout &Layout) const |
uint64_t | getFragmentAddress (const MCFragment *Fragment, const MCAsmLayout &Layout) const |
uint64_t | getPaddingSize (const MCSectionData *SD, const MCAsmLayout &Layout) const |
bool | doesSymbolRequireExternRelocation (const MCSymbolData *SD) |
Additional Inherited Members | |
![]() | |
MCObjectWriter (raw_ostream &_OS, bool _IsLittleEndian) | |
![]() | |
raw_ostream & | OS |
unsigned | IsLittleEndian: 1 |
Definition at line 82 of file MCMachObjectWriter.h.
|
inline |
Definition at line 116 of file MCMachObjectWriter.h.
|
inline |
Definition at line 214 of file MCMachObjectWriter.h.
void MachObjectWriter::BindIndirectSymbols | ( | MCAssembler & | Asm | ) |
Definition at line 425 of file MachObjectWriter.cpp.
References llvm::MCSymbolData::getFlags(), llvm::MCSymbol::getName(), llvm::MCAssembler::getOrCreateSymbolData(), llvm::MCSectionMachO::getType(), llvm::MCAssembler::indirect_symbol_begin(), llvm::MCAssembler::indirect_symbol_end(), llvm::report_fatal_error(), llvm::MachO::S_LAZY_SYMBOL_POINTERS, llvm::MachO::S_NON_LAZY_SYMBOL_POINTERS, llvm::MachO::S_SYMBOL_STUBS, llvm::ARMBuildAttrs::Section, llvm::MCSymbolData::setFlags(), and llvm::ARMBuildAttrs::Symbol.
Referenced by ExecutePostLayoutBinding().
void MachObjectWriter::computeSectionAddresses | ( | const MCAssembler & | Asm, |
const MCAsmLayout & | Layout | ||
) |
strictly be necessary.
Definition at line 604 of file MachObjectWriter.cpp.
References llvm::MCSectionData::getAlignment(), getPaddingSize(), llvm::MCAsmLayout::getSectionAddressSize(), llvm::MCAsmLayout::getSectionOrder(), llvm::RoundUpToAlignment(), SectionAddress, and llvm::SmallVectorTemplateCommon< T >::size().
Referenced by ExecutePostLayoutBinding().
void MachObjectWriter::ComputeSymbolTable | ( | MCAssembler & | Asm, |
SmallString< 256 > & | StringTable, | ||
std::vector< MachSymbolData > & | LocalSymbolData, | ||
std::vector< MachSymbolData > & | ExternalSymbolData, | ||
std::vector< MachSymbolData > & | UndefinedSymbolData | ||
) |
ComputeSymbolTable - Compute the symbol table data
StringTable | [out] - The string table data. |
ComputeSymbolTable - Compute the symbol table data
StringTable | [out] - The string table data. |
StringIndexMap | [out] - Map from symbol names to offsets in the string table. |
Definition at line 495 of file MachObjectWriter.cpp.
References llvm::MCAssembler::begin(), llvm::MCAssembler::end(), llvm::MCSymbol::getName(), llvm::MCSymbol::getSection(), llvm::MCSymbol::isAbsolute(), llvm::MCAssembler::isSymbolLinkerVisible(), llvm::MCSymbol::isUndefined(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT >, KeyT, ValueT, KeyInfoT >::lookup(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::ARMBuildAttrs::Symbol, llvm::MCAssembler::symbol_begin(), and llvm::MCAssembler::symbol_end().
Referenced by ExecutePostLayoutBinding().
bool MachObjectWriter::doesSymbolRequireExternRelocation | ( | const MCSymbolData * | SD | ) |
Definition at line 40 of file MachObjectWriter.cpp.
References llvm::MCSymbolData::getFlags(), llvm::MCSymbol::isUndefined(), llvm::SF_WeakDefinition, and llvm::MCSymbolData::Symbol.
|
virtual |
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.
Implements llvm::MCObjectWriter.
Definition at line 641 of file MachObjectWriter.cpp.
References BindIndirectSymbols(), computeSectionAddresses(), ComputeSymbolTable(), and markAbsoluteVariableSymbols().
uint64_t MachObjectWriter::getFragmentAddress | ( | const MCFragment * | Fragment, |
const MCAsmLayout & | Layout | ||
) | const |
Definition at line 67 of file MachObjectWriter.cpp.
References llvm::MCAsmLayout::getFragmentOffset(), llvm::MCFragment::getParent(), and getSectionAddress().
uint64_t MachObjectWriter::getPaddingSize | ( | const MCSectionData * | SD, |
const MCAsmLayout & | Layout | ||
) | const |
Definition at line 111 of file MachObjectWriter.cpp.
References llvm::MCSectionData::getAlignment(), llvm::MCSectionData::getLayoutOrder(), llvm::MCSectionData::getSection(), getSectionAddress(), llvm::MCAsmLayout::getSectionAddressSize(), llvm::MCAsmLayout::getSectionOrder(), llvm::MCSection::isVirtualSection(), and llvm::OffsetToAlignment().
Referenced by computeSectionAddresses(), and WriteObject().
|
inline |
Definition at line 137 of file MCMachObjectWriter.h.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::lookup(), and SectionAddress.
Referenced by getFragmentAddress(), getPaddingSize(), getSymbolAddress(), WriteObject(), and WriteSection().
|
inline |
Definition at line 135 of file MCMachObjectWriter.h.
References SectionAddress.
uint64_t MachObjectWriter::getSymbolAddress | ( | const MCSymbolData * | SD, |
const MCAsmLayout & | Layout | ||
) | const |
Definition at line 73 of file MachObjectWriter.cpp.
References llvm::CallingConv::C, llvm::MCExpr::EvaluateAsRelocatable(), llvm::MCAsmLayout::getAssembler(), llvm::MCValue::getConstant(), llvm::MCSymbolData::getFragment(), llvm::MCSymbol::getName(), llvm::MCFragment::getParent(), getSectionAddress(), llvm::MCValue::getSymA(), llvm::MCValue::getSymB(), llvm::MCSymbolRefExpr::getSymbol(), llvm::MCSymbolData::getSymbol(), llvm::MCAssembler::getSymbolData(), llvm::MCAsmLayout::getSymbolOffset(), llvm::MCSymbol::getVariableValue(), llvm::MCSymbol::isUndefined(), llvm::MCSymbol::isVariable(), and llvm::report_fatal_error().
Referenced by WriteNlist(), and WriteObject().
|
inline |
Definition at line 156 of file MCMachObjectWriter.h.
Referenced by WriteHeader(), WriteLinkerOptionsLoadCommand(), WriteNlist(), WriteObject(), WriteSection(), and WriteSegmentLoadCommand().
|
inline |
Definition at line 157 of file MCMachObjectWriter.h.
References llvm::MachO::CPU_TYPE_ARM.
bool MachObjectWriter::isFixupKindPCRel | ( | const MCAssembler & | Asm, |
unsigned | Kind | ||
) |
Definition at line 60 of file MachObjectWriter.cpp.
References llvm::MCFixupKindInfo::FKF_IsPCRel, llvm::MCFixupKindInfo::Flags, llvm::MCAssembler::getBackend(), and llvm::MCAsmBackend::getFixupKindInfo().
|
virtual |
Reimplemented from llvm::MCObjectWriter.
Definition at line 658 of file MachObjectWriter.cpp.
References llvm::MCSymbol::AliasedSymbol(), llvm::MCFragment::getAtom(), llvm::MCAssembler::getBackend(), llvm::MCSymbolData::getFragment(), llvm::MCFragment::getParent(), llvm::MCSymbol::getSection(), llvm::MCSectionData::getSection(), llvm::MCAssembler::getSubsectionsViaSymbols(), llvm::MCSymbolData::getSymbol(), llvm::MCAssembler::getSymbolData(), llvm::MCAsmBackend::hasReliableSymbolDifference(), llvm::MCSymbol::isInSection(), and llvm::MCSymbol::isTemporary().
void MachObjectWriter::markAbsoluteVariableSymbols | ( | MCAssembler & | Asm, |
const MCAsmLayout & | Layout | ||
) |
Definition at line 621 of file MachObjectWriter.cpp.
References llvm::MCExpr::EvaluateAsRelocatable(), llvm::MCValue::getSymA(), llvm::MCValue::getSymB(), llvm::MCSymbolData::getSymbol(), llvm::MCSymbol::getVariableValue(), llvm::MCSymbol::isVariable(), llvm::MCAssembler::symbol_begin(), and llvm::MCAssembler::symbol_end().
Referenced by ExecutePostLayoutBinding().
|
virtual |
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().
Implements llvm::MCObjectWriter.
Definition at line 415 of file MachObjectWriter.cpp.
void llvm::MachObjectWriter::RecordScatteredRelocation | ( | const MCAssembler & | Asm, |
const MCAsmLayout & | Layout, | ||
const MCFragment * | Fragment, | ||
const MCFixup & | Fixup, | ||
MCValue | Target, | ||
unsigned | Log2Size, | ||
uint64_t & | FixedValue | ||
) |
void llvm::MachObjectWriter::RecordTLVPRelocation | ( | const MCAssembler & | Asm, |
const MCAsmLayout & | Layout, | ||
const MCFragment * | Fragment, | ||
const MCFixup & | Fixup, | ||
MCValue | Target, | ||
uint64_t & | FixedValue | ||
) |
|
virtual |
lifetime management
Reimplemented from llvm::MCObjectWriter.
Definition at line 29 of file MachObjectWriter.cpp.
References llvm::SmallVectorImpl< T >::clear(), and llvm::MCObjectWriter::reset().
void MachObjectWriter::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 | ||
) |
Definition at line 267 of file MachObjectWriter.cpp.
References llvm::MCObjectWriter::OS, llvm::raw_ostream::tell(), and llvm::MCObjectWriter::Write32().
Referenced by WriteObject().
void MachObjectWriter::WriteHeader | ( | unsigned | NumLoadCommands, |
unsigned | LoadCommandsSize, | ||
bool | SubsectionsViaSymbols | ||
) |
Definition at line 124 of file MachObjectWriter.cpp.
References is64Bit(), llvm::MachO::MH_OBJECT, llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS, llvm::MCObjectWriter::OS, llvm::raw_ostream::tell(), and llvm::MCObjectWriter::Write32().
Referenced by WriteObject().
void MachObjectWriter::WriteLinkeditLoadCommand | ( | uint32_t | Type, |
uint32_t | DataOffset, | ||
uint32_t | DataSize | ||
) |
Definition at line 367 of file MachObjectWriter.cpp.
References llvm::MCObjectWriter::OS, llvm::raw_ostream::tell(), and llvm::MCObjectWriter::Write32().
Referenced by WriteObject().
void MachObjectWriter::WriteLinkerOptionsLoadCommand | ( | const std::vector< std::string > & | Options | ) |
Definition at line 390 of file MachObjectWriter.cpp.
References ComputeLinkerOptionsLoadCommandSize(), is64Bit(), llvm::OffsetToAlignment(), llvm::MCObjectWriter::OS, llvm::raw_ostream::tell(), llvm::MCObjectWriter::Write32(), and llvm::MCObjectWriter::WriteBytes().
Referenced by WriteObject().
void MachObjectWriter::WriteNlist | ( | MachSymbolData & | MSD, |
const MCAsmLayout & | Layout | ||
) |
Definition at line 304 of file MachObjectWriter.cpp.
References Align(), llvm::MCSymbolData::getCommonAlignment(), llvm::MCSymbolData::getCommonSize(), llvm::MCSymbolData::getFlags(), llvm::MCSymbol::getName(), llvm::MCSymbolData::getSymbol(), getSymbolAddress(), is64Bit(), llvm::MCSymbol::isAbsolute(), llvm::MCSymbolData::isCommon(), llvm::MCSymbol::isDefined(), llvm::MCSymbolData::isExternal(), llvm::MCSymbolData::isPrivateExtern(), llvm::MCSymbol::isUndefined(), llvm::Log2_32(), llvm::MachO::N_ABS, llvm::MachO::N_EXT, llvm::MachO::N_PEXT, llvm::MachO::N_SECT, llvm::MachO::N_UNDF, llvm::report_fatal_error(), llvm::ARMBuildAttrs::Symbol, llvm::MCObjectWriter::Write16(), llvm::MCObjectWriter::Write32(), llvm::MCObjectWriter::Write64(), and llvm::MCObjectWriter::Write8().
Referenced by WriteObject().
|
virtual |
Write the object file.
This routine is called by the assembler after layout and relaxation is complete, fixups have been evaluated and applied, and relocations generated.
Implements llvm::MCObjectWriter.
Definition at line 736 of file MachObjectWriter.cpp.
References llvm::MCAssembler::begin(), ComputeLinkerOptionsLoadCommandSize(), llvm::MCAssembler::data_region_begin(), llvm::MCAssembler::data_region_end(), llvm::dbgs(), DEBUG, llvm::DataRegionData::End, llvm::MCAssembler::end(), llvm::MCAsmLayout::getAssembler(), llvm::MCAssembler::getDataRegions(), llvm::MCSymbolData::getIndex(), llvm::MCAssembler::getLinkerOptions(), llvm::MCSymbol::getName(), getPaddingSize(), llvm::MCSectionData::getSection(), getSectionAddress(), llvm::MCAsmLayout::getSectionAddressSize(), llvm::MCAsmLayout::getSectionFileSize(), llvm::MCAssembler::getSubsectionsViaSymbols(), getSymbolAddress(), llvm::MCAssembler::getSymbolData(), llvm::MCSectionMachO::getType(), llvm::MCAssembler::indirect_symbol_begin(), llvm::MCAssembler::indirect_symbol_end(), llvm::MCAssembler::indirect_symbol_size(), is64Bit(), llvm::MCSymbolData::isExternal(), llvm::MCSection::isVirtualSection(), llvm::DataRegionData::Kind, llvm::OffsetToAlignment(), llvm::MCObjectWriter::OS, llvm::MachO::S_NON_LAZY_SYMBOL_POINTERS, llvm::ARMBuildAttrs::Section, llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::MCAssembler::size(), llvm::DataRegionData::Start, llvm::SmallString< InternalLen >::str(), llvm::MCObjectWriter::Write16(), llvm::MCObjectWriter::Write32(), llvm::MCObjectWriter::Write8(), WriteDysymtabLoadCommand(), WriteHeader(), WriteLinkeditLoadCommand(), WriteLinkerOptionsLoadCommand(), WriteNlist(), WriteSection(), llvm::MCAssembler::writeSectionData(), WriteSegmentLoadCommand(), WriteSymtabLoadCommand(), and llvm::MCObjectWriter::WriteZeros().
void MachObjectWriter::WriteSection | ( | const MCAssembler & | Asm, |
const MCAsmLayout & | Layout, | ||
const MCSectionData & | SD, | ||
uint64_t | FileOffset, | ||
uint64_t | RelocationsStart, | ||
unsigned | NumRelocations | ||
) |
Definition at line 198 of file MachObjectWriter.cpp.
References llvm::MCSectionData::getAlignment(), llvm::MCSectionData::getSection(), getSectionAddress(), llvm::MCAsmLayout::getSectionAddressSize(), llvm::MCAsmLayout::getSectionFileSize(), llvm::MCSectionMachO::getSectionName(), llvm::MCSectionMachO::getSegmentName(), llvm::MCSectionMachO::getStubSize(), llvm::MCSectionMachO::getTypeAndAttributes(), llvm::MCSectionData::hasInstructions(), is64Bit(), llvm::isPowerOf2_32(), llvm::MCSection::isVirtualSection(), llvm::Log2_32(), llvm::MCObjectWriter::OS, llvm::ARMBuildAttrs::Section, llvm::COFF::SectionSize, llvm::raw_ostream::tell(), llvm::MCObjectWriter::Write32(), llvm::MCObjectWriter::Write64(), and llvm::MCObjectWriter::WriteBytes().
Referenced by WriteObject().
void MachObjectWriter::WriteSegmentLoadCommand | ( | unsigned | NumSections, |
uint64_t | VMSize, | ||
uint64_t | SectionDataStartOffset, | ||
uint64_t | SectionDataSize | ||
) |
WriteSegmentLoadCommand - Write a segment load command.
NumSections | The number of sections in this segment. |
SectionDataSize | The total size of the sections. |
Definition at line 158 of file MachObjectWriter.cpp.
References is64Bit(), llvm::MCObjectWriter::OS, llvm::raw_ostream::tell(), llvm::MachO::VM_PROT_EXECUTE, llvm::MachO::VM_PROT_READ, llvm::MachO::VM_PROT_WRITE, llvm::MCObjectWriter::Write32(), llvm::MCObjectWriter::Write64(), and llvm::MCObjectWriter::WriteBytes().
Referenced by WriteObject().
void MachObjectWriter::WriteSymtabLoadCommand | ( | uint32_t | SymbolOffset, |
uint32_t | NumSymbols, | ||
uint32_t | StringTableOffset, | ||
uint32_t | StringTableSize | ||
) |
Definition at line 248 of file MachObjectWriter.cpp.
References llvm::MCObjectWriter::OS, llvm::raw_ostream::tell(), and llvm::MCObjectWriter::Write32().
Referenced by WriteObject().
SectionAddrMap llvm::MachObjectWriter::SectionAddress |
Definition at line 133 of file MCMachObjectWriter.h.
Referenced by computeSectionAddresses(), getSectionAddress(), and getSectionAddressMap().