summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-08-15 05:56:11 +0000
committerChris Lattner <sabre@nondot.org>2009-08-15 05:56:11 +0000
commit7d996d907f593d9d1a4c9d79805b2b7adee63f24 (patch)
treefcdc9ee08f11e76b5ebb8b5c522a305dd9f84625
parentbd51c677390d8e13560cbf3ea972b95a5fbc1f9a (diff)
downloadllvm-7d996d907f593d9d1a4c9d79805b2b7adee63f24.tar.gz
llvm-7d996d907f593d9d1a4c9d79805b2b7adee63f24.tar.bz2
llvm-7d996d907f593d9d1a4c9d79805b2b7adee63f24.tar.xz
add support for target-specific ELF section flags, add a new MCSectionXCore
class which represents the XCore cp/dp section flags. No functionality change yet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79077 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/MC/MCSectionELF.h36
-rw-r--r--lib/MC/MCSectionELF.cpp10
-rw-r--r--lib/Target/XCore/MCSectionXCore.cpp35
-rw-r--r--lib/Target/XCore/MCSectionXCore.h54
4 files changed, 124 insertions, 11 deletions
diff --git a/include/llvm/MC/MCSectionELF.h b/include/llvm/MC/MCSectionELF.h
index 1c2943a909..8e70e36961 100644
--- a/include/llvm/MC/MCSectionELF.h
+++ b/include/llvm/MC/MCSectionELF.h
@@ -34,9 +34,10 @@ class MCSectionELF : public MCSection {
/// explicit section specfied.
bool IsExplicit;
- MCSectionELF(const StringRef &Section, unsigned T, unsigned F,
+protected:
+ MCSectionELF(const StringRef &Section, unsigned type, unsigned flags,
SectionKind K, bool isExplicit)
- : MCSection(K), SectionName(Section.str()), Type(T), Flags(F),
+ : MCSection(K), SectionName(Section.str()), Type(type), Flags(flags),
IsExplicit(isExplicit) {}
public:
@@ -93,16 +94,16 @@ public:
SHT_REL = 0x09U,
// This section type is reserved but has unspecified semantics.
- SHT_SHLIB = 0x0aU,
+ SHT_SHLIB = 0x0AU,
// This section holds a symbol table.
- SHT_DYNSYM = 0x0bU,
+ SHT_DYNSYM = 0x0BU,
// This section contains an array of pointers to initialization functions.
- SHT_INIT_ARRAY = 0x0eU,
+ SHT_INIT_ARRAY = 0x0EU,
// This section contains an array of pointers to termination functions.
- SHT_FINI_ARRAY = 0x0fU,
+ SHT_FINI_ARRAY = 0x0FU,
// This section contains an array of pointers to functions that are invoked
// before all other initialization functions.
@@ -150,7 +151,17 @@ public:
SHF_GROUP = 0x200U,
// This section holds Thread-Local Storage.
- SHF_TLS = 0x400U
+ SHF_TLS = 0x400U,
+
+ /// FIRST_TARGET_DEP_FLAG - This is the first flag that subclasses are
+ /// allowed to specify.
+ FIRST_TARGET_DEP_FLAG = 0x800U,
+
+ /// TARGET_INDEP_SHF - This is the bitmask for all the target independent
+ /// section flags. Targets can define their own target flags above these.
+ /// If they do that, they should implement their own MCSectionELF subclasses
+ /// and implement the virtual method hooks below to handle printing needs.
+ TARGET_INDEP_SHF = FIRST_TARGET_DEP_FLAG-1U
};
StringRef getSectionName() const {
@@ -162,6 +173,17 @@ public:
virtual void PrintSwitchToSection(const TargetAsmInfo &TAI,
raw_ostream &OS) const;
+
+
+ /// PrintTargetSpecificSectionFlags - Targets that define their own
+ /// MCSectionELF subclasses with target specific section flags should
+ /// implement this method if they end up adding letters to the attributes
+ /// list.
+ virtual void PrintTargetSpecificSectionFlags(const TargetAsmInfo &TAI,
+ raw_ostream &OS) const {
+ }
+
+
};
} // end namespace llvm
diff --git a/lib/MC/MCSectionELF.cpp b/lib/MC/MCSectionELF.cpp
index 3d8774ceeb..fe0fcb3a06 100644
--- a/lib/MC/MCSectionELF.cpp
+++ b/lib/MC/MCSectionELF.cpp
@@ -17,8 +17,7 @@ using namespace llvm;
MCSectionELF *MCSectionELF::
Create(const StringRef &Section, unsigned Type, unsigned Flags,
SectionKind K, bool isExplicit, MCContext &Ctx) {
- return new
- (Ctx) MCSectionELF(Section, Type, Flags, K, isExplicit);
+ return new (Ctx) MCSectionELF(Section, Type, Flags, K, isExplicit);
}
// ShouldOmitSectionDirective - Decides whether a '.section' directive
@@ -68,7 +67,6 @@ void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI,
OS << ",#tls";
} else {
OS << ",\"";
-
if (Flags & MCSectionELF::SHF_ALLOC)
OS << 'a';
if (Flags & MCSectionELF::SHF_EXECINSTR)
@@ -81,7 +79,11 @@ void MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI,
OS << 'S';
if (Flags & MCSectionELF::SHF_TLS)
OS << 'T';
-
+
+ // If there are target-specific flags, print them.
+ if (Flags & ~MCSectionELF::TARGET_INDEP_SHF)
+ PrintTargetSpecificSectionFlags(TAI, OS);
+
OS << '"';
if (ShouldPrintSectionType(Type)) {
diff --git a/lib/Target/XCore/MCSectionXCore.cpp b/lib/Target/XCore/MCSectionXCore.cpp
new file mode 100644
index 0000000000..d2bb9e47d8
--- /dev/null
+++ b/lib/Target/XCore/MCSectionXCore.cpp
@@ -0,0 +1,35 @@
+//===- MCSectionXCore.cpp - XCore-specific section representation ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the MCSectionXCore class.
+//
+//===----------------------------------------------------------------------===//
+
+#include "MCSectionXCore.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/Support/raw_ostream.h"
+using namespace llvm;
+
+MCSectionXCore *
+MCSectionXCore::Create(const StringRef &Section, unsigned Type,
+ unsigned Flags, SectionKind K,
+ bool isExplicit, MCContext &Ctx) {
+ return new (Ctx) MCSectionXCore(Section, Type, Flags, K, isExplicit);
+}
+
+
+/// PrintTargetSpecificSectionFlags - This handles the XCore-specific cp/dp
+/// section flags.
+void MCSectionXCore::PrintTargetSpecificSectionFlags(const TargetAsmInfo &TAI,
+ raw_ostream &OS) const {
+ if (getFlags() & MCSectionXCore::SHF_CP_SECTION)
+ OS << 'c';
+ if (getFlags() & MCSectionXCore::SHF_DP_SECTION)
+ OS << 'd';
+}
diff --git a/lib/Target/XCore/MCSectionXCore.h b/lib/Target/XCore/MCSectionXCore.h
new file mode 100644
index 0000000000..e2e55bdaa6
--- /dev/null
+++ b/lib/Target/XCore/MCSectionXCore.h
@@ -0,0 +1,54 @@
+//===- MCSectionXCore.h - XCore-specific section representation -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares the MCSectionXCore class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_MCSECTION_XCORE_H
+#define LLVM_MCSECTION_XCORE_H
+
+#include "llvm/MC/MCSectionELF.h"
+
+namespace llvm {
+
+class MCSectionXCore : public MCSectionELF {
+ MCSectionXCore(const StringRef &Section, unsigned Type, unsigned Flags,
+ SectionKind K, bool isExplicit)
+ : MCSectionELF(Section, Type, Flags, K, isExplicit) {}
+
+public:
+
+ enum {
+ /// SHF_CP_SECTION - All sections with the "c" flag are grouped together
+ /// by the linker to form the constant pool and the cp register is set to
+ /// the start of the constant pool by the boot code.
+ SHF_CP_SECTION = FIRST_TARGET_DEP_FLAG,
+
+ /// SHF_DP_SECTION - All sections with the "d" flag are grouped together
+ /// by the linker to form the data section and the dp register is set to
+ /// the start of the section by the boot code.
+ SHF_DP_SECTION = FIRST_TARGET_DEP_FLAG << 1
+ };
+
+ static MCSectionXCore *Create(const StringRef &Section, unsigned Type,
+ unsigned Flags, SectionKind K,
+ bool isExplicit, MCContext &Ctx);
+
+
+ /// PrintTargetSpecificSectionFlags - This handles the XCore-specific cp/dp
+ /// section flags.
+ virtual void PrintTargetSpecificSectionFlags(const TargetAsmInfo &TAI,
+ raw_ostream &OS) const;
+
+};
+
+} // end namespace llvm
+
+#endif