Darwin doesn't support #APP/#NO_APP
[oota-llvm.git] / lib / Target / PowerPC / PPCAsmPrinter.cpp
index f75e4aae2272b1a6d026d62d8f2aad81ba5e53e8..f46d8236bf28f7c838f67752cc4f46725916b7ee 100644 (file)
@@ -25,6 +25,7 @@
 #include "llvm/Module.h"
 #include "llvm/Assembly/Writer.h"
 #include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/CodeGen/DwarfWriter.h"
 #include "llvm/CodeGen/MachineDebugInfo.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineInstr.h"
@@ -36,6 +37,7 @@
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/ADT/StringExtras.h"
+#include <iostream>
 #include <set>
 using namespace llvm;
 
@@ -81,7 +83,7 @@ namespace {
     void printMachineInstruction(const MachineInstr *MI);
     void printOp(const MachineOperand &MO);
 
-    void printOperand(const MachineInstr *MI, unsigned OpNo){
+    void printOperand(const MachineInstr *MI, unsigned OpNo) {
       const MachineOperand &MO = MI->getOperand(OpNo);
       if (MO.getType() == MachineOperand::MO_MachineRegister) {
         assert(MRegisterInfo::isPhysicalRegister(MO.getReg())&&"Not physreg??");
@@ -92,7 +94,13 @@ namespace {
         printOp(MO);
       }
     }
-
+    
+    bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
+                         unsigned AsmVariant, const char *ExtraCode) {
+       printOperand(MI, OpNo);
+       return false;
+    }
+    
     void printU5ImmOperand(const MachineInstr *MI, unsigned OpNo) {
       unsigned char value = MI->getOperand(OpNo).getImmedValue();
       assert(value <= 31 && "Invalid u5imm argument!");
@@ -203,15 +211,42 @@ namespace {
     
     virtual bool runOnMachineFunction(MachineFunction &F) = 0;
     virtual bool doFinalization(Module &M) = 0;
+    
+  };
+
+  /// DarwinDwarfWriter - Dwarf debug info writer customized for Darwin/Mac OS X
+  ///
+  struct DarwinDwarfWriter : public DwarfWriter {
+    // Ctor.
+    DarwinDwarfWriter(std::ostream &o, AsmPrinter *ap)
+    : DwarfWriter(o, ap)
+    {
+      needsSet = true;
+      DwarfAbbrevSection = ".section __DWARF,__debug_abbrev";
+      DwarfInfoSection = ".section __DWARF,__debug_info";
+      DwarfLineSection = ".section __DWARF,__debug_line";
+      DwarfFrameSection =
+          ".section __DWARF,__debug_frame,,coalesced,no_toc+strip_static_syms";
+      DwarfPubNamesSection = ".section __DWARF,__debug_pubnames";
+      DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes";
+      DwarfStrSection = ".section __DWARF,__debug_str";
+      DwarfLocSection = ".section __DWARF,__debug_loc";
+      DwarfARangesSection = ".section __DWARF,__debug_aranges";
+      DwarfRangesSection = ".section __DWARF,__debug_ranges";
+      DwarfMacInfoSection = ".section __DWARF,__debug_macinfo";
+      TextSection = ".text";
+      DataSection = ".data";
+    }
   };
 
   /// DarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac OS
   /// X
-  ///
   struct DarwinAsmPrinter : public PPCAsmPrinter {
+  
+    DarwinDwarfWriter DW;
 
     DarwinAsmPrinter(std::ostream &O, TargetMachine &TM)
-      : PPCAsmPrinter(O, TM) {
+      : PPCAsmPrinter(O, TM), DW(O, this) {
       CommentString = ";";
       GlobalPrefix = "_";
       PrivateGlobalPrefix = "L";     // Marker for constant pool idxs
@@ -222,6 +257,7 @@ namespace {
       LCOMMDirective = "\t.lcomm\t";
       StaticCtorsSection = ".mod_init_func";
       StaticDtorsSection = ".mod_term_func";
+      InlineAsmStart = InlineAsmEnd = "";  // Don't use #APP/#NO_APP
     }
 
     virtual const char *getPassName() const {
@@ -231,6 +267,13 @@ namespace {
     bool runOnMachineFunction(MachineFunction &F);
     bool doInitialization(Module &M);
     bool doFinalization(Module &M);
+    
+    void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+      AU.addRequired<MachineDebugInfo>();
+      PPCAsmPrinter::getAnalysisUsage(AU);
+    }
+
   };
 
   /// AIXAsmPrinter - PowerPC assembly printer, customized for AIX
@@ -379,6 +422,15 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
       O << ", " << (unsigned int)SH << "\n";
       return;
     }
+  } else if (MI->getOpcode() == PPC::OR4 || MI->getOpcode() == PPC::OR8) {
+    if (MI->getOperand(1).getReg() == MI->getOperand(2).getReg()) {
+      O << "mr ";
+      printOperand(MI, 0);
+      O << ", ";
+      printOperand(MI, 1);
+      O << "\n";
+      return;
+    }
   }
 
   if (printInstruction(MI))
@@ -394,15 +446,14 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
 /// method to print assembly for each instruction.
 ///
 bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
+  // FIXME - is this the earliest this can be set?
+  DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
+
   SetupMachineFunction(MF);
   O << "\n\n";
   
-  // Print out dwarf file info
-  MachineDebugInfo &DebugInfo = MF.getDebugInfo();
-  std::vector<std::string> Sources = DebugInfo.getSourceFiles();
-  for (unsigned i = 0, N = Sources.size(); i < N; i++) {
-    O << "\t; .file\t" << (i + 1) << "," << "\"" << Sources[i]  << "\"" << "\n";
-  }
+  // Emit pre-function debug information.
+  DW.BeginFunction(MF);
 
   // Print out constants referenced by the function
   EmitConstantPool(MF.getConstantPool());
@@ -449,6 +500,9 @@ bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
     }
   }
 
+  // Emit post-function debug information.
+  DW.EndFunction(MF);
+
   // We didn't modify anything.
   return false;
 }
@@ -461,6 +515,9 @@ bool DarwinAsmPrinter::doInitialization(Module &M) {
   
   // Darwin wants symbols to be quoted if they have complex names.
   Mang->setUseQuotes(true);
+  
+  // Emit initial debug information.
+  DW.BeginModule(M);
   return false;
 }
 
@@ -476,11 +533,10 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
     if (I->hasAppendingLinkage() && EmitSpecialLLVMGlobal(I))
       continue;
     
-    O << '\n';
     std::string name = Mang->getValueName(I);
     Constant *C = I->getInitializer();
     unsigned Size = TD.getTypeSize(C->getType());
-    unsigned Align = TD.getTypeAlignmentShift(C->getType());
+    unsigned Align = getPreferredAlignmentLog(I);
 
     if (C->isNullValue() && /* FIXME: Verify correct */
         (I->hasInternalLinkage() || I->hasWeakLinkage() ||
@@ -518,6 +574,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
       EmitAlignment(Align, I);
       O << name << ":\t\t\t\t; '" << I->getName() << "'\n";
       EmitGlobalConstant(C);
+      O << '\n';
     }
   }
 
@@ -576,6 +633,9 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
     }
   }
 
+  // Emit initial debug information.
+  DW.EndModule(M);
+
   // Funny Darwin hack: This flag tells the linker that no global symbols
   // contain code that falls through to other global symbols (e.g. the obvious
   // implementation of multiple entry points).  If this doesn't occur, the
@@ -587,12 +647,12 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
   return false; // success
 }
 
-/// runOnMachineFunction - This uses the printMachineInstruction()
+/// runOnMachineFunction - This uses the e()
 /// method to print assembly for each instruction.
 ///
 bool AIXAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   SetupMachineFunction(MF);
-
+  
   // Print out constants referenced by the function
   EmitConstantPool(MF.getConstantPool());