0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 //===- lib/MC/MCContext.cpp - Machine Code Context ------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // The LLVM Compiler Infrastructure
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 // This file is distributed under the University of Illinois Open Source
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 // License. See LICENSE.TXT for details.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 #include "llvm/MC/MCContext.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 #include "llvm/ADT/SmallString.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 #include "llvm/ADT/Twine.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 #include "llvm/MC/MCAsmInfo.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 #include "llvm/MC/MCDwarf.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 #include "llvm/MC/MCLabel.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 #include "llvm/MC/MCObjectFileInfo.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 #include "llvm/MC/MCRegisterInfo.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 #include "llvm/MC/MCSectionCOFF.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 #include "llvm/MC/MCSectionELF.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 #include "llvm/MC/MCSectionMachO.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 #include "llvm/MC/MCSymbol.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 #include "llvm/Support/ELF.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 #include "llvm/Support/ErrorHandling.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 #include "llvm/Support/FileSystem.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 #include "llvm/Support/MemoryBuffer.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 #include "llvm/Support/Signals.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 #include "llvm/Support/SourceMgr.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 #include <map>
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 using namespace llvm;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 MCContext::MCContext(const MCAsmInfo *mai, const MCRegisterInfo *mri,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 const MCObjectFileInfo *mofi, const SourceMgr *mgr,
|
77
|
34 bool DoAutoReset)
|
|
35 : SrcMgr(mgr), MAI(mai), MRI(mri), MOFI(mofi), Allocator(),
|
|
36 Symbols(Allocator), UsedNames(Allocator), NextUniqueID(0),
|
|
37 CurrentDwarfLoc(0, 0, 0, DWARF2_FLAG_IS_STMT, 0, 0), DwarfLocSeen(false),
|
|
38 GenDwarfForAssembly(false), GenDwarfFileNumber(0), DwarfVersion(4),
|
|
39 AllowTemporaryLabels(true), DwarfCompileUnitID(0),
|
|
40 AutoReset(DoAutoReset) {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41
|
77
|
42 std::error_code EC = llvm::sys::fs::current_path(CompilationDir);
|
33
|
43 if (EC)
|
|
44 CompilationDir.clear();
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 SecureLogFile = getenv("AS_SECURE_LOG_FILE");
|
77
|
47 SecureLog = nullptr;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 SecureLogUsed = false;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49
|
77
|
50 if (SrcMgr && SrcMgr->getNumBuffers())
|
|
51 MainFileName =
|
|
52 SrcMgr->getMemoryBuffer(SrcMgr->getMainFileID())->getBufferIdentifier();
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 MCContext::~MCContext() {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 if (AutoReset)
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 reset();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 // NOTE: The symbols are all allocated out of a bump pointer allocator,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 // we don't need to free them here.
|
33
|
62
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 // If the stream for the .secure_log_unique directive was created free it.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 delete (raw_ostream*)SecureLog;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 // Module Lifetime Management
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 void MCContext::reset() {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 UsedNames.clear();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 Symbols.clear();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 Allocator.Reset();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 Instances.clear();
|
83
|
76 CompilationDir.clear();
|
|
77 MainFileName.clear();
|
77
|
78 MCDwarfLineTablesCUMap.clear();
|
83
|
79 SectionStartEndSyms.clear();
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 MCGenDwarfLabelEntries.clear();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 DwarfDebugFlags = StringRef();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 DwarfCompileUnitID = 0;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 CurrentDwarfLoc = MCDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84
|
77
|
85 MachOUniquingMap.clear();
|
|
86 ELFUniquingMap.clear();
|
|
87 COFFUniquingMap.clear();
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 NextUniqueID = 0;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 AllowTemporaryLabels = true;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 DwarfLocSeen = false;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 GenDwarfForAssembly = false;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 GenDwarfFileNumber = 0;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 // Symbol Manipulation
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 assert(!Name.empty() && "Normal symbols cannot be unnamed!");
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102
|
83
|
103 MCSymbol *&Sym = Symbols[Name];
|
|
104
|
|
105 if (!Sym)
|
|
106 Sym = CreateSymbol(Name);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107
|
83
|
108 return Sym;
|
|
109 }
|
|
110
|
|
111 MCSymbol *MCContext::getOrCreateSectionSymbol(const MCSectionELF &Section) {
|
|
112 MCSymbol *&Sym = SectionSymbols[&Section];
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 if (Sym)
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114 return Sym;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115
|
83
|
116 StringRef Name = Section.getSectionName();
|
|
117
|
|
118 MCSymbol *&OldSym = Symbols[Name];
|
|
119 if (OldSym && OldSym->isUndefined()) {
|
|
120 Sym = OldSym;
|
|
121 return OldSym;
|
|
122 }
|
|
123
|
|
124 auto NameIter = UsedNames.insert(std::make_pair(Name, true)).first;
|
|
125 Sym = new (*this) MCSymbol(NameIter->getKey(), /*isTemporary*/ false);
|
|
126
|
|
127 if (!OldSym)
|
|
128 OldSym = Sym;
|
|
129
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 return Sym;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132
|
83
|
133 MCSymbol *MCContext::getOrCreateFrameAllocSymbol(StringRef FuncName) {
|
|
134 return GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix()) +
|
|
135 "frameallocation_" + FuncName);
|
|
136 }
|
|
137
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 MCSymbol *MCContext::CreateSymbol(StringRef Name) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 // Determine whether this is an assembler temporary or normal label, if used.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 bool isTemporary = false;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 if (AllowTemporaryLabels)
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142 isTemporary = Name.startswith(MAI->getPrivateGlobalPrefix());
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143
|
83
|
144 auto NameEntry = UsedNames.insert(std::make_pair(Name, true));
|
|
145 if (!NameEntry.second) {
|
33
|
146 assert(isTemporary && "Cannot rename non-temporary symbols");
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147 SmallString<128> NewName = Name;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
148 do {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 NewName.resize(Name.size());
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 raw_svector_ostream(NewName) << NextUniqueID++;
|
83
|
151 NameEntry = UsedNames.insert(std::make_pair(NewName, true));
|
|
152 } while (!NameEntry.second);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
153 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 // Ok, the entry doesn't already exist. Have the MCSymbol object itself refer
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 // to the copy of the string that is embedded in the UsedNames entry.
|
83
|
157 MCSymbol *Result =
|
|
158 new (*this) MCSymbol(NameEntry.first->getKey(), isTemporary);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 return Result;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
163 MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164 SmallString<128> NameSV;
|
33
|
165 return GetOrCreateSymbol(Name.toStringRef(NameSV));
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
166 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
167
|
77
|
168 MCSymbol *MCContext::CreateLinkerPrivateTempSymbol() {
|
|
169 SmallString<128> NameSV;
|
|
170 raw_svector_ostream(NameSV)
|
|
171 << MAI->getLinkerPrivateGlobalPrefix() << "tmp" << NextUniqueID++;
|
|
172 return CreateSymbol(NameSV);
|
|
173 }
|
|
174
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
175 MCSymbol *MCContext::CreateTempSymbol() {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
176 SmallString<128> NameSV;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177 raw_svector_ostream(NameSV)
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178 << MAI->getPrivateGlobalPrefix() << "tmp" << NextUniqueID++;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 return CreateSymbol(NameSV);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
180 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
181
|
77
|
182 unsigned MCContext::NextInstance(unsigned LocalLabelVal) {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
183 MCLabel *&Label = Instances[LocalLabelVal];
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 if (!Label)
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 Label = new (*this) MCLabel(0);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
186 return Label->incInstance();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188
|
77
|
189 unsigned MCContext::GetInstance(unsigned LocalLabelVal) {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
190 MCLabel *&Label = Instances[LocalLabelVal];
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191 if (!Label)
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 Label = new (*this) MCLabel(0);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 return Label->getInstance();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195
|
77
|
196 MCSymbol *MCContext::getOrCreateDirectionalLocalSymbol(unsigned LocalLabelVal,
|
|
197 unsigned Instance) {
|
|
198 MCSymbol *&Sym = LocalSymbols[std::make_pair(LocalLabelVal, Instance)];
|
|
199 if (!Sym)
|
|
200 Sym = CreateTempSymbol();
|
|
201 return Sym;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 }
|
77
|
203
|
|
204 MCSymbol *MCContext::CreateDirectionalLocalSymbol(unsigned LocalLabelVal) {
|
|
205 unsigned Instance = NextInstance(LocalLabelVal);
|
|
206 return getOrCreateDirectionalLocalSymbol(LocalLabelVal, Instance);
|
|
207 }
|
|
208
|
|
209 MCSymbol *MCContext::GetDirectionalLocalSymbol(unsigned LocalLabelVal,
|
|
210 bool Before) {
|
|
211 unsigned Instance = GetInstance(LocalLabelVal);
|
|
212 if (!Before)
|
|
213 ++Instance;
|
|
214 return getOrCreateDirectionalLocalSymbol(LocalLabelVal, Instance);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
217 MCSymbol *MCContext::LookupSymbol(StringRef Name) const {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
218 return Symbols.lookup(Name);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
219 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
220
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
221 MCSymbol *MCContext::LookupSymbol(const Twine &Name) const {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
222 SmallString<128> NameSV;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
223 Name.toVector(NameSV);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
224 return LookupSymbol(NameSV.str());
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
225 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
226
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
227 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
228 // Section Management
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
229 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
230
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
231 const MCSectionMachO *MCContext::
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
232 getMachOSection(StringRef Segment, StringRef Section,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
233 unsigned TypeAndAttributes,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
234 unsigned Reserved2, SectionKind Kind) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
235
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
236 // We unique sections by their segment/section pair. The returned section
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
237 // may not have the same flags as the requested section, if so this should be
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
238 // diagnosed by the client as an error.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
239
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
240 // Form the name to look up.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
241 SmallString<64> Name;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
242 Name += Segment;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
243 Name.push_back(',');
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
244 Name += Section;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
245
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
246 // Do the lookup, if we have a hit, return it.
|
77
|
247 const MCSectionMachO *&Entry = MachOUniquingMap[Name.str()];
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
248 if (Entry) return Entry;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
249
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
250 // Otherwise, return a new section.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
251 return Entry = new (*this) MCSectionMachO(Segment, Section, TypeAndAttributes,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
252 Reserved2, Kind);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
253 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
254
|
83
|
255 const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
|
|
256 unsigned Flags) {
|
|
257 return getELFSection(Section, Type, Flags, 0, "");
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
258 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
259
|
77
|
260 void MCContext::renameELFSection(const MCSectionELF *Section, StringRef Name) {
|
|
261 StringRef GroupName;
|
|
262 if (const MCSymbol *Group = Section->getGroup())
|
|
263 GroupName = Group->getName();
|
|
264
|
|
265 ELFUniquingMap.erase(SectionGroupPair(Section->getSectionName(), GroupName));
|
|
266 auto I =
|
|
267 ELFUniquingMap.insert(std::make_pair(SectionGroupPair(Name, GroupName),
|
|
268 Section)).first;
|
|
269 StringRef CachedName = I->first.first;
|
|
270 const_cast<MCSectionELF*>(Section)->setSectionName(CachedName);
|
|
271 }
|
|
272
|
83
|
273 const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
|
|
274 unsigned Flags, unsigned EntrySize,
|
|
275 StringRef Group, bool Unique) {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
276 // Do the lookup, if we have a hit, return it.
|
77
|
277 auto IterBool = ELFUniquingMap.insert(
|
|
278 std::make_pair(SectionGroupPair(Section, Group), nullptr));
|
|
279 auto &Entry = *IterBool.first;
|
83
|
280 if (!IterBool.second && !Unique)
|
|
281 return Entry.second;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
282
|
77
|
283 MCSymbol *GroupSym = nullptr;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
284 if (!Group.empty())
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
285 GroupSym = GetOrCreateSymbol(Group);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
286
|
77
|
287 StringRef CachedName = Entry.first.first;
|
83
|
288
|
|
289 SectionKind Kind;
|
|
290 if (Flags & ELF::SHF_EXECINSTR)
|
|
291 Kind = SectionKind::getText();
|
|
292 else
|
|
293 Kind = SectionKind::getReadOnly();
|
|
294
|
77
|
295 MCSectionELF *Result = new (*this)
|
83
|
296 MCSectionELF(CachedName, Type, Flags, Kind, EntrySize, GroupSym, Unique);
|
|
297 if (!Unique)
|
|
298 Entry.second = Result;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
299 return Result;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
300 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
301
|
83
|
302 const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
|
|
303 unsigned Flags, unsigned EntrySize,
|
|
304 StringRef Group) {
|
|
305 return getELFSection(Section, Type, Flags, EntrySize, Group, false);
|
|
306 }
|
|
307
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
308 const MCSectionELF *MCContext::CreateELFGroupSection() {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
309 MCSectionELF *Result =
|
83
|
310 new (*this) MCSectionELF(".group", ELF::SHT_GROUP, 0,
|
|
311 SectionKind::getReadOnly(), 4, nullptr, false);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
312 return Result;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
313 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
314
|
77
|
315 const MCSectionCOFF *MCContext::getCOFFSection(StringRef Section,
|
|
316 unsigned Characteristics,
|
|
317 SectionKind Kind,
|
|
318 StringRef COMDATSymName,
|
|
319 int Selection) {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
320 // Do the lookup, if we have a hit, return it.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
321
|
77
|
322 SectionGroupTriple T(Section, COMDATSymName, Selection);
|
|
323 auto IterBool = COFFUniquingMap.insert(std::make_pair(T, nullptr));
|
|
324 auto Iter = IterBool.first;
|
|
325 if (!IterBool.second)
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
326 return Iter->second;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
327
|
77
|
328 MCSymbol *COMDATSymbol = nullptr;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
329 if (!COMDATSymName.empty())
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
330 COMDATSymbol = GetOrCreateSymbol(COMDATSymName);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
331
|
77
|
332 StringRef CachedName = std::get<0>(Iter->first);
|
|
333 MCSectionCOFF *Result = new (*this)
|
|
334 MCSectionCOFF(CachedName, Characteristics, COMDATSymbol, Selection, Kind);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
335
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
336 Iter->second = Result;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
337 return Result;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
338 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
339
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
340 const MCSectionCOFF *
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
341 MCContext::getCOFFSection(StringRef Section, unsigned Characteristics,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
342 SectionKind Kind) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
343 return getCOFFSection(Section, Characteristics, Kind, "", 0);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
344 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
345
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
346 const MCSectionCOFF *MCContext::getCOFFSection(StringRef Section) {
|
77
|
347 SectionGroupTriple T(Section, "", 0);
|
|
348 auto Iter = COFFUniquingMap.find(T);
|
|
349 if (Iter == COFFUniquingMap.end())
|
|
350 return nullptr;
|
|
351 return Iter->second;
|
|
352 }
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
353
|
77
|
354 const MCSectionCOFF *
|
|
355 MCContext::getAssociativeCOFFSection(const MCSectionCOFF *Sec,
|
|
356 const MCSymbol *KeySym) {
|
|
357 // Return the normal section if we don't have to be associative.
|
|
358 if (!KeySym)
|
|
359 return Sec;
|
|
360
|
|
361 // Make an associative section with the same name and kind as the normal
|
|
362 // section.
|
|
363 unsigned Characteristics =
|
|
364 Sec->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT;
|
|
365 return getCOFFSection(Sec->getSectionName(), Characteristics, Sec->getKind(),
|
|
366 KeySym->getName(),
|
|
367 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
368 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
369
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
370 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
371 // Dwarf Management
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
372 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
373
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
374 /// GetDwarfFile - takes a file name an number to place in the dwarf file and
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
375 /// directory tables. If the file number has already been allocated it is an
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
376 /// error and zero is returned and the client reports the error, else the
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
377 /// allocated file number is returned. The file numbers may be in any order.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
378 unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
379 unsigned FileNumber, unsigned CUID) {
|
77
|
380 MCDwarfLineTable &Table = MCDwarfLineTablesCUMap[CUID];
|
|
381 return Table.getFile(Directory, FileName, FileNumber);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
382 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
383
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
384 /// isValidDwarfFileNumber - takes a dwarf file number and returns true if it
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
385 /// currently is assigned and false otherwise.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
386 bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) {
|
77
|
387 const SmallVectorImpl<MCDwarfFile>& MCDwarfFiles = getMCDwarfFiles(CUID);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
388 if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size())
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
389 return false;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
390
|
77
|
391 return !MCDwarfFiles[FileNumber].Name.empty();
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
392 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
393
|
77
|
394 /// finalizeDwarfSections - Emit end symbols for each non-empty code section.
|
|
395 /// Also remove empty sections from SectionStartEndSyms, to avoid generating
|
|
396 /// useless debug info for them.
|
|
397 void MCContext::finalizeDwarfSections(MCStreamer &MCOS) {
|
|
398 MCContext &context = MCOS.getContext();
|
|
399
|
|
400 auto sec = SectionStartEndSyms.begin();
|
|
401 while (sec != SectionStartEndSyms.end()) {
|
|
402 assert(sec->second.first && "Start symbol must be set by now");
|
|
403 MCOS.SwitchSection(sec->first);
|
|
404 if (MCOS.mayHaveInstructions()) {
|
|
405 MCSymbol *SectionEndSym = context.CreateTempSymbol();
|
|
406 MCOS.EmitLabel(SectionEndSym);
|
|
407 sec->second.second = SectionEndSym;
|
|
408 ++sec;
|
|
409 } else {
|
|
410 MapVector<const MCSection *, std::pair<MCSymbol *, MCSymbol *> >::iterator
|
|
411 to_erase = sec;
|
|
412 sec = SectionStartEndSyms.erase(to_erase);
|
|
413 }
|
|
414 }
|
|
415 }
|
|
416
|
|
417 void MCContext::FatalError(SMLoc Loc, const Twine &Msg) const {
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
418 // If we have a source manager and a location, use it. Otherwise just
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
419 // use the generic report_fatal_error().
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
420 if (!SrcMgr || Loc == SMLoc())
|
77
|
421 report_fatal_error(Msg, false);
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
422
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
423 // Use the source manager to print the message.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
424 SrcMgr->PrintMessage(Loc, SourceMgr::DK_Error, Msg);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
425
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
426 // If we reached here, we are failing ungracefully. Run the interrupt handlers
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
427 // to make sure any special cleanups get done, in particular that we remove
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
428 // files registered with RemoveFileOnSignal.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
429 sys::RunInterruptHandlers();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
430 exit(1);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
431 }
|