diff options
-rw-r--r-- | include/llvm/CodeGen/AsmPrinter.h | 6 | ||||
-rw-r--r-- | include/llvm/MC/MCStreamer.h | 10 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 25 | ||||
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 4 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 2 |
5 files changed, 22 insertions, 25 deletions
diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index efbcef1b81..33d8a02862 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -62,10 +62,6 @@ namespace llvm { typedef gcp_map_type::iterator gcp_iterator; gcp_map_type GCMetadataPrinters; - /// CurrentSection - The current section we are emitting to. This is - /// controlled and used by the SwitchToSection method. - const MCSection *CurrentSection; - /// If ExuberantAsm is set, a pointer to the loop info for this /// function. /// @@ -127,7 +123,7 @@ namespace llvm { std::string CurrentFnName; /// getCurrentSection() - Return the current section we are emitting to. - const MCSection *getCurrentSection() const { return CurrentSection; } + const MCSection *getCurrentSection() const; /// VerboseAsm - Emit comments in assembly output if this is true. diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 48096c708a..4d55990f8a 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -69,6 +69,9 @@ namespace llvm { protected: MCStreamer(MCContext &Ctx); + /// CurSection - This is the current section code is being emitted to, it is + /// kept up to date by SwitchSection. + const MCSection *CurSection; public: virtual ~MCStreamer(); @@ -78,11 +81,16 @@ namespace llvm { /// @{ /// SwitchSection - Set the current section where code is being emitted to - /// @param Section. + /// @param Section. This is required to update CurSection. /// /// This corresponds to assembler directives like .section, .text, etc. virtual void SwitchSection(const MCSection *Section) = 0; + + /// getCurrentSection - Return the current seciton that the streamer is + /// emitting code to. + const MCSection *getCurrentSection() const { return CurSection; } + /// EmitLabel - Emit a label for @param Symbol into the current section. /// /// This corresponds to an assembler statement such as: diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index d8594db950..e6ee960dc4 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -63,7 +63,6 @@ AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, LastMI(0), LastFn(0), Counter(~0U), PrevDLT(0, ~0U, ~0U) { - CurrentSection = 0; DW = 0; MMI = 0; switch (AsmVerbose) { case cl::BOU_UNSET: VerboseAsm = VDef; break; @@ -91,19 +90,18 @@ TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const { } /// SwitchToSection - Switch to the specified section of the executable if we -/// are not already in it! If "NS" is null, then this causes us to exit the -/// current section and not reenter another one. This is generally used for -/// asmprinter hacks. -/// -/// FIXME: Remove support for null sections. -/// +/// are not already in it! void AsmPrinter::SwitchToSection(const MCSection *NS) { - CurrentSection = NS; - // FIXME: Remove support for null sections! - if (NS) - OutStreamer.SwitchSection(NS); + assert(NS != 0 && "Must specify a section to switch to"); + OutStreamer.SwitchSection(NS); +} + +/// getCurrentSection() - Return the current section we are emitting to. +const MCSection *AsmPrinter::getCurrentSection() const { + return OutStreamer.getCurrentSection(); } + void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); @@ -143,8 +141,6 @@ bool AsmPrinter::doInitialization(Module &M) { << '\n' << TAI->getCommentString() << " End of file scope inline assembly\n"; - SwitchToSection(0); // Reset back to no section to close off sections. - if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling()) { MMI = getAnalysisIfAvailable<MachineModuleInfo>(); @@ -174,7 +170,6 @@ bool AsmPrinter::doFinalization(Module &M) { // to stuff that is actually used. Note that doing so would require targets // to notice uses in operands (due to constant exprs etc). This should // happen with the MC stuff eventually. - SwitchToSection(0); // Print out module-level global variables here. for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); @@ -776,7 +771,7 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits; O << TAI->getAlignDirective() << NumBits; - if (CurrentSection && CurrentSection->getKind().isText()) + if (getCurrentSection()->getKind().isText()) if (unsigned FillValue = TAI->getTextAlignFillValue()) { O << ','; PrintHex(FillValue); diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 60d66f93af..cb3642532c 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -24,12 +24,10 @@ class MCAsmStreamer : public MCStreamer { raw_ostream &OS; const TargetAsmInfo &TAI; AsmPrinter *Printer; - const MCSection *CurSection; public: MCAsmStreamer(MCContext &Context, raw_ostream &_OS, const TargetAsmInfo &tai, AsmPrinter *_AsmPrinter) - : MCStreamer(Context), OS(_OS), TAI(tai), Printer(_AsmPrinter), - CurSection(0) {} + : MCStreamer(Context), OS(_OS), TAI(tai), Printer(_AsmPrinter) {} ~MCAsmStreamer() {} /// @name MCStreamer Interface diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index a634f33ad3..8a6dcdae7a 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -11,7 +11,7 @@ using namespace llvm; -MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context) { +MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context), CurSection(0) { } MCStreamer::~MCStreamer() { |