// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+//
+// This file declares the MCSection class.
+//
+//===----------------------------------------------------------------------===//
#ifndef LLVM_MC_MCSECTION_H
#define LLVM_MC_MCSECTION_H
#include <string>
+#include "llvm/ADT/StringRef.h"
+#include "llvm/MC/SectionKind.h"
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;
+ MCSection(const MCSection&); // DO NOT IMPLEMENT
+ void operator=(const MCSection&); // DO NOT IMPLEMENT
+ protected:
+ MCSection(SectionKind K) : Kind(K) {}
+ SectionKind Kind;
+ public:
+ virtual ~MCSection();
+
+ SectionKind getKind() const { return Kind; }
+
+ virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
+ raw_ostream &OS) const = 0;
+ };
+ class MCSectionCOFF : public MCSection {
+ // FIXME: This memory is leaked because MCSectionCOFF is bump pointer
+ // allocated and this never gets freed.
+ 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;
+
+ MCSectionCOFF(StringRef name, bool isDirective, SectionKind K)
+ : MCSection(K), Name(name), IsDirective(isDirective) {
+ }
public:
- MCSection(const char *_Name) : Name(_Name) {}
+
+ static MCSectionCOFF *Create(StringRef Name, bool IsDirective,
+ SectionKind K, MCContext &Ctx);
const std::string &getName() const { return Name; }
+ bool isDirective() const { return IsDirective; }
+
+ virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
+ raw_ostream &OS) const;
};
-
+
} // end namespace llvm
#endif