Skip to content

Commit

Permalink
MCAssmembler: Move ELFHeaderEFlags to ELFObjectWriter
Browse files Browse the repository at this point in the history
Now that MCELFStreamer can access ELFObjectWriter (commit
70c52b6), we can move ELFHeaderEFlags
there.
  • Loading branch information
MaskRay committed Jul 23, 2024
1 parent f540160 commit c473e75
Show file tree
Hide file tree
Showing 14 changed files with 61 additions and 71 deletions.
11 changes: 0 additions & 11 deletions llvm/include/llvm/MC/MCAssembler.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,6 @@ class MCAssembler {
/// By default it's 0, which means bundling is disabled.
unsigned BundleAlignSize = 0;

/// ELF specific e_header flags
// It would be good if there were an MCELFAssembler class to hold this.
// ELF header flags are used both by the integrated and standalone assemblers.
// Access to the flags is necessary in cases where assembler directives affect
// which flags to be set.
unsigned ELFHeaderEFlags = 0;

/// Evaluate a fixup to a relocatable expression and the value which should be
/// placed into the fixup.
///
Expand Down Expand Up @@ -200,10 +193,6 @@ class MCAssembler {
/// Flag a function symbol as the target of a .thumb_func directive.
void setIsThumbFunc(const MCSymbol *Func) { ThumbFuncs.insert(Func); }

/// ELF e_header flags
unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }

/// Reuse an assembler instance
///
void reset();
Expand Down
5 changes: 5 additions & 0 deletions llvm/include/llvm/MC/MCELFObjectWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ class MCELFObjectTargetWriter : public MCObjectTargetWriter {
};

class ELFObjectWriter : public MCObjectWriter {
unsigned ELFHeaderEFlags = 0;

public:
std::unique_ptr<MCELFObjectTargetWriter> TargetObjectWriter;
DenseMap<const MCSectionELF *, std::vector<ELFRelocationEntry>> Relocations;
Expand Down Expand Up @@ -187,6 +189,9 @@ class ELFObjectWriter : public MCObjectWriter {
return true;
}

unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }

// Mark that we have seen GNU ABI usage (e.g. SHF_GNU_RETAIN, STB_GNU_UNIQUE).
void markGnuAbi() { SeenGnuAbi = true; }
bool seenGnuAbi() const { return SeenGnuAbi; }
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/MC/ELFObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ void ELFWriter::writeHeader(const MCAssembler &Asm) {
WriteWord(0); // e_shoff = sec hdr table off in bytes

// e_flags = whatever the target wants
W.write<uint32_t>(Asm.getELFHeaderEFlags());
W.write<uint32_t>(OWriter.getELFHeaderEFlags());

// e_ehsize = ELF header size
W.write<uint16_t>(is64Bit() ? sizeof(ELF::Elf64_Ehdr)
Expand Down Expand Up @@ -1157,6 +1157,7 @@ uint64_t ELFWriter::writeObject(MCAssembler &Asm) {
}

void ELFObjectWriter::reset() {
ELFHeaderEFlags = 0;
SeenGnuAbi = false;
OverrideABIVersion.reset();
Relocations.clear();
Expand Down
1 change: 0 additions & 1 deletion llvm/lib/MC/MCAssembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ void MCAssembler::reset() {
FileNames.clear();
ThumbFuncs.clear();
BundleAlignSize = 0;
ELFHeaderEFlags = 0;

// reset objects owned by us
if (getBackendPtr())
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -605,9 +605,9 @@ MCELFStreamer &AMDGPUTargetELFStreamer::getStreamer() {
// We use it for emitting the accumulated PAL metadata as a .note record.
// The PAL metadata is reset after it is emitted.
void AMDGPUTargetELFStreamer::finish() {
MCAssembler &MCA = getStreamer().getAssembler();
MCA.setELFHeaderEFlags(getEFlags());
getStreamer().getWriter().setOverrideABIVersion(
ELFObjectWriter &W = getStreamer().getWriter();
W.setELFHeaderEFlags(getEFlags());
W.setOverrideABIVersion(
getELFABIVersion(STI.getTargetTriple(), CodeObjectVersion));

std::string Blob;
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1128,7 +1128,7 @@ void ARMELFStreamer::reset() {
// MCELFStreamer clear's the assembler's e_flags. However, for
// arm we manually set the ABI version on streamer creation, so
// do the same here
getAssembler().setELFHeaderEFlags(ELF::EF_ARM_EABI_VER5);
getWriter().setELFHeaderEFlags(ELF::EF_ARM_EABI_VER5);
}

inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,
Expand Down Expand Up @@ -1484,7 +1484,7 @@ MCELFStreamer *createARMELFStreamer(MCContext &Context,
// FIXME: This should eventually end up somewhere else where more
// intelligent flag decisions can be made. For now we are just maintaining
// the status quo for ARM and setting EF_ARM_EABI_VER5 as the default.
S->getAssembler().setELFHeaderEFlags(ELF::EF_ARM_EABI_VER5);
S->getWriter().setELFHeaderEFlags(ELF::EF_ARM_EABI_VER5);

return S;
}
Expand Down
7 changes: 3 additions & 4 deletions llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,13 @@ static unsigned getEFlagsForFeatureSet(const FeatureBitset &Features) {

AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
: AVRTargetStreamer(S) {

MCAssembler &MCA = getStreamer().getAssembler();
unsigned EFlags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned EFlags = W.getELFHeaderEFlags();

EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits());
EFlags |= ELF::EF_AVR_LINKRELAX_PREPARED;

MCA.setELFHeaderEFlags(EFlags);
W.setELFHeaderEFlags(EFlags);
}

} // end namespace llvm
6 changes: 3 additions & 3 deletions llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ using namespace llvm;
CSKYTargetELFStreamer::CSKYTargetELFStreamer(MCStreamer &S,
const MCSubtargetInfo &STI)
: CSKYTargetStreamer(S), CurrentVendor("csky") {
MCAssembler &MCA = getStreamer().getAssembler();
ELFObjectWriter &W = getStreamer().getWriter();
const FeatureBitset &Features = STI.getFeatureBits();

unsigned EFlags = MCA.getELFHeaderEFlags();
unsigned EFlags = W.getELFHeaderEFlags();

EFlags |= ELF::EF_CSKY_ABIV2;

Expand Down Expand Up @@ -62,7 +62,7 @@ CSKYTargetELFStreamer::CSKYTargetELFStreamer(MCStreamer &S,

EFlags |= ELF::EF_CSKY_EFV1;

MCA.setELFHeaderEFlags(EFlags);
W.setELFHeaderEFlags(EFlags);
}

MCELFStreamer &CSKYTargetELFStreamer::getStreamer() {
Expand Down
3 changes: 1 addition & 2 deletions llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -291,8 +291,7 @@ class HexagonTargetELFStreamer : public HexagonTargetStreamer {
}
HexagonTargetELFStreamer(MCStreamer &S, MCSubtargetInfo const &STI)
: HexagonTargetStreamer(S) {
MCAssembler &MCA = getStreamer().getAssembler();
MCA.setELFHeaderEFlags(Hexagon_MC::GetELFFlags(STI));
getStreamer().getWriter().setELFHeaderEFlags(Hexagon_MC::GetELFFlags(STI));
}

void emitCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ MCELFStreamer &LoongArchTargetELFStreamer::getStreamer() {

void LoongArchTargetELFStreamer::finish() {
LoongArchTargetStreamer::finish();
MCAssembler &MCA = getStreamer().getAssembler();
ELFObjectWriter &W = getStreamer().getWriter();
LoongArchABI::ABI ABI = getTargetABI();

// Figure out the e_flags.
Expand All @@ -48,7 +48,7 @@ void LoongArchTargetELFStreamer::finish() {
// based relocs from day one.
//
// Refer to LoongArch ELF psABI v2.01 for details.
unsigned EFlags = MCA.getELFHeaderEFlags();
unsigned EFlags = W.getELFHeaderEFlags();
EFlags |= ELF::EF_LOONGARCH_OBJABI_V1;
switch (ABI) {
case LoongArchABI::ABI_ILP32S:
Expand All @@ -66,7 +66,7 @@ void LoongArchTargetELFStreamer::finish() {
case LoongArchABI::ABI_Unknown:
llvm_unreachable("Improperly initialized target ABI");
}
MCA.setELFHeaderEFlags(EFlags);
W.setELFHeaderEFlags(EFlags);
}

namespace {
Expand Down
4 changes: 0 additions & 4 deletions llvm/lib/Target/MSP430/MCTargetDesc/MSP430ELFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@ class MSP430TargetELFStreamer : public MCTargetStreamer {
MSP430TargetELFStreamer::MSP430TargetELFStreamer(MCStreamer &S,
const MCSubtargetInfo &STI)
: MCTargetStreamer(S) {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned EFlags = MCA.getELFHeaderEFlags();
MCA.setELFHeaderEFlags(EFlags);

// Emit build attributes section according to
// MSP430 EABI (slaa534.pdf, part 13).
MCSection *AttributeSection = getStreamer().getContext().getELFSection(
Expand Down
58 changes: 30 additions & 28 deletions llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,7 @@ MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
const MCSubtargetInfo &STI)
: MipsTargetStreamer(S), MicroMipsEnabled(false), STI(STI) {
MCAssembler &MCA = getStreamer().getAssembler();
ELFObjectWriter &W = getStreamer().getWriter();

// It's possible that MCObjectFileInfo isn't fully initialized at this point
// due to an initialization order problem where LLVMTargetMachine creates the
Expand All @@ -824,7 +825,7 @@ MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
// We can fix this by making the target streamer construct
// the ABI, but this is fraught with wide ranging dependency
// issues as well.
unsigned EFlags = MCA.getELFHeaderEFlags();
unsigned EFlags = W.getELFHeaderEFlags();

// FIXME: Fix a dependency issue by instantiating the ABI object to some
// default based off the triple. The triple doesn't describe the target
Expand Down Expand Up @@ -873,7 +874,7 @@ MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
if (Features[Mips::FeatureNaN2008])
EFlags |= ELF::EF_MIPS_NAN2008;

MCA.setELFHeaderEFlags(EFlags);
W.setELFHeaderEFlags(EFlags);
}

void MipsTargetELFStreamer::emitLabel(MCSymbol *S) {
Expand All @@ -889,6 +890,7 @@ void MipsTargetELFStreamer::emitLabel(MCSymbol *S) {

void MipsTargetELFStreamer::finish() {
MCAssembler &MCA = getStreamer().getAssembler();
ELFObjectWriter &W = getStreamer().getWriter();
const MCObjectFileInfo &OFI = *MCA.getContext().getObjectFileInfo();
MCELFStreamer &S = getStreamer();

Expand Down Expand Up @@ -925,7 +927,7 @@ void MipsTargetELFStreamer::finish() {

// Update e_header flags. See the FIXME and comment above in
// the constructor for a full rundown on this.
unsigned EFlags = MCA.getELFHeaderEFlags();
unsigned EFlags = W.getELFHeaderEFlags();

// ABI
// N64 does not require any ABI bits.
Expand All @@ -948,7 +950,7 @@ void MipsTargetELFStreamer::finish() {
if (Pic)
EFlags |= ELF::EF_MIPS_PIC | ELF::EF_MIPS_CPIC;

MCA.setELFHeaderEFlags(EFlags);
W.setELFHeaderEFlags(EFlags);

// Emit all the option records.
// At the moment we are only emitting .Mips.options (ODK_REGINFO) and
Expand Down Expand Up @@ -988,25 +990,25 @@ void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
}

void MipsTargetELFStreamer::setUsesMicroMips() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Flags |= ELF::EF_MIPS_MICROMIPS;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
}

void MipsTargetELFStreamer::emitDirectiveSetMips16() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Flags |= ELF::EF_MIPS_ARCH_ASE_M16;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
forbidModuleDirective();
}

void MipsTargetELFStreamer::emitDirectiveSetNoReorder() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Flags |= ELF::EF_MIPS_NOREORDER;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
forbidModuleDirective();
}

Expand Down Expand Up @@ -1063,45 +1065,45 @@ void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
}

void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Flags |= ELF::EF_MIPS_CPIC | ELF::EF_MIPS_PIC;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
}

void MipsTargetELFStreamer::emitDirectiveNaN2008() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Flags |= ELF::EF_MIPS_NAN2008;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
}

void MipsTargetELFStreamer::emitDirectiveNaNLegacy() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Flags &= ~ELF::EF_MIPS_NAN2008;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
}

void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
// This option overrides other PIC options like -KPIC.
Pic = false;
Flags &= ~ELF::EF_MIPS_PIC;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
}

void MipsTargetELFStreamer::emitDirectiveOptionPic2() {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Pic = true;
// NOTE: We are following the GAS behaviour here which means the directive
// 'pic2' also sets the CPIC bit in the ELF header. This is different from
// what is stated in the SYSV ABI which consider the bits EF_MIPS_PIC and
// EF_MIPS_CPIC to be mutually exclusive.
Flags |= ELF::EF_MIPS_PIC | ELF::EF_MIPS_CPIC;
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
}

void MipsTargetELFStreamer::emitDirectiveInsn() {
Expand Down
12 changes: 6 additions & 6 deletions llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,15 +298,14 @@ class PPCTargetELFStreamer : public PPCTargetStreamer {
}

void emitAbiVersion(int AbiVersion) override {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
Flags &= ~ELF::EF_PPC64_ABI;
Flags |= (AbiVersion & ELF::EF_PPC64_ABI);
MCA.setELFHeaderEFlags(Flags);
W.setELFHeaderEFlags(Flags);
}

void emitLocalEntry(MCSymbolELF *S, const MCExpr *LocalOffset) override {
MCAssembler &MCA = getStreamer().getAssembler();

// encodePPC64LocalEntryOffset will report an error if it cannot
// encode LocalOffset.
Expand All @@ -319,9 +318,10 @@ class PPCTargetELFStreamer : public PPCTargetStreamer {

// For GAS compatibility, unless we already saw a .abiversion directive,
// set e_flags to indicate ELFv2 ABI.
unsigned Flags = MCA.getELFHeaderEFlags();
ELFObjectWriter &W = getStreamer().getWriter();
unsigned Flags = W.getELFHeaderEFlags();
if ((Flags & ELF::EF_PPC64_ABI) == 0)
MCA.setELFHeaderEFlags(Flags | 2);
W.setELFHeaderEFlags(Flags | 2);
}

void emitAssignment(MCSymbol *S, const MCExpr *Value) override {
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ void RISCVTargetELFStreamer::finishAttributeSection() {

void RISCVTargetELFStreamer::finish() {
RISCVTargetStreamer::finish();
MCAssembler &MCA = getStreamer().getAssembler();
ELFObjectWriter &W = getStreamer().getWriter();
RISCVABI::ABI ABI = getTargetABI();

unsigned EFlags = MCA.getELFHeaderEFlags();
unsigned EFlags = W.getELFHeaderEFlags();

if (hasRVC())
EFlags |= ELF::EF_RISCV_RVC;
Expand All @@ -117,7 +117,7 @@ void RISCVTargetELFStreamer::finish() {
llvm_unreachable("Improperly initialised target ABI");
}

MCA.setELFHeaderEFlags(EFlags);
W.setELFHeaderEFlags(EFlags);
}

void RISCVTargetELFStreamer::reset() {
Expand Down

0 comments on commit c473e75

Please sign in to comment.