switch off of 'Section' onto MCSection. We're not properly using
[oota-llvm.git] / lib / CodeGen / AsmPrinter / AsmPrinter.cpp
index e12a0f2f0e7b6d7d6fded7ee04ec376dcc812bbc..178bbaa907cd6a01c0024b99bc1359ca83ade506 100644 (file)
 #include "llvm/CodeGen/MachineModuleInfo.h"
 #include "llvm/CodeGen/DwarfWriter.h"
 #include "llvm/Analysis/DebugInfo.h"
+#include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCStreamer.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FormattedStream.h"
@@ -30,6 +33,7 @@
 #include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetLowering.h"
+#include "llvm/Target/TargetLoweringObjectFile.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Target/TargetRegisterInfo.h"
 #include "llvm/ADT/SmallPtrSet.h"
@@ -47,6 +51,10 @@ AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm,
                        const TargetAsmInfo *T, bool VDef)
   : MachineFunctionPass(&ID), FunctionNumber(0), O(o),
     TM(tm), TAI(T), TRI(tm.getRegisterInfo()),
+
+    OutContext(*new MCContext()),
+    OutStreamer(*createAsmStreamer(OutContext, O)),
+
     IsInTextSection(false), LastMI(0), LastFn(0), Counter(~0U),
     PrevDLT(0, ~0U, ~0U) {
   DW = 0; MMI = 0;
@@ -61,8 +69,16 @@ AsmPrinter::~AsmPrinter() {
   for (gcp_iterator I = GCMetadataPrinters.begin(),
                     E = GCMetadataPrinters.end(); I != E; ++I)
     delete I->second;
+  
+  delete &OutStreamer;
+  delete &OutContext;
+}
+
+const TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const {
+  return TM.getTargetLowering()->getObjFileLowering();
 }
 
+
 /// SwitchToTextSection - Switch to the specified text section of the executable
 /// if we are not already in it!
 ///
@@ -117,8 +133,8 @@ void AsmPrinter::SwitchToDataSection(const char *NewSection,
 
 /// SwitchToSection - Switch to the specified section of the executable if we
 /// are not already in it!
-void AsmPrinter::SwitchToSection(const Section* NS) {
-  const std::stringNewSection = NS->getName();
+void AsmPrinter::SwitchToSection(const MCSection *NS) {
+  const std::string &NewSection = NS->getName();
 
   // If we're already in this section, we're done.
   if (CurrentSection == NewSection) return;
@@ -135,16 +151,21 @@ void AsmPrinter::SwitchToSection(const Section* NS) {
     // If section is named we need to switch into it via special '.section'
     // directive and also append funky flags. Otherwise - section name is just
     // some magic assembler directive.
-    if (NS->hasFlag(SectionFlags::Named))
+    if (NS->getKind().hasExplicitSection()) {
+      SmallString<32> FlagsStr;
+      
+      getObjFileLowering().getSectionFlagsAsString(NS->getKind(), FlagsStr);
+
       O << TAI->getSwitchToSectionDirective()
         << CurrentSection
-        << TAI->getSectionFlags(NS->getFlags());
-    else
+        << FlagsStr.c_str();
+    } else {
       O << CurrentSection;
+    }
     O << TAI->getDataSectionStartSuffix() << '\n';
   }
 
-  IsInTextSection = (NS->getFlags() & SectionFlags::Code);
+  IsInTextSection = NS->getKind().isText();
 }
 
 void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
@@ -153,6 +174,10 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
 }
 
 bool AsmPrinter::doInitialization(Module &M) {
+  // Initialize TargetLoweringObjectFile.
+  const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
+    .Initialize(OutContext, TM);
+  
   Mang = new Mangler(M, TAI->getGlobalPrefix(), TAI->getPrivateGlobalPrefix(),
                      TAI->getLinkerPrivateGlobalPrefix());
   
@@ -227,9 +252,6 @@ bool AsmPrinter::doFinalization(Module &M) {
   }
 
   if (TAI->getSetDirective()) {
-    if (!M.alias_empty())
-      SwitchToSection(TAI->getTextSection());
-
     O << '\n';
     for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
          I != E; ++I) {
@@ -266,6 +288,8 @@ bool AsmPrinter::doFinalization(Module &M) {
 
   delete Mang; Mang = 0;
   DW = 0; MMI = 0;
+  
+  OutStreamer.Finish();
   return false;
 }
 
@@ -285,10 +309,10 @@ void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
 namespace {
   // SectionCPs - Keep track the alignment, constpool entries per Section.
   struct SectionCPs {
-    const Section *S;
+    const MCSection *S;
     unsigned Alignment;
     SmallVector<unsigned, 4> CPEs;
-    SectionCPs(const Section *s, unsigned a) : S(s), Alignment(a) {};
+    SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {};
   };
 }
 
@@ -311,18 +335,21 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
     SectionKind Kind;
     switch (CPE.getRelocationInfo()) {
     default: llvm_unreachable("Unknown section kind");
-    case 2: Kind = SectionKind::getReadOnlyWithRel(); break;
-    case 1: Kind = SectionKind::getReadOnlyWithRelLocal(); break;
+    case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel, false); break;
+    case 1:
+      Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal,false);
+      break;
     case 0:
-      switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) {
-      case 4:   Kind = SectionKind::getMergableConst4(); break;
-      case 8:   Kind = SectionKind::getMergableConst8(); break;
-      case 16:  Kind = SectionKind::getMergableConst16(); break;
-      default:  Kind = SectionKind::getMergableConst(); break;
-      }
+    switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) {
+    case 4:  Kind = SectionKind::get(SectionKind::MergeableConst4,false); break;
+    case 8:  Kind = SectionKind::get(SectionKind::MergeableConst8,false); break;
+    case 16: Kind = SectionKind::get(SectionKind::MergeableConst16,false);break;
+    default: Kind = SectionKind::get(SectionKind::MergeableConst,false); break;
+    }
     }
 
-    const Section *S = TAI->getSectionForMergableConstant(Kind);
+    const MCSection *S =
+      getObjFileLowering().getSectionForMergeableConstant(Kind);
     
     // The number of sections are small, just do a linear search from the
     // last section to the first.
@@ -391,14 +418,16 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
   // the appropriate section.
   TargetLowering *LoweringInfo = TM.getTargetLowering();
 
-  const charJumpTableDataSection = TAI->getJumpTableDataSection();
+  const char *JumpTableDataSection = TAI->getJumpTableDataSection();
   const Function *F = MF.getFunction();
-  const Section *FuncSection = TAI->SectionForGlobal(F);
   
+  const MCSection *FuncSection =
+    getObjFileLowering().SectionForGlobal(F, Mang, TM);
+
   bool JTInDiffSection = false;
   if ((IsPic && !(LoweringInfo && LoweringInfo->usesGlobalOffsetTable())) ||
       !JumpTableDataSection ||
-      FuncSection->hasFlag(SectionFlags::Linkonce)) {
+      FuncSection->getKind().isWeak()) {
     // In PIC mode, we need to emit the jump table to the same section as the
     // function body itself, otherwise the label differences won't make sense.
     // We should also do if the section name is NULL or function is declared in
@@ -1605,7 +1634,7 @@ void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB,
     O << ':';
   if (printComment && MBB->getBasicBlock())
     O << '\t' << TAI->getCommentString() << ' '
-      << MBB->getBasicBlock()->getNameStart();
+      << MBB->getBasicBlock()->getNameStr();
 }
 
 /// printPICJumpTableSetLabel - This method prints a set label for the