From 975780bb595b57a45a8e6d72d8151b436314ce22 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 17 Aug 2009 05:49:08 +0000 Subject: [PATCH] change AsmPrinter to switch sections using AsmStreamer instead of doing it directly. This requires const'izing a bunch of stuff that took sections, but this seems like the right semantic thing to do: emitting a label to a section shouldn't mutate the MCSection object itself, for example. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79227 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCStreamer.h | 2 +- include/llvm/MC/MCSymbol.h | 6 +++--- include/llvm/MC/MCValue.h | 2 +- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 13 ++++--------- lib/MC/MCAsmStreamer.cpp | 10 ++++------ lib/MC/MCNullStreamer.cpp | 2 +- 6 files changed, 14 insertions(+), 21 deletions(-) diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index b8399d0115a..48096c708ac 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -81,7 +81,7 @@ namespace llvm { /// @param Section. /// /// This corresponds to assembler directives like .section, .text, etc. - virtual void SwitchSection(MCSection *Section) = 0; + virtual void SwitchSection(const MCSection *Section) = 0; /// EmitLabel - Emit a label for @param Symbol into the current section. /// diff --git a/include/llvm/MC/MCSymbol.h b/include/llvm/MC/MCSymbol.h index e857ebab70b..a5176bc24ff 100644 --- a/include/llvm/MC/MCSymbol.h +++ b/include/llvm/MC/MCSymbol.h @@ -34,7 +34,7 @@ namespace llvm { std::string Name; /// Section - The section the symbol is defined in, or null if the symbol /// has not been defined in the associated translation unit. - MCSection *Section; + const MCSection *Section; /// IsTemporary - True if this is an assembler temporary label, which /// typically does not survive in the .o file's symbol table. Usually @@ -55,8 +55,8 @@ namespace llvm { void operator=(const MCSymbol&); // DO NOT IMPLEMENT public: - MCSection *getSection() const { return Section; } - void setSection(MCSection *Value) { Section = Value; } + const MCSection *getSection() const { return Section; } + void setSection(const MCSection *S) { Section = S; } bool isExternal() const { return IsExternal; } void setExternal(bool Value) { IsExternal = Value; } diff --git a/include/llvm/MC/MCValue.h b/include/llvm/MC/MCValue.h index ee5ba84dd0f..ec323fe1b3f 100644 --- a/include/llvm/MC/MCValue.h +++ b/include/llvm/MC/MCValue.h @@ -49,7 +49,7 @@ public: /// /// @result - The value's associated section, or null for external or constant /// values. - MCSection *getAssociatedSection() const { + const MCSection *getAssociatedSection() const { return SymA ? SymA->getSection() : 0; } diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index d46043b29cd..7f23abe4ee1 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -98,23 +98,18 @@ TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const { /// FIXME: Remove support for null sections. /// void AsmPrinter::SwitchToSection(const MCSection *NS) { - // If we're already in this section, we're done. - if (CurrentSection == NS) return; - CurrentSection = NS; - - if (NS == 0) return; - - NS->PrintSwitchToSection(*TAI, O); + // FIXME: Remove support for null sections! + if (NS) + OutStreamer.SwitchSection(NS); } void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); AU.addRequired(); - if (ExuberantAsm) { + if (ExuberantAsm) AU.addRequired(); - } } bool AsmPrinter::doInitialization(Module &M) { diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index db39fb8b1cb..60d66f93af9 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -24,7 +24,7 @@ class MCAsmStreamer : public MCStreamer { raw_ostream &OS; const TargetAsmInfo &TAI; AsmPrinter *Printer; - MCSection *CurSection; + const MCSection *CurSection; public: MCAsmStreamer(MCContext &Context, raw_ostream &_OS, const TargetAsmInfo &tai, AsmPrinter *_AsmPrinter) @@ -35,7 +35,7 @@ public: /// @name MCStreamer Interface /// @{ - virtual void SwitchSection(MCSection *Section); + virtual void SwitchSection(const MCSection *Section); virtual void EmitLabel(MCSymbol *Symbol); @@ -98,12 +98,10 @@ static inline MCValue truncateToSize(const MCValue &Value, unsigned Bytes) { truncateToSize(Value.getConstant(), Bytes)); } -void MCAsmStreamer::SwitchSection(MCSection *Section) { +void MCAsmStreamer::SwitchSection(const MCSection *Section) { if (Section != CurSection) { CurSection = Section; - - // FIXME: Needs TargetAsmInfo! - Section->PrintSwitchToSection(*(const TargetAsmInfo*)0, OS); + Section->PrintSwitchToSection(TAI, OS); } } diff --git a/lib/MC/MCNullStreamer.cpp b/lib/MC/MCNullStreamer.cpp index 3ac79cbf0a2..fcdd087e67a 100644 --- a/lib/MC/MCNullStreamer.cpp +++ b/lib/MC/MCNullStreamer.cpp @@ -26,7 +26,7 @@ namespace { /// @name MCStreamer Interface /// @{ - virtual void SwitchSection(MCSection *Section) {} + virtual void SwitchSection(const MCSection *Section) {} virtual void EmitLabel(MCSymbol *Symbol) {}