add support for target-specific ELF section flags, add a new MCSectionXCore
authorChris Lattner <sabre@nondot.org>
Sat, 15 Aug 2009 05:56:11 +0000 (05:56 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 15 Aug 2009 05:56:11 +0000 (05:56 +0000)
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

include/llvm/MC/MCSectionELF.h
lib/MC/MCSectionELF.cpp
lib/Target/XCore/MCSectionXCore.cpp [new file with mode: 0644]
lib/Target/XCore/MCSectionXCore.h [new file with mode: 0644]

index 1c2943a90973893df135a9a8a08f3d6ffb9fbcfe..8e70e369619d14ba357176de5f9b80b6838bd8c2 100644 (file)
@@ -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
index 3d8774ceeb27604b0d7ccc9e4f784c515544d71e..fe0fcb3a06459fa2829496dc656f22efcae4507f 100644 (file)
@@ -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 (file)
index 0000000..d2bb9e4
--- /dev/null
@@ -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 (file)
index 0000000..e2e55bd
--- /dev/null
@@ -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