summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-03-23 21:22:04 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-03-23 21:22:04 +0000
commitf2b408c64e3d1503a3e7c63b3b48fb9c42e7aff6 (patch)
tree45e4c02585d401dc3d72cfa3d5954af80293ced0 /llvm/lib
parent328c0c11a8033fa6b8d716e6a08be3e07a20a1af (diff)
downloadbcm5719-llvm-f2b408c64e3d1503a3e7c63b3b48fb9c42e7aff6.tar.gz
bcm5719-llvm-f2b408c64e3d1503a3e7c63b3b48fb9c42e7aff6.zip
Refactor how passes get a symbol at the end of a section.
There is now a canonical symbol at the end of a section that different passes can request. This also allows us to assert that we don't switch back to a section whose end symbol has already been printed. llvm-svn: 233026
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp11
-rw-r--r--llvm/lib/MC/MCDwarf.cpp21
-rw-r--r--llvm/lib/MC/MCSection.cpp9
-rw-r--r--llvm/lib/MC/MCStreamer.cpp13
4 files changed, 30 insertions, 24 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index bc9a67640fb..e9ebd97dab0 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -1664,15 +1664,8 @@ void DwarfDebug::emitDebugARanges() {
const MCSection *Section = I.first;
MCSymbol *Sym = nullptr;
- if (Section) {
- // We can't call MCSection::getLabelEndName, as it's only safe to do so
- // if we know the section name up-front. For user-created sections, the
- // resulting label may not be valid to use as a label. (section names can
- // use a greater set of characters on some systems)
- Sym = Asm->createTempSymbol("debug_end");
- Asm->OutStreamer.SwitchSection(Section);
- Asm->OutStreamer.EmitLabel(Sym);
- }
+ if (Section)
+ Sym = Asm->OutStreamer.endSection(Section);
// Insert a final terminator.
SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index 91b277cee5c..24cdaeff494 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -179,23 +179,14 @@ EmitDwarfLineTable(MCObjectStreamer *MCOS, const MCSection *Section,
}
// Emit a DW_LNE_end_sequence for the end of the section.
- // Using the pointer Section create a temporary label at the end of the
- // section and use that and the LastLabel to compute the address delta
- // and use INT64_MAX as the line delta which is the signal that this is
- // actually a DW_LNE_end_sequence.
-
- // Switch to the section to be able to create a symbol at its end.
- // TODO: keep track of the last subsection so that this symbol appears in the
- // correct place.
- MCOS->SwitchSection(Section);
+ // Use the section end label to compute the address delta and use INT64_MAX
+ // as the line delta which is the signal that this is actually a
+ // DW_LNE_end_sequence.
+ MCSymbol *SectionEnd = MCOS->endSection(Section);
+ // Switch back the dwarf line section, in case endSection had to switch the
+ // section.
MCContext &Ctx = MCOS->getContext();
- // Create a symbol at the end of the section.
- MCSymbol *SectionEnd = Ctx.CreateTempSymbol();
- // Set the value of the symbol, as we are at the end of the section.
- MCOS->EmitLabel(SectionEnd);
-
- // Switch back the dwarf line section.
MCOS->SwitchSection(Ctx.getObjectFileInfo()->getDwarfLineSection());
const MCAsmInfo *AsmInfo = Ctx.getAsmInfo();
diff --git a/llvm/lib/MC/MCSection.cpp b/llvm/lib/MC/MCSection.cpp
index ccf4a7dddf7..7889f837b11 100644
--- a/llvm/lib/MC/MCSection.cpp
+++ b/llvm/lib/MC/MCSection.cpp
@@ -10,6 +10,7 @@
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -17,6 +18,14 @@ using namespace llvm;
// MCSection
//===----------------------------------------------------------------------===//
+MCSymbol *MCSection::getEndSymbol(MCContext &Ctx) const {
+ if (!End)
+ End = Ctx.createTempSymbol("sec_end", true);
+ return End;
+}
+
+bool MCSection::hasEnded() const { return End && End->isInSection(); }
+
MCSection::~MCSection() {
}
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index 63b0bf2c80f..27d0355bb11 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/lib/MC/MCStreamer.cpp
@@ -670,9 +670,22 @@ void MCStreamer::SwitchSection(const MCSection *Section,
SectionStack.back().second = curSection;
if (MCSectionSubPair(Section, Subsection) != curSection) {
SectionStack.back().first = MCSectionSubPair(Section, Subsection);
+ assert(!Section->hasEnded() && "Section already ended");
ChangeSection(Section, Subsection);
MCSymbol *Sym = Section->getBeginSymbol();
if (Sym && !Sym->isInSection())
EmitLabel(Sym);
}
}
+
+MCSymbol *MCStreamer::endSection(const MCSection *Section) {
+ // TODO: keep track of the last subsection so that this symbol appears in the
+ // correct place.
+ MCSymbol *Sym = Section->getEndSymbol(Context);
+ if (Sym->isInSection())
+ return Sym;
+
+ SwitchSection(Section);
+ EmitLabel(Sym);
+ return Sym;
+}
OpenPOWER on IntegriCloud