X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FMC%2FMCSectionCOFF.cpp;h=fc2bd365e16d56373e462a33fbd2c605860d841f;hb=08f77a9f422e96110d8400e4caaf6a51be49a1f3;hp=aac93775aebef183abbdcc1f6b79a12342e49f41;hpb=2684d9e3c702b2ef9fd430155d94671d12fa994f;p=oota-llvm.git diff --git a/lib/MC/MCSectionCOFF.cpp b/lib/MC/MCSectionCOFF.cpp index aac93775aeb..fc2bd365e16 100644 --- a/lib/MC/MCSectionCOFF.cpp +++ b/lib/MC/MCSectionCOFF.cpp @@ -20,6 +20,8 @@ MCSectionCOFF::~MCSectionCOFF() {} // anchor. // should be printed before the section name bool MCSectionCOFF::ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const { + if (COMDATSymbol) + return false; // FIXME: Does .section .bss/.data/.text work everywhere?? if (Name == ".text" || Name == ".data" || Name == ".bss") @@ -28,8 +30,15 @@ bool MCSectionCOFF::ShouldOmitSectionDirective(StringRef Name, return false; } +void MCSectionCOFF::setSelection(int Selection) const { + assert(Selection != 0 && "invalid COMDAT selection type"); + this->Selection = Selection; + Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; +} + void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, - raw_ostream &OS) const { + raw_ostream &OS, + const MCExpr *Subsection) const { // standard sections don't require the '.section' if (ShouldOmitSectionDirective(SectionName, MAI)) { @@ -40,39 +49,50 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, OS << "\t.section\t" << getSectionName() << ",\""; if (getKind().isText()) OS << 'x'; + else if (getKind().isBSS()) + OS << 'b'; if (getKind().isWriteable()) OS << 'w'; else OS << 'r'; if (getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE) OS << 'n'; - OS << "\"\n"; + if (getCharacteristics() & COFF::IMAGE_SCN_CNT_INITIALIZED_DATA) + OS << 'd'; + OS << '"'; if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { + OS << ","; switch (Selection) { case COFF::IMAGE_COMDAT_SELECT_NODUPLICATES: - OS << "\t.linkonce one_only\n"; + OS << "one_only,"; break; case COFF::IMAGE_COMDAT_SELECT_ANY: - OS << "\t.linkonce discard\n"; + OS << "discard,"; break; case COFF::IMAGE_COMDAT_SELECT_SAME_SIZE: - OS << "\t.linkonce same_size\n"; + OS << "same_size,"; break; case COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH: - OS << "\t.linkonce same_contents\n"; + OS << "same_contents,"; + break; + case COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE: + OS << "associative,"; 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_LARGEST: - // OS << "\t.linkonce largest\n"; - // break; + OS << "largest,"; + break; + case COFF::IMAGE_COMDAT_SELECT_NEWEST: + OS << "newest,"; + break; default: assert (0 && "unsupported COFF selection type"); break; } + assert(COMDATSymbol); + OS << *COMDATSymbol; } + OS << '\n'; } bool MCSectionCOFF::UseCodeAlign() const {