#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/ADT/iterator.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCELFExtras.h"
#include "llvm/MC/MCELFObjectWriter.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCFixup.h"
#include "llvm/MC/MCFixupKindInfo.h"
#include "llvm/MC/MCFragment.h"
#include "llvm/MC/MCObjectWriter.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCSymbolELF.h"
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/MC/MCValue.h"
#include "llvm/MC/StringTableBuilder.h"
#include "llvm/Support/Alignment.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compression.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/EndianStream.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LEB128.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/SMLoc.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/Host.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
usingnamespacellvm;
#define DEBUG_TYPE …
namespace {
stats
struct ELFWriter;
bool isDwoSection(const MCSectionELF &Sec) { … }
class SymbolTableWriter { … };
struct ELFWriter { … };
}
uint64_t ELFWriter::align(Align Alignment) { … }
unsigned ELFWriter::addToSectionTable(MCSectionELF *Sec) { … }
void SymbolTableWriter::createSymtabShndx() { … }
template <typename T> void SymbolTableWriter::write(T Value) { … }
SymbolTableWriter::SymbolTableWriter(ELFWriter &EWriter, bool Is64Bit)
: … { … }
void SymbolTableWriter::writeSymbol(uint32_t name, uint8_t info, uint64_t value,
uint64_t size, uint8_t other,
uint32_t shndx, bool Reserved) { … }
bool ELFWriter::is64Bit() const { … }
void ELFWriter::writeHeader(const MCAssembler &Asm) { … }
uint64_t ELFWriter::symbolValue(const MCAssembler &Asm, const MCSymbol &Sym) { … }
static uint8_t mergeTypeForSet(uint8_t origType, uint8_t newType) { … }
static bool isIFunc(const MCSymbolELF *Symbol) { … }
void ELFWriter::writeSymbol(const MCAssembler &Asm, SymbolTableWriter &Writer,
uint32_t StringIndex, ELFSymbolData &MSD) { … }
bool ELFWriter::isInSymtab(const MCAssembler &Asm, const MCSymbolELF &Symbol,
bool Used, bool Renamed) { … }
void ELFWriter::computeSymbolTable(MCAssembler &Asm,
const RevGroupMapTy &RevGroupMap) { … }
void ELFWriter::writeAddrsigSection() { … }
MCSectionELF *ELFWriter::createRelocationSection(MCContext &Ctx,
const MCSectionELF &Sec) { … }
bool ELFWriter::maybeWriteCompression(
uint32_t ChType, uint64_t Size,
SmallVectorImpl<uint8_t> &CompressedContents, Align Alignment) { … }
void ELFWriter::writeSectionData(const MCAssembler &Asm, MCSection &Sec) { … }
void ELFWriter::WriteSecHdrEntry(uint32_t Name, uint32_t Type, uint64_t Flags,
uint64_t Address, uint64_t Offset,
uint64_t Size, uint32_t Link, uint32_t Info,
MaybeAlign Alignment, uint64_t EntrySize) { … }
template <bool Is64>
static void encodeCrel(ArrayRef<ELFRelocationEntry> Relocs, raw_ostream &OS) { … }
void ELFWriter::writeRelocations(const MCAssembler &Asm,
const MCSectionELF &Sec) { … }
void ELFWriter::writeSection(uint32_t GroupSymbolIndex, uint64_t Offset,
uint64_t Size, const MCSectionELF &Section) { … }
void ELFWriter::writeSectionHeader(const MCAssembler &Asm) { … }
uint64_t ELFWriter::writeObject(MCAssembler &Asm) { … }
ELFObjectWriter::ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS, bool IsLittleEndian)
: … { … }
ELFObjectWriter::ELFObjectWriter(std::unique_ptr<MCELFObjectTargetWriter> MOTW,
raw_pwrite_stream &OS,
raw_pwrite_stream &DwoOS, bool IsLittleEndian)
: … { … }
void ELFObjectWriter::reset() { … }
bool ELFObjectWriter::hasRelocationAddend() const { … }
void ELFObjectWriter::executePostLayoutBinding(MCAssembler &Asm) { … }
bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
const MCValue &Val,
const MCSymbolELF *Sym,
uint64_t C,
unsigned Type) const { … }
bool ELFObjectWriter::checkRelocation(MCContext &Ctx, SMLoc Loc,
const MCSectionELF *From,
const MCSectionELF *To) { … }
void ELFObjectWriter::recordRelocation(MCAssembler &Asm,
const MCFragment *Fragment,
const MCFixup &Fixup, MCValue Target,
uint64_t &FixedValue) { … }
bool ELFObjectWriter::usesRela(const MCTargetOptions *TO,
const MCSectionELF &Sec) const { … }
bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(
const MCAssembler &Asm, const MCSymbol &SA, const MCFragment &FB,
bool InSet, bool IsPCRel) const { … }
uint64_t ELFObjectWriter::writeObject(MCAssembler &Asm) { … }