add new JumpTableSpecialLabelPrefix hook to asmprinter for jumptable emission.
authorChris Lattner <sabre@nondot.org>
Thu, 18 Jan 2007 01:12:56 +0000 (01:12 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 18 Jan 2007 01:12:56 +0000 (01:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33314 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/AsmPrinter.cpp
lib/Target/TargetAsmInfo.cpp

index 1218330902e8b9705ccd4cd359dc1d56f79bc72c..f58eb70906d4f2f724f3c80ee1226f29feaafb7a 100644 (file)
@@ -78,6 +78,10 @@ namespace llvm {
     /// have names in the .o file.  This is often "." or "L".
     const char *PrivateGlobalPrefix;      // Defaults to "."
     
+    /// JumpTableSpecialLabelPrefix - If not null, a extra (dead) label is
+    /// emitted before jump tables with the specified prefix.
+    const char *JumpTableSpecialLabelPrefix;  // Default to null.
+    
     /// GlobalVarAddrPrefix/Suffix - If these are nonempty, these strings
     /// will enclose any GlobalVariable (that isn't a function)
     ///
@@ -343,6 +347,9 @@ namespace llvm {
     const char *getPrivateGlobalPrefix() const {
       return PrivateGlobalPrefix;
     }
+    const char *getJumpTableSpecialLabelPrefix() const {
+      return JumpTableSpecialLabelPrefix;
+    }
     const char *getGlobalVarAddrPrefix() const {
       return GlobalVarAddrPrefix;
     }
index caa9da0d2ff29ae01c20c8a15cb0785537323b8b..a9e720149ec7bfd7233019030fd0a5339f1d87e0 100644 (file)
@@ -244,6 +244,13 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
         if (EmittedSets.insert(JTBBs[ii]).second)
           printSetLabel(i, JTBBs[ii]);
     
+    // On some targets (e.g. darwin) we want to emit two consequtive labels
+    // before each jump table.  The first label is never referenced, but tells
+    // the assembler and linker the extents of the jump table object.  The
+    // second label is actually referenced by the code.
+    if (const char *JTLabelPrefix = TAI->getJumpTableSpecialLabelPrefix())
+      O << JTLabelPrefix << "JTI" << getFunctionNumber() << '_' << i << ":\n";
+    
     O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 
       << '_' << i << ":\n";
     
@@ -259,7 +266,8 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
           << '_' << i << "_set_" << JTBBs[ii]->getNumber();
       } else if (IsPic) {
         printBasicBlockLabel(JTBBs[ii], false, false);
-        //If the arch uses custom Jump Table directives, don't calc relative to JT
+        // If the arch uses custom Jump Table directives, don't calc relative to
+        // JT
         if (!HadJTEntryDirective) 
           O << '-' << TAI->getPrivateGlobalPrefix() << "JTI"
             << getFunctionNumber() << '_' << i;
index 3afbddb89c960015ce010e1fbaaada54ae8a6595..45ea0eed4d0265d7b83350ba4d05cbc34b23e406 100644 (file)
@@ -28,6 +28,7 @@ TargetAsmInfo::TargetAsmInfo() :
   CommentString("#"),
   GlobalPrefix(""),
   PrivateGlobalPrefix("."),
+  JumpTableSpecialLabelPrefix(0),
   GlobalVarAddrPrefix(""),
   GlobalVarAddrSuffix(""),
   FunctionAddrPrefix(""),