forked from OSchip/llvm-project
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. llvm-svn: 79077
This commit is contained in:
parent
2be79b3608
commit
0fbe0f51a4
|
@ -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
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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';
|
||||
}
|
|
@ -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
|
Loading…
Reference in New Issue