Handle visibility printing with all generality. Remove bunch of duplicate code.
authorAnton Korobeynikov <asl@math.spbu.ru>
Fri, 8 Aug 2008 18:25:07 +0000 (18:25 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Fri, 8 Aug 2008 18:25:07 +0000 (18:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54540 91177308-0d34-0410-b5e6-96231b3b80d8

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

index e41d8dca298d2d26e18c039e1e2bca174e79ed88..b5f26952996f4b9f4c9a3525f12aacd16e117fcd 100644 (file)
@@ -355,6 +355,10 @@ namespace llvm {
                            const char *Prefix = 0);
     void printSuffixedName(const std::string &Name, const char* Suffix);
 
+    /// printVisibility - This prints visibility information about symbol, if
+    /// this is suported by the target.
+    void printVisibility(const std::string& Name, unsigned Visibility) const;
+
   private:
     void EmitLLVMUsedList(Constant *List);
     void EmitXXStructorList(Constant *List);
index 1ee71bdc72b79848bad59ec2a1a7cba58a22a103..b01ae7d6b5859e8d3e74927a6e5b06df9ca50779 100644 (file)
@@ -1469,3 +1469,14 @@ void AsmPrinter::printSuffixedName(const char *Name, const char *Suffix,
 void AsmPrinter::printSuffixedName(const std::string &Name, const char* Suffix) {
   printSuffixedName(Name.c_str(), Suffix);
 }
+
+void AsmPrinter::printVisibility(const std::string& Name,
+                                 unsigned Visibility) const {
+  if (Visibility == GlobalValue::HiddenVisibility) {
+    if (const char *Directive = TAI->getHiddenDirective())
+      O << Directive << Name << '\n';
+  } else if (Visibility == GlobalValue::ProtectedVisibility) {
+    if (const char *Directive = TAI->getProtectedDirective())
+      O << Directive << Name << '\n';
+  }
+}
index 8af79de902eb65ef11546fcc89534aec8e81478d..89b0a8a77e8edc0c57050ae0ba426ff060c749c8 100644 (file)
@@ -226,14 +226,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
     break;
   }
 
-  const char *VisibilityDirective = NULL;
-  if (F->hasHiddenVisibility())
-    VisibilityDirective = TAI->getHiddenDirective();
-  else if (F->hasProtectedVisibility())
-    VisibilityDirective = TAI->getProtectedDirective();
-
-  if (VisibilityDirective)
-    O << VisibilityDirective << CurrentFnName << "\n";
+  printVisibility(CurrentFnName, F->getVisibility());
 
   if (AFI->isThumbFunction()) {
     EmitAlignment(1, F, AFI->getAlign());
@@ -870,14 +863,7 @@ void ARMAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   unsigned Size = TD->getABITypeSize(Type);
   unsigned Align = TD->getPreferredAlignmentLog(GVar);
 
-  const char *VisibilityDirective = NULL;
-  if (GVar->hasHiddenVisibility())
-    VisibilityDirective = TAI->getHiddenDirective();
-  else if (GVar->hasProtectedVisibility())
-    VisibilityDirective = TAI->getProtectedDirective();
-
-  if (VisibilityDirective)
-    O << VisibilityDirective << name << "\n";
+  printVisibility(name, GVar->getVisibility());
 
   if (Subtarget->isTargetELF())
     O << "\t.type " << name << ",%object\n";
index 1532047f554a5f959828767552d7b1f44d81c355..e592e80a760d73570f4244f9922937d1d0fa3677 100644 (file)
@@ -164,6 +164,8 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
     break;
   }
 
+  printVisibility(CurrentFnName, F->getVisibility());
+
   O << "\t.ent " << CurrentFnName << "\n";
 
   O << CurrentFnName << ":\n";
@@ -221,8 +223,7 @@ void AlphaAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   SwitchToDataSection(SectionName.c_str());
 
   // 1: Check visibility
-  if (GVar->hasHiddenVisibility())
-    O << TAI->getHiddenDirective() << name << "\n";
+  printVisibility(name, GVar->getVisibility());
 
   // 2: Kind
   switch (GVar->getLinkage()) {
index 8ae7d90d258ec7614b94fdf5ba5017bd15665192..6ce530db4c07f1d092283c39964bc15bf9f3eab8 100644 (file)
@@ -142,6 +142,9 @@ bool IA64AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   // Print out labels for the function.
   EmitAlignment(5);
   O << "\t.global\t" << CurrentFnName << '\n';
+
+  printVisibility(CurrentFnName, F->getVisibility());
+
   O << "\t.type\t" << CurrentFnName << ", @function\n";
   O << CurrentFnName << ":\n";
 
@@ -274,7 +277,7 @@ void IA64AsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   unsigned Size = TD->getABITypeSize(C->getType());
   unsigned Align = TD->getPreferredAlignmentLog(GVar);
 
-  // FIXME: ELF supports visibility
+  printVisibility(name, GVar->getVisibility());
 
   SwitchToDataSection(SectionName.c_str());
 
index 0d222f101041db4bdfdb243e86afe3125fbfb9ab..42979fc14758fa03e65b130b1b21c76f1b5c012c 100644 (file)
@@ -237,6 +237,8 @@ emitFunctionStart(MachineFunction &MF)
   O << "\t.globl\t"  << CurrentFnName << '\n';
   O << "\t.ent\t"    << CurrentFnName << '\n';
 
+  printVisibility(CurrentFnName, F->getVisibility());
+
   if ((TAI->hasDotTypeDotSizeDirective()) && Subtarget->isLinux())
     O << "\t.type\t"   << CurrentFnName << ", @function\n";
 
@@ -497,7 +499,7 @@ printModuleLevelGV(const GlobalVariable* GVar) {
   } else
     Align = TD->getPreferredTypeAlignmentShift(CTy);
 
-  // FIXME: ELF supports visibility
+  printVisibility(name, GVar->getVisibility());
 
   SwitchToDataSection(SectionName.c_str());
 
@@ -508,7 +510,7 @@ printModuleLevelGV(const GlobalVariable* GVar) {
 
       if (GVar->hasInternalLinkage())
         O << "\t.local\t" << name << '\n';
-      
+
       O << TAI->getCOMMDirective() << name << ',' << Size;
       if (TAI->getCOMMDirectiveTakesAlignment())
         O << ',' << (1 << Align);
index e3186f26514ecbf77a17de79ecea7771594ea39a..1c545903b5ef457e2e016da9828173da3f255926 100644 (file)
@@ -593,9 +593,7 @@ bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
     break;
   }
 
-  if (F->hasHiddenVisibility())
-    if (const char *Directive = TAI->getHiddenDirective())
-      O << Directive << CurrentFnName << '\n';
+  printVisibility(CurrentFnName, F->getVisibility());
 
   EmitAlignment(2, F);
   O << CurrentFnName << ":\n";
@@ -671,9 +669,7 @@ void PPCLinuxAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   std::string name = Mang->getValueName(GVar);
   std::string SectionName = TAI->SectionForGlobal(GVar);
 
-  if (GVar->hasHiddenVisibility())
-    if (const char *Directive = TAI->getHiddenDirective())
-      O << Directive << name << '\n';
+  printVisibility(name, GVar->getVisibility());
 
   Constant *C = GVar->getInitializer();
   const Type *Type = C->getType();
@@ -792,9 +788,7 @@ bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
     break;
   }
 
-  if (F->hasHiddenVisibility())
-    if (const char *Directive = TAI->getHiddenDirective())
-      O << Directive << CurrentFnName << '\n';
+  printVisibility(CurrentFnName, F->getVisibility());
 
   EmitAlignment(OptimizeForSize ? 2 : 4, F);
   O << CurrentFnName << ":\n";
@@ -909,9 +903,7 @@ void PPCDarwinAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   std::string name = Mang->getValueName(GVar);
   std::string SectionName = TAI->SectionForGlobal(GVar);
 
-  if (GVar->hasHiddenVisibility())
-    if (const char *Directive = TAI->getHiddenDirective())
-      O << Directive << name << '\n';
+  printVisibility(name, GVar->getVisibility());
 
   Constant *C = GVar->getInitializer();
   const Type *Type = C->getType();
index 2752958bd9c1c3a9ea5c7312e6776c7f17997cab..5cdb4d6e398c38c42531a80e3c3b6de37ea860e1 100644 (file)
@@ -107,6 +107,9 @@ bool SparcAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   SwitchToTextSection(getSectionForFunction(*F).c_str(), F);
   EmitAlignment(4, F);
   O << "\t.globl\t" << CurrentFnName << '\n';
+
+  printVisibility(CurrentFnName, F->getVisibility());
+
   O << "\t.type\t" << CurrentFnName << ", #function\n";
   O << CurrentFnName << ":\n";
 
@@ -250,7 +253,8 @@ void SparcAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   unsigned Size = TD->getABITypeSize(C->getType());
   unsigned Align = TD->getPreferredAlignment(GVar);
 
-  // FIXME: ELF supports visibility
+  printVisibility(name, GVar->getVisibility());
+
   SwitchToDataSection(SectionName.c_str());
 
   if (C->isNullValue() && !GVar->hasSection()) {
index f99566b72d7661abca71a0cb2988d6388efdaa3e..bb519560a184853793ecb7c77beabfe1e8264d15 100644 (file)
@@ -183,13 +183,8 @@ void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
     }
     break;
   }
-  if (F->hasHiddenVisibility()) {
-    if (const char *Directive = TAI->getHiddenDirective())
-      O << Directive << CurrentFnName << '\n';
-  } else if (F->hasProtectedVisibility()) {
-    if (const char *Directive = TAI->getProtectedDirective())
-      O << Directive << CurrentFnName << '\n';
-  }
+
+  printVisibility(CurrentFnName, F->getVisibility());
 
   if (Subtarget->isTargetELF())
     O << "\t.type\t" << CurrentFnName << ",@function\n";
@@ -773,13 +768,7 @@ void X86ATTAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) {
   unsigned Size = TD->getABITypeSize(Type);
   unsigned Align = TD->getPreferredAlignmentLog(GVar);
 
-  if (GVar->hasHiddenVisibility()) {
-    if (const char *Directive = TAI->getHiddenDirective())
-      O << Directive << name << '\n';
-  } else if (GVar->hasProtectedVisibility()) {
-    if (const char *Directive = TAI->getProtectedDirective())
-      O << Directive << name << '\n';
-  }
+  printVisibility(name, GVar->getVisibility());
 
   if (Subtarget->isTargetELF())
     O << "\t.type\t" << name << ",@object\n";