27 void ARMTargetStreamer::anchor() {}
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>());
40 delete W64UnwindInfos[i];
45 delete W64UnwindInfos[i];
46 W64UnwindInfos.clear();
48 EmitDebugFrame =
false;
49 CurrentW64UnwindInfo = 0;
52 SectionStack.
push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
70 isa<MCSymbolRefExpr>(Expr))
84 for (std::vector<MCDwarfFrameInfo>::iterator
I = FrameInfos.begin(),
85 E = FrameInfos.end();
I != E; ++
I)
86 I->CompactUnwindEncoding =
91 const MCSymbol *Label,
int PointerSize) {
105 assert(Size <= 8 &&
"Invalid size");
106 assert((
isUIntN(8 * Size, Value) ||
isIntN(8 * Size, Value)) &&
110 for (
unsigned i = 0; i != Size; ++i) {
111 unsigned index = isLittleEndian ? i : (Size - i - 1);
112 buf[i] = uint8_t(Value >> (index * 8));
161 for (uint64_t i = 0, e = NumBytes; i != e; ++i)
177 unsigned Column,
unsigned Flags,
179 unsigned Discriminator,
186 if (FrameInfos.empty())
188 return &FrameInfos.back();
191 void MCStreamer::EnsureValidFrame() {
193 if (!CurFrame || CurFrame->
End)
209 SymbolOrdering[
Symbol] = 1 + SymbolOrdering.size();
213 assert(!Symbol->
isVariable() &&
"Cannot emit a variable symbol!");
220 assert(!Symbol->
isVariable() &&
"Cannot emit a variable symbol!");
235 EmitDebugFrame =
Debug;
240 if (CurFrame && !CurFrame->
End)
246 FrameInfos.push_back(Frame);
258 Frame.
Begin = LastSymbol;
279 MCSymbol *MCStreamer::EmitCFICommon() {
345 CurFrame->
Lsda = Sym;
418 W64UnwindInfos.push_back(Frame);
419 CurrentW64UnwindInfo = W64UnwindInfos.back();
422 void MCStreamer::EnsureValidW64UnwindInfo() {
424 if (!CurFrame || CurFrame->
End)
430 if (CurFrame && !CurFrame->
End)
436 setCurrentW64UnwindInfo(Frame);
440 EnsureValidW64UnwindInfo();
449 EnsureValidW64UnwindInfo();
456 setCurrentW64UnwindInfo(Frame);
460 EnsureValidW64UnwindInfo();
471 EnsureValidW64UnwindInfo();
476 if (!Except && !Unwind)
485 EnsureValidW64UnwindInfo();
492 EnsureValidW64UnwindInfo();
501 EnsureValidW64UnwindInfo();
515 EnsureValidW64UnwindInfo();
526 EnsureValidW64UnwindInfo();
533 Label, Register, Offset);
539 EnsureValidW64UnwindInfo();
546 Label, Register, Offset);
552 EnsureValidW64UnwindInfo();
563 EnsureValidW64UnwindInfo();
577 errs() <<
"EmitRawText called on an MCStreamer that doesn't support it, "
578 " something must not be fully mc'ized\n";
606 if (!FrameInfos.empty() && !FrameInfos.back().End)
virtual void EmitWin64EHPushFrame(bool Code)
const MCSymbol * Function
virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName)
EmitDwarfLocDirective - This implements the DWARF2.
void push_back(const T &Elt)
static void Emit(MCStreamer *MCOS, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
const MCExpr * ForceExpAbs(const MCExpr *Expr)
virtual void EmitCFISameValue(int64_t Register)
unsigned GetDwarfFile(StringRef Directory, StringRef FileName, unsigned FileNumber, unsigned CUID)
GetDwarfFile - creates an entry in the dwarf file and directory tables.
const MCAsmInfo * getAsmInfo() const
virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
const MCSymbol * ExceptionHandler
void EmitRawText(const Twine &String)
void EmitSLEB128IntValue(int64_t Value)
const MCSymbol * Function
static const MCConstantExpr * Create(int64_t Value, MCContext &Ctx)
virtual ~MCTargetStreamer()
static MCCFIInstruction createRememberState(MCSymbol *L)
.cfi_remember_state Save all current rules for all registers.
static MCCFIInstruction createOffset(MCSymbol *L, unsigned Register, int Offset)
.cfi_offset Previous value of Register is saved at offset Offset from CFA.
virtual void EmitValueImpl(const MCExpr *Value, unsigned Size)=0
const char * getPrivateGlobalPrefix() const
void EmitFrames(MCAsmBackend *MAB, bool usingCFI)
virtual void EmitCFIRegister(int64_t Register1, int64_t Register2)
void RecordProcStart(MCDwarfFrameInfo &Frame)
void setStreamer(MCStreamer *S)
virtual void EmitCFIDefCfaOffset(int64_t Offset)
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...
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...
const MCExpr * BuildSymbolDiff(MCContext &Context, const MCSymbol *A, const MCSymbol *B)
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()
virtual void EmitCFISections(bool EH, bool Debug)
virtual void EmitGPRel32Value(const MCExpr *Value)
std::vector< MCCFIInstruction > Instructions
static MCCFIInstruction createUndefined(MCSymbol *L, unsigned Register)
.cfi_undefined From now on the previous value of Register can't be restored anymore.
virtual void EmitCFIRememberState()
virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding)
virtual void EmitGPRel64Value(const MCExpr *Value)
MCSymbol * CreateTempSymbol()
virtual void EmitCFIEscape(StringRef Values)
#define llvm_unreachable(msg)
MCSectionSubPair getCurrentSection() const
void AssignSection(MCSymbol *Symbol, const MCSection *Section)
virtual void EmitBytes(StringRef Data)=0
virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
MCContext & getContext() const
bool isLittleEndian() const
isLittleEndian - True if the target is little endian.
std::vector< MCWin64EHInstruction > Instructions
virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
virtual void EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding)
virtual void EmitWin64EHStartChained()
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, unsigned CUID=0)
virtual void EmitCFIRestoreState()
static void Emit(MCStreamer &streamer)
virtual void EmitIntValue(uint64_t Value, unsigned Size)
void EmitValue(const MCExpr *Value, unsigned Size)
virtual void EmitCFIRestore(int64_t Register)
static const MCSymbolRefExpr * Create(const MCSymbol *Symbol, MCContext &Ctx)
virtual void EmitWin64EHAllocStack(unsigned Size)
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.
virtual raw_ostream & GetCommentOS()
virtual void EmitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros. This function properly handles data in virtual sections.
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...
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...
virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue)
static const MCBinaryExpr * Create(Opcode Op, const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
unsigned getNumW64UnwindInfos()
static MCCFIInstruction createWindowSave(MCSymbol *L)
.cfi_window_save SPARC register window is saved.
virtual void EmitCFIDefCfaRegister(int64_t Register)
void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label, int PointerSize)
virtual void EmitCOFFSecRel32(MCSymbol const *Symbol)
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...
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...
virtual void EmitRawTextImpl(StringRef String)
virtual void EmitCFIUndefined(int64_t Register)
unsigned PersonalityEncoding
void Finish()
Finish - Finish emission of machine code.
virtual void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol)
bool isIntN(unsigned N, int64_t x)
static MCCFIInstruction createRestoreState(MCSymbol *L)
.cfi_restore_state Restore the previously saved state.
void generateCompactUnwindEncodings(MCAsmBackend *MAB)
virtual void FinishImpl()=0
FinishImpl - Streamer specific finalization.
virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, bool Except)
bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
virtual void EmitLabel(MCSymbol *Symbol)
void setUndefined()
setUndefined - Mark the symbol as undefined.
virtual void EmitCFIOffset(int64_t Register, int64_t Offset)
virtual void EmitDebugLabel(MCSymbol *Symbol)
Promote Memory to Register
StringRef toStringRef(SmallVectorImpl< char > &Out) const
uint32_t CompactUnwindEncoding
virtual void EmitWin64EHSaveXMM(unsigned Register, unsigned Offset)
void encodeSLEB128(int64_t Value, raw_ostream &OS)
Utility function to encode a SLEB128 value to an output stream.
virtual void EmitWin64EHEndProc()
virtual void EmitWin64EHHandlerData()
MCWin64EHUnwindInfo * ChainedParent
static void Emit(MCStreamer &streamer, MCAsmBackend *MAB, bool usingCFI, bool isEH)
virtual MCSymbolData & getOrCreateSymbolData(MCSymbol *Symbol)
getOrCreateSymbolData - Get symbol data for given symbol.
unsigned getNumFrameInfos()
StringRef getName() const
getName - Get the symbol name.
virtual void EmitCFISignalFrame()
virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset)
const MCSymbol * Personality
void RecordProcEnd(MCDwarfFrameInfo &Frame)
void setSection(const MCSection &S)
setSection - Mark the symbol as defined in the section S.
virtual uint32_t generateCompactUnwindEncoding(ArrayRef< MCCFIInstruction >) const
Generate the compact unwind encoding for the CFI instructions.
virtual void EmitWin64EHEndChained()
void EmitAbsValue(const MCExpr *Value, unsigned Size)
virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset)
bool hasAggressiveSymbolFolding() const
void EmitULEB128IntValue(uint64_t Value, unsigned Padding=0)
bool isVariable() const
isVariable - Check if this is a variable symbol.
void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator)
virtual void EmitWin64EHSaveReg(unsigned Register, unsigned Offset)
virtual void EmitWin64EHStartProc(const MCSymbol *Symbol)
LLVM Value Representation.
MCAsmBackend - Generic interface to target specific assembler backends.
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.
void EmitSymbolValue(const MCSymbol *Sym, unsigned Size)
virtual void EmitWin64EHSetFrame(unsigned Register, unsigned Offset)
static MCCFIInstruction createEscape(MCSymbol *L, StringRef Vals)
.cfi_escape Allows the user to add arbitrary bytes to the unwind info.
virtual void EmitWin64EHPushReg(unsigned Register)
bool isUIntN(unsigned N, uint64_t x)
virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment)
static MCCFIInstruction createRegister(MCSymbol *L, unsigned Register1, unsigned Register2)
.cfi_register Previous value of Register1 is saved in register Register2.
virtual void EmitCFIWindowSave()