Move actual section printing stuff to AsmPrinter from TAI reducing heap traffic.
authorAnton Korobeynikov <asl@math.spbu.ru>
Wed, 24 Sep 2008 22:14:23 +0000 (22:14 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Wed, 24 Sep 2008 22:14:23 +0000 (22:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56573 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
lib/Target/Alpha/AlphaAsmPrinter.cpp
lib/Target/CellSPU/SPUAsmPrinter.cpp
lib/Target/IA64/IA64AsmPrinter.cpp
lib/Target/Mips/MipsAsmPrinter.cpp
lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
lib/Target/Sparc/SparcAsmPrinter.cpp
lib/Target/TargetAsmInfo.cpp
lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp

index 8305e54f9e8ddc12dfd77e503e625a07c2af89fa..49a99c509e60e6e8e7faa00608707b8654b33a97 100644 (file)
@@ -113,6 +113,7 @@ namespace llvm {
   public:
     bool isNamed() const { return Flags & SectionFlags::Named; }
     unsigned getEntitySize() const { return (Flags >> 24) & 0xFF; }
+
     const std::string& getName() const { return Name; }
     unsigned getFlags() const { return Flags; }
   };
@@ -573,7 +574,7 @@ namespace llvm {
 
     /// SectionForGlobal - This hooks returns proper section name for given
     /// global with all necessary flags and marks.
-    virtual std::string SectionForGlobal(const GlobalValue *GV) const;
+    virtual const Section* SectionForGlobal(const GlobalValue *GV) const;
 
     // Helper methods for SectionForGlobal
     virtual std::string UniqueSectionForGlobal(const GlobalValue* GV,
index 93ebf21818868936464f5deb63352314f563dd2b..9fc57a9545c09baff5471476a1c74db2675bdf45 100644 (file)
@@ -115,8 +115,18 @@ void AsmPrinter::SwitchToSection(const Section* NS) {
   // FIXME: Make CurrentSection a Section* in the future
   CurrentSection = NewSection;
 
-  if (!CurrentSection.empty())
-    O << CurrentSection << TAI->getDataSectionStartSuffix() << '\n';
+  if (!CurrentSection.empty()) {
+    // If section is named we need to switch into it via special '.section'
+    // directive and also append funky flags. Otherwise - section name is just
+    // some magic assembler directive.
+    if (NS->isNamed())
+      O << TAI->getSwitchToSectionDirective()
+        << CurrentSection
+        << TAI->getSectionFlags(NS->getFlags());
+    else
+      O << CurrentSection;
+    O << TAI->getDataSectionStartSuffix() << '\n';
+  }
 
   IsInTextSection = (NS->getFlags() & SectionFlags::Code);
 }
@@ -326,7 +336,7 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
     // function body itself, otherwise the label differences won't make sense.
     // We should also do if the section name is NULL or function is declared in
     // discardable section.
-    SwitchToTextSection(TAI->SectionForGlobal(F).c_str(), F);
+    SwitchToSection(TAI->SectionForGlobal(F));
   } else {
     SwitchToDataSection(JumpTableDataSection);
   }
index 4db430f9e224382725347599213a58f2cec43a89..08f05978b6a7e02aceeb54284bf723d751852202 100644 (file)
@@ -846,7 +846,6 @@ void ARMAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
     return;
   }
 
-  std::string SectionName = TAI->SectionForGlobal(GVar);
   std::string name = Mang->getValueName(GVar);
   Constant *C = GVar->getInitializer();
   const Type *Type = C->getType();
@@ -858,7 +857,7 @@ void ARMAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   if (Subtarget->isTargetELF())
     O << "\t.type " << name << ",%object\n";
 
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   if (C->isNullValue() && !GVar->hasSection() && !GVar->isThreadLocal()) {
     // FIXME: This seems to be pretty darwin-specific
index b1265afe1abe49319618f5579189f8c6c4afc6d6..9a4102c1a46932d34674bd9b160130102d42ef3c 100644 (file)
@@ -149,7 +149,7 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
 
   // Print out labels for the function.
   const Function *F = MF.getFunction();
-  SwitchToTextSection(TAI->SectionForGlobal(F).c_str(), F);
+  SwitchToSection(TAI->SectionForGlobal(F));
 
   EmitAlignment(4, F);
   switch (F->getLinkage()) {
@@ -214,14 +214,13 @@ void AlphaAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   if (EmitSpecialLLVMGlobal(GVar))
     return;
 
-  std::string SectionName = TAI->SectionForGlobal(GVar);
   std::string name = Mang->getValueName(GVar);
   Constant *C = GVar->getInitializer();
   unsigned Size = TD->getABITypeSize(C->getType());
   unsigned Align = TD->getPreferredAlignmentLog(GVar);
 
   // 0: Switch to section
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   // 1: Check visibility
   printVisibility(name, GVar->getVisibility());
index ef33968c28f457a4106f4ac10bcd7781e60b721d..5b0bacfc89f4f8db8ea80385f3578654ea6882fe 100644 (file)
@@ -418,7 +418,7 @@ LinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF)
   // Print out labels for the function.
   const Function *F = MF.getFunction();
 
-  SwitchToTextSection(TAI->SectionForGlobal(F).c_str(), F);
+  SwitchToSection(TAI->SectionForGlobal(F));
   EmitAlignment(3, F);
 
   switch (F->getLinkage()) {
index ff33125913c3b676efab183d0a8b5cd0453e9bac..0d04bf54b4f4bd2d8cf39a63661787254a792b6b 100644 (file)
@@ -130,7 +130,7 @@ bool IA64AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   EmitConstantPool(MF.getConstantPool());
 
   const Function *F = MF.getFunction();
-  SwitchToTextSection(TAI->SectionForGlobal(F).c_str(), F);
+  SwitchToSection(TAI->SectionForGlobal(F));
 
   // Print out labels for the function.
   EmitAlignment(5);
@@ -264,7 +264,6 @@ void IA64AsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
     return;
 
   O << "\n\n";
-  std::string SectionName = TAI->SectionForGlobal(GVar);
   std::string name = Mang->getValueName(GVar);
   Constant *C = GVar->getInitializer();
   unsigned Size = TD->getABITypeSize(C->getType());
@@ -272,7 +271,7 @@ void IA64AsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
 
   printVisibility(name, GVar->getVisibility());
 
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   if (C->isNullValue() && !GVar->hasSection()) {
     if (!GVar->isThreadLocal() &&
index fbe3faa3393c2022d81dde5c15ff5e2404d88c1b..9525f46bcbb041757610dacc2490438fb208882f 100644 (file)
@@ -224,7 +224,7 @@ emitFunctionStart(MachineFunction &MF)
 {
   // Print out the label for the function.
   const Function *F = MF.getFunction();
-  SwitchToTextSection(TAI->SectionForGlobal(F).c_str());
+  SwitchToSection(TAI->SectionForGlobal(F));
 
   // 2 bits aligned
   EmitAlignment(2, F);
@@ -479,7 +479,6 @@ printModuleLevelGV(const GlobalVariable* GVar) {
     return;
 
   O << "\n\n";
-  std::string SectionName = TAI->SectionForGlobal(GVar);
   std::string name = Mang->getValueName(GVar);
   Constant *C = GVar->getInitializer();
   const Type *CTy = C->getType();
@@ -501,7 +500,7 @@ printModuleLevelGV(const GlobalVariable* GVar) {
 
   printVisibility(name, GVar->getVisibility());
 
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   if (C->isNullValue() && !GVar->hasSection()) {
     if (!GVar->isThreadLocal() &&
index a8127f6f63cfa5cb407da6a28f1809af4ebb1093..2d9ecbd71e3331c0167a3832b5f81cd089804b44 100644 (file)
@@ -571,7 +571,7 @@ bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
 
   // Print out labels for the function.
   const Function *F = MF.getFunction();
-  SwitchToTextSection(TAI->SectionForGlobal(F).c_str(), F);
+  SwitchToSection(TAI->SectionForGlobal(F));
 
   switch (F->getLinkage()) {
   default: assert(0 && "Unknown linkage type!");
@@ -662,7 +662,6 @@ void PPCLinuxAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
     return;
 
   std::string name = Mang->getValueName(GVar);
-  std::string SectionName = TAI->SectionForGlobal(GVar);
 
   printVisibility(name, GVar->getVisibility());
 
@@ -671,7 +670,7 @@ void PPCLinuxAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   unsigned Size = TD->getABITypeSize(Type);
   unsigned Align = TD->getPreferredAlignmentLog(GVar);
 
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   if (C->isNullValue() && /* FIXME: Verify correct */
       !GVar->hasSection() &&
@@ -759,7 +758,7 @@ bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
 
   // Print out labels for the function.
   const Function *F = MF.getFunction();
-  SwitchToTextSection(TAI->SectionForGlobal(F).c_str(), F);
+  SwitchToSection(TAI->SectionForGlobal(F));
 
   switch (F->getLinkage()) {
   default: assert(0 && "Unknown linkage type!");
@@ -888,7 +887,6 @@ void PPCDarwinAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   }
 
   std::string name = Mang->getValueName(GVar);
-  std::string SectionName = TAI->SectionForGlobal(GVar);
 
   printVisibility(name, GVar->getVisibility());
 
@@ -897,7 +895,7 @@ void PPCDarwinAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   unsigned Size = TD->getABITypeSize(Type);
   unsigned Align = TD->getPreferredAlignmentLog(GVar);
 
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   if (C->isNullValue() && /* FIXME: Verify correct */
       !GVar->hasSection() &&
index bb4d6aeea7b50dc10fe276b94963de6d278ad062..424adaa7c3f435ebdf3c8285ba990357d5087c39 100644 (file)
@@ -99,7 +99,7 @@ bool SparcAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
 
   // Print out the label for the function.
   const Function *F = MF.getFunction();
-  SwitchToTextSection(TAI->SectionForGlobal(F).c_str(), F);
+  SwitchToSection(TAI->SectionForGlobal(F));
   EmitAlignment(4, F);
   O << "\t.globl\t" << CurrentFnName << '\n';
 
@@ -242,7 +242,6 @@ void SparcAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
     return;
 
   O << "\n\n";
-  std::string SectionName = TAI->SectionForGlobal(GVar);
   std::string name = Mang->getValueName(GVar);
   Constant *C = GVar->getInitializer();
   unsigned Size = TD->getABITypeSize(C->getType());
@@ -250,7 +249,7 @@ void SparcAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
 
   printVisibility(name, GVar->getVisibility());
 
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   if (C->isNullValue() && !GVar->hasSection()) {
     if (!GVar->isThreadLocal() &&
index 06b77dd26aa294e9b29bb26712942a25a568ed7d..536f16d6578a22d6e0d62ecca9bddba3c2366763 100644 (file)
@@ -272,7 +272,7 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
   return Flags;
 }
 
-std::string
+const Section*
 TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
   const Section* S;
   // Select section name
@@ -286,13 +286,7 @@ TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
     S = SelectSectionForGlobal(GV);
   }
 
-  if (!S->isNamed())
-    return S->Name;
-
-  // If section is named we need to switch into it via special '.section'
-  // directive and also append funky flags. Otherwise - section name is just
-  // some magic assembler directive.
-  return getSwitchToSectionDirective() + S->Name + getSectionFlags(S->Flags);
+  return S;
 }
 
 // Lame default implementation. Calculate the section name for global.
index 61c8f12eec36222ab6466440449e814d4fe51dcf..01fda9f1f08aa99509bf8ee690ce859e67756615 100644 (file)
@@ -148,11 +148,10 @@ void X86ATTAsmPrinter::decorateName(std::string &Name,
 
 void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
   const Function *F = MF.getFunction();
-  std::string SectionName = TAI->SectionForGlobal(F);
 
   decorateName(CurrentFnName, F);
 
-  SwitchToTextSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(F));
 
   unsigned FnAlign = OptimizeForSize ? 1 : 4;
   if (!F->isDeclaration() && F->hasNote(FnAttr::OptimizeForSize))
@@ -766,7 +765,6 @@ void X86ATTAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
     return;
   }
 
-  std::string SectionName = TAI->SectionForGlobal(GVar);
   std::string name = Mang->getValueName(GVar);
   Constant *C = GVar->getInitializer();
   const Type *Type = C->getType();
@@ -778,7 +776,7 @@ void X86ATTAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   if (Subtarget->isTargetELF())
     O << "\t.type\t" << name << ",@object\n";
 
-  SwitchToDataSection(SectionName.c_str());
+  SwitchToSection(TAI->SectionForGlobal(GVar));
 
   if (C->isNullValue() && !GVar->hasSection()) {
     // FIXME: This seems to be pretty darwin-specific