Emit proper "secrel" directive, where possible. This fixes invalid asm syntax of...
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 2 Sep 2007 22:07:21 +0000 (22:07 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 2 Sep 2007 22:07:21 +0000 (22:07 +0000)
some stuff.

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

lib/CodeGen/DwarfWriter.cpp

index 959170bd0c0079c2aad8c53b10a61c6d3de751cc..232c5c4ba2ef3cd3dbb778195588fdd0c74d4fed 100644 (file)
@@ -823,17 +823,24 @@ public:
   MachineModuleInfo *getMMI() const { return MMI; }
   const TargetAsmInfo *getTargetAsmInfo() const { return TAI; }
 
+  void PrintRelDirective(bool Force32Bit = false, bool isInSection = false)
+                                                                         const {
+    if (isInSection && TAI->getDwarfSectionOffsetDirective())
+      O << TAI->getDwarfSectionOffsetDirective();
+    else if (Force32Bit || TAI->getAddressSize() == sizeof(int32_t))
+      O << TAI->getData32bitsDirective();
+    else
+      O << TAI->getData64bitsDirective();
+  }
+  
   /// PrintLabelName - Print label name in form used by Dwarf writer.
   ///
   void PrintLabelName(DWLabel Label) const {
     PrintLabelName(Label.Tag, Label.Number);
   }
-  void PrintLabelName(const char *Tag, unsigned Number,
-                      bool isInSection = false) const {
-    if (isInSection && TAI->getDwarfSectionOffsetDirective())
-      O << TAI->getDwarfSectionOffsetDirective() << Tag;
-    else
-      O << TAI->getPrivateGlobalPrefix() << Tag;
+  void PrintLabelName(const char *Tag, unsigned Number) const {
+    
+    O << TAI->getPrivateGlobalPrefix() << Tag;
     if (Number) O << Number;
   }
   
@@ -854,21 +861,14 @@ public:
   }
   void EmitReference(const char *Tag, unsigned Number,
                      bool IsPCRelative = false) const {
-    if (TAI->getAddressSize() == sizeof(int32_t))
-      O << TAI->getData32bitsDirective();
-    else
-      O << TAI->getData64bitsDirective();
-      
+    PrintRelDirective();
     PrintLabelName(Tag, Number);
     
     if (IsPCRelative) O << "-" << TAI->getPCSymbol();
   }
   void EmitReference(const std::string &Name, bool IsPCRelative = false) const {
-    if (TAI->getAddressSize() == sizeof(int32_t))
-      O << TAI->getData32bitsDirective();
-    else
-      O << TAI->getData64bitsDirective();
-      
+    PrintRelDirective();
+    
     O << Name;
     
     if (IsPCRelative) O << "-" << TAI->getPCSymbol();
@@ -894,20 +894,14 @@ public:
       O << "-";
       PrintLabelName(TagLo, NumberLo);
       O << "\n";
-      
-      if (IsSmall || TAI->getAddressSize() == sizeof(int32_t))
-        O << TAI->getData32bitsDirective();
-      else
-        O << TAI->getData64bitsDirective();
+
+      PrintRelDirective(IsSmall);
         
       PrintLabelName("set", SetCounter);
       
       ++SetCounter;
     } else {
-      if (IsSmall || TAI->getAddressSize() == sizeof(int32_t))
-        O << TAI->getData32bitsDirective();
-      else
-        O << TAI->getData64bitsDirective();
+      PrintRelDirective(IsSmall);
         
       PrintLabelName(TagHi, NumberHi);
       O << "-";
@@ -923,7 +917,7 @@ public:
       O << "\t.set\t";
       PrintLabelName("set", SetCounter);
       O << ",";
-      PrintLabelName(Label, LabelNumber, true);
+      PrintLabelName(Label, LabelNumber);
 
       if (isEH)
         printAbsolute = TAI->isAbsoluteEHSectionOffsets();
@@ -935,21 +929,15 @@ public:
         PrintLabelName(Section, SectionNumber);
       }      
       O << "\n";
-      
-      if (IsSmall || TAI->getAddressSize() == sizeof(int32_t))
-        O << TAI->getData32bitsDirective();
-      else
-        O << TAI->getData64bitsDirective();
+
+      PrintRelDirective(IsSmall);
         
       PrintLabelName("set", SetCounter);
       ++SetCounter;
     } else {
-      if (IsSmall || TAI->getAddressSize() == sizeof(int32_t))
-        O << TAI->getData32bitsDirective();
-      else
-        O << TAI->getData64bitsDirective();
+      PrintRelDirective(IsSmall, true);
         
-      PrintLabelName(Label, LabelNumber, true);
+      PrintLabelName(Label, LabelNumber);
 
       if (isEH)
         printAbsolute = TAI->isAbsoluteEHSectionOffsets();
@@ -2811,12 +2799,12 @@ private:
         Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
         O << "-" << TAI->getPCSymbol();
         Asm->EOL("Set Personality");
-        O << TAI->getData32bitsDirective();
+        PrintRelDirective();
         PrintLabelName("set", SetCounter);
         Asm->EOL("Personality");
         ++SetCounter;
       } else {
-        O << TAI->getData32bitsDirective();
+        PrintRelDirective();
         Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
         O << "-" << TAI->getPCSymbol();
         Asm->EOL("Personality");
@@ -3188,11 +3176,8 @@ private:
     // Emit the type ids.
     for (unsigned M = TypeInfos.size(); M; --M) {
       GlobalVariable *GV = TypeInfos[M - 1];
-      
-      if (TAI->getAddressSize() == sizeof(int32_t))
-        O << TAI->getData32bitsDirective();
-      else
-        O << TAI->getData64bitsDirective();
+
+      PrintRelDirective();
 
       if (GV)
         O << Asm->getGlobalLinkName(GV);