namespace llvm {
class MCContext;
+ class MCAsmInfo;
+ class raw_ostream;
/// MCSection - Instances of this class represent a uniqued identifier for a
/// section in the current translation unit. The MCContext class uniques and
/// creates these.
class MCSection {
- std::string Name;
-
- /// IsDirective - This is true if the section name is a directive, not
- /// something that should be printed with ".section".
- ///
- /// FIXME: This is a hack. Switch to a semantic view of the section instead
- /// of a syntactic one.
- bool IsDirective;
-
MCSection(const MCSection&); // DO NOT IMPLEMENT
void operator=(const MCSection&); // DO NOT IMPLEMENT
protected:
- MCSection(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx);
+ MCSection(SectionKind K) : Kind(K) {}
SectionKind Kind;
public:
virtual ~MCSection();
- static MCSection *Create(const StringRef &Name, bool IsDirective,
- SectionKind K, MCContext &Ctx);
-
- const std::string &getName() const { return Name; }
- bool isDirective() const { return IsDirective; }
-
SectionKind getKind() const { return Kind; }
+
+ virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
+ raw_ostream &OS) const = 0;
};
-
- class MCSectionELF : public MCSection {
- MCSectionELF(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {}
- public:
+ class MCSectionCOFF : public MCSection {
+ // FIXME: This memory is leaked because MCSectionCOFF is bump pointer
+ // allocated and this never gets freed.
+ std::string Name;
- static MCSectionELF *Create(const StringRef &Name, bool IsDirective,
- SectionKind K, MCContext &Ctx);
+ /// IsDirective - This is true if the section name is a directive, not
+ /// something that should be printed with ".section".
+ ///
+ /// FIXME: This is a hack. Switch to a semantic view of the section instead
+ /// of a syntactic one.
+ bool IsDirective;
- };
-
- class MCSectionMachO : public MCSection {
- MCSectionMachO(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {}
+ MCSectionCOFF(StringRef name, bool isDirective, SectionKind K)
+ : MCSection(K), Name(name), IsDirective(isDirective) {
+ }
public:
- static MCSectionMachO *Create(const StringRef &Name, bool IsDirective,
- SectionKind K, MCContext &Ctx);
- };
-
- class MCSectionPECOFF : public MCSection {
- MCSectionPECOFF(const StringRef &Name, bool IsDirective, SectionKind K,
- MCContext &Ctx) : MCSection(Name, IsDirective, K, Ctx) {}
- public:
+ static MCSectionCOFF *Create(StringRef Name, bool IsDirective,
+ SectionKind K, MCContext &Ctx);
+
+ const std::string &getName() const { return Name; }
+ bool isDirective() const { return IsDirective; }
- static MCSectionPECOFF *Create(const StringRef &Name, bool IsDirective,
- SectionKind K, MCContext &Ctx);
+ virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
+ raw_ostream &OS) const;
};
} // end namespace llvm