1 //===-- XCoreTargetObjectFile.cpp - XCore object files --------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "XCoreTargetObjectFile.h"
11 #include "XCoreSubtarget.h"
12 #include "llvm/IR/DataLayout.h"
13 #include "llvm/MC/MCContext.h"
14 #include "llvm/MC/MCSectionELF.h"
15 #include "llvm/Support/ELF.h"
16 #include "llvm/Target/TargetMachine.h"
17
18 using namespace llvm;
19
20
Initialize(MCContext & Ctx,const TargetMachine & TM)21 void XCoreTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM){
22 TargetLoweringObjectFileELF::Initialize(Ctx, TM);
23
24 BSSSection = Ctx.getELFSection(".dp.bss", ELF::SHT_NOBITS,
25 ELF::SHF_ALLOC | ELF::SHF_WRITE |
26 ELF::XCORE_SHF_DP_SECTION);
27 BSSSectionLarge = Ctx.getELFSection(".dp.bss.large", ELF::SHT_NOBITS,
28 ELF::SHF_ALLOC | ELF::SHF_WRITE |
29 ELF::XCORE_SHF_DP_SECTION);
30 DataSection = Ctx.getELFSection(".dp.data", ELF::SHT_PROGBITS,
31 ELF::SHF_ALLOC | ELF::SHF_WRITE |
32 ELF::XCORE_SHF_DP_SECTION);
33 DataSectionLarge = Ctx.getELFSection(".dp.data.large", ELF::SHT_PROGBITS,
34 ELF::SHF_ALLOC | ELF::SHF_WRITE |
35 ELF::XCORE_SHF_DP_SECTION);
36 DataRelROSection = Ctx.getELFSection(".dp.rodata", ELF::SHT_PROGBITS,
37 ELF::SHF_ALLOC | ELF::SHF_WRITE |
38 ELF::XCORE_SHF_DP_SECTION);
39 DataRelROSectionLarge = Ctx.getELFSection(
40 ".dp.rodata.large", ELF::SHT_PROGBITS,
41 ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::XCORE_SHF_DP_SECTION);
42 ReadOnlySection =
43 Ctx.getELFSection(".cp.rodata", ELF::SHT_PROGBITS,
44 ELF::SHF_ALLOC | ELF::XCORE_SHF_CP_SECTION);
45 ReadOnlySectionLarge =
46 Ctx.getELFSection(".cp.rodata.large", ELF::SHT_PROGBITS,
47 ELF::SHF_ALLOC | ELF::XCORE_SHF_CP_SECTION);
48 MergeableConst4Section = Ctx.getELFSection(
49 ".cp.rodata.cst4", ELF::SHT_PROGBITS,
50 ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::XCORE_SHF_CP_SECTION, 4, "");
51 MergeableConst8Section = Ctx.getELFSection(
52 ".cp.rodata.cst8", ELF::SHT_PROGBITS,
53 ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::XCORE_SHF_CP_SECTION, 8, "");
54 MergeableConst16Section = Ctx.getELFSection(
55 ".cp.rodata.cst16", ELF::SHT_PROGBITS,
56 ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::XCORE_SHF_CP_SECTION, 16, "");
57 CStringSection =
58 Ctx.getELFSection(".cp.rodata.string", ELF::SHT_PROGBITS,
59 ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS |
60 ELF::XCORE_SHF_CP_SECTION);
61 // TextSection - see MObjectFileInfo.cpp
62 // StaticCtorSection - see MObjectFileInfo.cpp
63 // StaticDtorSection - see MObjectFileInfo.cpp
64 }
65
getXCoreSectionType(SectionKind K)66 static unsigned getXCoreSectionType(SectionKind K) {
67 if (K.isBSS())
68 return ELF::SHT_NOBITS;
69 return ELF::SHT_PROGBITS;
70 }
71
getXCoreSectionFlags(SectionKind K,bool IsCPRel)72 static unsigned getXCoreSectionFlags(SectionKind K, bool IsCPRel) {
73 unsigned Flags = 0;
74
75 if (!K.isMetadata())
76 Flags |= ELF::SHF_ALLOC;
77
78 if (K.isText())
79 Flags |= ELF::SHF_EXECINSTR;
80 else if (IsCPRel)
81 Flags |= ELF::XCORE_SHF_CP_SECTION;
82 else
83 Flags |= ELF::XCORE_SHF_DP_SECTION;
84
85 if (K.isWriteable())
86 Flags |= ELF::SHF_WRITE;
87
88 if (K.isMergeableCString() || K.isMergeableConst4() ||
89 K.isMergeableConst8() || K.isMergeableConst16())
90 Flags |= ELF::SHF_MERGE;
91
92 if (K.isMergeableCString())
93 Flags |= ELF::SHF_STRINGS;
94
95 return Flags;
96 }
97
98 MCSection *
getExplicitSectionGlobal(const GlobalValue * GV,SectionKind Kind,Mangler & Mang,const TargetMachine & TM) const99 XCoreTargetObjectFile::getExplicitSectionGlobal(const GlobalValue *GV,
100 SectionKind Kind, Mangler &Mang,
101 const TargetMachine &TM) const {
102 StringRef SectionName = GV->getSection();
103 // Infer section flags from the section name if we can.
104 bool IsCPRel = SectionName.startswith(".cp.");
105 if (IsCPRel && !Kind.isReadOnly())
106 report_fatal_error("Using .cp. section for writeable object.");
107 return getContext().getELFSection(SectionName, getXCoreSectionType(Kind),
108 getXCoreSectionFlags(Kind, IsCPRel));
109 }
110
111 MCSection *
SelectSectionForGlobal(const GlobalValue * GV,SectionKind Kind,Mangler & Mang,const TargetMachine & TM) const112 XCoreTargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
113 SectionKind Kind, Mangler &Mang,
114 const TargetMachine &TM) const {
115
116 bool UseCPRel = GV->isLocalLinkage(GV->getLinkage());
117
118 if (Kind.isText()) return TextSection;
119 if (UseCPRel) {
120 if (Kind.isMergeable1ByteCString()) return CStringSection;
121 if (Kind.isMergeableConst4()) return MergeableConst4Section;
122 if (Kind.isMergeableConst8()) return MergeableConst8Section;
123 if (Kind.isMergeableConst16()) return MergeableConst16Section;
124 }
125 Type *ObjType = GV->getValueType();
126 auto &DL = GV->getParent()->getDataLayout();
127 if (TM.getCodeModel() == CodeModel::Small || !ObjType->isSized() ||
128 DL.getTypeAllocSize(ObjType) < CodeModelLargeSize) {
129 if (Kind.isReadOnly()) return UseCPRel? ReadOnlySection
130 : DataRelROSection;
131 if (Kind.isBSS() || Kind.isCommon())return BSSSection;
132 if (Kind.isData())
133 return DataSection;
134 if (Kind.isReadOnlyWithRel()) return DataRelROSection;
135 } else {
136 if (Kind.isReadOnly()) return UseCPRel? ReadOnlySectionLarge
137 : DataRelROSectionLarge;
138 if (Kind.isBSS() || Kind.isCommon())return BSSSectionLarge;
139 if (Kind.isData())
140 return DataSectionLarge;
141 if (Kind.isReadOnlyWithRel()) return DataRelROSectionLarge;
142 }
143
144 assert((Kind.isThreadLocal() || Kind.isCommon()) && "Unknown section kind");
145 report_fatal_error("Target does not support TLS or Common sections");
146 }
147
getSectionForConstant(const DataLayout & DL,SectionKind Kind,const Constant * C,unsigned & Align) const148 MCSection *XCoreTargetObjectFile::getSectionForConstant(const DataLayout &DL,
149 SectionKind Kind,
150 const Constant *C,
151 unsigned &Align) const {
152 if (Kind.isMergeableConst4()) return MergeableConst4Section;
153 if (Kind.isMergeableConst8()) return MergeableConst8Section;
154 if (Kind.isMergeableConst16()) return MergeableConst16Section;
155 assert((Kind.isReadOnly() || Kind.isReadOnlyWithRel()) &&
156 "Unknown section kind");
157 // We assume the size of the object is never greater than CodeModelLargeSize.
158 // To handle CodeModelLargeSize changes to AsmPrinter would be required.
159 return ReadOnlySection;
160 }
161