diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2018-05-21 18:17:42 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2018-05-21 18:17:42 +0000 |
commit | f17b149d8cb5abd2f9a02ad5addf9e9500114d8c (patch) | |
tree | bbd83f9702f2d373b7a6de77a3c118d6f73623bb /llvm/lib/MC/MachObjectWriter.cpp | |
parent | 168d04d54442bab614c50911cce501cc5901d612 (diff) | |
download | bcm5719-llvm-f17b149d8cb5abd2f9a02ad5addf9e9500114d8c.tar.gz bcm5719-llvm-f17b149d8cb5abd2f9a02ad5addf9e9500114d8c.zip |
MC: Change object writers to use endian::Writer. NFCI.
Part of PR37466.
Differential Revision: https://reviews.llvm.org/D47040
llvm-svn: 332861
Diffstat (limited to 'llvm/lib/MC/MachObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/MachObjectWriter.cpp | 246 |
1 files changed, 125 insertions, 121 deletions
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index 5f9f61c7fee..ba8922c8997 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -141,24 +141,29 @@ void MachObjectWriter::writeHeader(MachO::HeaderFileType Type, // struct mach_header (28 bytes) or // struct mach_header_64 (32 bytes) - uint64_t Start = getStream().tell(); + uint64_t Start = W.OS.tell(); (void) Start; - write32(is64Bit() ? MachO::MH_MAGIC_64 : MachO::MH_MAGIC); + W.write<uint32_t>(is64Bit() ? MachO::MH_MAGIC_64 : MachO::MH_MAGIC); - write32(TargetObjectWriter->getCPUType()); - write32(TargetObjectWriter->getCPUSubtype()); + W.write<uint32_t>(TargetObjectWriter->getCPUType()); + W.write<uint32_t>(TargetObjectWriter->getCPUSubtype()); - write32(Type); - write32(NumLoadCommands); - write32(LoadCommandsSize); - write32(Flags); + W.write<uint32_t>(Type); + W.write<uint32_t>(NumLoadCommands); + W.write<uint32_t>(LoadCommandsSize); + W.write<uint32_t>(Flags); if (is64Bit()) - write32(0); // reserved + W.write<uint32_t>(0); // reserved - assert( - getStream().tell() - Start == - (is64Bit() ? sizeof(MachO::mach_header_64) : sizeof(MachO::mach_header))); + assert(W.OS.tell() - Start == (is64Bit() ? sizeof(MachO::mach_header_64) + : sizeof(MachO::mach_header))); +} + +void MachObjectWriter::writeWithPadding(StringRef Str, uint64_t Size) { + assert(Size >= Str.size()); + W.OS << Str; + W.OS.write_zeros(Size - Str.size()); } /// writeSegmentLoadCommand - Write a segment load command. @@ -172,38 +177,37 @@ void MachObjectWriter::writeSegmentLoadCommand( // struct segment_command (56 bytes) or // struct segment_command_64 (72 bytes) - uint64_t Start = getStream().tell(); + uint64_t Start = W.OS.tell(); (void) Start; unsigned SegmentLoadCommandSize = is64Bit() ? sizeof(MachO::segment_command_64): sizeof(MachO::segment_command); - write32(is64Bit() ? MachO::LC_SEGMENT_64 : MachO::LC_SEGMENT); - write32(SegmentLoadCommandSize + + W.write<uint32_t>(is64Bit() ? MachO::LC_SEGMENT_64 : MachO::LC_SEGMENT); + W.write<uint32_t>(SegmentLoadCommandSize + NumSections * (is64Bit() ? sizeof(MachO::section_64) : sizeof(MachO::section))); - assert(Name.size() <= 16); - writeBytes(Name, 16); + writeWithPadding(Name, 16); if (is64Bit()) { - write64(VMAddr); // vmaddr - write64(VMSize); // vmsize - write64(SectionDataStartOffset); // file offset - write64(SectionDataSize); // file size + W.write<uint64_t>(VMAddr); // vmaddr + W.write<uint64_t>(VMSize); // vmsize + W.write<uint64_t>(SectionDataStartOffset); // file offset + W.write<uint64_t>(SectionDataSize); // file size } else { - write32(VMAddr); // vmaddr - write32(VMSize); // vmsize - write32(SectionDataStartOffset); // file offset - write32(SectionDataSize); // file size + W.write<uint32_t>(VMAddr); // vmaddr + W.write<uint32_t>(VMSize); // vmsize + W.write<uint32_t>(SectionDataStartOffset); // file offset + W.write<uint32_t>(SectionDataSize); // file size } // maxprot - write32(MaxProt); + W.write<uint32_t>(MaxProt); // initprot - write32(InitProt); - write32(NumSections); - write32(0); // flags + W.write<uint32_t>(InitProt); + W.write<uint32_t>(NumSections); + W.write<uint32_t>(0); // flags - assert(getStream().tell() - Start == SegmentLoadCommandSize); + assert(W.OS.tell() - Start == SegmentLoadCommandSize); } void MachObjectWriter::writeSection(const MCAsmLayout &Layout, @@ -223,31 +227,31 @@ void MachObjectWriter::writeSection(const MCAsmLayout &Layout, // struct section (68 bytes) or // struct section_64 (80 bytes) - uint64_t Start = getStream().tell(); + uint64_t Start = W.OS.tell(); (void) Start; - writeBytes(Section.getSectionName(), 16); - writeBytes(Section.getSegmentName(), 16); + writeWithPadding(Section.getSectionName(), 16); + writeWithPadding(Section.getSegmentName(), 16); if (is64Bit()) { - write64(VMAddr); // address - write64(SectionSize); // size + W.write<uint64_t>(VMAddr); // address + W.write<uint64_t>(SectionSize); // size } else { - write32(VMAddr); // address - write32(SectionSize); // size + W.write<uint32_t>(VMAddr); // address + W.write<uint32_t>(SectionSize); // size } - write32(FileOffset); + W.write<uint32_t>(FileOffset); assert(isPowerOf2_32(Section.getAlignment()) && "Invalid alignment!"); - write32(Log2_32(Section.getAlignment())); - write32(NumRelocations ? RelocationsStart : 0); - write32(NumRelocations); - write32(Flags); - write32(IndirectSymBase.lookup(&Sec)); // reserved1 - write32(Section.getStubSize()); // reserved2 + W.write<uint32_t>(Log2_32(Section.getAlignment())); + W.write<uint32_t>(NumRelocations ? RelocationsStart : 0); + W.write<uint32_t>(NumRelocations); + W.write<uint32_t>(Flags); + W.write<uint32_t>(IndirectSymBase.lookup(&Sec)); // reserved1 + W.write<uint32_t>(Section.getStubSize()); // reserved2 if (is64Bit()) - write32(0); // reserved3 + W.write<uint32_t>(0); // reserved3 - assert(getStream().tell() - Start == + assert(W.OS.tell() - Start == (is64Bit() ? sizeof(MachO::section_64) : sizeof(MachO::section))); } @@ -257,17 +261,17 @@ void MachObjectWriter::writeSymtabLoadCommand(uint32_t SymbolOffset, uint32_t StringTableSize) { // struct symtab_command (24 bytes) - uint64_t Start = getStream().tell(); + uint64_t Start = W.OS.tell(); (void) Start; - write32(MachO::LC_SYMTAB); - write32(sizeof(MachO::symtab_command)); - write32(SymbolOffset); - write32(NumSymbols); - write32(StringTableOffset); - write32(StringTableSize); + W.write<uint32_t>(MachO::LC_SYMTAB); + W.write<uint32_t>(sizeof(MachO::symtab_command)); + W.write<uint32_t>(SymbolOffset); + W.write<uint32_t>(NumSymbols); + W.write<uint32_t>(StringTableOffset); + W.write<uint32_t>(StringTableSize); - assert(getStream().tell() - Start == sizeof(MachO::symtab_command)); + assert(W.OS.tell() - Start == sizeof(MachO::symtab_command)); } void MachObjectWriter::writeDysymtabLoadCommand(uint32_t FirstLocalSymbol, @@ -280,31 +284,31 @@ void MachObjectWriter::writeDysymtabLoadCommand(uint32_t FirstLocalSymbol, uint32_t NumIndirectSymbols) { // struct dysymtab_command (80 bytes) - uint64_t Start = getStream().tell(); + uint64_t Start = W.OS.tell(); (void) Start; - write32(MachO::LC_DYSYMTAB); - write32(sizeof(MachO::dysymtab_command)); - write32(FirstLocalSymbol); - write32(NumLocalSymbols); - write32(FirstExternalSymbol); - write32(NumExternalSymbols); - write32(FirstUndefinedSymbol); - write32(NumUndefinedSymbols); - write32(0); // tocoff - write32(0); // ntoc - write32(0); // modtaboff - write32(0); // nmodtab - write32(0); // extrefsymoff - write32(0); // nextrefsyms - write32(IndirectSymbolOffset); - write32(NumIndirectSymbols); - write32(0); // extreloff - write32(0); // nextrel - write32(0); // locreloff - write32(0); // nlocrel - - assert(getStream().tell() - Start == sizeof(MachO::dysymtab_command)); + W.write<uint32_t>(MachO::LC_DYSYMTAB); + W.write<uint32_t>(sizeof(MachO::dysymtab_command)); + W.write<uint32_t>(FirstLocalSymbol); + W.write<uint32_t>(NumLocalSymbols); + W.write<uint32_t>(FirstExternalSymbol); + W.write<uint32_t>(NumExternalSymbols); + W.write<uint32_t>(FirstUndefinedSymbol); + W.write<uint32_t>(NumUndefinedSymbols); + W.write<uint32_t>(0); // tocoff + W.write<uint32_t>(0); // ntoc + W.write<uint32_t>(0); // modtaboff + W.write<uint32_t>(0); // nmodtab + W.write<uint32_t>(0); // extrefsymoff + W.write<uint32_t>(0); // nextrefsyms + W.write<uint32_t>(IndirectSymbolOffset); + W.write<uint32_t>(NumIndirectSymbols); + W.write<uint32_t>(0); // extreloff + W.write<uint32_t>(0); // nextrel + W.write<uint32_t>(0); // locreloff + W.write<uint32_t>(0); // nlocrel + + assert(W.OS.tell() - Start == sizeof(MachO::dysymtab_command)); } MachObjectWriter::MachSymbolData * @@ -384,33 +388,33 @@ void MachObjectWriter::writeNlist(MachSymbolData &MSD, // struct nlist (12 bytes) - write32(MSD.StringIndex); - write8(Type); - write8(SectionIndex); + W.write<uint32_t>(MSD.StringIndex); + W.OS << char(Type); + W.OS << char(SectionIndex); // The Mach-O streamer uses the lowest 16-bits of the flags for the 'desc' // value. bool EncodeAsAltEntry = IsAlias && cast<MCSymbolMachO>(OrigSymbol).isAltEntry(); - write16(cast<MCSymbolMachO>(Symbol)->getEncodedFlags(EncodeAsAltEntry)); + W.write<uint16_t>(cast<MCSymbolMachO>(Symbol)->getEncodedFlags(EncodeAsAltEntry)); if (is64Bit()) - write64(Address); + W.write<uint64_t>(Address); else - write32(Address); + W.write<uint32_t>(Address); } void MachObjectWriter::writeLinkeditLoadCommand(uint32_t Type, uint32_t DataOffset, uint32_t DataSize) { - uint64_t Start = getStream().tell(); + uint64_t Start = W.OS.tell(); (void) Start; - write32(Type); - write32(sizeof(MachO::linkedit_data_command)); - write32(DataOffset); - write32(DataSize); + W.write<uint32_t>(Type); + W.write<uint32_t>(sizeof(MachO::linkedit_data_command)); + W.write<uint32_t>(DataOffset); + W.write<uint32_t>(DataSize); - assert(getStream().tell() - Start == sizeof(MachO::linkedit_data_command)); + assert(W.OS.tell() - Start == sizeof(MachO::linkedit_data_command)); } static unsigned ComputeLinkerOptionsLoadCommandSize( @@ -426,23 +430,23 @@ void MachObjectWriter::writeLinkerOptionsLoadCommand( const std::vector<std::string> &Options) { unsigned Size = ComputeLinkerOptionsLoadCommandSize(Options, is64Bit()); - uint64_t Start = getStream().tell(); + uint64_t Start = W.OS.tell(); (void) Start; - write32(MachO::LC_LINKER_OPTION); - write32(Size); - write32(Options.size()); + W.write<uint32_t>(MachO::LC_LINKER_OPTION); + W.write<uint32_t>(Size); + W.write<uint32_t>(Options.size()); uint64_t BytesWritten = sizeof(MachO::linker_option_command); for (const std::string &Option : Options) { // Write each string, including the null byte. - writeBytes(Option, Option.size() + 1); + W.OS << Option << '\0'; BytesWritten += Option.size() + 1; } // Pad to a multiple of the pointer size. - writeBytes("", OffsetToAlignment(BytesWritten, is64Bit() ? 8 : 4)); + W.OS.write_zeros(OffsetToAlignment(BytesWritten, is64Bit() ? 8 : 4)); - assert(getStream().tell() - Start == Size); + assert(W.OS.tell() - Start == Size); } void MachObjectWriter::recordRelocation(MCAssembler &Asm, @@ -611,7 +615,7 @@ void MachObjectWriter::computeSymbolTable( // Set the Index and the IsExtern bit. unsigned Index = Rel.Sym->getIndex(); assert(isInt<24>(Index)); - if (IsLittleEndian) + if (W.Endian == support::little) Rel.MRE.r_word1 = (Rel.MRE.r_word1 & (~0U << 24)) | Index | (1 << 27); else Rel.MRE.r_word1 = (Rel.MRE.r_word1 & 0xff) | Index << 8 | (1 << 4); @@ -847,19 +851,19 @@ void MachObjectWriter::writeObject(MCAssembler &Asm, (VersionInfo.Major << 16); if (VersionInfo.EmitBuildVersion) { // FIXME: Currently empty tools. Add clang version in the future. - write32(MachO::LC_BUILD_VERSION); - write32(sizeof(MachO::build_version_command)); - write32(VersionInfo.TypeOrPlatform.Platform); - write32(EncodedVersion); - write32(0); // SDK version. - write32(0); // Empty tools list. + W.write<uint32_t>(MachO::LC_BUILD_VERSION); + W.write<uint32_t>(sizeof(MachO::build_version_command)); + W.write<uint32_t>(VersionInfo.TypeOrPlatform.Platform); + W.write<uint32_t>(EncodedVersion); + W.write<uint32_t>(0); // SDK version. + W.write<uint32_t>(0); // Empty tools list. } else { MachO::LoadCommandType LCType = getLCFromMCVM(VersionInfo.TypeOrPlatform.Type); - write32(LCType); - write32(sizeof(MachO::version_min_command)); - write32(EncodedVersion); - write32(0); // reserved. + W.write<uint32_t>(LCType); + W.write<uint32_t>(sizeof(MachO::version_min_command)); + W.write<uint32_t>(EncodedVersion); + W.write<uint32_t>(0); // reserved. } } @@ -919,14 +923,14 @@ void MachObjectWriter::writeObject(MCAssembler &Asm, // Write the actual section data. for (const MCSection &Sec : Asm) { - Asm.writeSectionData(getStream(), &Sec, Layout); + Asm.writeSectionData(W.OS, &Sec, Layout); uint64_t Pad = getPaddingSize(&Sec, Layout); - WriteZeros(Pad); + W.OS.write_zeros(Pad); } // Write the extra padding. - WriteZeros(SectionDataPadding); + W.OS.write_zeros(SectionDataPadding); // Write the relocation entries. for (const MCSection &Sec : Asm) { @@ -934,8 +938,8 @@ void MachObjectWriter::writeObject(MCAssembler &Asm, // (approximately, the exact algorithm is more complicated than this). std::vector<RelAndSymbol> &Relocs = Relocations[&Sec]; for (const RelAndSymbol &Rel : make_range(Relocs.rbegin(), Relocs.rend())) { - write32(Rel.MRE.r_word0); - write32(Rel.MRE.r_word1); + W.write<uint32_t>(Rel.MRE.r_word0); + W.write<uint32_t>(Rel.MRE.r_word1); } } @@ -956,20 +960,20 @@ void MachObjectWriter::writeObject(MCAssembler &Asm, << ")" << " end: " << End << "(" << Data->End->getName() << ")" << " size: " << End - Start << "\n"); - write32(Start); - write16(End - Start); - write16(Data->Kind); + W.write<uint32_t>(Start); + W.write<uint16_t>(End - Start); + W.write<uint16_t>(Data->Kind); } // Write out the loh commands, if there is one. if (LOHSize) { #ifndef NDEBUG - unsigned Start = getStream().tell(); + unsigned Start = W.OS.tell(); #endif Asm.getLOHContainer().emit(*this, Layout); // Pad to a multiple of the pointer size. - writeBytes("", OffsetToAlignment(LOHRawSize, is64Bit() ? 8 : 4)); - assert(getStream().tell() - Start == LOHSize); + W.OS.write_zeros(OffsetToAlignment(LOHRawSize, is64Bit() ? 8 : 4)); + assert(W.OS.tell() - Start == LOHSize); } // Write the symbol table data, if used. @@ -988,12 +992,12 @@ void MachObjectWriter::writeObject(MCAssembler &Asm, uint32_t Flags = MachO::INDIRECT_SYMBOL_LOCAL; if (it->Symbol->isAbsolute()) Flags |= MachO::INDIRECT_SYMBOL_ABS; - write32(Flags); + W.write<uint32_t>(Flags); continue; } } - write32(it->Symbol->getIndex()); + W.write<uint32_t>(it->Symbol->getIndex()); } // FIXME: Check that offsets match computed ones. @@ -1005,7 +1009,7 @@ void MachObjectWriter::writeObject(MCAssembler &Asm, writeNlist(Entry, Layout); // Write the string table. - StringTable.write(getStream()); + StringTable.write(W.OS); } } |