Skip to content

Commit 6d46499

Browse files
committed
optimize linker-relaxable and remove canReuseDataFragment
Created using spr 1.3.5-bogner
1 parent 2efea54 commit 6d46499

File tree

3 files changed

+21
-16
lines changed

3 files changed

+21
-16
lines changed

llvm/lib/MC/MCObjectStreamer.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,12 @@ void MCObjectStreamer::emitFrames(MCAsmBackend *MAB) {
106106
MCDwarfFrameEmitter::Emit(*this, MAB, false);
107107
}
108108

109-
static bool canReuseDataFragment(const MCFragment &F) {
110-
if (!F.hasInstructions())
111-
return true;
112-
// Do not add data after a linker-relaxable instruction. The difference
113-
// between a new label and a label at or before the linker-relaxable
114-
// instruction cannot be resolved at assemble-time.
115-
return !F.isLinkerRelaxable();
116-
}
117-
118109
MCFragment *MCObjectStreamer::getOrCreateDataFragment() {
110+
// TODO: Start a new fragment whenever finalizing the variable-size tail of a
111+
// previous one, so that all getOrCreateDataFragment calls can be replaced
112+
// with getCurrentFragment
119113
auto *F = getCurrentFragment();
120-
if (F->getKind() != MCFragment::FT_Data || !canReuseDataFragment(*F)) {
114+
if (F->getKind() != MCFragment::FT_Data) {
121115
F = getContext().allocFragment<MCFragment>();
122116
insert(F);
123117
}
@@ -355,16 +349,23 @@ void MCObjectStreamer::emitInstToData(const MCInst &Inst,
355349
F->doneAppending();
356350
if (!Fixups.empty())
357351
F->appendFixups(Fixups);
352+
F->setHasInstructions(STI);
358353

354+
bool MarkedLinkerRelaxable = false;
359355
for (auto &Fixup : MutableArrayRef(F->getFixups()).slice(FixupStartIndex)) {
360356
Fixup.setOffset(Fixup.getOffset() + CodeOffset);
361-
if (Fixup.isLinkerRelaxable()) {
362-
F->setLinkerRelaxable();
357+
if (!Fixup.isLinkerRelaxable())
358+
continue;
359+
F->setLinkerRelaxable();
360+
// Do not add data after a linker-relaxable instruction. The difference
361+
// between a new label and a label at or before the linker-relaxable
362+
// instruction cannot be resolved at assemble-time.
363+
if (!MarkedLinkerRelaxable) {
364+
MarkedLinkerRelaxable = true;
363365
getCurrentSectionOnly()->setLinkerRelaxable();
366+
newFragment();
364367
}
365368
}
366-
367-
F->setHasInstructions(STI);
368369
}
369370

370371
void MCObjectStreamer::emitInstToFragment(const MCInst &Inst,
@@ -560,8 +561,10 @@ void MCObjectStreamer::emitCodeAlignment(Align Alignment,
560561
// if the alignment is larger than the minimum NOP size.
561562
unsigned Size;
562563
if (getAssembler().getBackend().shouldInsertExtraNopBytesForCodeAlign(*F,
563-
Size))
564+
Size)) {
564565
getCurrentSectionOnly()->setLinkerRelaxable();
566+
newFragment();
567+
}
565568
}
566569

567570
void MCObjectStreamer::emitValueToOffset(const MCExpr *Offset,

llvm/lib/MC/MCParser/MCTargetAsmParser.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ MCSubtargetInfo &MCTargetAsmParser::copySTI() {
2525
STI = &STICopy;
2626
// The returned STI will likely be modified. Create a new fragment to avoid
2727
// mixed STI values within a fragment.
28-
getStreamer().newFragment();
28+
if (getStreamer().getCurrentFragment())
29+
getStreamer().newFragment();
2930
return STICopy;
3031
}
3132

llvm/test/MC/RISCV/Relocations/mc-dump.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
# CHECK-NEXT:0 Data LinkerRelaxable Size:8 [97,00,00,00,e7,80,00,00]
1010
# CHECK-NEXT: Fixup @0 Value:specifier(19,ext) Kind:4023
1111
# CHECK-NEXT: Symbol @0 $x
12+
# CHECK-NEXT:8 Data Size:0 []
1213
# CHECK-NEXT:8 Align Align:8 Fill:0 FillLen:1 MaxBytesToEmit:8 Nops
1314
# CHECK-NEXT:12 Data Size:4 [13,05,30,00]
1415
# CHECK-NEXT:16 Align Align:8 Fill:0 FillLen:1 MaxBytesToEmit:8 Nops

0 commit comments

Comments
 (0)