Use generic section-handling stuff to emit constant pool entries
authorAnton Korobeynikov <asl@math.spbu.ru>
Wed, 24 Sep 2008 22:17:59 +0000 (22:17 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Wed, 24 Sep 2008 22:17:59 +0000 (22:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56579 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 077f5b1e7749fe9c2c2fede8a983df5e8ca45687..d3850a5fb3602ee55eda6fdf3cd612f4112efaa7 100644 (file)
@@ -366,8 +366,6 @@ namespace llvm {
     const GlobalValue *findGlobalValue(const Constant* CV);
     void EmitLLVMUsedList(Constant *List);
     void EmitXXStructorList(Constant *List);
-    void EmitConstantPool(unsigned Alignment, const char *Section,
-                std::vector<std::pair<MachineConstantPoolEntry,unsigned> > &CP);
     GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C);
   };
 }
index 3c25ab73b21bcf3d9c3caa03f27df1fb32dd08d4..1f15c4a748fd160587208228ea3ba5bba2d9c2d3 100644 (file)
@@ -28,6 +28,7 @@
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/Target/TargetRegisterInfo.h"
+#include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringExtras.h"
@@ -255,60 +256,50 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
   const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
   if (CP.empty()) return;
 
-  // Some targets require 4-, 8-, and 16- byte constant literals to be placed
-  // in special sections.
-  std::vector<std::pair<MachineConstantPoolEntry,unsigned> > FourByteCPs;
-  std::vector<std::pair<MachineConstantPoolEntry,unsigned> > EightByteCPs;
-  std::vector<std::pair<MachineConstantPoolEntry,unsigned> > SixteenByteCPs;
-  std::vector<std::pair<MachineConstantPoolEntry,unsigned> > OtherCPs;
-  std::vector<std::pair<MachineConstantPoolEntry,unsigned> > TargetCPs;
+  // Calculate sections for constant pool entries. We collect entries to go into
+  // the same section together to reduce amount of section switch statements.
+  typedef
+    std::multimap<const Section*,
+                  std::pair<MachineConstantPoolEntry, unsigned> > CPMap;
+  CPMap  CPs;
+  DenseSet<const Section*> Sections;
+
   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
     MachineConstantPoolEntry CPE = CP[i];
-    const Type *Ty = CPE.getType();
-    if (TAI->getFourByteConstantSection() &&
-        TM.getTargetData()->getABITypeSize(Ty) == 4)
-      FourByteCPs.push_back(std::make_pair(CPE, i));
-    else if (TAI->getEightByteConstantSection() &&
-             TM.getTargetData()->getABITypeSize(Ty) == 8)
-      EightByteCPs.push_back(std::make_pair(CPE, i));
-    else if (TAI->getSixteenByteConstantSection() &&
-             TM.getTargetData()->getABITypeSize(Ty) == 16)
-      SixteenByteCPs.push_back(std::make_pair(CPE, i));
-    else
-      OtherCPs.push_back(std::make_pair(CPE, i));
+    const Section* S = TAI->SelectSectionForMachineConst(CPE.getType());
+    CPs.insert(std::make_pair(S, std::make_pair(CPE, i)));
+    Sections.insert(S);
   }
 
-  unsigned Alignment = MCP->getConstantPoolAlignment();
-  EmitConstantPool(Alignment, TAI->getFourByteConstantSection(), FourByteCPs);
-  EmitConstantPool(Alignment, TAI->getEightByteConstantSection(), EightByteCPs);
-  EmitConstantPool(Alignment, TAI->getSixteenByteConstantSection(),
-                   SixteenByteCPs);
-  EmitConstantPool(Alignment, TAI->getConstantPoolSection(), OtherCPs);
-}
+  // Now print stuff into the calculated sections.
+  for (DenseSet<const Section*>::iterator IS = Sections.begin(),
+         ES = Sections.end(); IS != ES; ++IS) {
+    SwitchToSection(*IS);
+    EmitAlignment(MCP->getConstantPoolAlignment());
 
-void AsmPrinter::EmitConstantPool(unsigned Alignment, const char *Section,
-               std::vector<std::pair<MachineConstantPoolEntry,unsigned> > &CP) {
-  if (CP.empty()) return;
+    std::pair<CPMap::iterator, CPMap::iterator> II = CPs.equal_range(*IS);
+    for (CPMap::iterator I = II.first, E = II.second; I != E; ++I) {
+      CPMap::iterator J = next(I);
+      MachineConstantPoolEntry Entry = I->second.first;
+      unsigned index = I->second.second;
 
-  SwitchToDataSection(Section);
-  EmitAlignment(Alignment);
-  for (unsigned i = 0, e = CP.size(); i != e; ++i) {
-    O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
-      << CP[i].second << ":\t\t\t\t\t";
+      O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
+        << index << ":\t\t\t\t\t";
     // O << TAI->getCommentString() << ' ' << 
     //      WriteTypeSymbolic(O, CP[i].first.getType(), 0);
-    O << '\n';
-    if (CP[i].first.isMachineConstantPoolEntry())
-      EmitMachineConstantPoolValue(CP[i].first.Val.MachineCPVal);
-     else
-      EmitGlobalConstant(CP[i].first.Val.ConstVal);
-    if (i != e-1) {
-      const Type *Ty = CP[i].first.getType();
-      unsigned EntSize =
-        TM.getTargetData()->getABITypeSize(Ty);
-      unsigned ValEnd = CP[i].first.getOffset() + EntSize;
+      O << '\n';
+      if (Entry.isMachineConstantPoolEntry())
+        EmitMachineConstantPoolValue(Entry.Val.MachineCPVal);
+      else
+        EmitGlobalConstant(Entry.Val.ConstVal);
+
       // Emit inter-object padding for alignment.
-      EmitZeros(CP[i+1].first.getOffset()-ValEnd);
+      if (J != E) {
+        const Type *Ty = Entry.getType();
+        unsigned EntSize = TM.getTargetData()->getABITypeSize(Ty);
+        unsigned ValEnd = Entry.getOffset() + EntSize;
+        EmitZeros(J->second.first.getOffset()-ValEnd);
+      }
     }
   }
 }