LLVM  10.0.0svn
XCoreTargetObjectFile.cpp
Go to the documentation of this file.
1 //===-- XCoreTargetObjectFile.cpp - XCore object files --------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 #include "XCoreSubtarget.h"
11 #include "llvm/BinaryFormat/ELF.h"
12 #include "llvm/IR/DataLayout.h"
13 #include "llvm/MC/MCContext.h"
14 #include "llvm/MC/MCSectionELF.h"
16 
17 using namespace llvm;
18 
19 
22 
23  BSSSection = Ctx.getELFSection(".dp.bss", ELF::SHT_NOBITS,
26  BSSSectionLarge = Ctx.getELFSection(".dp.bss.large", ELF::SHT_NOBITS,
32  DataSectionLarge = Ctx.getELFSection(".dp.data.large", ELF::SHT_PROGBITS,
38  DataRelROSectionLarge = Ctx.getELFSection(
39  ".dp.rodata.large", ELF::SHT_PROGBITS,
42  Ctx.getELFSection(".cp.rodata", ELF::SHT_PROGBITS,
44  ReadOnlySectionLarge =
45  Ctx.getELFSection(".cp.rodata.large", ELF::SHT_PROGBITS,
48  ".cp.rodata.cst4", ELF::SHT_PROGBITS,
51  ".cp.rodata.cst8", ELF::SHT_PROGBITS,
54  ".cp.rodata.cst16", ELF::SHT_PROGBITS,
57  Ctx.getELFSection(".cp.rodata.string", ELF::SHT_PROGBITS,
60  // TextSection - see MObjectFileInfo.cpp
61  // StaticCtorSection - see MObjectFileInfo.cpp
62  // StaticDtorSection - see MObjectFileInfo.cpp
63  }
64 
65 static unsigned getXCoreSectionType(SectionKind K) {
66  if (K.isBSS())
67  return ELF::SHT_NOBITS;
68  return ELF::SHT_PROGBITS;
69 }
70 
71 static unsigned getXCoreSectionFlags(SectionKind K, bool IsCPRel) {
72  unsigned Flags = 0;
73 
74  if (!K.isMetadata())
75  Flags |= ELF::SHF_ALLOC;
76 
77  if (K.isText())
78  Flags |= ELF::SHF_EXECINSTR;
79  else if (IsCPRel)
81  else
83 
84  if (K.isWriteable())
85  Flags |= ELF::SHF_WRITE;
86 
87  if (K.isMergeableCString() || K.isMergeableConst4() ||
89  Flags |= ELF::SHF_MERGE;
90 
91  if (K.isMergeableCString())
92  Flags |= ELF::SHF_STRINGS;
93 
94  return Flags;
95 }
96 
98  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
100  // Infer section flags from the section name if we can.
101  bool IsCPRel = SectionName.startswith(".cp.");
102  if (IsCPRel && !Kind.isReadOnly())
103  report_fatal_error("Using .cp. section for writeable object.");
104  return getContext().getELFSection(SectionName, getXCoreSectionType(Kind),
105  getXCoreSectionFlags(Kind, IsCPRel));
106 }
107 
109  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
110 
111  bool UseCPRel = GO->hasLocalLinkage();
112 
113  if (Kind.isText()) return TextSection;
114  if (UseCPRel) {
115  if (Kind.isMergeable1ByteCString()) return CStringSection;
116  if (Kind.isMergeableConst4()) return MergeableConst4Section;
117  if (Kind.isMergeableConst8()) return MergeableConst8Section;
118  if (Kind.isMergeableConst16()) return MergeableConst16Section;
119  }
120  Type *ObjType = GO->getValueType();
121  auto &DL = GO->getParent()->getDataLayout();
122  if (TM.getCodeModel() == CodeModel::Small || !ObjType->isSized() ||
123  DL.getTypeAllocSize(ObjType) < CodeModelLargeSize) {
124  if (Kind.isReadOnly()) return UseCPRel? ReadOnlySection
126  if (Kind.isBSS() || Kind.isCommon())return BSSSection;
127  if (Kind.isData())
128  return DataSection;
129  if (Kind.isReadOnlyWithRel()) return DataRelROSection;
130  } else {
131  if (Kind.isReadOnly()) return UseCPRel? ReadOnlySectionLarge
132  : DataRelROSectionLarge;
133  if (Kind.isBSS() || Kind.isCommon())return BSSSectionLarge;
134  if (Kind.isData())
135  return DataSectionLarge;
136  if (Kind.isReadOnlyWithRel()) return DataRelROSectionLarge;
137  }
138 
139  assert((Kind.isThreadLocal() || Kind.isCommon()) && "Unknown section kind");
140  report_fatal_error("Target does not support TLS or Common sections");
141 }
142 
145  const Constant *C,
146  unsigned &Align) const {
147  if (Kind.isMergeableConst4()) return MergeableConst4Section;
148  if (Kind.isMergeableConst8()) return MergeableConst8Section;
149  if (Kind.isMergeableConst16()) return MergeableConst16Section;
150  assert((Kind.isReadOnly() || Kind.isReadOnlyWithRel()) &&
151  "Unknown section kind");
152  // We assume the size of the object is never greater than CodeModelLargeSize.
153  // To handle CodeModelLargeSize changes to AsmPrinter would be required.
154  return ReadOnlySection;
155 }
uint64_t CallInst * C
StringRef getSection() const
Get the custom section of this global if it has one.
Definition: GlobalObject.h:95
Instances of this class represent a uniqued identifier for a section in the current translation unit...
Definition: MCSection.h:39
MCSection * MergeableConst4Section
A parsed version of the target data layout string in and methods for querying it. ...
Definition: DataLayout.h:112
bool hasLocalLinkage() const
Definition: GlobalValue.h:445
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:139
This class represents lattice values for constants.
Definition: AllocatorList.h:23
bool isWriteable() const
Definition: SectionKind.h:144
All sections with the "d" flag are grouped together by the linker to form the data section and the dp...
Definition: ELF.h:934
bool isSized(SmallPtrSetImpl< Type *> *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:265
LLVM_NODISCARD bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition: StringRef.h:270
MCSection * TextSection
Section directive for standard text.
bool isMergeableConst8() const
Definition: SectionKind.h:140
bool isMergeableCString() const
Definition: SectionKind.h:127
static unsigned getXCoreSectionFlags(SectionKind K, bool IsCPRel)
All sections with the "c" flag are grouped together by the linker to form the constant pool and the c...
Definition: ELF.h:939
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
const DataLayout & getDataLayout() const
Get the data layout for the module&#39;s target platform.
Definition: Module.cpp:369
MCSection * MergeableConst16Section
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
static const unsigned CodeModelLargeSize
Context object for machine code objects.
Definition: MCContext.h:65
bool isText() const
Definition: SectionKind.h:118
MCSection * DataSection
Section directive for standard data.
bool isReadOnlyWithRel() const
Definition: SectionKind.h:167
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
This is an important base class in LLVM.
Definition: Constant.h:41
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition: SectionKind.h:22
bool isMergeableConst16() const
Definition: SectionKind.h:141
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:40
bool isBSS() const
Definition: SectionKind.h:159
bool isMergeableConst4() const
Definition: SectionKind.h:139
bool isCommon() const
Definition: SectionKind.h:163
bool isMetadata() const
Definition: SectionKind.h:116
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, unsigned &Align) const override
Given a constant with the SectionKind, return a section that it should be placed in.
CodeModel::Model getCodeModel() const
Returns the code model.
bool isReadOnly() const
Definition: SectionKind.h:122
static unsigned getXCoreSectionType(SectionKind K)
Type * getValueType() const
Definition: GlobalValue.h:279
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
Definition: MCContext.h:424
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:575
bool isData() const
Definition: SectionKind.h:165
bool isThreadLocal() const
Definition: SectionKind.h:148
bool isMergeable1ByteCString() const
Definition: SectionKind.h:131
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:65
MCSection * BSSSection
Section that is default initialized to zero.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
MCSection * ReadOnlySection
Section that is readonly and can contain arbitrary initialized data.
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * MergeableConst8Section