move sleb printing out of asmprinter into dwarf printer, make clients
authorChris Lattner <sabre@nondot.org>
Fri, 22 Jan 2010 22:56:55 +0000 (22:56 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 22 Jan 2010 22:56:55 +0000 (22:56 +0000)
handle the comment better, MCize the non-.sleb case.

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

include/llvm/CodeGen/AsmPrinter.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/AsmPrinter/DIE.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfException.cpp
lib/CodeGen/AsmPrinter/DwarfPrinter.cpp
lib/CodeGen/AsmPrinter/DwarfPrinter.h

index dad5de914a4217f8943f7207799fa3ff57b5b3ad..1f5e153d7d9edc30f92e5e26967be57fa3d5209c 100644 (file)
@@ -252,10 +252,6 @@ namespace llvm {
     /// representing an unsigned leb128 value.
     void PrintULEB128(unsigned Value) const;
 
-    /// PrintSLEB128 - Print a series of hexidecimal values(separated by commas)
-    /// representing a signed leb128 value.
-    void PrintSLEB128(int Value) const;
-
     //===------------------------------------------------------------------===//
     // Emission and print routines
     //
@@ -263,16 +259,11 @@ namespace llvm {
     /// EOL - Print a newline character to asm stream.  If a comment is present
     /// then it will be printed first.  Comments should not contain '\n'.
     void EOL(const Twine &Comment) const;
-    void EOL(const Twine &Comment, unsigned Encoding) const;
 
     /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
     /// unsigned leb128 value.
     void EmitULEB128Bytes(unsigned Value) const;
     
-    /// EmitSLEB128Bytes - print an assembler byte data directive to compose a
-    /// signed leb128 value.
-    void EmitSLEB128Bytes(int Value) const;
-    
     /// EmitInt8 - Emit a byte directive and value.
     ///
     void EmitInt8(int Value) const;
index 87afee0cc3aa644b13ad8bfb8433464608a5fa10..bf3d4241e3b3fafe27b82a5d20d70470a4ff88d0 100644 (file)
@@ -672,22 +672,6 @@ void AsmPrinter::PrintULEB128(unsigned Value) const {
   } while (Value);
 }
 
-/// PrintSLEB128 - Print a series of hexadecimal values (separated by commas)
-/// representing a signed leb128 value.
-void AsmPrinter::PrintSLEB128(int Value) const {
-  int Sign = Value >> (8 * sizeof(Value) - 1);
-  bool IsMore;
-
-  do {
-    unsigned char Byte = static_cast<unsigned char>(Value & 0x7f);
-    Value >>= 7;
-    IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
-    if (IsMore) Byte |= 0x80;
-    O << "0x";
-    O.write_hex(Byte);
-    if (IsMore) O << ", ";
-  } while (IsMore);
-}
 
 //===--------------------------------------------------------------------===//
 // Emission and print routines
@@ -707,26 +691,13 @@ void AsmPrinter::EOL(const Twine &Comment) const {
 /// unsigned leb128 value.
 void AsmPrinter::EmitULEB128Bytes(unsigned Value) const {
   if (MAI->hasLEB128()) {
-    O << "\t.uleb128\t"
-      << Value;
+    O << "\t.uleb128\t" << Value;
   } else {
     O << MAI->getData8bitsDirective();
     PrintULEB128(Value);
   }
 }
 
-/// EmitSLEB128Bytes - print an assembler byte data directive to compose a
-/// signed leb128 value.
-void AsmPrinter::EmitSLEB128Bytes(int Value) const {
-  if (MAI->hasLEB128()) {
-    O << "\t.sleb128\t"
-      << Value;
-  } else {
-    O << MAI->getData8bitsDirective();
-    PrintSLEB128(Value);
-  }
-}
-
 /// EmitInt8 - Emit a byte directive and value.
 ///
 void AsmPrinter::EmitInt8(int Value) const {
index 9b37963d206db715c2f282003a2926b906edb59a..131aa087ca2cbe3fb9786d0fb8ecd8394616438f 100644 (file)
@@ -200,7 +200,7 @@ void DIEInteger::EmitValue(DwarfPrinter *D, unsigned Form) const {
   case dwarf::DW_FORM_ref8:  // Fall thru
   case dwarf::DW_FORM_data8: Size = 8; break;
   case dwarf::DW_FORM_udata: Asm->EmitULEB128Bytes(Integer); return;
-  case dwarf::DW_FORM_sdata: Asm->EmitSLEB128Bytes(Integer); return;
+  case dwarf::DW_FORM_sdata: D->EmitSLEB128(Integer, ""); return;
   default: llvm_unreachable("DIE Value form not supported yet");
   }
   Asm->OutStreamer.EmitIntValue(Integer, Size, 0/*addrspace*/);
index 4a762b9f1445d9fb32fe9a8c3e9bd0340283f70c..a9045bd5d2b8f74f15d6562ad259a211697f0664 100644 (file)
@@ -2624,7 +2624,7 @@ void DwarfDebug::emitDebugLines() {
           // ... otherwise use long hand.
           Asm->EmitInt8(dwarf::DW_LNS_advance_line);
           Asm->EOL("DW_LNS_advance_line");
-          Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
+          EmitSLEB128(Offset, "Line Offset");
           Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
         }
       } else {
@@ -2675,8 +2675,7 @@ void DwarfDebug::emitCommonDebugFrame() {
   Asm->EOL("CIE Augmentation");
   Asm->EmitULEB128Bytes(1);
   Asm->EOL("CIE Code Alignment Factor");
-  Asm->EmitSLEB128Bytes(stackGrowth);
-  Asm->EOL("CIE Data Alignment Factor");
+  EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
   Asm->EOL("CIE RA Column");
 
index 43b1abf05dacefef198afcb6d03ac793f7d624e7..0dfb6b6d79ca61fc52d0c17a4fef58c452a4f63b 100644 (file)
@@ -177,8 +177,7 @@ void DwarfException::EmitCIE(const Function *PersonalityFn, unsigned Index) {
   // Round out reader.
   Asm->EmitULEB128Bytes(1);
   Asm->EOL("CIE Code Alignment Factor");
-  Asm->EmitSLEB128Bytes(stackGrowth);
-  Asm->EOL("CIE Data Alignment Factor");
+  EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), true));
   Asm->EOL("CIE Return Address Column");
 
@@ -894,17 +893,13 @@ void DwarfException::EmitExceptionTable() {
     //
     //   Used by the runtime to match the type of the thrown exception to the
     //   type of the catch clauses or the types in the exception specification.
-
-    Asm->EmitSLEB128Bytes(Action.ValueForTypeID);
-    Asm->EOL("TypeInfo index");
+    EmitSLEB128(Action.ValueForTypeID, "TypeInfo index");
 
     // Action Record
     //
     //   Self-relative signed displacement in bytes of the next action record,
     //   or 0 if there is no next action record.
-
-    Asm->EmitSLEB128Bytes(Action.NextAction);
-    Asm->EOL("Next action");
+    EmitSLEB128(Action.NextAction, "Next action");
   }
 
   // Emit the Catch TypeInfos.
index 99b46d61a0b180ea924a892009e90db3050c59f3..df8b2d2425fc75b33beb52847ff92d3e1f0476bd 100644 (file)
@@ -85,6 +85,36 @@ void DwarfPrinter::EmitEncodingByte(unsigned Val, const char *Desc) {
   Asm->OutStreamer.EmitIntValue(Val, 1, 0/*addrspace*/);
 }
 
+/// PrintSLEB128 - Print a series of hexadecimal values (separated by commas)
+/// representing a signed leb128 value.
+static void PrintSLEB128(MCStreamer &O, int Value) {
+  int Sign = Value >> (8 * sizeof(Value) - 1);
+  bool IsMore;
+  
+  do {
+    unsigned char Byte = static_cast<unsigned char>(Value & 0x7f);
+    Value >>= 7;
+    IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
+    if (IsMore) Byte |= 0x80;
+    
+    O.EmitIntValue(Byte, 1, /*addrspace*/0);
+  } while (IsMore);
+}
+
+/// EmitSLEB128 - print the specified signed leb128 value.
+void DwarfPrinter::EmitSLEB128(int Value, const char *Desc) const {
+  if (Asm->VerboseAsm && Desc)
+    Asm->OutStreamer.AddComment(Desc);
+    
+  if (MAI->hasLEB128()) {
+    O << "\t.sleb128\t" << Value;
+    Asm->OutStreamer.AddBlankLine();
+  } else {
+    PrintSLEB128(Asm->OutStreamer, Value);
+  }
+}
+
+
 
 /// PrintLabelName - Print label name in form used by Dwarf writer.
 ///
@@ -267,8 +297,7 @@ void DwarfPrinter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
         Asm->EOL("DW_CFA_offset_extended_sf");
         Asm->EmitULEB128Bytes(Reg);
         Asm->EOL("Reg");
-        Asm->EmitSLEB128Bytes(Offset);
-        Asm->EOL("Offset");
+        EmitSLEB128(Offset, "Offset");
       } else if (Reg < 64) {
         Asm->EmitInt8(dwarf::DW_CFA_offset + Reg);
         Asm->EOL("DW_CFA_offset + Reg (" + Twine(Reg) + ")");
index d76caf9a4ee10e7ee0c2af7c110fa626d6c9bcc6..bc285c7cad51e60076fd40b87afabd2f09ee0206 100644 (file)
@@ -87,11 +87,14 @@ public:
 
   /// EmitEncodingByte - Emit a .byte 42 directive that corresponds to an
   /// encoding.  If verbose assembly output is enabled, we output comments
-  /// describing the encoding.  Desc is an optional string saying what the
-  /// encoding is specifying (e.g. "LSDA").
-  void EmitEncodingByte(unsigned Val, const char *Desc = 0);
+  /// describing the encoding.  Desc is a string saying what the encoding is
+  /// specifying (e.g. "LSDA").
+  void EmitEncodingByte(unsigned Val, const char *Desc);
+  
+  /// EmitSLEB128 - print the specified signed leb128 value.
+  void EmitSLEB128(int Value, const char *Desc) const;
+  
   
-
   /// PrintLabelName - Print label name in form used by Dwarf writer.
   ///
   void PrintLabelName(const DWLabel &Label) const {