diff options
Diffstat (limited to 'include/llvm/MC/MCMachObjectWriter.h')
-rw-r--r-- | include/llvm/MC/MCMachObjectWriter.h | 82 |
1 files changed, 44 insertions, 38 deletions
diff --git a/include/llvm/MC/MCMachObjectWriter.h b/include/llvm/MC/MCMachObjectWriter.h index 0c5aa8a180638..63c2a28a7c9c8 100644 --- a/include/llvm/MC/MCMachObjectWriter.h +++ b/include/llvm/MC/MCMachObjectWriter.h @@ -21,7 +21,6 @@ namespace llvm { -class MCSectionData; class MachObjectWriter; class MCMachObjectTargetWriter { @@ -45,14 +44,14 @@ protected: public: virtual ~MCMachObjectTargetWriter(); - /// @name Lifetime Management + /// \name Lifetime Management /// @{ virtual void reset() {}; /// @} - /// @name Accessors + /// \name Accessors /// @{ bool is64Bit() const { return Is64Bit; } @@ -65,15 +64,13 @@ public: /// @} - /// @name API + /// \name API /// @{ - virtual void RecordRelocation(MachObjectWriter *Writer, - const MCAssembler &Asm, + virtual void RecordRelocation(MachObjectWriter *Writer, MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, - const MCFixup &Fixup, - MCValue Target, + const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue) = 0; /// @} @@ -83,7 +80,7 @@ class MachObjectWriter : public MCObjectWriter { /// MachSymbolData - Helper struct for containing some precomputed information /// on symbols. struct MachSymbolData { - MCSymbolData *SymbolData; + const MCSymbol *Symbol; uint64_t StringIndex; uint8_t SectionIndex; @@ -94,15 +91,21 @@ class MachObjectWriter : public MCObjectWriter { /// The target specific Mach-O writer instance. std::unique_ptr<MCMachObjectTargetWriter> TargetObjectWriter; - /// @name Relocation Data + /// \name Relocation Data /// @{ - llvm::DenseMap<const MCSectionData*, - std::vector<MachO::any_relocation_info> > Relocations; - llvm::DenseMap<const MCSectionData*, unsigned> IndirectSymBase; + struct RelAndSymbol { + const MCSymbol *Sym; + MachO::any_relocation_info MRE; + RelAndSymbol(const MCSymbol *Sym, const MachO::any_relocation_info &MRE) + : Sym(Sym), MRE(MRE) {} + }; + + llvm::DenseMap<const MCSection *, std::vector<RelAndSymbol>> Relocations; + llvm::DenseMap<const MCSection *, unsigned> IndirectSymBase; /// @} - /// @name Symbol Table Data + /// \name Symbol Table Data /// @{ StringTableBuilder StringTable; @@ -115,19 +118,20 @@ class MachObjectWriter : public MCObjectWriter { MachSymbolData *findSymbolData(const MCSymbol &Sym); public: - MachObjectWriter(MCMachObjectTargetWriter *MOTW, raw_ostream &_OS, - bool _IsLittleEndian) - : MCObjectWriter(_OS, _IsLittleEndian), TargetObjectWriter(MOTW) { - } + MachObjectWriter(MCMachObjectTargetWriter *MOTW, raw_pwrite_stream &OS, + bool IsLittleEndian) + : MCObjectWriter(OS, IsLittleEndian), TargetObjectWriter(MOTW) {} + + const MCSymbol &findAliasedSymbol(const MCSymbol &Sym) const; - /// @name Lifetime management Methods + /// \name Lifetime management Methods /// @{ void reset() override; /// @} - /// @name Utility Methods + /// \name Utility Methods /// @{ bool isFixupKindPCRel(const MCAssembler &Asm, unsigned Kind); @@ -136,23 +140,21 @@ public: SectionAddrMap &getSectionAddressMap() { return SectionAddress; } - uint64_t getSectionAddress(const MCSectionData* SD) const { - return SectionAddress.lookup(SD); + uint64_t getSectionAddress(const MCSection *Sec) const { + return SectionAddress.lookup(Sec); } - uint64_t getSymbolAddress(const MCSymbolData* SD, - const MCAsmLayout &Layout) 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 MCSectionData *SD, - const MCAsmLayout &Layout) const; + uint64_t getPaddingSize(const MCSection *SD, const MCAsmLayout &Layout) const; - bool doesSymbolRequireExternRelocation(const MCSymbolData *SD); + bool doesSymbolRequireExternRelocation(const MCSymbol &S); /// @} - /// @name Target Writer Proxy Accessors + /// \name Target Writer Proxy Accessors /// @{ bool is64Bit() const { return TargetObjectWriter->is64Bit(); } @@ -176,7 +178,7 @@ public: uint64_t SectionDataSize); void WriteSection(const MCAssembler &Asm, const MCAsmLayout &Layout, - const MCSectionData &SD, uint64_t FileOffset, + const MCSection &Sec, uint64_t FileOffset, uint64_t RelocationsStart, unsigned NumRelocations); void WriteSymtabLoadCommand(uint32_t SymbolOffset, uint32_t NumSymbols, @@ -213,9 +215,15 @@ public: // - Input errors, where something cannot be correctly encoded. 'as' allows // these through in many cases. - void addRelocation(const MCSectionData *SD, + // Add a relocation to be output in the object file. At the time this is + // called, the symbol indexes are not know, so if the relocation refers + // to a symbol it should be passed as \p RelSymbol so that it can be updated + // afterwards. If the relocation doesn't refer to a symbol, nullptr should be + // used. + void addRelocation(const MCSymbol *RelSymbol, const MCSection *Sec, MachO::any_relocation_info &MRE) { - Relocations[SD].push_back(MRE); + RelAndSymbol P(RelSymbol, MRE); + Relocations[Sec].push_back(P); } void RecordScatteredRelocation(const MCAssembler &Asm, @@ -231,7 +239,7 @@ public: const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue); - void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout, + void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, bool &IsPCRel, uint64_t &FixedValue) override; @@ -248,15 +256,12 @@ public: void computeSectionAddresses(const MCAssembler &Asm, const MCAsmLayout &Layout); - void markAbsoluteVariableSymbols(MCAssembler &Asm, - const MCAsmLayout &Layout); void ExecutePostLayoutBinding(MCAssembler &Asm, const MCAsmLayout &Layout) override; bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, - const MCSymbolData &DataA, - const MCFragment &FB, - bool InSet, + const MCSymbol &SymA, + const MCFragment &FB, bool InSet, bool IsPCRel) const override; void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override; @@ -271,7 +276,8 @@ public: /// \param OS - The stream to write to. /// \returns The constructed object writer. MCObjectWriter *createMachObjectWriter(MCMachObjectTargetWriter *MOTW, - raw_ostream &OS, bool IsLittleEndian); + raw_pwrite_stream &OS, + bool IsLittleEndian); } // End llvm namespace |