LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MCStreamer.cpp
Go to the documentation of this file.
1 //===- lib/MC/MCStreamer.cpp - Streaming Machine Code Output --------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/MC/MCStreamer.h"
11 #include "llvm/ADT/SmallString.h"
12 #include "llvm/ADT/Twine.h"
13 #include "llvm/MC/MCAsmBackend.h"
14 #include "llvm/MC/MCAsmInfo.h"
15 #include "llvm/MC/MCContext.h"
16 #include "llvm/MC/MCExpr.h"
17 #include "llvm/MC/MCObjectWriter.h"
18 #include "llvm/MC/MCSymbol.h"
20 #include "llvm/Support/LEB128.h"
22 #include <cstdlib>
23 using namespace llvm;
24 
25 // Pin the vtables to this file.
27 void ARMTargetStreamer::anchor() {}
28 
29 MCStreamer::MCStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer)
30  : Context(Ctx), TargetStreamer(TargetStreamer), EmitEHFrame(true),
31  EmitDebugFrame(false), CurrentW64UnwindInfo(0), LastSymbol(0),
32  AutoInitSections(false) {
33  SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
34  if (TargetStreamer)
35  TargetStreamer->setStreamer(this);
36 }
37 
39  for (unsigned i = 0; i < getNumW64UnwindInfos(); ++i)
40  delete W64UnwindInfos[i];
41 }
42 
44  for (unsigned i = 0; i < getNumW64UnwindInfos(); ++i)
45  delete W64UnwindInfos[i];
46  W64UnwindInfos.clear();
47  EmitEHFrame = true;
48  EmitDebugFrame = false;
49  CurrentW64UnwindInfo = 0;
50  LastSymbol = 0;
51  SectionStack.clear();
52  SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
53 }
54 
56  const MCSymbol *A,
57  const MCSymbol *B) {
59  const MCExpr *ARef =
60  MCSymbolRefExpr::Create(A, Variant, Context);
61  const MCExpr *BRef =
62  MCSymbolRefExpr::Create(B, Variant, Context);
63  const MCExpr *AddrDelta =
64  MCBinaryExpr::Create(MCBinaryExpr::Sub, ARef, BRef, Context);
65  return AddrDelta;
66 }
67 
68 const MCExpr *MCStreamer::ForceExpAbs(const MCExpr* Expr) {
69  if (Context.getAsmInfo()->hasAggressiveSymbolFolding() ||
70  isa<MCSymbolRefExpr>(Expr))
71  return Expr;
72 
73  MCSymbol *ABS = Context.CreateTempSymbol();
74  EmitAssignment(ABS, Expr);
75  return MCSymbolRefExpr::Create(ABS, Context);
76 }
77 
79  // By default, discard comments.
80  return nulls();
81 }
82 
84  for (std::vector<MCDwarfFrameInfo>::iterator I = FrameInfos.begin(),
85  E = FrameInfos.end(); I != E; ++I)
86  I->CompactUnwindEncoding =
87  (MAB ? MAB->generateCompactUnwindEncoding(I->Instructions) : 0);
88 }
89 
90 void MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta,
91  const MCSymbol *Label, int PointerSize) {
92  // emit the sequence to set the address
94  EmitULEB128IntValue(PointerSize + 1);
96  EmitSymbolValue(Label, PointerSize);
97 
98  // emit the sequence for the LineDelta (from 1) and a zero address delta.
99  MCDwarfLineAddr::Emit(this, LineDelta, 0);
100 }
101 
102 /// EmitIntValue - Special case of EmitValue that avoids the client having to
103 /// pass in a MCExpr for constant integers.
104 void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size) {
105  assert(Size <= 8 && "Invalid size");
106  assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
107  "Invalid size");
108  char buf[8];
109  const bool isLittleEndian = Context.getAsmInfo()->isLittleEndian();
110  for (unsigned i = 0; i != Size; ++i) {
111  unsigned index = isLittleEndian ? i : (Size - i - 1);
112  buf[i] = uint8_t(Value >> (index * 8));
113  }
114  EmitBytes(StringRef(buf, Size));
115 }
116 
117 /// EmitULEB128Value - Special case of EmitULEB128Value that avoids the
118 /// client having to pass in a MCExpr for constant integers.
119 void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned Padding) {
120  SmallString<128> Tmp;
121  raw_svector_ostream OSE(Tmp);
122  encodeULEB128(Value, OSE, Padding);
123  EmitBytes(OSE.str());
124 }
125 
126 /// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the
127 /// client having to pass in a MCExpr for constant integers.
129  SmallString<128> Tmp;
130  raw_svector_ostream OSE(Tmp);
131  encodeSLEB128(Value, OSE);
132  EmitBytes(OSE.str());
133 }
134 
135 void MCStreamer::EmitAbsValue(const MCExpr *Value, unsigned Size) {
136  const MCExpr *ABS = ForceExpAbs(Value);
137  EmitValue(ABS, Size);
138 }
139 
140 
141 void MCStreamer::EmitValue(const MCExpr *Value, unsigned Size) {
142  EmitValueImpl(Value, Size);
143 }
144 
145 void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size) {
147 }
148 
150  report_fatal_error("unsupported directive in streamer");
151 }
152 
154  report_fatal_error("unsupported directive in streamer");
155 }
156 
157 /// EmitFill - Emit NumBytes bytes worth of the value specified by
158 /// FillValue. This implements directives such as '.space'.
159 void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) {
160  const MCExpr *E = MCConstantExpr::Create(FillValue, getContext());
161  for (uint64_t i = 0, e = NumBytes; i != e; ++i)
162  EmitValue(E, 1);
163 }
164 
165 /// The implementation in this class just redirects to EmitFill.
166 void MCStreamer::EmitZeros(uint64_t NumBytes) {
167  EmitFill(NumBytes, 0);
168 }
169 
171  StringRef Directory,
172  StringRef Filename, unsigned CUID) {
173  return getContext().GetDwarfFile(Directory, Filename, FileNo, CUID) == 0;
174 }
175 
176 void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
177  unsigned Column, unsigned Flags,
178  unsigned Isa,
179  unsigned Discriminator,
180  StringRef FileName) {
181  getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
182  Discriminator);
183 }
184 
185 MCDwarfFrameInfo *MCStreamer::getCurrentFrameInfo() {
186  if (FrameInfos.empty())
187  return 0;
188  return &FrameInfos.back();
189 }
190 
191 void MCStreamer::EnsureValidFrame() {
192  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
193  if (!CurFrame || CurFrame->End)
194  report_fatal_error("No open frame");
195 }
196 
198  MCSymbol *EHSymbol) {
199 }
200 
202  if (Section)
203  Symbol->setSection(*Section);
204  else
205  Symbol->setUndefined();
206 
207  // As we emit symbols into a section, track the order so that they can
208  // be sorted upon later. Zero is reserved to mean 'unemitted'.
209  SymbolOrdering[Symbol] = 1 + SymbolOrdering.size();
210 }
211 
213  assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
214  assert(getCurrentSection().first && "Cannot emit before setting section!");
215  AssignSection(Symbol, getCurrentSection().first);
216  LastSymbol = Symbol;
217 }
218 
220  assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
221  assert(getCurrentSection().first && "Cannot emit before setting section!");
222  AssignSection(Symbol, getCurrentSection().first);
223  LastSymbol = Symbol;
224 }
225 
226 void MCStreamer::EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding) {
227  EnsureValidFrame();
228  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
229  CurFrame->CompactUnwindEncoding = CompactUnwindEncoding;
230 }
231 
232 void MCStreamer::EmitCFISections(bool EH, bool Debug) {
233  assert(EH || Debug);
234  EmitEHFrame = EH;
235  EmitDebugFrame = Debug;
236 }
237 
239  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
240  if (CurFrame && !CurFrame->End)
241  report_fatal_error("Starting a frame before finishing the previous one!");
242 
243  MCDwarfFrameInfo Frame;
244  EmitCFIStartProcImpl(Frame);
245 
246  FrameInfos.push_back(Frame);
247 }
248 
250 }
251 
253  Frame.Function = LastSymbol;
254  // If the function is externally visible, we need to create a local
255  // symbol to avoid relocations.
257  if (LastSymbol && LastSymbol->getName().startswith(Prefix)) {
258  Frame.Begin = LastSymbol;
259  } else {
260  Frame.Begin = getContext().CreateTempSymbol();
261  EmitLabel(Frame.Begin);
262  }
263 }
264 
266  EnsureValidFrame();
267  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
268  EmitCFIEndProcImpl(*CurFrame);
269 }
270 
272 }
273 
275  Frame.End = getContext().CreateTempSymbol();
276  EmitLabel(Frame.End);
277 }
278 
279 MCSymbol *MCStreamer::EmitCFICommon() {
280  EnsureValidFrame();
281  MCSymbol *Label = getContext().CreateTempSymbol();
282  EmitLabel(Label);
283  return Label;
284 }
285 
286 void MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
287  MCSymbol *Label = EmitCFICommon();
289  MCCFIInstruction::createDefCfa(Label, Register, Offset);
290  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
291  CurFrame->Instructions.push_back(Instruction);
292 }
293 
294 void MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
295  MCSymbol *Label = EmitCFICommon();
298  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
299  CurFrame->Instructions.push_back(Instruction);
300 }
301 
302 void MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
303  MCSymbol *Label = EmitCFICommon();
305  MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment);
306  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
307  CurFrame->Instructions.push_back(Instruction);
308 }
309 
311  MCSymbol *Label = EmitCFICommon();
314  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
315  CurFrame->Instructions.push_back(Instruction);
316 }
317 
318 void MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {
319  MCSymbol *Label = EmitCFICommon();
321  MCCFIInstruction::createOffset(Label, Register, Offset);
322  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
323  CurFrame->Instructions.push_back(Instruction);
324 }
325 
326 void MCStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
327  MCSymbol *Label = EmitCFICommon();
329  MCCFIInstruction::createRelOffset(Label, Register, Offset);
330  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
331  CurFrame->Instructions.push_back(Instruction);
332 }
333 
335  unsigned Encoding) {
336  EnsureValidFrame();
337  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
338  CurFrame->Personality = Sym;
339  CurFrame->PersonalityEncoding = Encoding;
340 }
341 
342 void MCStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
343  EnsureValidFrame();
344  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
345  CurFrame->Lsda = Sym;
346  CurFrame->LsdaEncoding = Encoding;
347 }
348 
350  MCSymbol *Label = EmitCFICommon();
352  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
353  CurFrame->Instructions.push_back(Instruction);
354 }
355 
357  // FIXME: Error if there is no matching cfi_remember_state.
358  MCSymbol *Label = EmitCFICommon();
360  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
361  CurFrame->Instructions.push_back(Instruction);
362 }
363 
365  MCSymbol *Label = EmitCFICommon();
367  MCCFIInstruction::createSameValue(Label, Register);
368  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
369  CurFrame->Instructions.push_back(Instruction);
370 }
371 
373  MCSymbol *Label = EmitCFICommon();
375  MCCFIInstruction::createRestore(Label, Register);
376  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
377  CurFrame->Instructions.push_back(Instruction);
378 }
379 
381  MCSymbol *Label = EmitCFICommon();
383  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
384  CurFrame->Instructions.push_back(Instruction);
385 }
386 
388  EnsureValidFrame();
389  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
390  CurFrame->IsSignalFrame = true;
391 }
392 
394  MCSymbol *Label = EmitCFICommon();
396  MCCFIInstruction::createUndefined(Label, Register);
397  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
398  CurFrame->Instructions.push_back(Instruction);
399 }
400 
401 void MCStreamer::EmitCFIRegister(int64_t Register1, int64_t Register2) {
402  MCSymbol *Label = EmitCFICommon();
404  MCCFIInstruction::createRegister(Label, Register1, Register2);
405  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
406  CurFrame->Instructions.push_back(Instruction);
407 }
408 
410  MCSymbol *Label = EmitCFICommon();
413  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
414  CurFrame->Instructions.push_back(Instruction);
415 }
416 
417 void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
418  W64UnwindInfos.push_back(Frame);
419  CurrentW64UnwindInfo = W64UnwindInfos.back();
420 }
421 
422 void MCStreamer::EnsureValidW64UnwindInfo() {
423  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
424  if (!CurFrame || CurFrame->End)
425  report_fatal_error("No open Win64 EH frame function!");
426 }
427 
429  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
430  if (CurFrame && !CurFrame->End)
431  report_fatal_error("Starting a function before ending the previous one!");
433  Frame->Begin = getContext().CreateTempSymbol();
434  Frame->Function = Symbol;
435  EmitLabel(Frame->Begin);
436  setCurrentW64UnwindInfo(Frame);
437 }
438 
440  EnsureValidW64UnwindInfo();
441  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
442  if (CurFrame->ChainedParent)
443  report_fatal_error("Not all chained regions terminated!");
444  CurFrame->End = getContext().CreateTempSymbol();
445  EmitLabel(CurFrame->End);
446 }
447 
449  EnsureValidW64UnwindInfo();
451  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
452  Frame->Begin = getContext().CreateTempSymbol();
453  Frame->Function = CurFrame->Function;
454  Frame->ChainedParent = CurFrame;
455  EmitLabel(Frame->Begin);
456  setCurrentW64UnwindInfo(Frame);
457 }
458 
460  EnsureValidW64UnwindInfo();
461  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
462  if (!CurFrame->ChainedParent)
463  report_fatal_error("End of a chained region outside a chained region!");
464  CurFrame->End = getContext().CreateTempSymbol();
465  EmitLabel(CurFrame->End);
466  CurrentW64UnwindInfo = CurFrame->ChainedParent;
467 }
468 
469 void MCStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
470  bool Except) {
471  EnsureValidW64UnwindInfo();
472  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
473  if (CurFrame->ChainedParent)
474  report_fatal_error("Chained unwind areas can't have handlers!");
475  CurFrame->ExceptionHandler = Sym;
476  if (!Except && !Unwind)
477  report_fatal_error("Don't know what kind of handler this is!");
478  if (Unwind)
479  CurFrame->HandlesUnwind = true;
480  if (Except)
481  CurFrame->HandlesExceptions = true;
482 }
483 
485  EnsureValidW64UnwindInfo();
486  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
487  if (CurFrame->ChainedParent)
488  report_fatal_error("Chained unwind areas can't have handlers!");
489 }
490 
492  EnsureValidW64UnwindInfo();
493  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
494  MCSymbol *Label = getContext().CreateTempSymbol();
495  MCWin64EHInstruction Inst(Win64EH::UOP_PushNonVol, Label, Register);
496  EmitLabel(Label);
497  CurFrame->Instructions.push_back(Inst);
498 }
499 
500 void MCStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) {
501  EnsureValidW64UnwindInfo();
502  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
503  if (CurFrame->LastFrameInst >= 0)
504  report_fatal_error("Frame register and offset already specified!");
505  if (Offset & 0x0F)
506  report_fatal_error("Misaligned frame pointer offset!");
507  MCSymbol *Label = getContext().CreateTempSymbol();
508  MCWin64EHInstruction Inst(Win64EH::UOP_SetFPReg, Label, Register, Offset);
509  EmitLabel(Label);
510  CurFrame->LastFrameInst = CurFrame->Instructions.size();
511  CurFrame->Instructions.push_back(Inst);
512 }
513 
515  EnsureValidW64UnwindInfo();
516  if (Size & 7)
517  report_fatal_error("Misaligned stack allocation!");
518  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
519  MCSymbol *Label = getContext().CreateTempSymbol();
520  MCWin64EHInstruction Inst(Label, Size);
521  EmitLabel(Label);
522  CurFrame->Instructions.push_back(Inst);
523 }
524 
525 void MCStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) {
526  EnsureValidW64UnwindInfo();
527  if (Offset & 7)
528  report_fatal_error("Misaligned saved register offset!");
529  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
530  MCSymbol *Label = getContext().CreateTempSymbol();
532  Offset > 512*1024-8 ? Win64EH::UOP_SaveNonVolBig : Win64EH::UOP_SaveNonVol,
533  Label, Register, Offset);
534  EmitLabel(Label);
535  CurFrame->Instructions.push_back(Inst);
536 }
537 
538 void MCStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) {
539  EnsureValidW64UnwindInfo();
540  if (Offset & 0x0F)
541  report_fatal_error("Misaligned saved vector register offset!");
542  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
543  MCSymbol *Label = getContext().CreateTempSymbol();
545  Offset > 512*1024-16 ? Win64EH::UOP_SaveXMM128Big : Win64EH::UOP_SaveXMM128,
546  Label, Register, Offset);
547  EmitLabel(Label);
548  CurFrame->Instructions.push_back(Inst);
549 }
550 
552  EnsureValidW64UnwindInfo();
553  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
554  if (CurFrame->Instructions.size() > 0)
555  report_fatal_error("If present, PushMachFrame must be the first UOP");
556  MCSymbol *Label = getContext().CreateTempSymbol();
558  EmitLabel(Label);
559  CurFrame->Instructions.push_back(Inst);
560 }
561 
563  EnsureValidW64UnwindInfo();
564  MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
565  CurFrame->PrologEnd = getContext().CreateTempSymbol();
566  EmitLabel(CurFrame->PrologEnd);
567 }
568 
570  llvm_unreachable("This file format doesn't support this directive");
571 }
572 
573 /// EmitRawText - If this file is backed by an assembly streamer, this dumps
574 /// the specified string in the output .s file. This capability is
575 /// indicated by the hasRawTextSupport() predicate.
577  errs() << "EmitRawText called on an MCStreamer that doesn't support it, "
578  " something must not be fully mc'ized\n";
579  abort();
580 }
581 
583  SmallString<128> Str;
585 }
586 
587 void MCStreamer::EmitFrames(MCAsmBackend *MAB, bool usingCFI) {
588  if (!getNumFrameInfos())
589  return;
590 
591  if (EmitEHFrame)
592  MCDwarfFrameEmitter::Emit(*this, MAB, usingCFI, true);
593 
594  if (EmitDebugFrame)
595  MCDwarfFrameEmitter::Emit(*this, MAB, usingCFI, false);
596 }
597 
599  if (!getNumW64UnwindInfos())
600  return;
601 
603 }
604 
606  if (!FrameInfos.empty() && !FrameInfos.back().End)
607  report_fatal_error("Unfinished frame!");
608 
609  FinishImpl();
610 }
611 
613  report_fatal_error("Not supported!");
614  return *(static_cast<MCSymbolData*>(0));
615 }
virtual void EmitWin64EHPushFrame(bool Code)
Definition: MCStreamer.cpp:551
const MCSymbol * Function
Definition: MCDwarf.h:446
virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName)
EmitDwarfLocDirective - This implements the DWARF2.
Definition: MCStreamer.cpp:176
void push_back(const T &Elt)
Definition: SmallVector.h:236
static void Emit(MCStreamer *MCOS, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
Definition: MCDwarf.cpp:355
const MCExpr * ForceExpAbs(const MCExpr *Expr)
Definition: MCStreamer.cpp:68
virtual void EmitCFISameValue(int64_t Register)
Definition: MCStreamer.cpp:364
unsigned GetDwarfFile(StringRef Directory, StringRef FileName, unsigned FileNumber, unsigned CUID)
GetDwarfFile - creates an entry in the dwarf file and directory tables.
Definition: MCContext.cpp:319
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:175
raw_ostream & errs()
virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
Definition: MCStreamer.cpp:334
const MCSymbol * ExceptionHandler
Definition: MCWin64EH.h:71
void EmitRawText(const Twine &String)
Definition: MCStreamer.cpp:582
void EmitSLEB128IntValue(int64_t Value)
Definition: MCStreamer.cpp:128
const MCSymbol * Function
Definition: MCWin64EH.h:72
static const MCConstantExpr * Create(int64_t Value, MCContext &Ctx)
Definition: MCExpr.cpp:152
virtual ~MCTargetStreamer()
Definition: MCStreamer.cpp:26
static MCCFIInstruction createRememberState(MCSymbol *L)
.cfi_remember_state Save all current rules for all registers.
Definition: MCDwarf.h:393
static MCCFIInstruction createOffset(MCSymbol *L, unsigned Register, int Offset)
.cfi_offset Previous value of Register is saved at offset Offset from CFA.
Definition: MCDwarf.h:348
virtual void EmitValueImpl(const MCExpr *Value, unsigned Size)=0
const char * getPrivateGlobalPrefix() const
Definition: MCAsmInfo.h:434
virtual void reset()
Definition: MCStreamer.cpp:43
void EmitFrames(MCAsmBackend *MAB, bool usingCFI)
Definition: MCStreamer.cpp:587
virtual void EmitCFIRegister(int64_t Register1, int64_t Register2)
Definition: MCStreamer.cpp:401
void RecordProcStart(MCDwarfFrameInfo &Frame)
Definition: MCStreamer.cpp:252
void setStreamer(MCStreamer *S)
Definition: MCStreamer.h:73
virtual void EmitCFIDefCfaOffset(int64_t Offset)
Definition: MCStreamer.cpp:294
static MCCFIInstruction createDefCfaOffset(MCSymbol *L, int Offset)
.cfi_def_cfa_offset modifies a rule for computing CFA. Register remains the same, but offset is new...
Definition: MCDwarf.h:335
unsigned LsdaEncoding
Definition: MCDwarf.h:449
void EmitCFIStartProc()
Definition: MCStreamer.cpp:238
static MCCFIInstruction createAdjustCfaOffset(MCSymbol *L, int Adjustment)
.cfi_adjust_cfa_offset Same as .cfi_def_cfa_offset, but Offset is a relative value that is added/subt...
Definition: MCDwarf.h:342
const MCExpr * BuildSymbolDiff(MCContext &Context, const MCSymbol *A, const MCSymbol *B)
Definition: MCStreamer.cpp:55
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value)=0
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
virtual void EmitWin64EHEndProlog()
Definition: MCStreamer.cpp:562
virtual void EmitCFISections(bool EH, bool Debug)
Definition: MCStreamer.cpp:232
virtual void EmitGPRel32Value(const MCExpr *Value)
Definition: MCStreamer.cpp:153
std::vector< MCCFIInstruction > Instructions
Definition: MCDwarf.h:447
static MCCFIInstruction createUndefined(MCSymbol *L, unsigned Register)
.cfi_undefined From now on the previous value of Register can't be restored anymore.
Definition: MCDwarf.h:382
virtual void EmitCFIRememberState()
Definition: MCStreamer.cpp:349
virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding)
Definition: MCStreamer.cpp:342
virtual void EmitGPRel64Value(const MCExpr *Value)
Definition: MCStreamer.cpp:149
MCSymbol * CreateTempSymbol()
Definition: MCContext.cpp:165
virtual void EmitCFIEscape(StringRef Values)
Definition: MCStreamer.cpp:380
#define llvm_unreachable(msg)
MCSectionSubPair getCurrentSection() const
Definition: MCStreamer.h:224
void AssignSection(MCSymbol *Symbol, const MCSection *Section)
Definition: MCStreamer.cpp:201
virtual void EmitBytes(StringRef Data)=0
MCSymbol * Begin
Definition: MCDwarf.h:442
const MCSymbol * Lsda
Definition: MCDwarf.h:445
virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
Definition: MCStreamer.cpp:249
virtual ~MCStreamer()
Definition: MCStreamer.cpp:38
#define false
Definition: ConvertUTF.c:64
MCContext & getContext() const
Definition: MCStreamer.h:168
bool isLittleEndian() const
isLittleEndian - True if the target is little endian.
Definition: MCAsmInfo.h:334
std::vector< MCWin64EHInstruction > Instructions
Definition: MCWin64EH.h:79
virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
Definition: MCStreamer.cpp:271
virtual void EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding)
Definition: MCStreamer.cpp:226
virtual void EmitWin64EHStartChained()
Definition: MCStreamer.cpp:448
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, unsigned CUID=0)
Definition: MCStreamer.cpp:170
virtual void EmitCFIRestoreState()
Definition: MCStreamer.cpp:356
static void Emit(MCStreamer &streamer)
Definition: MCWin64EH.cpp:277
virtual void EmitIntValue(uint64_t Value, unsigned Size)
Definition: MCStreamer.cpp:104
void EmitValue(const MCExpr *Value, unsigned Size)
Definition: MCStreamer.cpp:141
virtual void EmitCFIRestore(int64_t Register)
Definition: MCStreamer.cpp:372
static const MCSymbolRefExpr * Create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:270
virtual void EmitWin64EHAllocStack(unsigned Size)
Definition: MCStreamer.cpp:514
static MCCFIInstruction createSameValue(MCSymbol *L, unsigned Register)
.cfi_same_value Current value of Register is the same as in the previous frame. I.e., no restoration is needed.
Definition: MCDwarf.h:388
virtual raw_ostream & GetCommentOS()
Definition: MCStreamer.cpp:78
#define true
Definition: ConvertUTF.c:65
virtual void EmitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros. This function properly handles data in virtual sections.
Definition: MCStreamer.cpp:166
static MCCFIInstruction createDefCfa(MCSymbol *L, unsigned Register, int Offset)
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it...
Definition: MCDwarf.h:321
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register)
.cfi_def_cfa_register modifies a rule for computing CFA. From now on Register will be used instead of...
Definition: MCDwarf.h:328
virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue)
Definition: MCStreamer.cpp:159
static const MCBinaryExpr * Create(Opcode Op, const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.cpp:142
unsigned getNumW64UnwindInfos()
Definition: MCStreamer.h:181
static MCCFIInstruction createWindowSave(MCSymbol *L)
.cfi_window_save SPARC register window is saved.
Definition: MCDwarf.h:369
virtual void EmitCFIDefCfaRegister(int64_t Register)
Definition: MCStreamer.cpp:310
void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label, int PointerSize)
Definition: MCStreamer.cpp:90
virtual void EmitCOFFSecRel32(MCSymbol const *Symbol)
Definition: MCStreamer.cpp:569
static MCCFIInstruction createRelOffset(MCSymbol *L, unsigned Register, int Offset)
.cfi_rel_offset Previous value of Register is saved at offset Offset from the current CFA register...
Definition: MCDwarf.h:356
static MCCFIInstruction createRestore(MCSymbol *L, unsigned Register)
.cfi_restore says that the rule for Register is now the same as it was at the beginning of the functi...
Definition: MCDwarf.h:376
virtual void EmitRawTextImpl(StringRef String)
Definition: MCStreamer.cpp:576
virtual void EmitCFIUndefined(int64_t Register)
Definition: MCStreamer.cpp:393
unsigned PersonalityEncoding
Definition: MCDwarf.h:448
void Finish()
Finish - Finish emission of machine code.
Definition: MCStreamer.cpp:605
virtual void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol)
Definition: MCStreamer.cpp:197
bool isIntN(unsigned N, int64_t x)
Definition: MathExtras.h:321
static MCCFIInstruction createRestoreState(MCSymbol *L)
.cfi_restore_state Restore the previously saved state.
Definition: MCDwarf.h:398
void generateCompactUnwindEncodings(MCAsmBackend *MAB)
Definition: MCStreamer.cpp:83
virtual void FinishImpl()=0
FinishImpl - Streamer specific finalization.
virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, bool Except)
Definition: MCStreamer.cpp:469
bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition: StringRef.h:208
virtual void EmitLabel(MCSymbol *Symbol)
Definition: MCStreamer.cpp:212
void setUndefined()
setUndefined - Mark the symbol as undefined.
Definition: MCSymbol.h:120
virtual void EmitCFIOffset(int64_t Register, int64_t Offset)
Definition: MCStreamer.cpp:318
virtual void EmitDebugLabel(MCSymbol *Symbol)
Definition: MCStreamer.cpp:219
Promote Memory to Register
Definition: Mem2Reg.cpp:54
StringRef toStringRef(SmallVectorImpl< char > &Out) const
Definition: Twine.cpp:31
uint32_t CompactUnwindEncoding
Definition: MCDwarf.h:450
virtual void EmitWin64EHSaveXMM(unsigned Register, unsigned Offset)
Definition: MCStreamer.cpp:538
void encodeSLEB128(int64_t Value, raw_ostream &OS)
Utility function to encode a SLEB128 value to an output stream.
Definition: LEB128.h:23
virtual void EmitWin64EHEndProc()
Definition: MCStreamer.cpp:439
virtual void EmitWin64EHHandlerData()
Definition: MCStreamer.cpp:484
MCWin64EHUnwindInfo * ChainedParent
Definition: MCWin64EH.h:78
static void Emit(MCStreamer &streamer, MCAsmBackend *MAB, bool usingCFI, bool isEH)
Definition: MCDwarf.cpp:1422
virtual MCSymbolData & getOrCreateSymbolData(MCSymbol *Symbol)
getOrCreateSymbolData - Get symbol data for given symbol.
Definition: MCStreamer.cpp:612
unsigned getNumFrameInfos()
Definition: MCStreamer.h:175
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:70
virtual void EmitCFISignalFrame()
Definition: MCStreamer.cpp:387
virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset)
Definition: MCStreamer.cpp:326
const MCSymbol * Personality
Definition: MCDwarf.h:444
void RecordProcEnd(MCDwarfFrameInfo &Frame)
Definition: MCStreamer.cpp:274
#define I(x, y, z)
Definition: MD5.cpp:54
void setSection(const MCSection &S)
setSection - Mark the symbol as defined in the section S.
Definition: MCSymbol.h:117
virtual uint32_t generateCompactUnwindEncoding(ArrayRef< MCCFIInstruction >) const
Generate the compact unwind encoding for the CFI instructions.
Definition: MCAsmBackend.h:166
virtual void EmitWin64EHEndChained()
Definition: MCStreamer.cpp:459
void EmitAbsValue(const MCExpr *Value, unsigned Size)
Definition: MCStreamer.cpp:135
virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset)
Definition: MCStreamer.cpp:286
bool hasAggressiveSymbolFolding() const
Definition: MCAsmInfo.h:486
void EmitULEB128IntValue(uint64_t Value, unsigned Padding=0)
Definition: MCStreamer.cpp:119
bool isVariable() const
isVariable - Check if this is a variable symbol.
Definition: MCSymbol.h:132
void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator)
Definition: MCContext.h:347
virtual void EmitWin64EHSaveReg(unsigned Register, unsigned Offset)
Definition: MCStreamer.cpp:525
virtual void EmitWin64EHStartProc(const MCSymbol *Symbol)
Definition: MCStreamer.cpp:428
LLVM Value Representation.
Definition: Value.h:66
MCAsmBackend - Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:34
static cl::opt< bool, true > Debug("debug", cl::desc("Enable debug output"), cl::Hidden, cl::location(DebugFlag))
raw_ostream & nulls()
nulls() - This returns a reference to a raw_ostream which discards output.
void encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned Padding=0)
Utility function to encode a ULEB128 value to an output stream.
Definition: LEB128.h:38
Subtraction.
Definition: MCExpr.h:379
void EmitSymbolValue(const MCSymbol *Sym, unsigned Size)
Definition: MCStreamer.cpp:145
virtual void EmitWin64EHSetFrame(unsigned Register, unsigned Offset)
Definition: MCStreamer.cpp:500
static MCCFIInstruction createEscape(MCSymbol *L, StringRef Vals)
.cfi_escape Allows the user to add arbitrary bytes to the unwind info.
Definition: MCDwarf.h:404
virtual void EmitWin64EHPushReg(unsigned Register)
Definition: MCStreamer.cpp:491
bool isUIntN(unsigned N, uint64_t x)
Definition: MathExtras.h:315
virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment)
Definition: MCStreamer.cpp:302
static MCCFIInstruction createRegister(MCSymbol *L, unsigned Register1, unsigned Register2)
.cfi_register Previous value of Register1 is saved in register Register2.
Definition: MCDwarf.h:363
virtual void EmitCFIWindowSave()
Definition: MCStreamer.cpp:409