Skip to content

Commit c473e75

Browse files
committed
MCAssmembler: Move ELFHeaderEFlags to ELFObjectWriter
Now that MCELFStreamer can access ELFObjectWriter (commit 70c52b6), we can move ELFHeaderEFlags there.
1 parent f540160 commit c473e75

File tree

14 files changed

+61
-71
lines changed

14 files changed

+61
-71
lines changed

llvm/include/llvm/MC/MCAssembler.h

-11
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,6 @@ class MCAssembler {
9494
/// By default it's 0, which means bundling is disabled.
9595
unsigned BundleAlignSize = 0;
9696

97-
/// ELF specific e_header flags
98-
// It would be good if there were an MCELFAssembler class to hold this.
99-
// ELF header flags are used both by the integrated and standalone assemblers.
100-
// Access to the flags is necessary in cases where assembler directives affect
101-
// which flags to be set.
102-
unsigned ELFHeaderEFlags = 0;
103-
10497
/// Evaluate a fixup to a relocatable expression and the value which should be
10598
/// placed into the fixup.
10699
///
@@ -200,10 +193,6 @@ class MCAssembler {
200193
/// Flag a function symbol as the target of a .thumb_func directive.
201194
void setIsThumbFunc(const MCSymbol *Func) { ThumbFuncs.insert(Func); }
202195

203-
/// ELF e_header flags
204-
unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
205-
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }
206-
207196
/// Reuse an assembler instance
208197
///
209198
void reset();

llvm/include/llvm/MC/MCELFObjectWriter.h

+5
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ class MCELFObjectTargetWriter : public MCObjectTargetWriter {
154154
};
155155

156156
class ELFObjectWriter : public MCObjectWriter {
157+
unsigned ELFHeaderEFlags = 0;
158+
157159
public:
158160
std::unique_ptr<MCELFObjectTargetWriter> TargetObjectWriter;
159161
DenseMap<const MCSectionELF *, std::vector<ELFRelocationEntry>> Relocations;
@@ -187,6 +189,9 @@ class ELFObjectWriter : public MCObjectWriter {
187189
return true;
188190
}
189191

192+
unsigned getELFHeaderEFlags() const { return ELFHeaderEFlags; }
193+
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags; }
194+
190195
// Mark that we have seen GNU ABI usage (e.g. SHF_GNU_RETAIN, STB_GNU_UNIQUE).
191196
void markGnuAbi() { SeenGnuAbi = true; }
192197
bool seenGnuAbi() const { return SeenGnuAbi; }

llvm/lib/MC/ELFObjectWriter.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ void ELFWriter::writeHeader(const MCAssembler &Asm) {
360360
WriteWord(0); // e_shoff = sec hdr table off in bytes
361361

362362
// e_flags = whatever the target wants
363-
W.write<uint32_t>(Asm.getELFHeaderEFlags());
363+
W.write<uint32_t>(OWriter.getELFHeaderEFlags());
364364

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

11591159
void ELFObjectWriter::reset() {
1160+
ELFHeaderEFlags = 0;
11601161
SeenGnuAbi = false;
11611162
OverrideABIVersion.reset();
11621163
Relocations.clear();

llvm/lib/MC/MCAssembler.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ void MCAssembler::reset() {
9797
FileNames.clear();
9898
ThumbFuncs.clear();
9999
BundleAlignSize = 0;
100-
ELFHeaderEFlags = 0;
101100

102101
// reset objects owned by us
103102
if (getBackendPtr())

llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -605,9 +605,9 @@ MCELFStreamer &AMDGPUTargetELFStreamer::getStreamer() {
605605
// We use it for emitting the accumulated PAL metadata as a .note record.
606606
// The PAL metadata is reset after it is emitted.
607607
void AMDGPUTargetELFStreamer::finish() {
608-
MCAssembler &MCA = getStreamer().getAssembler();
609-
MCA.setELFHeaderEFlags(getEFlags());
610-
getStreamer().getWriter().setOverrideABIVersion(
608+
ELFObjectWriter &W = getStreamer().getWriter();
609+
W.setELFHeaderEFlags(getEFlags());
610+
W.setOverrideABIVersion(
611611
getELFABIVersion(STI.getTargetTriple(), CodeObjectVersion));
612612

613613
std::string Blob;

llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1128,7 +1128,7 @@ void ARMELFStreamer::reset() {
11281128
// MCELFStreamer clear's the assembler's e_flags. However, for
11291129
// arm we manually set the ABI version on streamer creation, so
11301130
// do the same here
1131-
getAssembler().setELFHeaderEFlags(ELF::EF_ARM_EABI_VER5);
1131+
getWriter().setELFHeaderEFlags(ELF::EF_ARM_EABI_VER5);
11321132
}
11331133

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

14891489
return S;
14901490
}

llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,13 @@ static unsigned getEFlagsForFeatureSet(const FeatureBitset &Features) {
5656

5757
AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
5858
: AVRTargetStreamer(S) {
59-
60-
MCAssembler &MCA = getStreamer().getAssembler();
61-
unsigned EFlags = MCA.getELFHeaderEFlags();
59+
ELFObjectWriter &W = getStreamer().getWriter();
60+
unsigned EFlags = W.getELFHeaderEFlags();
6261

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

66-
MCA.setELFHeaderEFlags(EFlags);
65+
W.setELFHeaderEFlags(EFlags);
6766
}
6867

6968
} // end namespace llvm

llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFStreamer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ using namespace llvm;
3131
CSKYTargetELFStreamer::CSKYTargetELFStreamer(MCStreamer &S,
3232
const MCSubtargetInfo &STI)
3333
: CSKYTargetStreamer(S), CurrentVendor("csky") {
34-
MCAssembler &MCA = getStreamer().getAssembler();
34+
ELFObjectWriter &W = getStreamer().getWriter();
3535
const FeatureBitset &Features = STI.getFeatureBits();
3636

37-
unsigned EFlags = MCA.getELFHeaderEFlags();
37+
unsigned EFlags = W.getELFHeaderEFlags();
3838

3939
EFlags |= ELF::EF_CSKY_ABIV2;
4040

@@ -62,7 +62,7 @@ CSKYTargetELFStreamer::CSKYTargetELFStreamer(MCStreamer &S,
6262

6363
EFlags |= ELF::EF_CSKY_EFV1;
6464

65-
MCA.setELFHeaderEFlags(EFlags);
65+
W.setELFHeaderEFlags(EFlags);
6666
}
6767

6868
MCELFStreamer &CSKYTargetELFStreamer::getStreamer() {

llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,7 @@ class HexagonTargetELFStreamer : public HexagonTargetStreamer {
291291
}
292292
HexagonTargetELFStreamer(MCStreamer &S, MCSubtargetInfo const &STI)
293293
: HexagonTargetStreamer(S) {
294-
MCAssembler &MCA = getStreamer().getAssembler();
295-
MCA.setELFHeaderEFlags(Hexagon_MC::GetELFFlags(STI));
294+
getStreamer().getWriter().setELFHeaderEFlags(Hexagon_MC::GetELFFlags(STI));
296295
}
297296

298297
void emitCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,

llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFStreamer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ MCELFStreamer &LoongArchTargetELFStreamer::getStreamer() {
3737

3838
void LoongArchTargetELFStreamer::finish() {
3939
LoongArchTargetStreamer::finish();
40-
MCAssembler &MCA = getStreamer().getAssembler();
40+
ELFObjectWriter &W = getStreamer().getWriter();
4141
LoongArchABI::ABI ABI = getTargetABI();
4242

4343
// Figure out the e_flags.
@@ -48,7 +48,7 @@ void LoongArchTargetELFStreamer::finish() {
4848
// based relocs from day one.
4949
//
5050
// Refer to LoongArch ELF psABI v2.01 for details.
51-
unsigned EFlags = MCA.getELFHeaderEFlags();
51+
unsigned EFlags = W.getELFHeaderEFlags();
5252
EFlags |= ELF::EF_LOONGARCH_OBJABI_V1;
5353
switch (ABI) {
5454
case LoongArchABI::ABI_ILP32S:
@@ -66,7 +66,7 @@ void LoongArchTargetELFStreamer::finish() {
6666
case LoongArchABI::ABI_Unknown:
6767
llvm_unreachable("Improperly initialized target ABI");
6868
}
69-
MCA.setELFHeaderEFlags(EFlags);
69+
W.setELFHeaderEFlags(EFlags);
7070
}
7171

7272
namespace {

llvm/lib/Target/MSP430/MCTargetDesc/MSP430ELFStreamer.cpp

-4
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ class MSP430TargetELFStreamer : public MCTargetStreamer {
3535
MSP430TargetELFStreamer::MSP430TargetELFStreamer(MCStreamer &S,
3636
const MCSubtargetInfo &STI)
3737
: MCTargetStreamer(S) {
38-
MCAssembler &MCA = getStreamer().getAssembler();
39-
unsigned EFlags = MCA.getELFHeaderEFlags();
40-
MCA.setELFHeaderEFlags(EFlags);
41-
4238
// Emit build attributes section according to
4339
// MSP430 EABI (slaa534.pdf, part 13).
4440
MCSection *AttributeSection = getStreamer().getContext().getELFSection(

llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp

+30-28
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,7 @@ MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
801801
const MCSubtargetInfo &STI)
802802
: MipsTargetStreamer(S), MicroMipsEnabled(false), STI(STI) {
803803
MCAssembler &MCA = getStreamer().getAssembler();
804+
ELFObjectWriter &W = getStreamer().getWriter();
804805

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

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

876-
MCA.setELFHeaderEFlags(EFlags);
877+
W.setELFHeaderEFlags(EFlags);
877878
}
878879

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

890891
void MipsTargetELFStreamer::finish() {
891892
MCAssembler &MCA = getStreamer().getAssembler();
893+
ELFObjectWriter &W = getStreamer().getWriter();
892894
const MCObjectFileInfo &OFI = *MCA.getContext().getObjectFileInfo();
893895
MCELFStreamer &S = getStreamer();
894896

@@ -925,7 +927,7 @@ void MipsTargetELFStreamer::finish() {
925927

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

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

951-
MCA.setELFHeaderEFlags(EFlags);
953+
W.setELFHeaderEFlags(EFlags);
952954

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

990992
void MipsTargetELFStreamer::setUsesMicroMips() {
991-
MCAssembler &MCA = getStreamer().getAssembler();
992-
unsigned Flags = MCA.getELFHeaderEFlags();
993+
ELFObjectWriter &W = getStreamer().getWriter();
994+
unsigned Flags = W.getELFHeaderEFlags();
993995
Flags |= ELF::EF_MIPS_MICROMIPS;
994-
MCA.setELFHeaderEFlags(Flags);
996+
W.setELFHeaderEFlags(Flags);
995997
}
996998

997999
void MipsTargetELFStreamer::emitDirectiveSetMips16() {
998-
MCAssembler &MCA = getStreamer().getAssembler();
999-
unsigned Flags = MCA.getELFHeaderEFlags();
1000+
ELFObjectWriter &W = getStreamer().getWriter();
1001+
unsigned Flags = W.getELFHeaderEFlags();
10001002
Flags |= ELF::EF_MIPS_ARCH_ASE_M16;
1001-
MCA.setELFHeaderEFlags(Flags);
1003+
W.setELFHeaderEFlags(Flags);
10021004
forbidModuleDirective();
10031005
}
10041006

10051007
void MipsTargetELFStreamer::emitDirectiveSetNoReorder() {
1006-
MCAssembler &MCA = getStreamer().getAssembler();
1007-
unsigned Flags = MCA.getELFHeaderEFlags();
1008+
ELFObjectWriter &W = getStreamer().getWriter();
1009+
unsigned Flags = W.getELFHeaderEFlags();
10081010
Flags |= ELF::EF_MIPS_NOREORDER;
1009-
MCA.setELFHeaderEFlags(Flags);
1011+
W.setELFHeaderEFlags(Flags);
10101012
forbidModuleDirective();
10111013
}
10121014

@@ -1063,45 +1065,45 @@ void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
10631065
}
10641066

10651067
void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
1066-
MCAssembler &MCA = getStreamer().getAssembler();
1067-
unsigned Flags = MCA.getELFHeaderEFlags();
1068+
ELFObjectWriter &W = getStreamer().getWriter();
1069+
unsigned Flags = W.getELFHeaderEFlags();
10681070
Flags |= ELF::EF_MIPS_CPIC | ELF::EF_MIPS_PIC;
1069-
MCA.setELFHeaderEFlags(Flags);
1071+
W.setELFHeaderEFlags(Flags);
10701072
}
10711073

10721074
void MipsTargetELFStreamer::emitDirectiveNaN2008() {
1073-
MCAssembler &MCA = getStreamer().getAssembler();
1074-
unsigned Flags = MCA.getELFHeaderEFlags();
1075+
ELFObjectWriter &W = getStreamer().getWriter();
1076+
unsigned Flags = W.getELFHeaderEFlags();
10751077
Flags |= ELF::EF_MIPS_NAN2008;
1076-
MCA.setELFHeaderEFlags(Flags);
1078+
W.setELFHeaderEFlags(Flags);
10771079
}
10781080

10791081
void MipsTargetELFStreamer::emitDirectiveNaNLegacy() {
1080-
MCAssembler &MCA = getStreamer().getAssembler();
1081-
unsigned Flags = MCA.getELFHeaderEFlags();
1082+
ELFObjectWriter &W = getStreamer().getWriter();
1083+
unsigned Flags = W.getELFHeaderEFlags();
10821084
Flags &= ~ELF::EF_MIPS_NAN2008;
1083-
MCA.setELFHeaderEFlags(Flags);
1085+
W.setELFHeaderEFlags(Flags);
10841086
}
10851087

10861088
void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
1087-
MCAssembler &MCA = getStreamer().getAssembler();
1088-
unsigned Flags = MCA.getELFHeaderEFlags();
1089+
ELFObjectWriter &W = getStreamer().getWriter();
1090+
unsigned Flags = W.getELFHeaderEFlags();
10891091
// This option overrides other PIC options like -KPIC.
10901092
Pic = false;
10911093
Flags &= ~ELF::EF_MIPS_PIC;
1092-
MCA.setELFHeaderEFlags(Flags);
1094+
W.setELFHeaderEFlags(Flags);
10931095
}
10941096

10951097
void MipsTargetELFStreamer::emitDirectiveOptionPic2() {
1096-
MCAssembler &MCA = getStreamer().getAssembler();
1097-
unsigned Flags = MCA.getELFHeaderEFlags();
1098+
ELFObjectWriter &W = getStreamer().getWriter();
1099+
unsigned Flags = W.getELFHeaderEFlags();
10981100
Pic = true;
10991101
// NOTE: We are following the GAS behaviour here which means the directive
11001102
// 'pic2' also sets the CPIC bit in the ELF header. This is different from
11011103
// what is stated in the SYSV ABI which consider the bits EF_MIPS_PIC and
11021104
// EF_MIPS_CPIC to be mutually exclusive.
11031105
Flags |= ELF::EF_MIPS_PIC | ELF::EF_MIPS_CPIC;
1104-
MCA.setELFHeaderEFlags(Flags);
1106+
W.setELFHeaderEFlags(Flags);
11051107
}
11061108

11071109
void MipsTargetELFStreamer::emitDirectiveInsn() {

llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCTargetDesc.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -298,15 +298,14 @@ class PPCTargetELFStreamer : public PPCTargetStreamer {
298298
}
299299

300300
void emitAbiVersion(int AbiVersion) override {
301-
MCAssembler &MCA = getStreamer().getAssembler();
302-
unsigned Flags = MCA.getELFHeaderEFlags();
301+
ELFObjectWriter &W = getStreamer().getWriter();
302+
unsigned Flags = W.getELFHeaderEFlags();
303303
Flags &= ~ELF::EF_PPC64_ABI;
304304
Flags |= (AbiVersion & ELF::EF_PPC64_ABI);
305-
MCA.setELFHeaderEFlags(Flags);
305+
W.setELFHeaderEFlags(Flags);
306306
}
307307

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

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

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

327327
void emitAssignment(MCSymbol *S, const MCExpr *Value) override {

llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ void RISCVTargetELFStreamer::finishAttributeSection() {
8787

8888
void RISCVTargetELFStreamer::finish() {
8989
RISCVTargetStreamer::finish();
90-
MCAssembler &MCA = getStreamer().getAssembler();
90+
ELFObjectWriter &W = getStreamer().getWriter();
9191
RISCVABI::ABI ABI = getTargetABI();
9292

93-
unsigned EFlags = MCA.getELFHeaderEFlags();
93+
unsigned EFlags = W.getELFHeaderEFlags();
9494

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

120-
MCA.setELFHeaderEFlags(EFlags);
120+
W.setELFHeaderEFlags(EFlags);
121121
}
122122

123123
void RISCVTargetELFStreamer::reset() {

0 commit comments

Comments
 (0)