Make AsmStreamer maintain a notion of the current section, pushing it up from the
authorChris Lattner <sabre@nondot.org>
Tue, 18 Aug 2009 06:15:16 +0000 (06:15 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 18 Aug 2009 06:15:16 +0000 (06:15 +0000)
MCAsmStreamer.  Based on this, eliminate the current section from AsmPrinter.

While I'm at it, clean up the last of the horrible "switch to null section" stuff
and add an assert.  This change is in preparation for completely eliminating
asmprinter::switchtosection.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79324 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
include/llvm/MC/MCStreamer.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/MC/MCAsmStreamer.cpp
lib/MC/MCStreamer.cpp

index efbcef1b8149e47810b106a2d52707b8a862c680..33d8a028626fa5cd0557ac19887b9af17a1b3a05 100644 (file)
@@ -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.
index 48096c708ace1eba152dc12cd0cdf2b932c9fc45..4d55990f8aa93a1e1ce3b09b8310946ed88e7b70 100644 (file)
@@ -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:
index d8594db9508e2036c0dadd67735e952f0c9aeb4e..e6ee960dc48c12a6715aeeaea13214592aed76a7 100644 (file)
@@ -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);
index 60d66f93af96a3e2063b1b0eee50aa6be9df9195..cb3642532c1c319e2a29220bda99fc1b565d730b 100644 (file)
@@ -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
index a634f33ad34aa87a281588c26757410b0659e910..8a6dcdae7a4072219f8471d07b720059a09373bd 100644 (file)
@@ -11,7 +11,7 @@
 
 using namespace llvm;
 
-MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context) {
+MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context), CurSection(0) {
 }
 
 MCStreamer::~MCStreamer() {