annotate llvm/lib/MC/MCStreamer.cpp @ 180:680fa57a2f20

fix compile errors.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 30 May 2020 17:44:06 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- lib/MC/MCStreamer.cpp - Streaming Machine Code Output --------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "llvm/MC/MCStreamer.h"
anatofuz
parents:
diff changeset
10 #include "llvm/ADT/Optional.h"
anatofuz
parents:
diff changeset
11 #include "llvm/ADT/SmallString.h"
anatofuz
parents:
diff changeset
12 #include "llvm/ADT/StringRef.h"
anatofuz
parents:
diff changeset
13 #include "llvm/ADT/Twine.h"
anatofuz
parents:
diff changeset
14 #include "llvm/BinaryFormat/COFF.h"
anatofuz
parents:
diff changeset
15 #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
anatofuz
parents:
diff changeset
16 #include "llvm/MC/MCAsmBackend.h"
anatofuz
parents:
diff changeset
17 #include "llvm/MC/MCAsmInfo.h"
anatofuz
parents:
diff changeset
18 #include "llvm/MC/MCCodeView.h"
anatofuz
parents:
diff changeset
19 #include "llvm/MC/MCContext.h"
anatofuz
parents:
diff changeset
20 #include "llvm/MC/MCDwarf.h"
anatofuz
parents:
diff changeset
21 #include "llvm/MC/MCExpr.h"
anatofuz
parents:
diff changeset
22 #include "llvm/MC/MCInst.h"
anatofuz
parents:
diff changeset
23 #include "llvm/MC/MCInstPrinter.h"
anatofuz
parents:
diff changeset
24 #include "llvm/MC/MCObjectFileInfo.h"
anatofuz
parents:
diff changeset
25 #include "llvm/MC/MCRegister.h"
anatofuz
parents:
diff changeset
26 #include "llvm/MC/MCRegisterInfo.h"
anatofuz
parents:
diff changeset
27 #include "llvm/MC/MCSection.h"
anatofuz
parents:
diff changeset
28 #include "llvm/MC/MCSectionCOFF.h"
anatofuz
parents:
diff changeset
29 #include "llvm/MC/MCSymbol.h"
anatofuz
parents:
diff changeset
30 #include "llvm/MC/MCWin64EH.h"
anatofuz
parents:
diff changeset
31 #include "llvm/MC/MCWinEH.h"
anatofuz
parents:
diff changeset
32 #include "llvm/Support/Casting.h"
anatofuz
parents:
diff changeset
33 #include "llvm/Support/ErrorHandling.h"
anatofuz
parents:
diff changeset
34 #include "llvm/Support/LEB128.h"
anatofuz
parents:
diff changeset
35 #include "llvm/Support/MathExtras.h"
anatofuz
parents:
diff changeset
36 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
37 #include <cassert>
anatofuz
parents:
diff changeset
38 #include <cstdint>
anatofuz
parents:
diff changeset
39 #include <cstdlib>
anatofuz
parents:
diff changeset
40 #include <utility>
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 using namespace llvm;
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 MCTargetStreamer::MCTargetStreamer(MCStreamer &S) : Streamer(S) {
anatofuz
parents:
diff changeset
45 S.setTargetStreamer(this);
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 // Pin the vtables to this file.
anatofuz
parents:
diff changeset
49 MCTargetStreamer::~MCTargetStreamer() = default;
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 void MCTargetStreamer::emitLabel(MCSymbol *Symbol) {}
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 void MCTargetStreamer::finish() {}
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 void MCTargetStreamer::changeSection(const MCSection *CurSection,
anatofuz
parents:
diff changeset
56 MCSection *Section,
anatofuz
parents:
diff changeset
57 const MCExpr *Subsection,
anatofuz
parents:
diff changeset
58 raw_ostream &OS) {
anatofuz
parents:
diff changeset
59 Section->PrintSwitchToSection(
anatofuz
parents:
diff changeset
60 *Streamer.getContext().getAsmInfo(),
anatofuz
parents:
diff changeset
61 Streamer.getContext().getObjectFileInfo()->getTargetTriple(), OS,
anatofuz
parents:
diff changeset
62 Subsection);
anatofuz
parents:
diff changeset
63 }
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 void MCTargetStreamer::emitDwarfFileDirective(StringRef Directive) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 Streamer.emitRawText(Directive);
150
anatofuz
parents:
diff changeset
67 }
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 void MCTargetStreamer::emitValue(const MCExpr *Value) {
anatofuz
parents:
diff changeset
70 SmallString<128> Str;
anatofuz
parents:
diff changeset
71 raw_svector_ostream OS(Str);
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73 Value->print(OS, Streamer.getContext().getAsmInfo());
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
74 Streamer.emitRawText(OS.str());
150
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 void MCTargetStreamer::emitRawBytes(StringRef Data) {
anatofuz
parents:
diff changeset
78 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
anatofuz
parents:
diff changeset
79 const char *Directive = MAI->getData8bitsDirective();
anatofuz
parents:
diff changeset
80 for (const unsigned char C : Data.bytes()) {
anatofuz
parents:
diff changeset
81 SmallString<128> Str;
anatofuz
parents:
diff changeset
82 raw_svector_ostream OS(Str);
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 OS << Directive << (unsigned)C;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
85 Streamer.emitRawText(OS.str());
150
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 void MCTargetStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 MCStreamer::MCStreamer(MCContext &Ctx)
anatofuz
parents:
diff changeset
92 : Context(Ctx), CurrentWinFrameInfo(nullptr),
anatofuz
parents:
diff changeset
93 UseAssemblerInfoForParsing(false) {
anatofuz
parents:
diff changeset
94 SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
anatofuz
parents:
diff changeset
95 }
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97 MCStreamer::~MCStreamer() {}
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99 void MCStreamer::reset() {
anatofuz
parents:
diff changeset
100 DwarfFrameInfos.clear();
anatofuz
parents:
diff changeset
101 CurrentWinFrameInfo = nullptr;
anatofuz
parents:
diff changeset
102 WinFrameInfos.clear();
anatofuz
parents:
diff changeset
103 SymbolOrdering.clear();
anatofuz
parents:
diff changeset
104 SectionStack.clear();
anatofuz
parents:
diff changeset
105 SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
anatofuz
parents:
diff changeset
106 }
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 raw_ostream &MCStreamer::GetCommentOS() {
anatofuz
parents:
diff changeset
109 // By default, discard comments.
anatofuz
parents:
diff changeset
110 return nulls();
anatofuz
parents:
diff changeset
111 }
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 unsigned MCStreamer::getNumFrameInfos() { return DwarfFrameInfos.size(); }
anatofuz
parents:
diff changeset
114 ArrayRef<MCDwarfFrameInfo> MCStreamer::getDwarfFrameInfos() const {
anatofuz
parents:
diff changeset
115 return DwarfFrameInfos;
anatofuz
parents:
diff changeset
116 }
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 void MCStreamer::emitRawComment(const Twine &T, bool TabPrefix) {}
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 void MCStreamer::addExplicitComment(const Twine &T) {}
anatofuz
parents:
diff changeset
121 void MCStreamer::emitExplicitComments() {}
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 void MCStreamer::generateCompactUnwindEncodings(MCAsmBackend *MAB) {
anatofuz
parents:
diff changeset
124 for (auto &FI : DwarfFrameInfos)
anatofuz
parents:
diff changeset
125 FI.CompactUnwindEncoding =
anatofuz
parents:
diff changeset
126 (MAB ? MAB->generateCompactUnwindEncoding(FI.Instructions) : 0);
anatofuz
parents:
diff changeset
127 }
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 /// EmitIntValue - Special case of EmitValue that avoids the client having to
anatofuz
parents:
diff changeset
130 /// pass in a MCExpr for constant integers.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
131 void MCStreamer::emitIntValue(uint64_t Value, unsigned Size) {
150
anatofuz
parents:
diff changeset
132 assert(1 <= Size && Size <= 8 && "Invalid size");
anatofuz
parents:
diff changeset
133 assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
anatofuz
parents:
diff changeset
134 "Invalid size");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
135 const bool IsLittleEndian = Context.getAsmInfo()->isLittleEndian();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
136 uint64_t Swapped = support::endian::byte_swap(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
137 Value, IsLittleEndian ? support::little : support::big);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
138 unsigned Index = IsLittleEndian ? 0 : 8 - Size;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
139 emitBytes(StringRef(reinterpret_cast<char *>(&Swapped) + Index, Size));
150
anatofuz
parents:
diff changeset
140 }
anatofuz
parents:
diff changeset
141
anatofuz
parents:
diff changeset
142 /// EmitULEB128IntValue - Special case of EmitULEB128Value that avoids the
anatofuz
parents:
diff changeset
143 /// client having to pass in a MCExpr for constant integers.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
144 void MCStreamer::emitULEB128IntValue(uint64_t Value, unsigned PadTo) {
150
anatofuz
parents:
diff changeset
145 SmallString<128> Tmp;
anatofuz
parents:
diff changeset
146 raw_svector_ostream OSE(Tmp);
anatofuz
parents:
diff changeset
147 encodeULEB128(Value, OSE, PadTo);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
148 emitBytes(OSE.str());
150
anatofuz
parents:
diff changeset
149 }
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 /// EmitSLEB128IntValue - Special case of EmitSLEB128Value that avoids the
anatofuz
parents:
diff changeset
152 /// client having to pass in a MCExpr for constant integers.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
153 void MCStreamer::emitSLEB128IntValue(int64_t Value) {
150
anatofuz
parents:
diff changeset
154 SmallString<128> Tmp;
anatofuz
parents:
diff changeset
155 raw_svector_ostream OSE(Tmp);
anatofuz
parents:
diff changeset
156 encodeSLEB128(Value, OSE);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
157 emitBytes(OSE.str());
150
anatofuz
parents:
diff changeset
158 }
anatofuz
parents:
diff changeset
159
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
160 void MCStreamer::emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
161 emitValueImpl(Value, Size, Loc);
150
anatofuz
parents:
diff changeset
162 }
anatofuz
parents:
diff changeset
163
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
164 void MCStreamer::emitSymbolValue(const MCSymbol *Sym, unsigned Size,
150
anatofuz
parents:
diff changeset
165 bool IsSectionRelative) {
anatofuz
parents:
diff changeset
166 assert((!IsSectionRelative || Size == 4) &&
anatofuz
parents:
diff changeset
167 "SectionRelative value requires 4-bytes");
anatofuz
parents:
diff changeset
168
anatofuz
parents:
diff changeset
169 if (!IsSectionRelative)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
170 emitValueImpl(MCSymbolRefExpr::create(Sym, getContext()), Size);
150
anatofuz
parents:
diff changeset
171 else
anatofuz
parents:
diff changeset
172 EmitCOFFSecRel32(Sym, /*Offset=*/0);
anatofuz
parents:
diff changeset
173 }
anatofuz
parents:
diff changeset
174
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
175 void MCStreamer::emitDTPRel64Value(const MCExpr *Value) {
150
anatofuz
parents:
diff changeset
176 report_fatal_error("unsupported directive in streamer");
anatofuz
parents:
diff changeset
177 }
anatofuz
parents:
diff changeset
178
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
179 void MCStreamer::emitDTPRel32Value(const MCExpr *Value) {
150
anatofuz
parents:
diff changeset
180 report_fatal_error("unsupported directive in streamer");
anatofuz
parents:
diff changeset
181 }
anatofuz
parents:
diff changeset
182
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
183 void MCStreamer::emitTPRel64Value(const MCExpr *Value) {
150
anatofuz
parents:
diff changeset
184 report_fatal_error("unsupported directive in streamer");
anatofuz
parents:
diff changeset
185 }
anatofuz
parents:
diff changeset
186
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
187 void MCStreamer::emitTPRel32Value(const MCExpr *Value) {
150
anatofuz
parents:
diff changeset
188 report_fatal_error("unsupported directive in streamer");
anatofuz
parents:
diff changeset
189 }
anatofuz
parents:
diff changeset
190
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
191 void MCStreamer::emitGPRel64Value(const MCExpr *Value) {
150
anatofuz
parents:
diff changeset
192 report_fatal_error("unsupported directive in streamer");
anatofuz
parents:
diff changeset
193 }
anatofuz
parents:
diff changeset
194
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
195 void MCStreamer::emitGPRel32Value(const MCExpr *Value) {
150
anatofuz
parents:
diff changeset
196 report_fatal_error("unsupported directive in streamer");
anatofuz
parents:
diff changeset
197 }
anatofuz
parents:
diff changeset
198
anatofuz
parents:
diff changeset
199 /// Emit NumBytes bytes worth of the value specified by FillValue.
anatofuz
parents:
diff changeset
200 /// This implements directives such as '.space'.
anatofuz
parents:
diff changeset
201 void MCStreamer::emitFill(uint64_t NumBytes, uint8_t FillValue) {
anatofuz
parents:
diff changeset
202 emitFill(*MCConstantExpr::create(NumBytes, getContext()), FillValue);
anatofuz
parents:
diff changeset
203 }
anatofuz
parents:
diff changeset
204
anatofuz
parents:
diff changeset
205 /// The implementation in this class just redirects to emitFill.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
206 void MCStreamer::emitZeros(uint64_t NumBytes) { emitFill(NumBytes, 0); }
150
anatofuz
parents:
diff changeset
207
anatofuz
parents:
diff changeset
208 Expected<unsigned>
anatofuz
parents:
diff changeset
209 MCStreamer::tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
anatofuz
parents:
diff changeset
210 StringRef Filename,
anatofuz
parents:
diff changeset
211 Optional<MD5::MD5Result> Checksum,
anatofuz
parents:
diff changeset
212 Optional<StringRef> Source,
anatofuz
parents:
diff changeset
213 unsigned CUID) {
anatofuz
parents:
diff changeset
214 return getContext().getDwarfFile(Directory, Filename, FileNo, Checksum,
anatofuz
parents:
diff changeset
215 Source, CUID);
anatofuz
parents:
diff changeset
216 }
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 void MCStreamer::emitDwarfFile0Directive(StringRef Directory,
anatofuz
parents:
diff changeset
219 StringRef Filename,
anatofuz
parents:
diff changeset
220 Optional<MD5::MD5Result> Checksum,
anatofuz
parents:
diff changeset
221 Optional<StringRef> Source,
anatofuz
parents:
diff changeset
222 unsigned CUID) {
anatofuz
parents:
diff changeset
223 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
anatofuz
parents:
diff changeset
224 Source);
anatofuz
parents:
diff changeset
225 }
anatofuz
parents:
diff changeset
226
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
227 void MCStreamer::emitCFIBKeyFrame() {
150
anatofuz
parents:
diff changeset
228 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
229 if (!CurFrame)
anatofuz
parents:
diff changeset
230 return;
anatofuz
parents:
diff changeset
231 CurFrame->IsBKeyFrame = true;
anatofuz
parents:
diff changeset
232 }
anatofuz
parents:
diff changeset
233
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
234 void MCStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
150
anatofuz
parents:
diff changeset
235 unsigned Column, unsigned Flags,
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
236 unsigned Isa, unsigned Discriminator,
150
anatofuz
parents:
diff changeset
237 StringRef FileName) {
anatofuz
parents:
diff changeset
238 getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
anatofuz
parents:
diff changeset
239 Discriminator);
anatofuz
parents:
diff changeset
240 }
anatofuz
parents:
diff changeset
241
anatofuz
parents:
diff changeset
242 MCSymbol *MCStreamer::getDwarfLineTableSymbol(unsigned CUID) {
anatofuz
parents:
diff changeset
243 MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
anatofuz
parents:
diff changeset
244 if (!Table.getLabel()) {
anatofuz
parents:
diff changeset
245 StringRef Prefix = Context.getAsmInfo()->getPrivateGlobalPrefix();
anatofuz
parents:
diff changeset
246 Table.setLabel(
anatofuz
parents:
diff changeset
247 Context.getOrCreateSymbol(Prefix + "line_table_start" + Twine(CUID)));
anatofuz
parents:
diff changeset
248 }
anatofuz
parents:
diff changeset
249 return Table.getLabel();
anatofuz
parents:
diff changeset
250 }
anatofuz
parents:
diff changeset
251
anatofuz
parents:
diff changeset
252 bool MCStreamer::hasUnfinishedDwarfFrameInfo() {
anatofuz
parents:
diff changeset
253 return !DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End;
anatofuz
parents:
diff changeset
254 }
anatofuz
parents:
diff changeset
255
anatofuz
parents:
diff changeset
256 MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo() {
anatofuz
parents:
diff changeset
257 if (!hasUnfinishedDwarfFrameInfo()) {
anatofuz
parents:
diff changeset
258 getContext().reportError(SMLoc(), "this directive must appear between "
anatofuz
parents:
diff changeset
259 ".cfi_startproc and .cfi_endproc "
anatofuz
parents:
diff changeset
260 "directives");
anatofuz
parents:
diff changeset
261 return nullptr;
anatofuz
parents:
diff changeset
262 }
anatofuz
parents:
diff changeset
263 return &DwarfFrameInfos.back();
anatofuz
parents:
diff changeset
264 }
anatofuz
parents:
diff changeset
265
anatofuz
parents:
diff changeset
266 bool MCStreamer::EmitCVFileDirective(unsigned FileNo, StringRef Filename,
anatofuz
parents:
diff changeset
267 ArrayRef<uint8_t> Checksum,
anatofuz
parents:
diff changeset
268 unsigned ChecksumKind) {
anatofuz
parents:
diff changeset
269 return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
anatofuz
parents:
diff changeset
270 ChecksumKind);
anatofuz
parents:
diff changeset
271 }
anatofuz
parents:
diff changeset
272
anatofuz
parents:
diff changeset
273 bool MCStreamer::EmitCVFuncIdDirective(unsigned FunctionId) {
anatofuz
parents:
diff changeset
274 return getContext().getCVContext().recordFunctionId(FunctionId);
anatofuz
parents:
diff changeset
275 }
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 bool MCStreamer::EmitCVInlineSiteIdDirective(unsigned FunctionId,
anatofuz
parents:
diff changeset
278 unsigned IAFunc, unsigned IAFile,
anatofuz
parents:
diff changeset
279 unsigned IALine, unsigned IACol,
anatofuz
parents:
diff changeset
280 SMLoc Loc) {
anatofuz
parents:
diff changeset
281 if (getContext().getCVContext().getCVFunctionInfo(IAFunc) == nullptr) {
anatofuz
parents:
diff changeset
282 getContext().reportError(Loc, "parent function id not introduced by "
anatofuz
parents:
diff changeset
283 ".cv_func_id or .cv_inline_site_id");
anatofuz
parents:
diff changeset
284 return true;
anatofuz
parents:
diff changeset
285 }
anatofuz
parents:
diff changeset
286
anatofuz
parents:
diff changeset
287 return getContext().getCVContext().recordInlinedCallSiteId(
anatofuz
parents:
diff changeset
288 FunctionId, IAFunc, IAFile, IALine, IACol);
anatofuz
parents:
diff changeset
289 }
anatofuz
parents:
diff changeset
290
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
291 void MCStreamer::emitCVLocDirective(unsigned FunctionId, unsigned FileNo,
150
anatofuz
parents:
diff changeset
292 unsigned Line, unsigned Column,
anatofuz
parents:
diff changeset
293 bool PrologueEnd, bool IsStmt,
anatofuz
parents:
diff changeset
294 StringRef FileName, SMLoc Loc) {}
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 bool MCStreamer::checkCVLocSection(unsigned FuncId, unsigned FileNo,
anatofuz
parents:
diff changeset
297 SMLoc Loc) {
anatofuz
parents:
diff changeset
298 CodeViewContext &CVC = getContext().getCVContext();
anatofuz
parents:
diff changeset
299 MCCVFunctionInfo *FI = CVC.getCVFunctionInfo(FuncId);
anatofuz
parents:
diff changeset
300 if (!FI) {
anatofuz
parents:
diff changeset
301 getContext().reportError(
anatofuz
parents:
diff changeset
302 Loc, "function id not introduced by .cv_func_id or .cv_inline_site_id");
anatofuz
parents:
diff changeset
303 return false;
anatofuz
parents:
diff changeset
304 }
anatofuz
parents:
diff changeset
305
anatofuz
parents:
diff changeset
306 // Track the section
anatofuz
parents:
diff changeset
307 if (FI->Section == nullptr)
anatofuz
parents:
diff changeset
308 FI->Section = getCurrentSectionOnly();
anatofuz
parents:
diff changeset
309 else if (FI->Section != getCurrentSectionOnly()) {
anatofuz
parents:
diff changeset
310 getContext().reportError(
anatofuz
parents:
diff changeset
311 Loc,
anatofuz
parents:
diff changeset
312 "all .cv_loc directives for a function must be in the same section");
anatofuz
parents:
diff changeset
313 return false;
anatofuz
parents:
diff changeset
314 }
anatofuz
parents:
diff changeset
315 return true;
anatofuz
parents:
diff changeset
316 }
anatofuz
parents:
diff changeset
317
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
318 void MCStreamer::emitCVLinetableDirective(unsigned FunctionId,
150
anatofuz
parents:
diff changeset
319 const MCSymbol *Begin,
anatofuz
parents:
diff changeset
320 const MCSymbol *End) {}
anatofuz
parents:
diff changeset
321
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
322 void MCStreamer::emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
150
anatofuz
parents:
diff changeset
323 unsigned SourceFileId,
anatofuz
parents:
diff changeset
324 unsigned SourceLineNum,
anatofuz
parents:
diff changeset
325 const MCSymbol *FnStartSym,
anatofuz
parents:
diff changeset
326 const MCSymbol *FnEndSym) {}
anatofuz
parents:
diff changeset
327
anatofuz
parents:
diff changeset
328 /// Only call this on endian-specific types like ulittle16_t and little32_t, or
anatofuz
parents:
diff changeset
329 /// structs composed of them.
anatofuz
parents:
diff changeset
330 template <typename T>
anatofuz
parents:
diff changeset
331 static void copyBytesForDefRange(SmallString<20> &BytePrefix,
anatofuz
parents:
diff changeset
332 codeview::SymbolKind SymKind,
anatofuz
parents:
diff changeset
333 const T &DefRangeHeader) {
anatofuz
parents:
diff changeset
334 BytePrefix.resize(2 + sizeof(T));
anatofuz
parents:
diff changeset
335 codeview::ulittle16_t SymKindLE = codeview::ulittle16_t(SymKind);
anatofuz
parents:
diff changeset
336 memcpy(&BytePrefix[0], &SymKindLE, 2);
anatofuz
parents:
diff changeset
337 memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
anatofuz
parents:
diff changeset
338 }
anatofuz
parents:
diff changeset
339
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
340 void MCStreamer::emitCVDefRangeDirective(
150
anatofuz
parents:
diff changeset
341 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
anatofuz
parents:
diff changeset
342 StringRef FixedSizePortion) {}
anatofuz
parents:
diff changeset
343
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
344 void MCStreamer::emitCVDefRangeDirective(
150
anatofuz
parents:
diff changeset
345 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
anatofuz
parents:
diff changeset
346 codeview::DefRangeRegisterRelHeader DRHdr) {
anatofuz
parents:
diff changeset
347 SmallString<20> BytePrefix;
anatofuz
parents:
diff changeset
348 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL, DRHdr);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
349 emitCVDefRangeDirective(Ranges, BytePrefix);
150
anatofuz
parents:
diff changeset
350 }
anatofuz
parents:
diff changeset
351
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
352 void MCStreamer::emitCVDefRangeDirective(
150
anatofuz
parents:
diff changeset
353 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
anatofuz
parents:
diff changeset
354 codeview::DefRangeSubfieldRegisterHeader DRHdr) {
anatofuz
parents:
diff changeset
355 SmallString<20> BytePrefix;
anatofuz
parents:
diff changeset
356 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_SUBFIELD_REGISTER,
anatofuz
parents:
diff changeset
357 DRHdr);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
358 emitCVDefRangeDirective(Ranges, BytePrefix);
150
anatofuz
parents:
diff changeset
359 }
anatofuz
parents:
diff changeset
360
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
361 void MCStreamer::emitCVDefRangeDirective(
150
anatofuz
parents:
diff changeset
362 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
anatofuz
parents:
diff changeset
363 codeview::DefRangeRegisterHeader DRHdr) {
anatofuz
parents:
diff changeset
364 SmallString<20> BytePrefix;
anatofuz
parents:
diff changeset
365 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER, DRHdr);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
366 emitCVDefRangeDirective(Ranges, BytePrefix);
150
anatofuz
parents:
diff changeset
367 }
anatofuz
parents:
diff changeset
368
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
369 void MCStreamer::emitCVDefRangeDirective(
150
anatofuz
parents:
diff changeset
370 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
anatofuz
parents:
diff changeset
371 codeview::DefRangeFramePointerRelHeader DRHdr) {
anatofuz
parents:
diff changeset
372 SmallString<20> BytePrefix;
anatofuz
parents:
diff changeset
373 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_FRAMEPOINTER_REL,
anatofuz
parents:
diff changeset
374 DRHdr);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
375 emitCVDefRangeDirective(Ranges, BytePrefix);
150
anatofuz
parents:
diff changeset
376 }
anatofuz
parents:
diff changeset
377
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
378 void MCStreamer::emitEHSymAttributes(const MCSymbol *Symbol,
150
anatofuz
parents:
diff changeset
379 MCSymbol *EHSymbol) {
anatofuz
parents:
diff changeset
380 }
anatofuz
parents:
diff changeset
381
anatofuz
parents:
diff changeset
382 void MCStreamer::InitSections(bool NoExecStack) {
anatofuz
parents:
diff changeset
383 SwitchSection(getContext().getObjectFileInfo()->getTextSection());
anatofuz
parents:
diff changeset
384 }
anatofuz
parents:
diff changeset
385
anatofuz
parents:
diff changeset
386 void MCStreamer::AssignFragment(MCSymbol *Symbol, MCFragment *Fragment) {
anatofuz
parents:
diff changeset
387 assert(Fragment);
anatofuz
parents:
diff changeset
388 Symbol->setFragment(Fragment);
anatofuz
parents:
diff changeset
389
anatofuz
parents:
diff changeset
390 // As we emit symbols into a section, track the order so that they can
anatofuz
parents:
diff changeset
391 // be sorted upon later. Zero is reserved to mean 'unemitted'.
anatofuz
parents:
diff changeset
392 SymbolOrdering[Symbol] = 1 + SymbolOrdering.size();
anatofuz
parents:
diff changeset
393 }
anatofuz
parents:
diff changeset
394
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
395 void MCStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
150
anatofuz
parents:
diff changeset
396 Symbol->redefineIfPossible();
anatofuz
parents:
diff changeset
397
anatofuz
parents:
diff changeset
398 if (!Symbol->isUndefined() || Symbol->isVariable())
anatofuz
parents:
diff changeset
399 return getContext().reportError(Loc, "invalid symbol redefinition");
anatofuz
parents:
diff changeset
400
anatofuz
parents:
diff changeset
401 assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
anatofuz
parents:
diff changeset
402 assert(getCurrentSectionOnly() && "Cannot emit before setting section!");
anatofuz
parents:
diff changeset
403 assert(!Symbol->getFragment() && "Unexpected fragment on symbol data!");
anatofuz
parents:
diff changeset
404 assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
anatofuz
parents:
diff changeset
405
anatofuz
parents:
diff changeset
406 Symbol->setFragment(&getCurrentSectionOnly()->getDummyFragment());
anatofuz
parents:
diff changeset
407
anatofuz
parents:
diff changeset
408 MCTargetStreamer *TS = getTargetStreamer();
anatofuz
parents:
diff changeset
409 if (TS)
anatofuz
parents:
diff changeset
410 TS->emitLabel(Symbol);
anatofuz
parents:
diff changeset
411 }
anatofuz
parents:
diff changeset
412
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
413 void MCStreamer::emitCFISections(bool EH, bool Debug) {
150
anatofuz
parents:
diff changeset
414 assert(EH || Debug);
anatofuz
parents:
diff changeset
415 }
anatofuz
parents:
diff changeset
416
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
417 void MCStreamer::emitCFIStartProc(bool IsSimple, SMLoc Loc) {
150
anatofuz
parents:
diff changeset
418 if (hasUnfinishedDwarfFrameInfo())
anatofuz
parents:
diff changeset
419 return getContext().reportError(
anatofuz
parents:
diff changeset
420 Loc, "starting new .cfi frame before finishing the previous one");
anatofuz
parents:
diff changeset
421
anatofuz
parents:
diff changeset
422 MCDwarfFrameInfo Frame;
anatofuz
parents:
diff changeset
423 Frame.IsSimple = IsSimple;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
424 emitCFIStartProcImpl(Frame);
150
anatofuz
parents:
diff changeset
425
anatofuz
parents:
diff changeset
426 const MCAsmInfo* MAI = Context.getAsmInfo();
anatofuz
parents:
diff changeset
427 if (MAI) {
anatofuz
parents:
diff changeset
428 for (const MCCFIInstruction& Inst : MAI->getInitialFrameState()) {
anatofuz
parents:
diff changeset
429 if (Inst.getOperation() == MCCFIInstruction::OpDefCfa ||
anatofuz
parents:
diff changeset
430 Inst.getOperation() == MCCFIInstruction::OpDefCfaRegister) {
anatofuz
parents:
diff changeset
431 Frame.CurrentCfaRegister = Inst.getRegister();
anatofuz
parents:
diff changeset
432 }
anatofuz
parents:
diff changeset
433 }
anatofuz
parents:
diff changeset
434 }
anatofuz
parents:
diff changeset
435
anatofuz
parents:
diff changeset
436 DwarfFrameInfos.push_back(Frame);
anatofuz
parents:
diff changeset
437 }
anatofuz
parents:
diff changeset
438
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
439 void MCStreamer::emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
150
anatofuz
parents:
diff changeset
440 }
anatofuz
parents:
diff changeset
441
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
442 void MCStreamer::emitCFIEndProc() {
150
anatofuz
parents:
diff changeset
443 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
444 if (!CurFrame)
anatofuz
parents:
diff changeset
445 return;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
446 emitCFIEndProcImpl(*CurFrame);
150
anatofuz
parents:
diff changeset
447 }
anatofuz
parents:
diff changeset
448
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
449 void MCStreamer::emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
150
anatofuz
parents:
diff changeset
450 // Put a dummy non-null value in Frame.End to mark that this frame has been
anatofuz
parents:
diff changeset
451 // closed.
anatofuz
parents:
diff changeset
452 Frame.End = (MCSymbol *)1;
anatofuz
parents:
diff changeset
453 }
anatofuz
parents:
diff changeset
454
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
455 MCSymbol *MCStreamer::emitCFILabel() {
150
anatofuz
parents:
diff changeset
456 // Return a dummy non-null value so that label fields appear filled in when
anatofuz
parents:
diff changeset
457 // generating textual assembly.
anatofuz
parents:
diff changeset
458 return (MCSymbol *)1;
anatofuz
parents:
diff changeset
459 }
anatofuz
parents:
diff changeset
460
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
461 void MCStreamer::emitCFIDefCfa(int64_t Register, int64_t Offset) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
462 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
463 MCCFIInstruction Instruction =
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
464 MCCFIInstruction::cfiDefCfa(Label, Register, Offset);
150
anatofuz
parents:
diff changeset
465 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
466 if (!CurFrame)
anatofuz
parents:
diff changeset
467 return;
anatofuz
parents:
diff changeset
468 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
469 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
anatofuz
parents:
diff changeset
470 }
anatofuz
parents:
diff changeset
471
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
472 void MCStreamer::emitCFIDefCfaOffset(int64_t Offset) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
473 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
474 MCCFIInstruction Instruction =
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
475 MCCFIInstruction::cfiDefCfaOffset(Label, Offset);
150
anatofuz
parents:
diff changeset
476 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
477 if (!CurFrame)
anatofuz
parents:
diff changeset
478 return;
anatofuz
parents:
diff changeset
479 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
480 }
anatofuz
parents:
diff changeset
481
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
482 void MCStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
483 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
484 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
485 MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment);
anatofuz
parents:
diff changeset
486 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
487 if (!CurFrame)
anatofuz
parents:
diff changeset
488 return;
anatofuz
parents:
diff changeset
489 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
490 }
anatofuz
parents:
diff changeset
491
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
492 void MCStreamer::emitCFIDefCfaRegister(int64_t Register) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
493 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
494 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
495 MCCFIInstruction::createDefCfaRegister(Label, Register);
anatofuz
parents:
diff changeset
496 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
497 if (!CurFrame)
anatofuz
parents:
diff changeset
498 return;
anatofuz
parents:
diff changeset
499 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
500 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
anatofuz
parents:
diff changeset
501 }
anatofuz
parents:
diff changeset
502
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
503 void MCStreamer::emitCFIOffset(int64_t Register, int64_t Offset) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
504 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
505 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
506 MCCFIInstruction::createOffset(Label, Register, Offset);
anatofuz
parents:
diff changeset
507 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
508 if (!CurFrame)
anatofuz
parents:
diff changeset
509 return;
anatofuz
parents:
diff changeset
510 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
511 }
anatofuz
parents:
diff changeset
512
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
513 void MCStreamer::emitCFIRelOffset(int64_t Register, int64_t Offset) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
514 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
515 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
516 MCCFIInstruction::createRelOffset(Label, Register, Offset);
anatofuz
parents:
diff changeset
517 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
518 if (!CurFrame)
anatofuz
parents:
diff changeset
519 return;
anatofuz
parents:
diff changeset
520 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
521 }
anatofuz
parents:
diff changeset
522
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
523 void MCStreamer::emitCFIPersonality(const MCSymbol *Sym,
150
anatofuz
parents:
diff changeset
524 unsigned Encoding) {
anatofuz
parents:
diff changeset
525 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
526 if (!CurFrame)
anatofuz
parents:
diff changeset
527 return;
anatofuz
parents:
diff changeset
528 CurFrame->Personality = Sym;
anatofuz
parents:
diff changeset
529 CurFrame->PersonalityEncoding = Encoding;
anatofuz
parents:
diff changeset
530 }
anatofuz
parents:
diff changeset
531
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
532 void MCStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
150
anatofuz
parents:
diff changeset
533 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
534 if (!CurFrame)
anatofuz
parents:
diff changeset
535 return;
anatofuz
parents:
diff changeset
536 CurFrame->Lsda = Sym;
anatofuz
parents:
diff changeset
537 CurFrame->LsdaEncoding = Encoding;
anatofuz
parents:
diff changeset
538 }
anatofuz
parents:
diff changeset
539
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
540 void MCStreamer::emitCFIRememberState() {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
541 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
542 MCCFIInstruction Instruction = MCCFIInstruction::createRememberState(Label);
anatofuz
parents:
diff changeset
543 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
544 if (!CurFrame)
anatofuz
parents:
diff changeset
545 return;
anatofuz
parents:
diff changeset
546 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
547 }
anatofuz
parents:
diff changeset
548
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
549 void MCStreamer::emitCFIRestoreState() {
150
anatofuz
parents:
diff changeset
550 // FIXME: Error if there is no matching cfi_remember_state.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
551 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
552 MCCFIInstruction Instruction = MCCFIInstruction::createRestoreState(Label);
anatofuz
parents:
diff changeset
553 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
554 if (!CurFrame)
anatofuz
parents:
diff changeset
555 return;
anatofuz
parents:
diff changeset
556 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
557 }
anatofuz
parents:
diff changeset
558
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
559 void MCStreamer::emitCFISameValue(int64_t Register) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
560 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
561 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
562 MCCFIInstruction::createSameValue(Label, Register);
anatofuz
parents:
diff changeset
563 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
564 if (!CurFrame)
anatofuz
parents:
diff changeset
565 return;
anatofuz
parents:
diff changeset
566 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
567 }
anatofuz
parents:
diff changeset
568
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
569 void MCStreamer::emitCFIRestore(int64_t Register) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
570 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
571 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
572 MCCFIInstruction::createRestore(Label, Register);
anatofuz
parents:
diff changeset
573 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
574 if (!CurFrame)
anatofuz
parents:
diff changeset
575 return;
anatofuz
parents:
diff changeset
576 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
577 }
anatofuz
parents:
diff changeset
578
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
579 void MCStreamer::emitCFIEscape(StringRef Values) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
580 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
581 MCCFIInstruction Instruction = MCCFIInstruction::createEscape(Label, Values);
anatofuz
parents:
diff changeset
582 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
583 if (!CurFrame)
anatofuz
parents:
diff changeset
584 return;
anatofuz
parents:
diff changeset
585 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
586 }
anatofuz
parents:
diff changeset
587
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
588 void MCStreamer::emitCFIGnuArgsSize(int64_t Size) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
589 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
590 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
591 MCCFIInstruction::createGnuArgsSize(Label, Size);
anatofuz
parents:
diff changeset
592 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
593 if (!CurFrame)
anatofuz
parents:
diff changeset
594 return;
anatofuz
parents:
diff changeset
595 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
596 }
anatofuz
parents:
diff changeset
597
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
598 void MCStreamer::emitCFISignalFrame() {
150
anatofuz
parents:
diff changeset
599 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
600 if (!CurFrame)
anatofuz
parents:
diff changeset
601 return;
anatofuz
parents:
diff changeset
602 CurFrame->IsSignalFrame = true;
anatofuz
parents:
diff changeset
603 }
anatofuz
parents:
diff changeset
604
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
605 void MCStreamer::emitCFIUndefined(int64_t Register) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
606 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
607 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
608 MCCFIInstruction::createUndefined(Label, Register);
anatofuz
parents:
diff changeset
609 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
610 if (!CurFrame)
anatofuz
parents:
diff changeset
611 return;
anatofuz
parents:
diff changeset
612 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
613 }
anatofuz
parents:
diff changeset
614
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
615 void MCStreamer::emitCFIRegister(int64_t Register1, int64_t Register2) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
616 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
617 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
618 MCCFIInstruction::createRegister(Label, Register1, Register2);
anatofuz
parents:
diff changeset
619 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
620 if (!CurFrame)
anatofuz
parents:
diff changeset
621 return;
anatofuz
parents:
diff changeset
622 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
623 }
anatofuz
parents:
diff changeset
624
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
625 void MCStreamer::emitCFIWindowSave() {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
626 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
627 MCCFIInstruction Instruction =
anatofuz
parents:
diff changeset
628 MCCFIInstruction::createWindowSave(Label);
anatofuz
parents:
diff changeset
629 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
630 if (!CurFrame)
anatofuz
parents:
diff changeset
631 return;
anatofuz
parents:
diff changeset
632 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
633 }
anatofuz
parents:
diff changeset
634
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
635 void MCStreamer::emitCFINegateRAState() {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
636 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
637 MCCFIInstruction Instruction = MCCFIInstruction::createNegateRAState(Label);
anatofuz
parents:
diff changeset
638 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
639 if (!CurFrame)
anatofuz
parents:
diff changeset
640 return;
anatofuz
parents:
diff changeset
641 CurFrame->Instructions.push_back(Instruction);
anatofuz
parents:
diff changeset
642 }
anatofuz
parents:
diff changeset
643
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
644 void MCStreamer::emitCFIReturnColumn(int64_t Register) {
150
anatofuz
parents:
diff changeset
645 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
anatofuz
parents:
diff changeset
646 if (!CurFrame)
anatofuz
parents:
diff changeset
647 return;
anatofuz
parents:
diff changeset
648 CurFrame->RAReg = Register;
anatofuz
parents:
diff changeset
649 }
anatofuz
parents:
diff changeset
650
anatofuz
parents:
diff changeset
651 WinEH::FrameInfo *MCStreamer::EnsureValidWinFrameInfo(SMLoc Loc) {
anatofuz
parents:
diff changeset
652 const MCAsmInfo *MAI = Context.getAsmInfo();
anatofuz
parents:
diff changeset
653 if (!MAI->usesWindowsCFI()) {
anatofuz
parents:
diff changeset
654 getContext().reportError(
anatofuz
parents:
diff changeset
655 Loc, ".seh_* directives are not supported on this target");
anatofuz
parents:
diff changeset
656 return nullptr;
anatofuz
parents:
diff changeset
657 }
anatofuz
parents:
diff changeset
658 if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
anatofuz
parents:
diff changeset
659 getContext().reportError(
anatofuz
parents:
diff changeset
660 Loc, ".seh_ directive must appear within an active frame");
anatofuz
parents:
diff changeset
661 return nullptr;
anatofuz
parents:
diff changeset
662 }
anatofuz
parents:
diff changeset
663 return CurrentWinFrameInfo;
anatofuz
parents:
diff changeset
664 }
anatofuz
parents:
diff changeset
665
anatofuz
parents:
diff changeset
666 void MCStreamer::EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) {
anatofuz
parents:
diff changeset
667 const MCAsmInfo *MAI = Context.getAsmInfo();
anatofuz
parents:
diff changeset
668 if (!MAI->usesWindowsCFI())
anatofuz
parents:
diff changeset
669 return getContext().reportError(
anatofuz
parents:
diff changeset
670 Loc, ".seh_* directives are not supported on this target");
anatofuz
parents:
diff changeset
671 if (CurrentWinFrameInfo && !CurrentWinFrameInfo->End)
anatofuz
parents:
diff changeset
672 getContext().reportError(
anatofuz
parents:
diff changeset
673 Loc, "Starting a function before ending the previous one!");
anatofuz
parents:
diff changeset
674
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
675 MCSymbol *StartProc = emitCFILabel();
150
anatofuz
parents:
diff changeset
676
anatofuz
parents:
diff changeset
677 WinFrameInfos.emplace_back(
anatofuz
parents:
diff changeset
678 std::make_unique<WinEH::FrameInfo>(Symbol, StartProc));
anatofuz
parents:
diff changeset
679 CurrentWinFrameInfo = WinFrameInfos.back().get();
anatofuz
parents:
diff changeset
680 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
anatofuz
parents:
diff changeset
681 }
anatofuz
parents:
diff changeset
682
anatofuz
parents:
diff changeset
683 void MCStreamer::EmitWinCFIEndProc(SMLoc Loc) {
anatofuz
parents:
diff changeset
684 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
685 if (!CurFrame)
anatofuz
parents:
diff changeset
686 return;
anatofuz
parents:
diff changeset
687 if (CurFrame->ChainedParent)
anatofuz
parents:
diff changeset
688 getContext().reportError(Loc, "Not all chained regions terminated!");
anatofuz
parents:
diff changeset
689
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
690 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
691 CurFrame->End = Label;
anatofuz
parents:
diff changeset
692 }
anatofuz
parents:
diff changeset
693
anatofuz
parents:
diff changeset
694 void MCStreamer::EmitWinCFIFuncletOrFuncEnd(SMLoc Loc) {
anatofuz
parents:
diff changeset
695 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
696 if (!CurFrame)
anatofuz
parents:
diff changeset
697 return;
anatofuz
parents:
diff changeset
698 if (CurFrame->ChainedParent)
anatofuz
parents:
diff changeset
699 getContext().reportError(Loc, "Not all chained regions terminated!");
anatofuz
parents:
diff changeset
700
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
701 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
702 CurFrame->FuncletOrFuncEnd = Label;
anatofuz
parents:
diff changeset
703 }
anatofuz
parents:
diff changeset
704
anatofuz
parents:
diff changeset
705 void MCStreamer::EmitWinCFIStartChained(SMLoc Loc) {
anatofuz
parents:
diff changeset
706 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
707 if (!CurFrame)
anatofuz
parents:
diff changeset
708 return;
anatofuz
parents:
diff changeset
709
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
710 MCSymbol *StartProc = emitCFILabel();
150
anatofuz
parents:
diff changeset
711
anatofuz
parents:
diff changeset
712 WinFrameInfos.emplace_back(std::make_unique<WinEH::FrameInfo>(
anatofuz
parents:
diff changeset
713 CurFrame->Function, StartProc, CurFrame));
anatofuz
parents:
diff changeset
714 CurrentWinFrameInfo = WinFrameInfos.back().get();
anatofuz
parents:
diff changeset
715 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
anatofuz
parents:
diff changeset
716 }
anatofuz
parents:
diff changeset
717
anatofuz
parents:
diff changeset
718 void MCStreamer::EmitWinCFIEndChained(SMLoc Loc) {
anatofuz
parents:
diff changeset
719 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
720 if (!CurFrame)
anatofuz
parents:
diff changeset
721 return;
anatofuz
parents:
diff changeset
722 if (!CurFrame->ChainedParent)
anatofuz
parents:
diff changeset
723 return getContext().reportError(
anatofuz
parents:
diff changeset
724 Loc, "End of a chained region outside a chained region!");
anatofuz
parents:
diff changeset
725
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
726 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
727
anatofuz
parents:
diff changeset
728 CurFrame->End = Label;
anatofuz
parents:
diff changeset
729 CurrentWinFrameInfo = const_cast<WinEH::FrameInfo *>(CurFrame->ChainedParent);
anatofuz
parents:
diff changeset
730 }
anatofuz
parents:
diff changeset
731
anatofuz
parents:
diff changeset
732 void MCStreamer::EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
anatofuz
parents:
diff changeset
733 SMLoc Loc) {
anatofuz
parents:
diff changeset
734 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
735 if (!CurFrame)
anatofuz
parents:
diff changeset
736 return;
anatofuz
parents:
diff changeset
737 if (CurFrame->ChainedParent)
anatofuz
parents:
diff changeset
738 return getContext().reportError(
anatofuz
parents:
diff changeset
739 Loc, "Chained unwind areas can't have handlers!");
anatofuz
parents:
diff changeset
740 CurFrame->ExceptionHandler = Sym;
anatofuz
parents:
diff changeset
741 if (!Except && !Unwind)
anatofuz
parents:
diff changeset
742 getContext().reportError(Loc, "Don't know what kind of handler this is!");
anatofuz
parents:
diff changeset
743 if (Unwind)
anatofuz
parents:
diff changeset
744 CurFrame->HandlesUnwind = true;
anatofuz
parents:
diff changeset
745 if (Except)
anatofuz
parents:
diff changeset
746 CurFrame->HandlesExceptions = true;
anatofuz
parents:
diff changeset
747 }
anatofuz
parents:
diff changeset
748
anatofuz
parents:
diff changeset
749 void MCStreamer::EmitWinEHHandlerData(SMLoc Loc) {
anatofuz
parents:
diff changeset
750 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
751 if (!CurFrame)
anatofuz
parents:
diff changeset
752 return;
anatofuz
parents:
diff changeset
753 if (CurFrame->ChainedParent)
anatofuz
parents:
diff changeset
754 getContext().reportError(Loc, "Chained unwind areas can't have handlers!");
anatofuz
parents:
diff changeset
755 }
anatofuz
parents:
diff changeset
756
anatofuz
parents:
diff changeset
757 void MCStreamer::emitCGProfileEntry(const MCSymbolRefExpr *From,
anatofuz
parents:
diff changeset
758 const MCSymbolRefExpr *To, uint64_t Count) {
anatofuz
parents:
diff changeset
759 }
anatofuz
parents:
diff changeset
760
anatofuz
parents:
diff changeset
761 static MCSection *getWinCFISection(MCContext &Context, unsigned *NextWinCFIID,
anatofuz
parents:
diff changeset
762 MCSection *MainCFISec,
anatofuz
parents:
diff changeset
763 const MCSection *TextSec) {
anatofuz
parents:
diff changeset
764 // If this is the main .text section, use the main unwind info section.
anatofuz
parents:
diff changeset
765 if (TextSec == Context.getObjectFileInfo()->getTextSection())
anatofuz
parents:
diff changeset
766 return MainCFISec;
anatofuz
parents:
diff changeset
767
anatofuz
parents:
diff changeset
768 const auto *TextSecCOFF = cast<MCSectionCOFF>(TextSec);
anatofuz
parents:
diff changeset
769 auto *MainCFISecCOFF = cast<MCSectionCOFF>(MainCFISec);
anatofuz
parents:
diff changeset
770 unsigned UniqueID = TextSecCOFF->getOrAssignWinCFISectionID(NextWinCFIID);
anatofuz
parents:
diff changeset
771
anatofuz
parents:
diff changeset
772 // If this section is COMDAT, this unwind section should be COMDAT associative
anatofuz
parents:
diff changeset
773 // with its group.
anatofuz
parents:
diff changeset
774 const MCSymbol *KeySym = nullptr;
anatofuz
parents:
diff changeset
775 if (TextSecCOFF->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
anatofuz
parents:
diff changeset
776 KeySym = TextSecCOFF->getCOMDATSymbol();
anatofuz
parents:
diff changeset
777
anatofuz
parents:
diff changeset
778 // In a GNU environment, we can't use associative comdats. Instead, do what
anatofuz
parents:
diff changeset
779 // GCC does, which is to make plain comdat selectany section named like
anatofuz
parents:
diff changeset
780 // ".[px]data$_Z3foov".
anatofuz
parents:
diff changeset
781 if (!Context.getAsmInfo()->hasCOFFAssociativeComdats()) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
782 std::string SectionName = (MainCFISecCOFF->getName() + "$" +
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
783 TextSecCOFF->getName().split('$').second)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
784 .str();
150
anatofuz
parents:
diff changeset
785 return Context.getCOFFSection(
anatofuz
parents:
diff changeset
786 SectionName,
anatofuz
parents:
diff changeset
787 MainCFISecCOFF->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT,
anatofuz
parents:
diff changeset
788 MainCFISecCOFF->getKind(), "", COFF::IMAGE_COMDAT_SELECT_ANY);
anatofuz
parents:
diff changeset
789 }
anatofuz
parents:
diff changeset
790 }
anatofuz
parents:
diff changeset
791
anatofuz
parents:
diff changeset
792 return Context.getAssociativeCOFFSection(MainCFISecCOFF, KeySym, UniqueID);
anatofuz
parents:
diff changeset
793 }
anatofuz
parents:
diff changeset
794
anatofuz
parents:
diff changeset
795 MCSection *MCStreamer::getAssociatedPDataSection(const MCSection *TextSec) {
anatofuz
parents:
diff changeset
796 return getWinCFISection(getContext(), &NextWinCFIID,
anatofuz
parents:
diff changeset
797 getContext().getObjectFileInfo()->getPDataSection(),
anatofuz
parents:
diff changeset
798 TextSec);
anatofuz
parents:
diff changeset
799 }
anatofuz
parents:
diff changeset
800
anatofuz
parents:
diff changeset
801 MCSection *MCStreamer::getAssociatedXDataSection(const MCSection *TextSec) {
anatofuz
parents:
diff changeset
802 return getWinCFISection(getContext(), &NextWinCFIID,
anatofuz
parents:
diff changeset
803 getContext().getObjectFileInfo()->getXDataSection(),
anatofuz
parents:
diff changeset
804 TextSec);
anatofuz
parents:
diff changeset
805 }
anatofuz
parents:
diff changeset
806
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
807 void MCStreamer::emitSyntaxDirective() {}
150
anatofuz
parents:
diff changeset
808
anatofuz
parents:
diff changeset
809 static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg) {
anatofuz
parents:
diff changeset
810 return Ctx.getRegisterInfo()->getSEHRegNum(Reg);
anatofuz
parents:
diff changeset
811 }
anatofuz
parents:
diff changeset
812
anatofuz
parents:
diff changeset
813 void MCStreamer::EmitWinCFIPushReg(MCRegister Register, SMLoc Loc) {
anatofuz
parents:
diff changeset
814 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
815 if (!CurFrame)
anatofuz
parents:
diff changeset
816 return;
anatofuz
parents:
diff changeset
817
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
818 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
819
anatofuz
parents:
diff changeset
820 WinEH::Instruction Inst = Win64EH::Instruction::PushNonVol(
anatofuz
parents:
diff changeset
821 Label, encodeSEHRegNum(Context, Register));
anatofuz
parents:
diff changeset
822 CurFrame->Instructions.push_back(Inst);
anatofuz
parents:
diff changeset
823 }
anatofuz
parents:
diff changeset
824
anatofuz
parents:
diff changeset
825 void MCStreamer::EmitWinCFISetFrame(MCRegister Register, unsigned Offset,
anatofuz
parents:
diff changeset
826 SMLoc Loc) {
anatofuz
parents:
diff changeset
827 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
828 if (!CurFrame)
anatofuz
parents:
diff changeset
829 return;
anatofuz
parents:
diff changeset
830 if (CurFrame->LastFrameInst >= 0)
anatofuz
parents:
diff changeset
831 return getContext().reportError(
anatofuz
parents:
diff changeset
832 Loc, "frame register and offset can be set at most once");
anatofuz
parents:
diff changeset
833 if (Offset & 0x0F)
anatofuz
parents:
diff changeset
834 return getContext().reportError(Loc, "offset is not a multiple of 16");
anatofuz
parents:
diff changeset
835 if (Offset > 240)
anatofuz
parents:
diff changeset
836 return getContext().reportError(
anatofuz
parents:
diff changeset
837 Loc, "frame offset must be less than or equal to 240");
anatofuz
parents:
diff changeset
838
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
839 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
840
anatofuz
parents:
diff changeset
841 WinEH::Instruction Inst = Win64EH::Instruction::SetFPReg(
anatofuz
parents:
diff changeset
842 Label, encodeSEHRegNum(getContext(), Register), Offset);
anatofuz
parents:
diff changeset
843 CurFrame->LastFrameInst = CurFrame->Instructions.size();
anatofuz
parents:
diff changeset
844 CurFrame->Instructions.push_back(Inst);
anatofuz
parents:
diff changeset
845 }
anatofuz
parents:
diff changeset
846
anatofuz
parents:
diff changeset
847 void MCStreamer::EmitWinCFIAllocStack(unsigned Size, SMLoc Loc) {
anatofuz
parents:
diff changeset
848 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
849 if (!CurFrame)
anatofuz
parents:
diff changeset
850 return;
anatofuz
parents:
diff changeset
851 if (Size == 0)
anatofuz
parents:
diff changeset
852 return getContext().reportError(Loc,
anatofuz
parents:
diff changeset
853 "stack allocation size must be non-zero");
anatofuz
parents:
diff changeset
854 if (Size & 7)
anatofuz
parents:
diff changeset
855 return getContext().reportError(
anatofuz
parents:
diff changeset
856 Loc, "stack allocation size is not a multiple of 8");
anatofuz
parents:
diff changeset
857
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
858 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
859
anatofuz
parents:
diff changeset
860 WinEH::Instruction Inst = Win64EH::Instruction::Alloc(Label, Size);
anatofuz
parents:
diff changeset
861 CurFrame->Instructions.push_back(Inst);
anatofuz
parents:
diff changeset
862 }
anatofuz
parents:
diff changeset
863
anatofuz
parents:
diff changeset
864 void MCStreamer::EmitWinCFISaveReg(MCRegister Register, unsigned Offset,
anatofuz
parents:
diff changeset
865 SMLoc Loc) {
anatofuz
parents:
diff changeset
866 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
867 if (!CurFrame)
anatofuz
parents:
diff changeset
868 return;
anatofuz
parents:
diff changeset
869
anatofuz
parents:
diff changeset
870 if (Offset & 7)
anatofuz
parents:
diff changeset
871 return getContext().reportError(
anatofuz
parents:
diff changeset
872 Loc, "register save offset is not 8 byte aligned");
anatofuz
parents:
diff changeset
873
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
874 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
875
anatofuz
parents:
diff changeset
876 WinEH::Instruction Inst = Win64EH::Instruction::SaveNonVol(
anatofuz
parents:
diff changeset
877 Label, encodeSEHRegNum(Context, Register), Offset);
anatofuz
parents:
diff changeset
878 CurFrame->Instructions.push_back(Inst);
anatofuz
parents:
diff changeset
879 }
anatofuz
parents:
diff changeset
880
anatofuz
parents:
diff changeset
881 void MCStreamer::EmitWinCFISaveXMM(MCRegister Register, unsigned Offset,
anatofuz
parents:
diff changeset
882 SMLoc Loc) {
anatofuz
parents:
diff changeset
883 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
884 if (!CurFrame)
anatofuz
parents:
diff changeset
885 return;
anatofuz
parents:
diff changeset
886 if (Offset & 0x0F)
anatofuz
parents:
diff changeset
887 return getContext().reportError(Loc, "offset is not a multiple of 16");
anatofuz
parents:
diff changeset
888
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
889 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
890
anatofuz
parents:
diff changeset
891 WinEH::Instruction Inst = Win64EH::Instruction::SaveXMM(
anatofuz
parents:
diff changeset
892 Label, encodeSEHRegNum(Context, Register), Offset);
anatofuz
parents:
diff changeset
893 CurFrame->Instructions.push_back(Inst);
anatofuz
parents:
diff changeset
894 }
anatofuz
parents:
diff changeset
895
anatofuz
parents:
diff changeset
896 void MCStreamer::EmitWinCFIPushFrame(bool Code, SMLoc Loc) {
anatofuz
parents:
diff changeset
897 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
898 if (!CurFrame)
anatofuz
parents:
diff changeset
899 return;
anatofuz
parents:
diff changeset
900 if (!CurFrame->Instructions.empty())
anatofuz
parents:
diff changeset
901 return getContext().reportError(
anatofuz
parents:
diff changeset
902 Loc, "If present, PushMachFrame must be the first UOP");
anatofuz
parents:
diff changeset
903
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
904 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
905
anatofuz
parents:
diff changeset
906 WinEH::Instruction Inst = Win64EH::Instruction::PushMachFrame(Label, Code);
anatofuz
parents:
diff changeset
907 CurFrame->Instructions.push_back(Inst);
anatofuz
parents:
diff changeset
908 }
anatofuz
parents:
diff changeset
909
anatofuz
parents:
diff changeset
910 void MCStreamer::EmitWinCFIEndProlog(SMLoc Loc) {
anatofuz
parents:
diff changeset
911 WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
anatofuz
parents:
diff changeset
912 if (!CurFrame)
anatofuz
parents:
diff changeset
913 return;
anatofuz
parents:
diff changeset
914
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
915 MCSymbol *Label = emitCFILabel();
150
anatofuz
parents:
diff changeset
916
anatofuz
parents:
diff changeset
917 CurFrame->PrologEnd = Label;
anatofuz
parents:
diff changeset
918 }
anatofuz
parents:
diff changeset
919
anatofuz
parents:
diff changeset
920 void MCStreamer::EmitCOFFSafeSEH(MCSymbol const *Symbol) {}
anatofuz
parents:
diff changeset
921
anatofuz
parents:
diff changeset
922 void MCStreamer::EmitCOFFSymbolIndex(MCSymbol const *Symbol) {}
anatofuz
parents:
diff changeset
923
anatofuz
parents:
diff changeset
924 void MCStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) {}
anatofuz
parents:
diff changeset
925
anatofuz
parents:
diff changeset
926 void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) {}
anatofuz
parents:
diff changeset
927
anatofuz
parents:
diff changeset
928 void MCStreamer::EmitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) {}
anatofuz
parents:
diff changeset
929
anatofuz
parents:
diff changeset
930 /// EmitRawText - If this file is backed by an assembly streamer, this dumps
anatofuz
parents:
diff changeset
931 /// the specified string in the output .s file. This capability is
anatofuz
parents:
diff changeset
932 /// indicated by the hasRawTextSupport() predicate.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
933 void MCStreamer::emitRawTextImpl(StringRef String) {
150
anatofuz
parents:
diff changeset
934 // This is not llvm_unreachable for the sake of out of tree backend
anatofuz
parents:
diff changeset
935 // developers who may not have assembly streamers and should serve as a
anatofuz
parents:
diff changeset
936 // reminder to not accidentally call EmitRawText in the absence of such.
anatofuz
parents:
diff changeset
937 report_fatal_error("EmitRawText called on an MCStreamer that doesn't support "
anatofuz
parents:
diff changeset
938 "it (target backend is likely missing an AsmStreamer "
anatofuz
parents:
diff changeset
939 "implementation)");
anatofuz
parents:
diff changeset
940 }
anatofuz
parents:
diff changeset
941
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
942 void MCStreamer::emitRawText(const Twine &T) {
150
anatofuz
parents:
diff changeset
943 SmallString<128> Str;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
944 emitRawTextImpl(T.toStringRef(Str));
150
anatofuz
parents:
diff changeset
945 }
anatofuz
parents:
diff changeset
946
anatofuz
parents:
diff changeset
947 void MCStreamer::EmitWindowsUnwindTables() {
anatofuz
parents:
diff changeset
948 }
anatofuz
parents:
diff changeset
949
anatofuz
parents:
diff changeset
950 void MCStreamer::Finish() {
anatofuz
parents:
diff changeset
951 if ((!DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End) ||
anatofuz
parents:
diff changeset
952 (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) {
anatofuz
parents:
diff changeset
953 getContext().reportError(SMLoc(), "Unfinished frame!");
anatofuz
parents:
diff changeset
954 return;
anatofuz
parents:
diff changeset
955 }
anatofuz
parents:
diff changeset
956
anatofuz
parents:
diff changeset
957 MCTargetStreamer *TS = getTargetStreamer();
anatofuz
parents:
diff changeset
958 if (TS)
anatofuz
parents:
diff changeset
959 TS->finish();
anatofuz
parents:
diff changeset
960
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
961 finishImpl();
150
anatofuz
parents:
diff changeset
962 }
anatofuz
parents:
diff changeset
963
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
964 void MCStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
150
anatofuz
parents:
diff changeset
965 visitUsedExpr(*Value);
anatofuz
parents:
diff changeset
966 Symbol->setVariableValue(Value);
anatofuz
parents:
diff changeset
967
anatofuz
parents:
diff changeset
968 MCTargetStreamer *TS = getTargetStreamer();
anatofuz
parents:
diff changeset
969 if (TS)
anatofuz
parents:
diff changeset
970 TS->emitAssignment(Symbol, Value);
anatofuz
parents:
diff changeset
971 }
anatofuz
parents:
diff changeset
972
anatofuz
parents:
diff changeset
973 void MCTargetStreamer::prettyPrintAsm(MCInstPrinter &InstPrinter,
anatofuz
parents:
diff changeset
974 uint64_t Address, const MCInst &Inst,
anatofuz
parents:
diff changeset
975 const MCSubtargetInfo &STI,
anatofuz
parents:
diff changeset
976 raw_ostream &OS) {
anatofuz
parents:
diff changeset
977 InstPrinter.printInst(&Inst, Address, "", STI, OS);
anatofuz
parents:
diff changeset
978 }
anatofuz
parents:
diff changeset
979
anatofuz
parents:
diff changeset
980 void MCStreamer::visitUsedSymbol(const MCSymbol &Sym) {
anatofuz
parents:
diff changeset
981 }
anatofuz
parents:
diff changeset
982
anatofuz
parents:
diff changeset
983 void MCStreamer::visitUsedExpr(const MCExpr &Expr) {
anatofuz
parents:
diff changeset
984 switch (Expr.getKind()) {
anatofuz
parents:
diff changeset
985 case MCExpr::Target:
anatofuz
parents:
diff changeset
986 cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
anatofuz
parents:
diff changeset
987 break;
anatofuz
parents:
diff changeset
988
anatofuz
parents:
diff changeset
989 case MCExpr::Constant:
anatofuz
parents:
diff changeset
990 break;
anatofuz
parents:
diff changeset
991
anatofuz
parents:
diff changeset
992 case MCExpr::Binary: {
anatofuz
parents:
diff changeset
993 const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
anatofuz
parents:
diff changeset
994 visitUsedExpr(*BE.getLHS());
anatofuz
parents:
diff changeset
995 visitUsedExpr(*BE.getRHS());
anatofuz
parents:
diff changeset
996 break;
anatofuz
parents:
diff changeset
997 }
anatofuz
parents:
diff changeset
998
anatofuz
parents:
diff changeset
999 case MCExpr::SymbolRef:
anatofuz
parents:
diff changeset
1000 visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
anatofuz
parents:
diff changeset
1001 break;
anatofuz
parents:
diff changeset
1002
anatofuz
parents:
diff changeset
1003 case MCExpr::Unary:
anatofuz
parents:
diff changeset
1004 visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
anatofuz
parents:
diff changeset
1005 break;
anatofuz
parents:
diff changeset
1006 }
anatofuz
parents:
diff changeset
1007 }
anatofuz
parents:
diff changeset
1008
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1009 void MCStreamer::emitInstruction(const MCInst &Inst, const MCSubtargetInfo &) {
150
anatofuz
parents:
diff changeset
1010 // Scan for values.
anatofuz
parents:
diff changeset
1011 for (unsigned i = Inst.getNumOperands(); i--;)
anatofuz
parents:
diff changeset
1012 if (Inst.getOperand(i).isExpr())
anatofuz
parents:
diff changeset
1013 visitUsedExpr(*Inst.getOperand(i).getExpr());
anatofuz
parents:
diff changeset
1014 }
anatofuz
parents:
diff changeset
1015
anatofuz
parents:
diff changeset
1016 void MCStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
anatofuz
parents:
diff changeset
1017 unsigned Size) {
anatofuz
parents:
diff changeset
1018 // Get the Hi-Lo expression.
anatofuz
parents:
diff changeset
1019 const MCExpr *Diff =
anatofuz
parents:
diff changeset
1020 MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, Context),
anatofuz
parents:
diff changeset
1021 MCSymbolRefExpr::create(Lo, Context), Context);
anatofuz
parents:
diff changeset
1022
anatofuz
parents:
diff changeset
1023 const MCAsmInfo *MAI = Context.getAsmInfo();
anatofuz
parents:
diff changeset
1024 if (!MAI->doesSetDirectiveSuppressReloc()) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1025 emitValue(Diff, Size);
150
anatofuz
parents:
diff changeset
1026 return;
anatofuz
parents:
diff changeset
1027 }
anatofuz
parents:
diff changeset
1028
anatofuz
parents:
diff changeset
1029 // Otherwise, emit with .set (aka assignment).
anatofuz
parents:
diff changeset
1030 MCSymbol *SetLabel = Context.createTempSymbol("set", true);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1031 emitAssignment(SetLabel, Diff);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1032 emitSymbolValue(SetLabel, Size);
150
anatofuz
parents:
diff changeset
1033 }
anatofuz
parents:
diff changeset
1034
anatofuz
parents:
diff changeset
1035 void MCStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
anatofuz
parents:
diff changeset
1036 const MCSymbol *Lo) {
anatofuz
parents:
diff changeset
1037 // Get the Hi-Lo expression.
anatofuz
parents:
diff changeset
1038 const MCExpr *Diff =
anatofuz
parents:
diff changeset
1039 MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, Context),
anatofuz
parents:
diff changeset
1040 MCSymbolRefExpr::create(Lo, Context), Context);
anatofuz
parents:
diff changeset
1041
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1042 emitULEB128Value(Diff);
150
anatofuz
parents:
diff changeset
1043 }
anatofuz
parents:
diff changeset
1044
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1045 void MCStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1046 void MCStreamer::emitThumbFunc(MCSymbol *Func) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1047 void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
150
anatofuz
parents:
diff changeset
1048 void MCStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) {
anatofuz
parents:
diff changeset
1049 llvm_unreachable("this directive only supported on COFF targets");
anatofuz
parents:
diff changeset
1050 }
anatofuz
parents:
diff changeset
1051 void MCStreamer::EndCOFFSymbolDef() {
anatofuz
parents:
diff changeset
1052 llvm_unreachable("this directive only supported on COFF targets");
anatofuz
parents:
diff changeset
1053 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1054 void MCStreamer::emitFileDirective(StringRef Filename) {}
150
anatofuz
parents:
diff changeset
1055 void MCStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
anatofuz
parents:
diff changeset
1056 llvm_unreachable("this directive only supported on COFF targets");
anatofuz
parents:
diff changeset
1057 }
anatofuz
parents:
diff changeset
1058 void MCStreamer::EmitCOFFSymbolType(int Type) {
anatofuz
parents:
diff changeset
1059 llvm_unreachable("this directive only supported on COFF targets");
anatofuz
parents:
diff changeset
1060 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1061 void MCStreamer::emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size,
150
anatofuz
parents:
diff changeset
1062 MCSymbol *CsectSym,
anatofuz
parents:
diff changeset
1063 unsigned ByteAlign) {
anatofuz
parents:
diff changeset
1064 llvm_unreachable("this directive only supported on XCOFF targets");
anatofuz
parents:
diff changeset
1065 }
anatofuz
parents:
diff changeset
1066 void MCStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) {}
anatofuz
parents:
diff changeset
1067 void MCStreamer::emitELFSymverDirective(StringRef AliasName,
anatofuz
parents:
diff changeset
1068 const MCSymbol *Aliasee) {}
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1069 void MCStreamer::emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
150
anatofuz
parents:
diff changeset
1070 unsigned ByteAlignment) {}
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1071 void MCStreamer::emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
150
anatofuz
parents:
diff changeset
1072 uint64_t Size, unsigned ByteAlignment) {}
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1073 void MCStreamer::changeSection(MCSection *, const MCExpr *) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1074 void MCStreamer::emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1075 void MCStreamer::emitBytes(StringRef Data) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1076 void MCStreamer::emitBinaryData(StringRef Data) { emitBytes(Data); }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1077 void MCStreamer::emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) {
150
anatofuz
parents:
diff changeset
1078 visitUsedExpr(*Value);
anatofuz
parents:
diff changeset
1079 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1080 void MCStreamer::emitULEB128Value(const MCExpr *Value) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1081 void MCStreamer::emitSLEB128Value(const MCExpr *Value) {}
150
anatofuz
parents:
diff changeset
1082 void MCStreamer::emitFill(const MCExpr &NumBytes, uint64_t Value, SMLoc Loc) {}
anatofuz
parents:
diff changeset
1083 void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
anatofuz
parents:
diff changeset
1084 SMLoc Loc) {}
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1085 void MCStreamer::emitValueToAlignment(unsigned ByteAlignment, int64_t Value,
150
anatofuz
parents:
diff changeset
1086 unsigned ValueSize,
anatofuz
parents:
diff changeset
1087 unsigned MaxBytesToEmit) {}
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1088 void MCStreamer::emitCodeAlignment(unsigned ByteAlignment,
150
anatofuz
parents:
diff changeset
1089 unsigned MaxBytesToEmit) {}
anatofuz
parents:
diff changeset
1090 void MCStreamer::emitValueToOffset(const MCExpr *Offset, unsigned char Value,
anatofuz
parents:
diff changeset
1091 SMLoc Loc) {}
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1092 void MCStreamer::emitBundleAlignMode(unsigned AlignPow2) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1093 void MCStreamer::emitBundleLock(bool AlignToEnd) {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1094 void MCStreamer::finishImpl() {}
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1095 void MCStreamer::emitBundleUnlock() {}
150
anatofuz
parents:
diff changeset
1096
anatofuz
parents:
diff changeset
1097 void MCStreamer::SwitchSection(MCSection *Section, const MCExpr *Subsection) {
anatofuz
parents:
diff changeset
1098 assert(Section && "Cannot switch to a null section!");
anatofuz
parents:
diff changeset
1099 MCSectionSubPair curSection = SectionStack.back().first;
anatofuz
parents:
diff changeset
1100 SectionStack.back().second = curSection;
anatofuz
parents:
diff changeset
1101 if (MCSectionSubPair(Section, Subsection) != curSection) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1102 changeSection(Section, Subsection);
150
anatofuz
parents:
diff changeset
1103 SectionStack.back().first = MCSectionSubPair(Section, Subsection);
anatofuz
parents:
diff changeset
1104 assert(!Section->hasEnded() && "Section already ended");
anatofuz
parents:
diff changeset
1105 MCSymbol *Sym = Section->getBeginSymbol();
anatofuz
parents:
diff changeset
1106 if (Sym && !Sym->isInSection())
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1107 emitLabel(Sym);
150
anatofuz
parents:
diff changeset
1108 }
anatofuz
parents:
diff changeset
1109 }
anatofuz
parents:
diff changeset
1110
anatofuz
parents:
diff changeset
1111 MCSymbol *MCStreamer::endSection(MCSection *Section) {
anatofuz
parents:
diff changeset
1112 // TODO: keep track of the last subsection so that this symbol appears in the
anatofuz
parents:
diff changeset
1113 // correct place.
anatofuz
parents:
diff changeset
1114 MCSymbol *Sym = Section->getEndSymbol(Context);
anatofuz
parents:
diff changeset
1115 if (Sym->isInSection())
anatofuz
parents:
diff changeset
1116 return Sym;
anatofuz
parents:
diff changeset
1117
anatofuz
parents:
diff changeset
1118 SwitchSection(Section);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1119 emitLabel(Sym);
150
anatofuz
parents:
diff changeset
1120 return Sym;
anatofuz
parents:
diff changeset
1121 }
anatofuz
parents:
diff changeset
1122
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1123 void MCStreamer::emitVersionForTarget(const Triple &Target,
150
anatofuz
parents:
diff changeset
1124 const VersionTuple &SDKVersion) {
anatofuz
parents:
diff changeset
1125 if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
anatofuz
parents:
diff changeset
1126 return;
anatofuz
parents:
diff changeset
1127 // Do we even know the version?
anatofuz
parents:
diff changeset
1128 if (Target.getOSMajorVersion() == 0)
anatofuz
parents:
diff changeset
1129 return;
anatofuz
parents:
diff changeset
1130
anatofuz
parents:
diff changeset
1131 unsigned Major;
anatofuz
parents:
diff changeset
1132 unsigned Minor;
anatofuz
parents:
diff changeset
1133 unsigned Update;
anatofuz
parents:
diff changeset
1134 if (Target.isMacCatalystEnvironment()) {
anatofuz
parents:
diff changeset
1135 // Mac Catalyst always uses the build version load command.
anatofuz
parents:
diff changeset
1136 Target.getiOSVersion(Major, Minor, Update);
anatofuz
parents:
diff changeset
1137 assert(Major && "A non-zero major version is expected");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1138 emitBuildVersion(MachO::PLATFORM_MACCATALYST, Major, Minor, Update,
150
anatofuz
parents:
diff changeset
1139 SDKVersion);
anatofuz
parents:
diff changeset
1140 return;
anatofuz
parents:
diff changeset
1141 }
anatofuz
parents:
diff changeset
1142
anatofuz
parents:
diff changeset
1143 MCVersionMinType VersionType;
anatofuz
parents:
diff changeset
1144 if (Target.isWatchOS()) {
anatofuz
parents:
diff changeset
1145 VersionType = MCVM_WatchOSVersionMin;
anatofuz
parents:
diff changeset
1146 Target.getWatchOSVersion(Major, Minor, Update);
anatofuz
parents:
diff changeset
1147 } else if (Target.isTvOS()) {
anatofuz
parents:
diff changeset
1148 VersionType = MCVM_TvOSVersionMin;
anatofuz
parents:
diff changeset
1149 Target.getiOSVersion(Major, Minor, Update);
anatofuz
parents:
diff changeset
1150 } else if (Target.isMacOSX()) {
anatofuz
parents:
diff changeset
1151 VersionType = MCVM_OSXVersionMin;
anatofuz
parents:
diff changeset
1152 if (!Target.getMacOSXVersion(Major, Minor, Update))
anatofuz
parents:
diff changeset
1153 Major = 0;
anatofuz
parents:
diff changeset
1154 } else {
anatofuz
parents:
diff changeset
1155 VersionType = MCVM_IOSVersionMin;
anatofuz
parents:
diff changeset
1156 Target.getiOSVersion(Major, Minor, Update);
anatofuz
parents:
diff changeset
1157 }
anatofuz
parents:
diff changeset
1158 if (Major != 0)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1159 emitVersionMin(VersionType, Major, Minor, Update, SDKVersion);
150
anatofuz
parents:
diff changeset
1160 }