10 #ifndef LLVM_MC_MCMACHOBJECTWRITER_H
11 #define LLVM_MC_MCMACHOBJECTWRITER_H
18 #include "llvm/Support/DataTypes.h"
25 class MachObjectWriter;
28 const unsigned Is64Bit : 1;
29 const uint32_t CPUType;
30 const uint32_t CPUSubtype;
33 const unsigned UseAggressiveSymbolFolding : 1;
34 unsigned LocalDifference_RIT;
39 bool UseAggressiveSymbolFolding_ =
false);
42 LocalDifference_RIT =
Type;
63 return LocalDifference_RIT;
77 uint64_t &FixedValue) = 0;
85 struct MachSymbolData {
91 bool operator<(
const MachSymbolData &RHS)
const;
101 std::vector<MachO::any_relocation_info> > Relocations;
109 std::vector<MachSymbolData> LocalSymbolData;
110 std::vector<MachSymbolData> ExternalSymbolData;
111 std::vector<MachSymbolData> UndefinedSymbolData;
117 bool _IsLittleEndian)
118 :
MCObjectWriter(_OS, _IsLittleEndian), TargetObjectWriter(MOTW) {
124 virtual void reset();
156 bool is64Bit()
const {
return TargetObjectWriter->is64Bit(); }
158 uint32_t
CPUType = TargetObjectWriter->getCPUType() & ~MachO::CPU_ARCH_MASK;
164 void WriteHeader(
unsigned NumLoadCommands,
unsigned LoadCommandsSize,
165 bool SubsectionsViaSymbols);
173 uint64_t SectionDataStartOffset,
174 uint64_t SectionDataSize);
178 uint64_t RelocationsStart,
unsigned NumRelocations);
181 uint32_t StringTableOffset,
182 uint32_t StringTableSize);
185 uint32_t NumLocalSymbols,
186 uint32_t FirstExternalSymbol,
187 uint32_t NumExternalSymbols,
188 uint32_t FirstUndefinedSymbol,
189 uint32_t NumUndefinedSymbols,
190 uint32_t IndirectSymbolOffset,
191 uint32_t NumIndirectSymbols);
216 Relocations[SD].push_back(MRE);
224 uint64_t &FixedValue);
230 uint64_t &FixedValue);
242 std::vector<MachSymbolData> &LocalSymbolData,
243 std::vector<MachSymbolData> &ExternalSymbolData,
244 std::vector<MachSymbolData> &UndefinedSymbolData);
271 raw_ostream &OS,
bool IsLittleEndian);
void markAbsoluteVariableSymbols(MCAssembler &Asm, const MCAsmLayout &Layout)
COFF::RelocationTypeX86 Type
virtual void reset()
lifetime management
void computeSectionAddresses(const 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 re...
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 RecordScatteredRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, unsigned Log2Size, uint64_t &FixedValue)
void operator<(const Optional< T > &X, const Optional< U > &Y)
Poison comparison between two Optional objects. Clients needs to explicitly compare the underlying va...
MCMachObjectTargetWriter(bool Is64Bit_, uint32_t CPUType_, uint32_t CPUSubtype_, bool UseAggressiveSymbolFolding_=false)
void RecordTLVPRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue)
void WriteSegmentLoadCommand(unsigned NumSections, uint64_t VMSize, uint64_t SectionDataStartOffset, uint64_t SectionDataSize)
void WriteLinkeditLoadCommand(uint32_t Type, uint32_t DataOffset, uint32_t DataSize)
void WriteLinkerOptionsLoadCommand(const std::vector< std::string > &Options)
virtual ~MCMachObjectTargetWriter()
uint64_t getSymbolAddress(const MCSymbolData *SD, const MCAsmLayout &Layout) const
void setLocalDifferenceRelocationType(unsigned Type)
bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind)
uint64_t getSectionAddress(const MCSectionData *SD) const
void WriteSection(const MCAssembler &Asm, const MCAsmLayout &Layout, const MCSectionData &SD, uint64_t FileOffset, uint64_t RelocationsStart, unsigned NumRelocations)
virtual void RecordRelocation(MachObjectWriter *Writer, const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue)=0
SectionAddrMap & getSectionAddressMap()
uint32_t getCPUSubtype() const
uint32_t getCPUType() const
void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout)
Write the object file.
void WriteNlist(MachSymbolData &MSD, const MCAsmLayout &Layout)
MachObjectWriter(MCMachObjectTargetWriter *MOTW, raw_ostream &_OS, bool _IsLittleEndian)
unsigned getLocalDifferenceRelocationType() const
SectionAddrMap SectionAddress
virtual bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, const MCSymbolData &DataA, const MCFragment &FB, bool InSet, bool IsPCRel) const
uint64_t getPaddingSize(const MCSectionData *SD, const MCAsmLayout &Layout) const
uint64_t getFragmentAddress(const MCFragment *Fragment, const MCAsmLayout &Layout) const
bool doesSymbolRequireExternRelocation(const MCSymbolData *SD)
void BindIndirectSymbols(MCAssembler &Asm)
bool useAggressiveSymbolFolding() const
ValueT lookup(const KeyT &Val) const
void addRelocation(const MCSectionData *SD, MachO::any_relocation_info &MRE)
void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue)
Record a relocation entry.
void WriteSymtabLoadCommand(uint32_t SymbolOffset, uint32_t NumSymbols, uint32_t StringTableOffset, uint32_t StringTableSize)
void ComputeSymbolTable(MCAssembler &Asm, SmallString< 256 > &StringTable, std::vector< MachSymbolData > &LocalSymbolData, std::vector< MachSymbolData > &ExternalSymbolData, std::vector< MachSymbolData > &UndefinedSymbolData)
void WriteHeader(unsigned NumLoadCommands, unsigned LoadCommandsSize, bool SubsectionsViaSymbols)
MCObjectWriter * createMachObjectWriter(MCMachObjectTargetWriter *MOTW, raw_ostream &OS, bool IsLittleEndian)
Construct a new Mach-O writer instance.