diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-08 22:41:53 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-08 22:41:53 +0000 |
commit | 1cb9396f4f3d2cdf6bf25b12eec6867c65645e55 (patch) | |
tree | 181ae850501f5204ecdb055cc0368d26a30b0f53 /llvm/lib/MC/MCSection.cpp | |
parent | 089b7de20dac7361b80f75e82961e053bdc5d7ff (diff) | |
download | bcm5719-llvm-1cb9396f4f3d2cdf6bf25b12eec6867c65645e55.tar.gz bcm5719-llvm-1cb9396f4f3d2cdf6bf25b12eec6867c65645e55.zip |
1. Make MCSection an abstract class.
2. Move section switch printing to MCSection virtual method which takes a
TAI. This eliminates textual formatting stuff from TLOF.
3. Eliminate SwitchToSectionDirective, getSectionFlagsAsString, and
TLOFELF::AtIsCommentChar.
llvm-svn: 78510
Diffstat (limited to 'llvm/lib/MC/MCSection.cpp')
-rw-r--r-- | llvm/lib/MC/MCSection.cpp | 114 |
1 files changed, 109 insertions, 5 deletions
diff --git a/llvm/lib/MC/MCSection.cpp b/llvm/lib/MC/MCSection.cpp index ec6078ea37b..a1f56648597 100644 --- a/llvm/lib/MC/MCSection.cpp +++ b/llvm/lib/MC/MCSection.cpp @@ -9,8 +9,14 @@ #include "llvm/MC/MCSection.h" #include "llvm/MC/MCContext.h" +#include "llvm/Target/TargetAsmInfo.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; +//===----------------------------------------------------------------------===// +// MCSection +//===----------------------------------------------------------------------===// + MCSection::~MCSection() { } @@ -22,26 +28,124 @@ MCSection::MCSection(const StringRef &N, bool isDirective, SectionKind K, Entry = this; } -MCSection *MCSection:: -Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { - return new (Ctx) MCSection(Name, IsDirective, K, Ctx); -} - +//===----------------------------------------------------------------------===// +// MCSectionELF +//===----------------------------------------------------------------------===// MCSectionELF *MCSectionELF:: Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { return new (Ctx) MCSectionELF(Name, IsDirective, K, Ctx); } +void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI, + raw_ostream &OS) const { + if (isDirective()) { + OS << getName() << '\n'; + return; + } + + OS << "\t.section\t" << getName(); + + // Handle the weird solaris syntax if desired. + if (TAI.usesSunStyleELFSectionSwitchSyntax() && + !getKind().isMergeableConst() && !getKind().isMergeableCString()) { + if (!getKind().isMetadata()) + OS << ",#alloc"; + if (getKind().isText()) + OS << ",#execinstr"; + if (getKind().isWriteable()) + OS << ",#write"; + if (getKind().isThreadLocal()) + OS << ",#tls"; + } else { + OS << ",\""; + + if (!getKind().isMetadata()) + OS << 'a'; + if (getKind().isText()) + OS << 'x'; + if (getKind().isWriteable()) + OS << 'w'; + if (getKind().isMergeable1ByteCString() || + getKind().isMergeable2ByteCString() || + getKind().isMergeable4ByteCString() || + getKind().isMergeableConst4() || + getKind().isMergeableConst8() || + getKind().isMergeableConst16()) + OS << 'M'; + if (getKind().isMergeable1ByteCString() || + getKind().isMergeable2ByteCString() || + getKind().isMergeable4ByteCString()) + OS << 'S'; + if (getKind().isThreadLocal()) + OS << 'T'; + + OS << "\","; + + // If comment string is '@', e.g. as on ARM - use '%' instead + if (TAI.getCommentString()[0] == '@') + OS << '%'; + else + OS << '@'; + + if (getKind().isBSS() || getKind().isThreadBSS()) + OS << "nobits"; + else + OS << "progbits"; + + if (getKind().isMergeable1ByteCString()) { + OS << ",1"; + } else if (getKind().isMergeable2ByteCString()) { + OS << ",2"; + } else if (getKind().isMergeable4ByteCString()) { + OS << ",4"; + } else if (getKind().isMergeableConst4()) { + OS << ",4"; + } else if (getKind().isMergeableConst8()) { + OS << ",8"; + } else if (getKind().isMergeableConst16()) { + OS << ",16"; + } + } +} + +//===----------------------------------------------------------------------===// +// MCSectionMachO +//===----------------------------------------------------------------------===// MCSectionMachO *MCSectionMachO:: Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { return new (Ctx) MCSectionMachO(Name, IsDirective, K, Ctx); } +void MCSectionMachO::PrintSwitchToSection(const TargetAsmInfo &TAI, + raw_ostream &OS) const { + if (!isDirective()) + OS << "\t.section\t" << getName() << '\n'; + else + OS << getName() << '\n'; +} + +//===----------------------------------------------------------------------===// +// MCSectionCOFF +//===----------------------------------------------------------------------===// MCSectionCOFF *MCSectionCOFF:: Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { return new (Ctx) MCSectionCOFF(Name, IsDirective, K, Ctx); } +void MCSectionCOFF::PrintSwitchToSection(const TargetAsmInfo &TAI, + raw_ostream &OS) const { + + if (isDirective()) { + OS << getName() << '\n'; + return; + } + OS << "\t.section\t" << getName() << ",\""; + if (getKind().isText()) + OS << 'x'; + if (getKind().isWriteable()) + OS << 'w'; + OS << "\"\n"; +} |