diff options
author | Nico Rieck <nico.rieck@gmail.com> | 2013-07-06 12:13:10 +0000 |
---|---|---|
committer | Nico Rieck <nico.rieck@gmail.com> | 2013-07-06 12:13:10 +0000 |
commit | 80646283796b20c6a1b7d8eb69ce6f0478d54383 (patch) | |
tree | 83b9be6b71faffa6cd481cea7736a172d36609ea /lib/MC/MCSectionCOFF.cpp | |
parent | 2be430d251a781e76634e945d56224a7a0ef5a39 (diff) | |
download | llvm-80646283796b20c6a1b7d8eb69ce6f0478d54383.tar.gz llvm-80646283796b20c6a1b7d8eb69ce6f0478d54383.tar.bz2 llvm-80646283796b20c6a1b7d8eb69ce6f0478d54383.tar.xz |
MC: Implement COFF .linkonce directive
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185753 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCSectionCOFF.cpp')
-rw-r--r-- | lib/MC/MCSectionCOFF.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/MC/MCSectionCOFF.cpp b/lib/MC/MCSectionCOFF.cpp index 6cedf0655c..64aa2c5c49 100644 --- a/lib/MC/MCSectionCOFF.cpp +++ b/lib/MC/MCSectionCOFF.cpp @@ -28,6 +28,17 @@ bool MCSectionCOFF::ShouldOmitSectionDirective(StringRef Name, return false; } +void MCSectionCOFF::setSelection(int Selection, + const MCSectionCOFF *Assoc) const { + assert(Selection != 0 && "invalid COMDAT selection type"); + assert((Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) == + (Assoc != 0) && + "associative COMDAT section must have an associated section"); + this->Selection = Selection; + this->Assoc = Assoc; + Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; +} + void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS, const MCExpr *Subsection) const { @@ -63,12 +74,15 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, case COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH: OS << "\t.linkonce same_contents\n"; break; - //NOTE: as of binutils 2.20, there is no way to specifiy select largest - // with the .linkonce directive. For now, we treat it as an invalid - // comdat selection value. + case COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE: + OS << "\t.linkonce associative " << Assoc->getSectionName() << "\n"; + break; case COFF::IMAGE_COMDAT_SELECT_LARGEST: - // OS << "\t.linkonce largest\n"; - // break; + OS << "\t.linkonce largest\n"; + break; + case COFF::IMAGE_COMDAT_SELECT_NEWEST: + OS << "\t.linkonce newest\n"; + break; default: assert (0 && "unsupported COFF selection type"); break; |