updated support for the COFF .linkonce

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.

llvm-svn: 103568
This commit is contained in:
Nathan Jeffords 2010-05-12 04:26:09 +00:00
parent 42464b8b92
commit 76a07580ad
2 changed files with 27 additions and 7 deletions

View 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);

View 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;
}
}
}