use EmitLinkage for functions as well as globals. One output
authorChris Lattner <sabre@nondot.org>
Tue, 26 Jan 2010 23:51:52 +0000 (23:51 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 26 Jan 2010 23:51:52 +0000 (23:51 +0000)
change is that we now use ".linkonce discard" for global variables
instead of ".linkonce samesize".  These should be the same, just less
strict.  If anyone is interested in mcizing MCSection for COFF targets,
this should be easy to fix.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94623 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/MC/MCAsmInfoCOFF.cpp

index bb90356625e0c299bda163d4be7f7c625e7a648a..50eff9cbc6e8daccb539b9cad3b48e15348c2da1 100644 (file)
@@ -169,7 +169,9 @@ void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) {
       // FIXME: linkonce should be a section attribute, handled by COFF Section
       // assignment.
       // http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
-      // .linkonce same_size
+      // .linkonce discard
+      // FIXME: It would be nice to use .linkonce samesize for non-common
+      // globals.
       O << LinkOnce;
     } else {
       // .weak _foo
@@ -300,38 +302,9 @@ void AsmPrinter::EmitFunctionHeader() {
   OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
   printVisibility(CurrentFnSym, F->getVisibility());
 
-  switch (F->getLinkage()) {
-  default: llvm_unreachable("Unknown linkage type!");
-  case Function::InternalLinkage:  // Symbols default to internal.
-  case Function::PrivateLinkage:
-    break;
-  case Function::DLLExportLinkage:
-  case Function::ExternalLinkage:
-    OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
-    break;
-  case Function::LinkerPrivateLinkage:
-  case Function::LinkOnceAnyLinkage:
-  case Function::LinkOnceODRLinkage:
-  case Function::WeakAnyLinkage:
-  case Function::WeakODRLinkage:
-    if (MAI->getWeakDefDirective() != 0) {
-      OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
-      O << MAI->getWeakDefDirective() << *CurrentFnSym << '\n';
-    } else if (MAI->getLinkOnceDirective() != 0) {
-      OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
-      // FIXME: linkonce should be a section attribute, handled by COFF Section
-      // assignment.
-      // http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
-      O << "\t.linkonce discard\n";
-    } else {
-      O << "\t.weak\t" << *CurrentFnSym << '\n';
-    }
-    break;
-  }
-
+  EmitLinkage(F->getLinkage(), CurrentFnSym);
   EmitAlignment(MF->getAlignment(), F);
 
-
   if (MAI->hasDotTypeDotSizeDirective())
     OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
 
index ace7ba1e793db523003b0f02b4c7d94d7b222a7d..9130493de277b3fac6078ff0a02d4e92c731cdec 100644 (file)
@@ -24,7 +24,7 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() {
   HasSingleParameterDotFile = false;
   PrivateGlobalPrefix = "L";  // Prefix for private global symbols
   WeakRefDirective = "\t.weak\t";
-  LinkOnceDirective = "\t.linkonce same_size\n";
+  LinkOnceDirective = "\t.linkonce discard\n";
   
   // Doesn't support visibility:
   HiddenVisibilityAttr = ProtectedVisibilityAttr = MCSA_Invalid;