summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/lib/MC/MCELFStreamer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/lib/MC/MCELFStreamer.cpp')
-rw-r--r--contrib/llvm/lib/MC/MCELFStreamer.cpp60
1 files changed, 15 insertions, 45 deletions
diff --git a/contrib/llvm/lib/MC/MCELFStreamer.cpp b/contrib/llvm/lib/MC/MCELFStreamer.cpp
index fe9ac21..06d161b 100644
--- a/contrib/llvm/lib/MC/MCELFStreamer.cpp
+++ b/contrib/llvm/lib/MC/MCELFStreamer.cpp
@@ -68,7 +68,6 @@ void MCELFStreamer::mergeFragment(MCDataFragment *DF,
EF->setBundlePadding(static_cast<uint8_t>(RequiredBundlePadding));
Assembler.writeFragmentPadding(*EF, FSize, OW);
- VecOS.flush();
delete OW;
DF->getContents().append(Code.begin(), Code.end());
@@ -87,20 +86,10 @@ void MCELFStreamer::mergeFragment(MCDataFragment *DF,
}
void MCELFStreamer::InitSections(bool NoExecStack) {
- // This emulates the same behavior of GNU as. This makes it easier
- // to compare the output as the major sections are in the same order.
MCContext &Ctx = getContext();
SwitchSection(Ctx.getObjectFileInfo()->getTextSection());
EmitCodeAlignment(4);
- SwitchSection(Ctx.getObjectFileInfo()->getDataSection());
- EmitCodeAlignment(4);
-
- SwitchSection(Ctx.getObjectFileInfo()->getBSSSection());
- EmitCodeAlignment(4);
-
- SwitchSection(Ctx.getObjectFileInfo()->getTextSection());
-
if (NoExecStack)
SwitchSection(Ctx.getAsmInfo()->getNonexecutableStackSection(Ctx));
}
@@ -112,7 +101,7 @@ void MCELFStreamer::EmitLabel(MCSymbol *S) {
MCObjectStreamer::EmitLabel(Symbol);
const MCSectionELF &Section =
- static_cast<const MCSectionELF&>(Symbol->getSection());
+ static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
if (Section.getFlags() & ELF::SHF_TLS)
Symbol->setType(ELF::STT_TLS);
}
@@ -134,7 +123,7 @@ void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
llvm_unreachable("invalid assembler flag!");
}
-// If bundle aligment is used and there are any instructions in the section, it
+// If bundle alignment is used and there are any instructions in the section, it
// needs to be aligned to at least the bundle size.
static void setSectionAlignmentForBundling(const MCAssembler &Assembler,
MCSection *Section) {
@@ -312,13 +301,20 @@ void MCELFStreamer::EmitCommonSymbol(MCSymbol *S, uint64_t Size,
Symbol->setType(ELF::STT_OBJECT);
if (Symbol->getBinding() == ELF::STB_LOCAL) {
- MCSection *Section = getAssembler().getContext().getELFSection(
+ MCSection &Section = *getAssembler().getContext().getELFSection(
".bss", ELF::SHT_NOBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
+ MCSectionSubPair P = getCurrentSection();
+ SwitchSection(&Section);
- AssignSection(Symbol, Section);
+ EmitValueToAlignment(ByteAlignment, 0, 1, 0);
+ EmitLabel(Symbol);
+ EmitZeros(Size);
- struct LocalCommon L = {Symbol, Size, ByteAlignment};
- LocalCommons.push_back(L);
+ // Update the maximum alignment of the section if necessary.
+ if (ByteAlignment > Section.getAlignment())
+ Section.setAlignment(ByteAlignment);
+
+ SwitchSection(P.first, P.second);
} else {
if(Symbol->declareCommon(Size, ByteAlignment))
report_fatal_error("Symbol: " + Symbol->getName() +
@@ -344,7 +340,7 @@ void MCELFStreamer::EmitLocalCommonSymbol(MCSymbol *S, uint64_t Size,
}
void MCELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
- const SMLoc &Loc) {
+ SMLoc Loc) {
if (isBundleLocked())
report_fatal_error("Emitting values inside a locked bundle is forbidden");
fixSymbolsInTLSFixups(Value);
@@ -480,7 +476,6 @@ void MCELFStreamer::EmitInstToData(const MCInst &Inst,
SmallString<256> Code;
raw_svector_ostream VecOS(Code);
Assembler.getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI);
- VecOS.flush();
for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
fixSymbolsInTLSFixups(Fixups[i].getValue());
@@ -603,7 +598,7 @@ void MCELFStreamer::EmitBundleUnlock() {
report_fatal_error("Empty bundle-locked group is forbidden");
// When the -mc-relax-all flag is used, we emit instructions to fragments
- // stored on a stack. When the bundle unlock is emited, we pop a fragment
+ // stored on a stack. When the bundle unlock is emitted, we pop a fragment
// from the stack a merge it to the one below.
if (getAssembler().getRelaxAll()) {
assert(!BundleGroups.empty() && "There are no bundle groups");
@@ -625,29 +620,6 @@ void MCELFStreamer::EmitBundleUnlock() {
Sec.setBundleLockState(MCSection::NotBundleLocked);
}
-void MCELFStreamer::Flush() {
- for (std::vector<LocalCommon>::const_iterator i = LocalCommons.begin(),
- e = LocalCommons.end();
- i != e; ++i) {
- const MCSymbol &Symbol = *i->Symbol;
- uint64_t Size = i->Size;
- unsigned ByteAlignment = i->ByteAlignment;
- MCSection &Section = Symbol.getSection();
-
- getAssembler().registerSection(Section);
- new MCAlignFragment(ByteAlignment, 0, 1, ByteAlignment, &Section);
-
- MCFragment *F = new MCFillFragment(0, 0, Size, &Section);
- Symbol.setFragment(F);
-
- // Update the maximum alignment of the section if necessary.
- if (ByteAlignment > Section.getAlignment())
- Section.setAlignment(ByteAlignment);
- }
-
- LocalCommons.clear();
-}
-
void MCELFStreamer::FinishImpl() {
// Ensure the last section gets aligned if necessary.
MCSection *CurSection = getCurrentSectionOnly();
@@ -655,8 +627,6 @@ void MCELFStreamer::FinishImpl() {
EmitFrames(nullptr);
- Flush();
-
this->MCObjectStreamer::FinishImpl();
}
OpenPOWER on IntegriCloud