|
LLVM
4.0.0
|
#include <MCMachObjectWriter.h>
Public Member Functions | |
| MachObjectWriter (MCMachObjectTargetWriter *MOTW, raw_pwrite_stream &OS, bool IsLittleEndian) | |
| const MCSymbol & | findAliasedSymbol (const MCSymbol &Sym) const |
| void | writeHeader (MachO::HeaderFileType Type, unsigned NumLoadCommands, unsigned LoadCommandsSize, bool SubsectionsViaSymbols) |
| void | writeSegmentLoadCommand (StringRef Name, unsigned NumSections, uint64_t VMAddr, uint64_t VMSize, uint64_t SectionDataStartOffset, uint64_t SectionDataSize, uint32_t MaxProt, uint32_t InitProt) |
| Write a segment load command. More... | |
| void | writeSection (const MCAsmLayout &Layout, const MCSection &Sec, uint64_t VMAddr, uint64_t FileOffset, unsigned Flags, 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 MCSymbol *RelSymbol, const MCSection *Sec, 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 (MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, bool &IsPCRel, uint64_t &FixedValue) override |
| Record a relocation entry. More... | |
| void | bindIndirectSymbols (MCAssembler &Asm) |
| void | computeSymbolTable (MCAssembler &Asm, std::vector< MachSymbolData > &LocalSymbolData, std::vector< MachSymbolData > &ExternalSymbolData, std::vector< MachSymbolData > &UndefinedSymbolData) |
| Compute the symbol table data. More... | |
| void | computeSectionAddresses (const MCAssembler &Asm, const MCAsmLayout &Layout) |
| void | executePostLayoutBinding (MCAssembler &Asm, const MCAsmLayout &Layout) override |
| Perform any late binding of symbols (for example, to assign symbol indices for use when generating relocations). More... | |
| bool | isSymbolRefDifferenceFullyResolvedImpl (const MCAssembler &Asm, const MCSymbol &A, const MCSymbol &B, bool InSet) const override |
| bool | isSymbolRefDifferenceFullyResolvedImpl (const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, bool InSet, bool IsPCRel) const override |
| void | writeObject (MCAssembler &Asm, const MCAsmLayout &Layout) override |
| Write the object file. More... | |
Lifetime management Methods | |
| void | reset () override |
| lifetime management More... | |
Utility Methods | |
| bool | isFixupKindPCRel (const MCAssembler &Asm, unsigned Kind) |
| SectionAddrMap & | getSectionAddressMap () |
| uint64_t | getSectionAddress (const MCSection *Sec) const |
| uint64_t | getSymbolAddress (const MCSymbol &S, const MCAsmLayout &Layout) const |
| uint64_t | getFragmentAddress (const MCFragment *Fragment, const MCAsmLayout &Layout) const |
| uint64_t | getPaddingSize (const MCSection *SD, const MCAsmLayout &Layout) const |
| bool | doesSymbolRequireExternRelocation (const MCSymbol &S) |
Target Writer Proxy Accessors | |
| bool | is64Bit () const |
| bool | isX86_64 () const |
Public Member Functions inherited from llvm::MCObjectWriter | |
| virtual | ~MCObjectWriter () |
| bool | isLittleEndian () const |
| raw_pwrite_stream & | getStream () |
| void | setStream (raw_pwrite_stream &NewOS) |
| 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... | |
| virtual bool | isWeak (const MCSymbol &Sym) const |
| True if this symbol (which is a variable) is weak. 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) |
Additional Inherited Members | |
Protected Member Functions inherited from llvm::MCObjectWriter | |
| MCObjectWriter (raw_pwrite_stream &OS, bool IsLittleEndian) | |
| unsigned | getInitialOffset () |
Protected Attributes inherited from llvm::MCObjectWriter | |
| unsigned | IsLittleEndian: 1 |
Definition at line 74 of file MCMachObjectWriter.h.
|
inline |
Definition at line 117 of file MCMachObjectWriter.h.
|
inline |
Definition at line 215 of file MCMachObjectWriter.h.
References P.
| void MachObjectWriter::bindIndirectSymbols | ( | MCAssembler & | Asm | ) |
Definition at line 444 of file MachObjectWriter.cpp.
References llvm::MCSymbol::getName(), llvm::MCSectionMachO::getType(), llvm::MCAssembler::indirect_symbol_begin(), llvm::MCAssembler::indirect_symbol_end(), llvm::MCAssembler::registerSymbol(), llvm::report_fatal_error(), llvm::MachO::S_LAZY_SYMBOL_POINTERS, llvm::MachO::S_NON_LAZY_SYMBOL_POINTERS, llvm::MachO::S_SYMBOL_STUBS, llvm::MachO::S_THREAD_LOCAL_VARIABLE_POINTERS, llvm::ARMBuildAttrs::Section, and llvm::ARMBuildAttrs::Symbol.
Referenced by executePostLayoutBinding().
| void MachObjectWriter::computeSectionAddresses | ( | const MCAssembler & | Asm, |
| const MCAsmLayout & | Layout | ||
| ) |
strictly be necessary.
Definition at line 609 of file MachObjectWriter.cpp.
References llvm::alignTo(), getPaddingSize(), llvm::MCAsmLayout::getSectionAddressSize(), and llvm::MCAsmLayout::getSectionOrder().
Referenced by executePostLayoutBinding().
| void MachObjectWriter::computeSymbolTable | ( | MCAssembler & | Asm, |
| std::vector< MachSymbolData > & | LocalSymbolData, | ||
| std::vector< MachSymbolData > & | ExternalSymbolData, | ||
| std::vector< MachSymbolData > & | UndefinedSymbolData | ||
| ) |
Compute the symbol table data.
computeSymbolTable - Compute the symbol table data
Definition at line 508 of file MachObjectWriter.cpp.
References assert(), llvm::MCAssembler::begin(), llvm::MCAssembler::end(), llvm::MCObjectWriter::IsLittleEndian, llvm::MCAssembler::isSymbolLinkerVisible(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::lookup(), llvm::ARMBuildAttrs::Section, llvm::ARMBuildAttrs::Symbol, and llvm::MCAssembler::symbols().
Referenced by writeObject().
Definition at line 41 of file MachObjectWriter.cpp.
References llvm::MCSymbol::isUndefined().
|
overridevirtual |
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 624 of file MachObjectWriter.cpp.
References bindIndirectSymbols(), and computeSectionAddresses().
Definition at line 308 of file MachObjectWriter.cpp.
References llvm::dyn_cast(), llvm::MCSymbol::getVariableValue(), and llvm::MCSymbol::isVariable().
Referenced by isSymbolRefDifferenceFullyResolvedImpl(), and writeNlist().
| 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 MCSection * | SD, |
| const MCAsmLayout & | Layout | ||
| ) | const |
Definition at line 106 of file MachObjectWriter.cpp.
References llvm::MCSection::getAlignment(), llvm::MCSection::getLayoutOrder(), getSectionAddress(), llvm::MCAsmLayout::getSectionAddressSize(), llvm::MCAsmLayout::getSectionOrder(), llvm::MCSection::isVirtualSection(), and llvm::OffsetToAlignment().
Referenced by computeSectionAddresses(), and writeObject().
Definition at line 137 of file MCMachObjectWriter.h.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::lookup().
Referenced by getFragmentAddress(), getPaddingSize(), getSymbolAddress(), and writeObject().
|
inline |
Definition at line 135 of file MCMachObjectWriter.h.
| uint64_t MachObjectWriter::getSymbolAddress | ( | const MCSymbol & | S, |
| const MCAsmLayout & | Layout | ||
| ) | const |
Definition at line 73 of file MachObjectWriter.cpp.
References llvm::dwarf::syntax::Address, C, llvm::MCExpr::evaluateAsRelocatable(), llvm::MCValue::getConstant(), llvm::MCSymbol::getFragment(), llvm::MCSymbol::getName(), llvm::MCFragment::getParent(), getSectionAddress(), llvm::MCValue::getSymA(), llvm::MCValue::getSymB(), llvm::MCSymbolRefExpr::getSymbol(), llvm::MCAsmLayout::getSymbolOffset(), llvm::MCSymbol::getVariableValue(), llvm::MCSymbol::isUndefined(), llvm::MCSymbol::isVariable(), llvm::report_fatal_error(), and Target.
Referenced by writeNlist(), and writeObject().
|
inline |
Definition at line 154 of file MCMachObjectWriter.h.
Referenced by writeHeader(), writeLinkerOptionsLoadCommand(), writeNlist(), writeObject(), writeSection(), and writeSegmentLoadCommand().
| 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().
|
overridevirtual |
Reimplemented from llvm::MCObjectWriter.
Definition at line 632 of file MachObjectWriter.cpp.
References llvm::MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(), and llvm::MCSymbol::isVariable().
|
overridevirtual |
Reimplemented from llvm::MCObjectWriter.
Definition at line 644 of file MachObjectWriter.cpp.
References findAliasedSymbol(), llvm::MCFragment::getAtom(), llvm::MCSymbol::getFragment(), llvm::MCFragment::getParent(), llvm::MCSymbol::getSection(), llvm::MCAssembler::getSubsectionsViaSymbols(), llvm::MCSymbol::isInSection(), llvm::MCSymbol::isTemporary(), and isX86_64().
|
inline |
Definition at line 155 of file MCMachObjectWriter.h.
References llvm::MachO::CPU_TYPE_X86_64.
Referenced by isSymbolRefDifferenceFullyResolvedImpl().
|
overridevirtual |
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 435 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 | ||
| ) |
|
overridevirtual |
lifetime management
Reimplemented from llvm::MCObjectWriter.
Definition at line 31 of file MachObjectWriter.cpp.
References 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 260 of file MachObjectWriter.cpp.
References assert(), llvm::MCObjectWriter::getStream(), llvm::raw_ostream::tell(), and llvm::MCObjectWriter::write32().
Referenced by writeObject().
| void MachObjectWriter::writeHeader | ( | MachO::HeaderFileType | Type, |
| unsigned | NumLoadCommands, | ||
| unsigned | LoadCommandsSize, | ||
| bool | SubsectionsViaSymbols | ||
| ) |
Definition at line 119 of file MachObjectWriter.cpp.
References assert(), fuzzer::Flags, llvm::MCObjectWriter::getStream(), is64Bit(), llvm::MachO::MH_MAGIC, llvm::MachO::MH_MAGIC_64, llvm::MachO::MH_SUBSECTIONS_VIA_SYMBOLS, 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 389 of file MachObjectWriter.cpp.
References assert(), llvm::MCObjectWriter::getStream(), llvm::raw_ostream::tell(), and llvm::MCObjectWriter::write32().
Referenced by writeObject().
| void MachObjectWriter::writeLinkerOptionsLoadCommand | ( | const std::vector< std::string > & | Options | ) |
Definition at line 412 of file MachObjectWriter.cpp.
References assert(), ComputeLinkerOptionsLoadCommandSize(), llvm::MCObjectWriter::getStream(), is64Bit(), llvm::OffsetToAlignment(), 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 320 of file MachObjectWriter.cpp.
References llvm::dwarf::syntax::Address, findAliasedSymbol(), llvm::MCSymbol::getCommonSize(), getSymbolAddress(), if(), is64Bit(), llvm::MCSymbol::isAbsolute(), llvm::MCSymbol::isCommon(), llvm::MCSymbol::isDefined(), llvm::MCSymbol::isExternal(), llvm::MCSymbol::isPrivateExtern(), llvm::MCSymbol::isUndefined(), llvm::MachO::N_ABS, llvm::MachO::N_EXT, llvm::MachO::N_INDR, llvm::MachO::N_PEXT, llvm::MachO::N_SECT, llvm::MachO::N_UNDF, llvm::ARMBuildAttrs::Symbol, llvm::MCObjectWriter::write16(), llvm::MCObjectWriter::write32(), llvm::MCObjectWriter::write64(), and llvm::MCObjectWriter::write8().
Referenced by writeObject().
|
overridevirtual |
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 711 of file MachObjectWriter.cpp.
References llvm::dwarf::syntax::Address, llvm::alignTo(), assert(), ComputeLinkerOptionsLoadCommandSize(), computeSymbolTable(), llvm::dbgs(), DEBUG, llvm::DataRegionData::End, llvm::WebAssembly::End, fuzzer::Flags, llvm::MCAsmLayout::getAssembler(), llvm::MCAssembler::getDataRegions(), llvm::MCLOHContainer::getEmitSize(), llvm::MCAssembler::getLinkerOptions(), llvm::MCAssembler::getLOHContainer(), llvm::MCSymbol::getName(), getPaddingSize(), getSectionAddress(), llvm::MCAsmLayout::getSectionAddressSize(), llvm::MCAsmLayout::getSectionFileSize(), llvm::MCObjectWriter::getStream(), getSymbolAddress(), llvm::MCSectionMachO::getType(), llvm::MCAssembler::getVersionMinInfo(), llvm::MachO::INDIRECT_SYMBOL_ABS, llvm::MachO::INDIRECT_SYMBOL_LOCAL, is64Bit(), llvm::DataRegionData::Kind, llvm::MCAssembler::VersionMinInfoType::Kind, llvm::MCAssembler::VersionMinInfoType::Major, llvm::make_range(), llvm::MCVM_IOSVersionMin, llvm::MCVM_OSXVersionMin, llvm::MCVM_TvOSVersionMin, llvm::MCVM_WatchOSVersionMin, llvm::MachO::MH_OBJECT, llvm::MCAssembler::VersionMinInfoType::Minor, llvm::OffsetToAlignment(), llvm::MachO::S_ATTR_SOME_INSTRUCTIONS, llvm::MachO::S_NON_LAZY_SYMBOL_POINTERS, llvm::ARMBuildAttrs::Section, llvm::MCAssembler::size(), llvm::DataRegionData::Start, llvm::raw_ostream::tell(), llvm::MCAssembler::VersionMinInfoType::Update, llvm::MachO::VM_PROT_EXECUTE, llvm::MachO::VM_PROT_READ, llvm::MachO::VM_PROT_WRITE, llvm::MCObjectWriter::write16(), llvm::MCObjectWriter::write32(), llvm::MCObjectWriter::writeBytes(), writeDysymtabLoadCommand(), writeHeader(), writeLinkeditLoadCommand(), writeLinkerOptionsLoadCommand(), writeNlist(), writeSection(), writeSegmentLoadCommand(), writeSymtabLoadCommand(), and llvm::MCObjectWriter::WriteZeros().
| void MachObjectWriter::writeSection | ( | const MCAsmLayout & | Layout, |
| const MCSection & | Sec, | ||
| uint64_t | VMAddr, | ||
| uint64_t | FileOffset, | ||
| unsigned | Flags, | ||
| uint64_t | RelocationsStart, | ||
| unsigned | NumRelocations | ||
| ) |
Definition at line 196 of file MachObjectWriter.cpp.
References assert(), llvm::MCSection::getAlignment(), llvm::MCAsmLayout::getSectionAddressSize(), llvm::MCAsmLayout::getSectionFileSize(), llvm::MCSectionMachO::getSectionName(), llvm::MCSectionMachO::getSegmentName(), llvm::MCObjectWriter::getStream(), llvm::MCSectionMachO::getStubSize(), is64Bit(), llvm::isPowerOf2_32(), llvm::MCSectionMachO::isVirtualSection(), llvm::Log2_32(), 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 | ( | StringRef | Name, |
| unsigned | NumSections, | ||
| uint64_t | VMAddr, | ||
| uint64_t | VMSize, | ||
| uint64_t | SectionDataStartOffset, | ||
| uint64_t | SectionDataSize, | ||
| uint32_t | MaxProt, | ||
| uint32_t | InitProt | ||
| ) |
Write a segment load command.
writeSegmentLoadCommand - Write a segment load command.
| NumSections | The number of sections in this segment. |
| SectionDataSize | The total size of the sections. |
Definition at line 155 of file MachObjectWriter.cpp.
References assert(), llvm::MCObjectWriter::getStream(), is64Bit(), llvm::StringRef::size(), llvm::raw_ostream::tell(), 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 241 of file MachObjectWriter.cpp.
References assert(), llvm::MCObjectWriter::getStream(), llvm::raw_ostream::tell(), and llvm::MCObjectWriter::write32().
Referenced by writeObject().
1.8.6