1. Clean up code due to changes in SwitchTo*Section(2)
2. Added partial debug support for mingw\cygwin targets (the same as
   Linux\ELF). Please note, that currently mingw\cygwin uses 'stabs' format
   for storing debug info by default, thus many (runtime) libraries has
   this information included. These formats shouldn't be mixed in one binary
   ('stabs' & 'DWARF'), otherwise binutils tools will be confused.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31311 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp
index bfd0e37..05761d1 100644
--- a/lib/CodeGen/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter.cpp
@@ -96,7 +96,7 @@
       << "\n" << TAI->getCommentString()
       << " End of file scope inline assembly\n";
 
-  SwitchToDataSection("", 0);   // Reset back to no section.
+  SwitchToDataSection("");   // Reset back to no section.
   
   if (MachineDebugInfo *DebugInfo = getAnalysisToUpdate<MachineDebugInfo>()) {
     DebugInfo->AnalyzeModule(M);
@@ -160,7 +160,7 @@
                std::vector<std::pair<MachineConstantPoolEntry,unsigned> > &CP) {
   if (CP.empty()) return;
 
-  SwitchToDataSection(Section, 0);
+  SwitchToDataSection(Section);
   EmitAlignment(Alignment);
   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
     O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
@@ -203,7 +203,7 @@
   if (TM.getRelocationModel() == Reloc::PIC_) {
     TargetLowering *LoweringInfo = TM.getTargetLowering();
     if (LoweringInfo && LoweringInfo->usesGlobalOffsetTable()) {
-      SwitchToDataSection(TAI->getJumpTableDataSection(), 0);
+      SwitchToDataSection(TAI->getJumpTableDataSection());
       if (TD->getPointerSize() == 8 && !JTEntryDirective)
         JTEntryDirective = TAI->getData64bitsDirective();
     } else {      
@@ -213,7 +213,7 @@
       SwitchToTextSection(getSectionForFunction(*F).c_str(), F);
     }
   } else {
-    SwitchToDataSection(TAI->getJumpTableDataSection(), 0);
+    SwitchToDataSection(TAI->getJumpTableDataSection());
     if (TD->getPointerSize() == 8)
       JTEntryDirective = TAI->getData64bitsDirective();
   }
@@ -279,14 +279,14 @@
   }
 
   if (GV->getName() == "llvm.global_ctors" && GV->use_empty()) {
-    SwitchToDataSection(TAI->getStaticCtorsSection(), 0);
+    SwitchToDataSection(TAI->getStaticCtorsSection());
     EmitAlignment(2, 0);
     EmitXXStructorList(GV->getInitializer());
     return true;
   } 
   
   if (GV->getName() == "llvm.global_dtors" && GV->use_empty()) {
-    SwitchToDataSection(TAI->getStaticDtorsSection(), 0);
+    SwitchToDataSection(TAI->getStaticDtorsSection());
     EmitAlignment(2, 0);
     EmitXXStructorList(GV->getInitializer());
     return true;
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index 983d8f5..7bec4d3 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -2176,30 +2176,30 @@
   
   // Dwarf sections base addresses.
   if (TAI->getDwarfRequiresFrameSection()) {
-    Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
+    Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
     EmitLabel("section_frame", 0);
   }
-  Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
   EmitLabel("section_info", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
   EmitLabel("section_abbrev", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
   EmitLabel("section_aranges", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
   EmitLabel("section_macinfo", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfLineSection());
   EmitLabel("section_line", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfLocSection());
   EmitLabel("section_loc", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
   EmitLabel("section_pubnames", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfStrSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfStrSection());
   EmitLabel("section_str", 0);
-  Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
   EmitLabel("section_ranges", 0);
-  Asm->SwitchToTextSection(TAI->getTextSection(), 0);
+  Asm->SwitchToTextSection(TAI->getTextSection());
   EmitLabel("text_begin", 0);
-  Asm->SwitchToDataSection(TAI->getDataSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDataSection());
   EmitLabel("data_begin", 0);
 
   // Emit common frame information.
@@ -2408,7 +2408,7 @@
 ///
 void Dwarf::EmitDebugInfo() const {
   // Start debug info section.
-  Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
   
   // Process each compile unit.
   for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -2444,7 +2444,7 @@
   // Check to see if it is worth the effort.
   if (!Abbreviations.empty()) {
     // Start the debug abbrev section.
-    Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0);
+    Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
     
     EmitLabel("abbrev_begin", 0);
     
@@ -2477,7 +2477,7 @@
   const int MaxLineDelta = 255 + MinLineDelta;
 
   // Start the dwarf line section.
-  Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfLineSection());
   
   // Construct the section header.
   
@@ -2636,7 +2636,7 @@
       TAI->getAddressSize() : -TAI->getAddressSize();
 
   // Start the dwarf frame section.
-  Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
 
   EmitLabel("frame_common", 0);
   EmitDifference("frame_common_end", 0,
@@ -2669,7 +2669,7 @@
     return;
 
   // Start the dwarf frame section.
-  Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
   
   EmitDifference("frame_end", SubprogramCount,
                  "frame_begin", SubprogramCount);
@@ -2699,7 +2699,7 @@
 ///
 void Dwarf::EmitDebugPubNames() {
   // Start the dwarf pubnames section.
-  Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
     
   // Process each compile unit.
   for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -2746,7 +2746,7 @@
   // Check to see if it is worth the effort.
   if (!StringPool.empty()) {
     // Start the dwarf str section.
-    Asm->SwitchToDataSection(TAI->getDwarfStrSection(), 0);
+    Asm->SwitchToDataSection(TAI->getDwarfStrSection());
     
     // For each of strings in the string pool.
     for (unsigned StringID = 1, N = StringPool.size();
@@ -2766,7 +2766,7 @@
 ///
 void Dwarf::EmitDebugLoc() {
   // Start the dwarf loc section.
-  Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfLocSection());
   
   O << "\n";
 }
@@ -2775,7 +2775,7 @@
 ///
 void Dwarf::EmitDebugARanges() {
   // Start the dwarf aranges section.
-  Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
   
   // FIXME - Mock up
 #if 0
@@ -2816,7 +2816,7 @@
 ///
 void Dwarf::EmitDebugRanges() {
   // Start the dwarf ranges section.
-  Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
   
   O << "\n";
 }
@@ -2825,7 +2825,7 @@
 ///
 void Dwarf::EmitDebugMacInfo() {
   // Start the dwarf macinfo section.
-  Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
   
   O << "\n";
 }
@@ -2939,14 +2939,14 @@
   EOL("Dwarf End Module");
   
   // Standard sections final addresses.
-  Asm->SwitchToTextSection(TAI->getTextSection(), 0);
+  Asm->SwitchToTextSection(TAI->getTextSection());
   EmitLabel("text_end", 0);
-  Asm->SwitchToDataSection(TAI->getDataSection(), 0);
+  Asm->SwitchToDataSection(TAI->getDataSection());
   EmitLabel("data_end", 0);
   
   // End text sections.
   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
-    Asm->SwitchToTextSection(SectionMap[i].c_str(), 0);
+    Asm->SwitchToTextSection(SectionMap[i].c_str());
     EmitLabel("section_end", i);
   }
   
diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 21c2f74..aafc782 100644
--- a/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -577,7 +577,7 @@
     for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end();
          i != e; ++i) {
       SwitchToTextSection(".section __TEXT,__picsymbolstub1,symbol_stubs,"
-                          "pure_instructions,32", 0);
+                          "pure_instructions,32");
       EmitAlignment(4);
       O << "L" << *i << "$stub:\n";
       O << "\t.indirect_symbol " << *i << "\n";
@@ -593,7 +593,7 @@
         O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n";
       O << "\tmtctr r12\n";
       O << "\tbctr\n";
-      SwitchToDataSection(".lazy_symbol_pointer", 0);
+      SwitchToDataSection(".lazy_symbol_pointer");
       O << "L" << *i << "$lazy_ptr:\n";
       O << "\t.indirect_symbol " << *i << "\n";
       if (isPPC64)
@@ -605,7 +605,7 @@
     for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end();
          i != e; ++i) {
       SwitchToTextSection(".section __TEXT,__symbol_stub1,symbol_stubs,"
-                          "pure_instructions,16", 0);
+                          "pure_instructions,16");
       EmitAlignment(4);
       O << "L" << *i << "$stub:\n";
       O << "\t.indirect_symbol " << *i << "\n";
@@ -616,7 +616,7 @@
         O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n";
       O << "\tmtctr r12\n";
       O << "\tbctr\n";
-      SwitchToDataSection(".lazy_symbol_pointer", 0);
+      SwitchToDataSection(".lazy_symbol_pointer");
       O << "L" << *i << "$lazy_ptr:\n";
       O << "\t.indirect_symbol " << *i << "\n";
       if (isPPC64)
@@ -630,7 +630,7 @@
 
   // Output stubs for external and common global variables.
   if (GVStubs.begin() != GVStubs.end()) {
-    SwitchToDataSection(".non_lazy_symbol_pointer", 0);
+    SwitchToDataSection(".non_lazy_symbol_pointer");
     for (std::set<std::string>::iterator I = GVStubs.begin(),
          E = GVStubs.end(); I != E; ++I) {
       O << "L" << *I << "$non_lazy_ptr:\n";
diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp
index 42af5b6..d6199dc 100755
--- a/lib/Target/X86/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/X86ATTAsmPrinter.cpp
@@ -52,7 +52,9 @@
 /// method to print assembly for each instruction.
 ///
 bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
-  if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
+  if (Subtarget->isTargetDarwin() ||
+      Subtarget->isTargetELF() ||
+      Subtarget->isTargetCygwin()) {
     // Let PassManager know we need debug information and relay
     // the MachineDebugInfo address on to DwarfWriter.
     DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
@@ -111,7 +113,9 @@
        F->getLinkage() == Function::WeakLinkage))
     O << "_llvm$workaround$fake$stub_" << CurrentFnName << ":\n";
 
-  if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
+  if (Subtarget->isTargetDarwin() ||
+      Subtarget->isTargetELF() ||
+      Subtarget->isTargetCygwin()) {
     // Emit pre-function debug information.
     DW.BeginFunction(&MF);
   }
@@ -141,7 +145,9 @@
   if (TAI->hasDotTypeDotSizeDirective())
     O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
 
-  if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
+  if (Subtarget->isTargetDarwin() ||
+      Subtarget->isTargetELF() ||
+      Subtarget->isTargetCygwin()) {
     // Emit post-function debug information.
     DW.EndFunction();
   }
diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp
index 9ef0ad1..41ce91a 100644
--- a/lib/Target/X86/X86AsmPrinter.cpp
+++ b/lib/Target/X86/X86AsmPrinter.cpp
@@ -116,7 +116,7 @@
 
     // Emit initial debug information.
     DW.BeginModule(&M);
-  } else if (Subtarget->isTargetELF()) {
+  } else if (Subtarget->isTargetELF() || Subtarget->isTargetCygwin()) {
     // Emit initial debug information.
     DW.BeginModule(&M);
   }
@@ -253,7 +253,7 @@
   
   // Output linker support code for dllexported globals
   if (DLLExportedGVs.begin() != DLLExportedGVs.end()) {
-    SwitchToDataSection(".section .drectve", 0);    
+    SwitchToDataSection(".section .drectve");
   }
 
   for (std::set<std::string>::iterator i = DLLExportedGVs.begin(),
@@ -263,7 +263,7 @@
   }    
 
   if (DLLExportedFns.begin() != DLLExportedFns.end()) {
-    SwitchToDataSection(".section .drectve", 0);    
+    SwitchToDataSection(".section .drectve");
   }
 
   for (std::set<std::string>::iterator i = DLLExportedFns.begin(),
@@ -273,7 +273,7 @@
   }    
  
   if (Subtarget->isTargetDarwin()) {
-    SwitchToDataSection("", 0);
+    SwitchToDataSection("");
 
     // Output stubs for dynamically-linked functions
     unsigned j = 1;
@@ -291,7 +291,7 @@
     // Output stubs for external and common global variables.
     if (GVStubs.begin() != GVStubs.end())
       SwitchToDataSection(
-                    ".section __IMPORT,__pointers,non_lazy_symbol_pointers", 0);
+                    ".section __IMPORT,__pointers,non_lazy_symbol_pointers");
     for (std::set<std::string>::iterator i = GVStubs.begin(), e = GVStubs.end();
          i != e; ++i) {
       O << "L" << *i << "$non_lazy_ptr:\n";
@@ -308,7 +308,7 @@
     // linker can safely perform dead code stripping.  Since LLVM never
     // generates code that does this, it is always safe to set.
     O << "\t.subsections_via_symbols\n";
-  } else if (Subtarget->isTargetELF()) {
+  } else if (Subtarget->isTargetELF() || Subtarget->isTargetCygwin()) {
     // Emit final debug information.
     DW.EndModule();
   }
diff --git a/lib/Target/X86/X86AsmPrinter.h b/lib/Target/X86/X86AsmPrinter.h
index b2fbe05..3503e37 100755
--- a/lib/Target/X86/X86AsmPrinter.h
+++ b/lib/Target/X86/X86AsmPrinter.h
@@ -67,7 +67,9 @@
 
   void getAnalysisUsage(AnalysisUsage &AU) const {
     AU.setPreservesAll();
-    if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) {
+    if (Subtarget->isTargetDarwin() ||
+        Subtarget->isTargetELF() ||
+        Subtarget->isTargetCygwin()) {
       AU.addRequired<MachineDebugInfo>();
     }
     MachineFunctionPass::getAnalysisUsage(AU);
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 6de5032..96ab939 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -219,7 +219,9 @@
   setOperationAction(ISD::LOCATION, MVT::Other, Expand);
   setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand);
   // FIXME - use subtarget debug flags
-  if (!Subtarget->isTargetDarwin() && !Subtarget->isTargetELF())
+  if (!Subtarget->isTargetDarwin() &&
+      !Subtarget->isTargetELF() &&
+      !Subtarget->isTargetCygwin())
     setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand);
 
   // VASTART needs to be custom lowered to use the VarArgsFrameIndex
diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp
index 11caea9..7b23963 100755
--- a/lib/Target/X86/X86IntelAsmPrinter.cpp
+++ b/lib/Target/X86/X86IntelAsmPrinter.cpp
@@ -393,14 +393,14 @@
     switch (I->getLinkage()) {
     case GlobalValue::LinkOnceLinkage:
     case GlobalValue::WeakLinkage:
-      SwitchToDataSection("", 0);
+      SwitchToDataSection("");
       O << name << "?\tsegment common 'COMMON'\n";
       bCustomSegment = true;
       // FIXME: the default alignment is 16 bytes, but 1, 2, 4, and 256
       // are also available.
       break;
     case GlobalValue::AppendingLinkage:
-      SwitchToDataSection("", 0);
+      SwitchToDataSection("");
       O << name << "?\tsegment public 'DATA'\n";
       bCustomSegment = true;
       // FIXME: the default alignment is 16 bytes, but 1, 2, 4, and 256
@@ -434,7 +434,7 @@
     // Output linker support code for dllexported globals
   if ((DLLExportedGVs.begin() != DLLExportedGVs.end()) ||
       (DLLExportedFns.begin() != DLLExportedFns.end())) {
-    SwitchToDataSection("", 0);
+    SwitchToDataSection("");
     O << "; WARNING: The following code is valid only with MASM v8.x and (possible) higher\n"
       << "; This version of MASM is usually shipped with Microsoft Visual Studio 2005\n"
       << "; or (possible) further versions. Unfortunately, there is no way to support\n"
@@ -461,7 +461,7 @@
   
   // Bypass X86SharedAsmPrinter::doFinalization().
   AsmPrinter::doFinalization(M);
-  SwitchToDataSection("", 0);
+  SwitchToDataSection("");
   O << "\tend\n";
   return false; // success
 }
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index 93596c0..229473c 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -90,6 +90,24 @@
     HasDotTypeDotSizeDirective = false;
     StaticCtorsSection = "\t.section .ctors,\"aw\"";
     StaticDtorsSection = "\t.section .dtors,\"aw\"";
+
+    // Set up DWARF directives
+    HasLEB128 = true;  // Target asm supports leb128 directives (little-endian)
+    PrivateGlobalPrefix = "L";  // Prefix for private global symbols
+    DwarfRequiresFrameSection = false;
+    DwarfAbbrevSection =  "\t.section\t.debug_abbrev,\"dr\"";
+    DwarfInfoSection =    "\t.section\t.debug_info,\"dr\"";
+    DwarfLineSection =    "\t.section\t.debug_line,\"dr\"";
+    DwarfFrameSection =   "\t.section\t.debug_frame,\"dr\"";
+    DwarfPubNamesSection ="\t.section\t.debug_pubnames,\"dr\"";
+    DwarfPubTypesSection ="\t.section\t.debug_pubtypes,\"dr\"";
+    DwarfStrSection =     "\t.section\t.debug_str,\"dr\"";
+    DwarfLocSection =     "\t.section\t.debug_loc,\"dr\"";
+    DwarfARangesSection = "\t.section\t.debug_aranges,\"dr\"";
+    DwarfRangesSection =  "\t.section\t.debug_ranges,\"dr\"";
+    DwarfMacInfoSection = "\t.section\t.debug_macinfo,\"dr\"";
+    break;
+    
     break;
   case X86Subtarget::isWindows:
     GlobalPrefix = "_";