/// assembly source files.
unsigned GenDwarfFileNumber;
- /// Symbols created for the start and end of each section, used for
- /// generating the .debug_ranges and .debug_aranges sections.
- MapVector<const MCSection *, std::pair<MCSymbol *, MCSymbol *>>
- SectionStartEndSyms;
+ /// Sections for generating the .debug_ranges and .debug_aranges sections.
+ SetVector<const MCSection *> SectionsForRanges;
/// The information gathered from labels that will have dwarf label
/// entries when generating dwarf assembly source files.
void setGenDwarfFileNumber(unsigned FileNumber) {
GenDwarfFileNumber = FileNumber;
}
- const MapVector<const MCSection *, std::pair<MCSymbol *, MCSymbol *>> &
- getGenDwarfSectionSyms() {
- return SectionStartEndSyms;
+ const SetVector<const MCSection *> &getGenDwarfSectionSyms() {
+ return SectionsForRanges;
}
- std::pair<MapVector<const MCSection *,
- std::pair<MCSymbol *, MCSymbol *>>::iterator,
- bool>
- addGenDwarfSection(const MCSection *Sec) {
- return SectionStartEndSyms.insert(
- std::make_pair(Sec, std::make_pair(nullptr, nullptr)));
+ bool addGenDwarfSection(const MCSection *Sec) {
+ return SectionsForRanges.insert(Sec);
}
+
void finalizeDwarfSections(MCStreamer &MCOS);
const std::vector<MCGenDwarfLabelEntry> &getMCGenDwarfLabelEntries() const {
return MCGenDwarfLabelEntries;
MCSection(const MCSection &) = delete;
void operator=(const MCSection &) = delete;
- MCSymbol *Begin;
+ mutable MCSymbol *Begin;
mutable MCSymbol *End;
protected:
SectionVariant getVariant() const { return Variant; }
MCSymbol *getBeginSymbol() const { return Begin; }
+ void setBeginSymbol(MCSymbol *Sym) const {
+ assert(!Begin);
+ Begin = Sym;
+ }
MCSymbol *getEndSymbol(MCContext &Ctx) const;
bool hasEnded() const;
CompilationDir.clear();
MainFileName.clear();
MCDwarfLineTablesCUMap.clear();
- SectionStartEndSyms.clear();
+ SectionsForRanges.clear();
MCGenDwarfLabelEntries.clear();
DwarfDebugFlags = StringRef();
DwarfCompileUnitID = 0;
return !MCDwarfFiles[FileNumber].Name.empty();
}
-/// finalizeDwarfSections - Emit end symbols for each non-empty code section.
-/// Also remove empty sections from SectionStartEndSyms, to avoid generating
+/// Remove empty sections from SectionStartEndSyms, to avoid generating
/// useless debug info for them.
void MCContext::finalizeDwarfSections(MCStreamer &MCOS) {
- MCContext &context = MCOS.getContext();
-
- auto sec = SectionStartEndSyms.begin();
- while (sec != SectionStartEndSyms.end()) {
- assert(sec->second.first && "Start symbol must be set by now");
- MCOS.SwitchSection(sec->first);
- if (MCOS.mayHaveInstructions()) {
- MCSymbol *SectionEndSym = context.createTempSymbol();
- MCOS.EmitLabel(SectionEndSym);
- sec->second.second = SectionEndSym;
- ++sec;
- } else {
- MapVector<const MCSection *, std::pair<MCSymbol *, MCSymbol *>>::iterator
- to_erase = sec;
- sec = SectionStartEndSyms.erase(to_erase);
- }
+ std::vector<const MCSection *> Keep;
+ for (const MCSection *Sec : SectionsForRanges) {
+ MCOS.SwitchSection(Sec); // FIXME: pass the section to mayHaveInstructions
+ if (MCOS.mayHaveInstructions())
+ Keep.push_back(Sec);
}
+ SectionsForRanges.clear();
+ SectionsForRanges.insert(Keep.begin(), Keep.end());
}
void MCContext::reportFatalError(SMLoc Loc, const Twine &Msg) const {
// Now emit the table of pairs of PointerSize'ed values for the section
// addresses and sizes.
- for (const auto &sec : Sections) {
- MCSymbol *StartSymbol = sec.second.first;
- MCSymbol *EndSymbol = sec.second.second;
+ for (const MCSection *Sec : Sections) {
+ MCSymbol *StartSymbol = Sec->getBeginSymbol();
+ MCSymbol *EndSymbol = Sec->getEndSymbol(context);
assert(StartSymbol && "StartSymbol must not be NULL");
assert(EndSymbol && "EndSymbol must not be NULL");
const auto TextSection = Sections.begin();
assert(TextSection != Sections.end() && "No text section found");
- MCSymbol *StartSymbol = TextSection->second.first;
- MCSymbol *EndSymbol = TextSection->second.second;
+ MCSymbol *StartSymbol = (*TextSection)->getBeginSymbol();
+ MCSymbol *EndSymbol = (*TextSection)->getEndSymbol(context);
assert(StartSymbol && "StartSymbol must not be NULL");
assert(EndSymbol && "EndSymbol must not be NULL");
MCOS->SwitchSection(context.getObjectFileInfo()->getDwarfRangesSection());
- for (const auto &sec : Sections) {
-
- MCSymbol *StartSymbol = sec.second.first;
- MCSymbol *EndSymbol = sec.second.second;
+ for (const MCSection *Sec : Sections) {
+ MCSymbol *StartSymbol = Sec->getBeginSymbol();
+ MCSymbol *EndSymbol = Sec->getEndSymbol(context);
assert(StartSymbol && "StartSymbol must not be NULL");
assert(EndSymbol && "EndSymbol must not be NULL");
if (getContext().getGenDwarfForAssembly()) {
MCSymbol *SectionStartSym = getContext().createTempSymbol();
getStreamer().EmitLabel(SectionStartSym);
- auto InsertResult = getContext().addGenDwarfSection(
- getStreamer().getCurrentSection().first);
- assert(InsertResult.second && ".text section should not have debug info yet");
- InsertResult.first->second.first = SectionStartSym;
+ const MCSection *Sec = getStreamer().getCurrentSection().first;
+ bool InsertResult = getContext().addGenDwarfSection(Sec);
+ assert(InsertResult && ".text section should not have debug info yet");
+ Sec->setBeginSymbol(SectionStartSym);
getContext().setGenDwarfFileNumber(getStreamer().EmitDwarfFileDirective(
0, StringRef(), getContext().getMainFileName()));
}
getStreamer().SwitchSection(ELFSection, Subsection);
if (getContext().getGenDwarfForAssembly()) {
- auto InsertResult = getContext().addGenDwarfSection(ELFSection);
- if (InsertResult.second) {
+ bool InsertResult = getContext().addGenDwarfSection(ELFSection);
+ if (InsertResult) {
if (getContext().getDwarfVersion() <= 2)
Warning(loc, "DWARF2 only supports one section per compilation unit");
MCSymbol *SectionStartSymbol = getContext().createTempSymbol();
getStreamer().EmitLabel(SectionStartSymbol);
- InsertResult.first->second.first = SectionStartSymbol;
+ ELFSection->setBeginSymbol(SectionStartSymbol);
}
}