diff options
author | Nathan Jeffords <blunted2night@gmail.com> | 2010-05-12 04:26:09 +0000 |
---|---|---|
committer | Nathan Jeffords <blunted2night@gmail.com> | 2010-05-12 04:26:09 +0000 |
commit | 871bb94c4343dcc7391af7833ebb4313a782440b (patch) | |
tree | 966258dcc361c8dd028267fbc5c5fbb08468bcde /lib | |
parent | 5bdc2aa264b38a4632cf1e4fef1f328b464147a5 (diff) | |
download | llvm-871bb94c4343dcc7391af7833ebb4313a782440b.tar.gz llvm-871bb94c4343dcc7391af7833ebb4313a782440b.tar.bz2 llvm-871bb94c4343dcc7391af7833ebb4313a782440b.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103568 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 8 | ||||
-rw-r--r-- | lib/MC/MCSectionCOFF.cpp | 26 |
2 files changed, 27 insertions, 7 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index a4cf454253..a330843db4 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -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); diff --git a/lib/MC/MCSectionCOFF.cpp b/lib/MC/MCSectionCOFF.cpp index 103a80f1e3..786bc7bc03 100644 --- a/lib/MC/MCSectionCOFF.cpp +++ b/lib/MC/MCSectionCOFF.cpp @@ -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; + } + } } |