1 //===-- XCoreTargetObjectFile.cpp - XCore object files --------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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"
21 void XCoreTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM){
22 TargetLoweringObjectFileELF::Initialize(Ctx, TM);
25 Ctx.getELFSection(".dp.bss", ELF::SHT_NOBITS,
26 ELF::SHF_ALLOC | ELF::SHF_WRITE |
27 ELF::XCORE_SHF_DP_SECTION,
28 SectionKind::getBSS());
30 Ctx.getELFSection(".dp.bss.large", ELF::SHT_NOBITS,
31 ELF::SHF_ALLOC | ELF::SHF_WRITE |
32 ELF::XCORE_SHF_DP_SECTION,
33 SectionKind::getBSS());
35 Ctx.getELFSection(".dp.data", ELF::SHT_PROGBITS,
36 ELF::SHF_ALLOC | ELF::SHF_WRITE |
37 ELF::XCORE_SHF_DP_SECTION,
38 SectionKind::getDataRel());
40 Ctx.getELFSection(".dp.data.large", ELF::SHT_PROGBITS,
41 ELF::SHF_ALLOC | ELF::SHF_WRITE |
42 ELF::XCORE_SHF_DP_SECTION,
43 SectionKind::getDataRel());
44 // This is the wrong place to decide if const data should be placed
45 // in the .cp or .dp section.
46 // Ideally we should set up DataRelROSection to use the '.dp.'' and use this
47 // for const data, unless the front end explicitly states a '.cp.'' section.
49 Ctx.getELFSection(".cp.rodata", ELF::SHT_PROGBITS,
51 ELF::XCORE_SHF_CP_SECTION,
52 SectionKind::getReadOnlyWithRel());
53 ReadOnlySectionLarge =
54 Ctx.getELFSection(".cp.rodata.large", ELF::SHT_PROGBITS,
56 ELF::XCORE_SHF_CP_SECTION,
57 SectionKind::getReadOnlyWithRel());
58 MergeableConst4Section =
59 Ctx.getELFSection(".cp.rodata.cst4", ELF::SHT_PROGBITS,
60 ELF::SHF_ALLOC | ELF::SHF_MERGE |
61 ELF::XCORE_SHF_CP_SECTION,
62 SectionKind::getMergeableConst4());
63 MergeableConst8Section =
64 Ctx.getELFSection(".cp.rodata.cst8", ELF::SHT_PROGBITS,
65 ELF::SHF_ALLOC | ELF::SHF_MERGE |
66 ELF::XCORE_SHF_CP_SECTION,
67 SectionKind::getMergeableConst8());
68 MergeableConst16Section =
69 Ctx.getELFSection(".cp.rodata.cst16", ELF::SHT_PROGBITS,
70 ELF::SHF_ALLOC | ELF::SHF_MERGE |
71 ELF::XCORE_SHF_CP_SECTION,
72 SectionKind::getMergeableConst16());
74 Ctx.getELFSection(".cp.rodata.string", ELF::SHT_PROGBITS,
75 ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS |
76 ELF::XCORE_SHF_CP_SECTION,
77 SectionKind::getReadOnlyWithRel());
78 // TextSection - see MObjectFileInfo.cpp
79 // StaticCtorSection - see MObjectFileInfo.cpp
80 // StaticDtorSection - see MObjectFileInfo.cpp
83 static SectionKind getXCoreKindForNamedSection(StringRef Name, SectionKind K) {
84 if (Name.startswith(".cp."))
85 return SectionKind::getReadOnly();
89 static unsigned getXCoreSectionType(SectionKind K) {
91 return ELF::SHT_NOBITS;
92 return ELF::SHT_PROGBITS;
95 static unsigned getXCoreSectionFlags(SectionKind K) {
99 Flags |= ELF::SHF_ALLOC;
102 Flags |= ELF::SHF_EXECINSTR;
103 else if (K.isReadOnly())
104 Flags |= ELF::XCORE_SHF_CP_SECTION;
106 Flags |= ELF::XCORE_SHF_DP_SECTION;
109 Flags |= ELF::SHF_WRITE;
111 if (K.isMergeableCString() || K.isMergeableConst4() ||
112 K.isMergeableConst8() || K.isMergeableConst16())
113 Flags |= ELF::SHF_MERGE;
115 if (K.isMergeableCString())
116 Flags |= ELF::SHF_STRINGS;
121 const MCSection *XCoreTargetObjectFile::
122 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
123 Mangler *Mang, const TargetMachine &TM) const {
124 StringRef SectionName = GV->getSection();
125 // Infer section flags from the section name if we can.
126 Kind = getXCoreKindForNamedSection(SectionName, Kind);
127 return getContext().getELFSection(SectionName, getXCoreSectionType(Kind),
128 getXCoreSectionFlags(Kind), Kind);
131 const MCSection *XCoreTargetObjectFile::
132 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang,
133 const TargetMachine &TM) const{
134 if (Kind.isText()) return TextSection;
135 if (Kind.isMergeable1ByteCString()) return CStringSection;
136 if (Kind.isMergeableConst4()) return MergeableConst4Section;
137 if (Kind.isMergeableConst8()) return MergeableConst8Section;
138 if (Kind.isMergeableConst16()) return MergeableConst16Section;
140 Type *ObjType = GV->getType()->getPointerElementType();
141 if (TM.getCodeModel() == CodeModel::Small ||
142 !ObjType->isSized() ||
143 TM.getDataLayout()->getTypeAllocSize(ObjType) < CodeModelLargeSize) {
144 if (Kind.isReadOnly()) return ReadOnlySection;
145 if (Kind.isBSS()) return BSSSection;
146 if (Kind.isDataRel()) return DataSection;
147 if (Kind.isReadOnlyWithRel()) return ReadOnlySection;
149 if (Kind.isReadOnly()) return ReadOnlySectionLarge;
150 if (Kind.isBSS()) return BSSSectionLarge;
151 if (Kind.isDataRel()) return DataSectionLarge;
152 if (Kind.isReadOnlyWithRel()) return ReadOnlySectionLarge;
155 assert((Kind.isThreadLocal() || Kind.isCommon()) && "Unknown section kind");
156 report_fatal_error("Target does not support TLS or Common sections");
159 const MCSection *XCoreTargetObjectFile::
160 getSectionForConstant(SectionKind Kind) const {
161 if (Kind.isMergeableConst4()) return MergeableConst4Section;
162 if (Kind.isMergeableConst8()) return MergeableConst8Section;
163 if (Kind.isMergeableConst16()) return MergeableConst16Section;
164 assert((Kind.isReadOnly() || Kind.isReadOnlyWithRel()) &&
165 "Unknown section kind");
166 // We assume the size of the object is never greater than CodeModelLargeSize.
167 // To handle CodeModelLargeSize changes to AsmPrinter would be required.
168 return ReadOnlySection;