Naturally align doubles in the constant pool, set PrivateGlobalPrefix on
darwin, use it when printing the constant pool indices so the labels are
appropriately private, emit cp entries to .const instead of .data on darwin
and only emit a single .section for the constant pool, not one for each
entry.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24440 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp
index 14f47c0..70332a3 100755
--- a/lib/Target/X86/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/X86ATTAsmPrinter.cpp
@@ -174,7 +174,7 @@
     O << "]";
     return;
   } else if (BaseReg.isConstantPoolIndex()) {
-    O << ".CPI" << CurrentFnName << "_"
+    O << PrivateGlobalPrefix << "CPI" << CurrentFnName << "_"
       << BaseReg.getConstantPoolIndex();
     if (DispSpec.getImmedValue())
       O << "+" << DispSpec.getImmedValue();
diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp
index ac06cbc..18c7c4b 100644
--- a/lib/Target/X86/X86AsmPrinter.cpp
+++ b/lib/Target/X86/X86AsmPrinter.cpp
@@ -18,6 +18,7 @@
 #include "X86IntelAsmPrinter.h"
 #include "X86.h"
 #include "llvm/Module.h"
+#include "llvm/Type.h"
 #include "llvm/Assembly/Writer.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/Support/Mangler.h"
@@ -66,6 +67,7 @@
     AlignmentIsInBytes = false;
     Data64bitsDirective = 0;       // we can't emit a 64-bit unit
     ZeroDirective = "\t.space\t";  // ".space N" emits N zeros.
+    PrivateGlobalPrefix = "L";     // Marker for constant pool idxs
   }
 
   return AsmPrinter::doInitialization(M);
@@ -82,14 +84,21 @@
 
   if (CP.empty()) return;
 
+  if (forDarwin) {
+    O << "\t.const\n";
+  } else {
+    O << "\t.section .rodata\n";
+  }
+  
   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
-    if (forDarwin)
-      O << "\t.data\n";
+    // FIXME: force doubles to be naturally aligned.  We should handle this
+    // more correctly in the future.
+    if (CP[i]->getType() == Type::DoubleTy)
+      emitAlignment(3);
     else
-      O << "\t.section .rodata\n";
-    emitAlignment(TD.getTypeAlignmentShift(CP[i]->getType()));
-    O << ".CPI" << CurrentFnName << "_" << i << ":\t\t\t\t\t" << CommentString
-      << *CP[i] << "\n";
+      emitAlignment(TD.getTypeAlignmentShift(CP[i]->getType()));
+    O << PrivateGlobalPrefix << "CPI" << CurrentFnName << "_" << i
+      << ":\t\t\t\t\t" << CommentString << *CP[i] << "\n";
     emitGlobalConstant(CP[i]);
   }
 }
diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp
index 9cf7c29..a9d7c63 100755
--- a/lib/Target/X86/X86IntelAsmPrinter.cpp
+++ b/lib/Target/X86/X86IntelAsmPrinter.cpp
@@ -141,7 +141,7 @@
     O << "]";
     return;
   } else if (BaseReg.isConstantPoolIndex()) {
-    O << "[.CPI" << CurrentFnName << "_"
+    O << "[" << PrivateGlobalPrefix << "CPI" << CurrentFnName << "_"
       << BaseReg.getConstantPoolIndex();
 
     if (IndexReg.getReg()) {