aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/MC/MCSection.h29
-rw-r--r--lib/MC/CMakeLists.txt1
-rw-r--r--lib/MC/MCContext.cpp12
-rw-r--r--lib/MC/MCSection.cpp31
4 files changed, 57 insertions, 16 deletions
diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h
index 024bc6c33a..32238586fd 100644
--- a/include/llvm/MC/MCSection.h
+++ b/include/llvm/MC/MCSection.h
@@ -17,24 +17,45 @@
#include <string>
#include "llvm/ADT/StringRef.h"
-namespace llvm {
+// FIXME: HORRIBLE HACK: major layering violation to get an enum.
+#include "llvm/Target/TargetLoweringObjectFile.h"
+namespace llvm {
+ class MCContext;
+
/// 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;
- private:
MCSection(const MCSection&); // DO NOT IMPLEMENT
void operator=(const MCSection&); // DO NOT IMPLEMENT
- MCSection(const StringRef &_Name, MCContext &Ctx);
+ protected:
+ MCSection(const StringRef &Name, MCContext &Ctx);
public:
+ virtual ~MCSection();
- static MCSection *Create(const StringRef &_Name, MCContext &Ctx);
+ static MCSection *Create(const StringRef &Name, MCContext &Ctx);
const std::string &getName() const { return Name; }
};
+ /// MCSectionWithKind - This is used by targets that use the SectionKind enum
+ /// to classify their sections.
+ class MCSectionWithKind : public MCSection {
+ SectionKind Kind;
+ MCSectionWithKind(const StringRef &Name, SectionKind K, MCContext &Ctx)
+ : MCSection(Name, Ctx), Kind(K) {}
+ public:
+
+ static MCSectionWithKind *Create(const StringRef &Name, SectionKind K,
+ MCContext &Ctx);
+
+ SectionKind getKind() const { return Kind; }
+ };
+
+
+
} // end namespace llvm
#endif
diff --git a/lib/MC/CMakeLists.txt b/lib/MC/CMakeLists.txt
index 3dd1e18191..82d400bf44 100644
--- a/lib/MC/CMakeLists.txt
+++ b/lib/MC/CMakeLists.txt
@@ -3,6 +3,7 @@ add_llvm_library(LLVMMC
MCAsmParser.cpp
MCAsmStreamer.cpp
MCContext.cpp
+ MCSection.cpp
MCStreamer.cpp
TargetAsmParser.cpp
)
diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp
index 5f3f125169..e6fb5c8809 100644
--- a/lib/MC/MCContext.cpp
+++ b/lib/MC/MCContext.cpp
@@ -25,18 +25,6 @@ MCSection *MCContext::GetSection(const StringRef &Name) const {
return I != Sections.end() ? I->second : 0;
}
-
-MCSection::MCSection(const StringRef &_Name, MCContext &Ctx) : Name(_Name) {
- MCSection *&Entry = Ctx.Sections[Name];
- assert(Entry == 0 && "Multiple sections with the same name created");
- Entry = this;
-}
-
-MCSection *MCSection::Create(const StringRef &Name, MCContext &Ctx) {
- return new (Ctx) MCSection(Name, Ctx);
-}
-
-
MCSymbol *MCContext::CreateSymbol(const StringRef &Name) {
assert(Name[0] != '\0' && "Normal symbols cannot be unnamed!");
diff --git a/lib/MC/MCSection.cpp b/lib/MC/MCSection.cpp
new file mode 100644
index 0000000000..2a2b0b6faf
--- /dev/null
+++ b/lib/MC/MCSection.cpp
@@ -0,0 +1,31 @@
+//===- lib/MC/MCSection.cpp - Machine Code Section Representation ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCContext.h"
+using namespace llvm;
+
+MCSection::~MCSection() {
+}
+
+MCSection::MCSection(const StringRef &N, MCContext &Ctx) : Name(N) {
+ MCSection *&Entry = Ctx.Sections[Name];
+ assert(Entry == 0 && "Multiple sections with the same name created");
+ Entry = this;
+}
+
+MCSection *MCSection::Create(const StringRef &Name, MCContext &Ctx) {
+ return new (Ctx) MCSection(Name, Ctx);
+}
+
+
+MCSectionWithKind *
+MCSectionWithKind::Create(const StringRef &Name, SectionKind K, MCContext &Ctx){
+ return new (Ctx) MCSectionWithKind(Name, K, Ctx);
+}