mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Remove yet another method of creating begin and end symbol for sections.
I missed this one when first unifying how we handle begin and end symbols. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237912 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dc089e4dc3
commit
43356a1a45
@ -136,10 +136,8 @@ namespace llvm {
|
||||
/// 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.
|
||||
@ -469,17 +467,13 @@ namespace llvm {
|
||||
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;
|
||||
|
@ -35,7 +35,7 @@ private:
|
||||
MCSection(const MCSection &) = delete;
|
||||
void operator=(const MCSection &) = delete;
|
||||
|
||||
MCSymbol *Begin;
|
||||
mutable MCSymbol *Begin;
|
||||
mutable MCSymbol *End;
|
||||
|
||||
protected:
|
||||
@ -52,6 +52,10 @@ public:
|
||||
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;
|
||||
|
||||
|
@ -77,7 +77,7 @@ void MCContext::reset() {
|
||||
CompilationDir.clear();
|
||||
MainFileName.clear();
|
||||
MCDwarfLineTablesCUMap.clear();
|
||||
SectionStartEndSyms.clear();
|
||||
SectionsForRanges.clear();
|
||||
MCGenDwarfLabelEntries.clear();
|
||||
DwarfDebugFlags = StringRef();
|
||||
DwarfCompileUnitID = 0;
|
||||
@ -437,27 +437,17 @@ bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) {
|
||||
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 {
|
||||
|
@ -610,9 +610,9 @@ static void EmitGenDwarfAranges(MCStreamer *MCOS,
|
||||
|
||||
// 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");
|
||||
|
||||
@ -699,8 +699,8 @@ static void EmitGenDwarfInfo(MCStreamer *MCOS,
|
||||
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");
|
||||
|
||||
@ -805,10 +805,9 @@ static void EmitGenDwarfRanges(MCStreamer *MCOS) {
|
||||
|
||||
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");
|
||||
|
||||
|
@ -632,10 +632,10 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) {
|
||||
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()));
|
||||
}
|
||||
|
@ -532,14 +532,14 @@ EndStmt:
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user