updated support for the COFF .linkonce
authorNathan Jeffords <blunted2night@gmail.com>
Wed, 12 May 2010 04:26:09 +0000 (04:26 +0000)
committerNathan Jeffords <blunted2night@gmail.com>
Wed, 12 May 2010 04:26:09 +0000 (04:26 +0000)
Now, the .linkonce directive is emitted as part of MCSectionCOFF::PrintSwitchToSection instead of AsmPrinter::EmitLinkage since it is an attribute of the section the symbol was placed into not the symbol itself.

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

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/MC/MCSectionCOFF.cpp

index a4cf454253e8b859736e3131b2c3e85d52b82cd6..a330843db45bc3d599043f99b55764f3feee1bd7 100644 (file)
@@ -208,13 +208,7 @@ void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const {
     } else if (const char *LinkOnce = MAI->getLinkOnceDirective()) {
       // .globl _foo
       OutStreamer.EmitSymbolAttribute(GVSym, 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
-      // .linkonce discard
-      // FIXME: It would be nice to use .linkonce samesize for non-common
-      // globals.
-      OutStreamer.EmitRawText(StringRef(LinkOnce));
+      //NOTE: linkonce is handling by the section the symbol was assigned to
     } else {
       // .weak _foo
       OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Weak);
index 103a80f1e37d3c97b464ae9d26183c7cf5a5ffc3..786bc7bc03562ef347f145c215171e90c8a69af8 100644 (file)
@@ -47,4 +47,30 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
   if (getCharacteristics() & MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE)
     OS << 'n';
   OS << "\"\n";
+  
+  if (getCharacteristics() & MCSectionCOFF::IMAGE_SCN_LNK_COMDAT) {
+    switch (Selection) {
+      default:
+        assert (0 && "unsupported COFF selection type");
+        break;
+      case IMAGE_COMDAT_SELECT_NODUPLICATES:
+        OS << "\t.linkonce one_only\n";
+        break;
+      case IMAGE_COMDAT_SELECT_ANY:
+        OS << "\t.linkonce discard\n";
+        break;
+      case IMAGE_COMDAT_SELECT_SAME_SIZE:
+        OS << "\t.linkonce same_size\n";
+        break;
+      case IMAGE_COMDAT_SELECT_EXACT_MATCH:
+        OS << "\t.linkonce same_contents\n";
+        break;
+      // ".linkonce largest" is not documented as being an option.
+      // It seems odd that a link attribute designed essentially for PE/COFF
+      // wouldn't support all the options (at least as of binutils 2.20)
+    //case IMAGE_COMDAT_SELECT_LARGEST:
+    //  OS << "\t.linkonce largest\n";
+    //  break;
+    }
+  }
 }