- Emit subsections_via_symbols for Darwin.
[oota-llvm.git] / lib / Target / X86 / X86AsmPrinter.h
index 649ec4d02473ee9cb66c7a3c22cb7d0188f219d8..ed0fdbed27dbffb01b41a6a54a177bbd07f2f296 100755 (executable)
@@ -18,6 +18,8 @@
 
 #include "X86.h"
 #include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/CodeGen/DwarfWriter.h"
+#include "llvm/CodeGen/MachineDebugInfo.h"
 #include "llvm/ADT/Statistic.h"
 #include <set>
 
@@ -27,15 +29,46 @@ namespace x86 {
 
 extern Statistic<> EmittedInsts;
 
+/// X86DwarfWriter - Dwarf debug info writer customized for Darwin/Mac OS X
+///
+struct X86DwarfWriter : public DwarfWriter {
+ // Ctor.
+X86DwarfWriter(std::ostream &o, AsmPrinter *ap)
+  : DwarfWriter(o, ap)
+    {
+      needsSet = true;
+      DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev";
+      DwarfInfoSection = ".section __DWARFA,__debug_info";
+      DwarfLineSection = ".section __DWARFA,__debug_line";
+      DwarfFrameSection = ".section __DWARFA,__debug_frame";
+      DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames";
+      DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes";
+      DwarfStrSection = ".section __DWARFA,__debug_str";
+      DwarfLocSection = ".section __DWARFA,__debug_loc";
+      DwarfARangesSection = ".section __DWARFA,__debug_aranges";
+      DwarfRangesSection = ".section __DWARFA,__debug_ranges";
+      DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo";
+      TextSection = ".text";
+       DataSection = ".data";
+    }
+};
+
 struct X86SharedAsmPrinter : public AsmPrinter {
+  X86DwarfWriter DW;
+
   X86SharedAsmPrinter(std::ostream &O, TargetMachine &TM)
-    : AsmPrinter(O, TM), forELF(false), forDarwin(false) { }
+    : AsmPrinter(O, TM), DW(O, this), forDarwin(false) { }
 
   bool doInitialization(Module &M);
   bool doFinalization(Module &M);
 
-  bool forELF;
-  bool forDarwin;
+  void getAnalysisUsage(AnalysisUsage &AU) const {
+    AU.setPreservesAll();
+    AU.addRequired<MachineDebugInfo>();
+    MachineFunctionPass::getAnalysisUsage(AU);
+  }
+
+  bool forDarwin;  // FIXME: eliminate.
 
   // Necessary for Darwin to print out the apprioriate types of linker stubs
   std::set<std::string> FnStubs, GVStubs, LinkOnceStubs;
@@ -48,11 +81,12 @@ struct X86SharedAsmPrinter : public AsmPrinter {
 
   inline static bool isMem(const MachineInstr *MI, unsigned Op) {
     if (MI->getOperand(Op).isFrameIndex()) return true;
-    if (MI->getOperand(Op).isConstantPoolIndex()) return true;
     return Op+4 <= MI->getNumOperands() &&
       MI->getOperand(Op  ).isRegister() && isScale(MI->getOperand(Op+1)) &&
-      MI->getOperand(Op+2).isRegister() && (MI->getOperand(Op+3).isImmediate()||
-      MI->getOperand(Op+3).isGlobalAddress());
+      MI->getOperand(Op+2).isRegister() &&
+      (MI->getOperand(Op+3).isImmediate() ||
+       MI->getOperand(Op+3).isGlobalAddress() ||
+       MI->getOperand(Op+3).isConstantPoolIndex());
   }
 };