14 #ifndef LLVM_MC_MCSTREAMER_H
15 #define LLVM_MC_MCSTREAMER_H
23 #include "llvm/Support/DataTypes.h"
79 virtual void anchor();
86 virtual void emitSetFP(
unsigned FpReg,
unsigned SpReg,
87 int64_t Offset = 0) = 0;
88 virtual void emitPad(int64_t Offset) = 0;
95 virtual void emitFPU(
unsigned FPU) = 0;
118 std::vector<MCDwarfFrameInfo> FrameInfos;
121 void EnsureValidFrame();
123 std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos;
126 void EnsureValidW64UnwindInfo();
138 bool AutoInitSections;
155 return CurrentW64UnwindInfo;
166 virtual void reset();
171 assert(TargetStreamer);
172 return *TargetStreamer;
184 return *W64UnwindInfos[i];
225 if (!SectionStack.
empty())
226 return SectionStack.
back().first;
233 if (!SectionStack.
empty())
234 return SectionStack.
back().second;
241 return SymbolOrdering.lookup(Sym);
262 if (SectionStack.
size() <= 1)
267 if (oldSection != curSection)
273 if (SectionStack.
empty())
285 assert(Section &&
"Cannot switch to a null section!");
287 SectionStack.
back().second = curSection;
298 const MCExpr *Subsection = 0) {
299 assert(Section &&
"Cannot switch to a null section!");
301 SectionStack.
back().second = curSection;
308 if (AutoInitSections)
314 this->AutoInitSections = AutoInitSections;
524 virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue);
528 virtual void EmitZeros(uint64_t NumBytes);
548 unsigned ValueSize = 1,
549 unsigned MaxBytesToEmit = 0) = 0;
563 unsigned MaxBytesToEmit = 0) = 0;
575 unsigned char Value = 0) = 0;
596 unsigned Column,
unsigned Flags,
597 unsigned Isa,
unsigned Discriminator,
603 unsigned PointerSize) = 0;
702 formatted_raw_ostream &OS,
bool isVerboseAsm,
703 bool useLoc,
bool useCFI,
bool useDwarfDirectory,
704 MCInstPrinter *InstPrint = 0,
705 MCCodeEmitter *CE = 0, MCAsmBackend *TAB = 0,
706 bool ShowInst =
false);
713 raw_ostream &OS, MCCodeEmitter *CE,
721 MCCodeEmitter &CE, raw_ostream &OS,
727 MCAsmBackend &TAB, raw_ostream &OS,
736 raw_ostream &OS, MCCodeEmitter *CE);
virtual void EmitULEB128Value(const MCExpr *Value)=0
virtual void EmitWin64EHPushFrame(bool Code)
MCStreamer * createPureStreamer(MCContext &Ctx, MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *CE)
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)
const MCExpr * ForceExpAbs(const MCExpr *Expr)
virtual void EmitCFISameValue(int64_t Register)
MCSectionSubPair getPreviousSection() const
virtual void AddComment(const Twine &T)
virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel, const MCSymbol *Label, unsigned PointerSize)=0
void EmitRawText(const Twine &String)
void EmitSLEB128IntValue(int64_t Value)
virtual void switchVendor(StringRef Vendor)=0
virtual void AddBlankLine()
AddBlankLine - Emit a blank line to a .s file to pretty it up.
virtual void emitPersonality(const MCSymbol *Personality)=0
virtual ~MCTargetStreamer()
virtual void InitSections()=0
InitSections - Create the default sections and set the initial one.
virtual void EmitValueImpl(const MCExpr *Value, unsigned Size)=0
virtual void EmitFileDirective(StringRef Filename)=0
MCStreamer * createNullStreamer(MCContext &Ctx)
virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol=0, uint64_t Size=0, unsigned ByteAlignment=0)=0
void EmitFrames(MCAsmBackend *MAB, bool usingCFI)
virtual bool hasRawTextSupport() const
virtual void EmitInstruction(const MCInst &Inst)=0
virtual void EmitBundleAlignMode(unsigned AlignPow2)=0
Set the bundle alignment mode from now on in the section. The argument is the power of 2 to which the...
virtual void EmitCFIRegister(int64_t Register1, int64_t Register2)
void RecordProcStart(MCDwarfFrameInfo &Frame)
MCWin64EHUnwindInfo * getCurrentW64UnwindInfo()
void setStreamer(MCStreamer *S)
virtual void EmitCFIDefCfaOffset(int64_t Offset)
virtual void EmitThumbFunc(MCSymbol *Func)=0
COFF::SymbolStorageClass StorageClass
MCStreamer * createELFStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer, MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *CE, bool RelaxAll, bool NoExecStack)
const MCExpr * BuildSymbolDiff(MCContext &Context, const MCSymbol *A, const MCSymbol *B)
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value)=0
virtual void finishAttributeSection()=0
ArrayRef< MCDwarfFrameInfo > getFrameInfos() const
virtual void EmitWin64EHEndProlog()
virtual void EmitCFISections(bool EH, bool Debug)
virtual void EmitGPRel32Value(const MCExpr *Value)
virtual void EmitCFIRememberState()
virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding)
virtual void EmitGPRel64Value(const MCExpr *Value)
MCStreamer * createMachOStreamer(MCContext &Ctx, MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *CE, bool RelaxAll=false)
T LLVM_ATTRIBUTE_UNUSED_RESULT pop_back_val()
virtual void EmitCFIEscape(StringRef Values)
MCSectionSubPair getCurrentSection() const
void AssignSection(MCSymbol *Symbol, const MCSection *Section)
virtual void EmitBytes(StringRef Data)=0
virtual void emitFnEnd()=0
virtual bool isVerboseAsm() const
virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
MCContext & getContext() const
void SwitchSection(const MCSection *Section, const MCExpr *Subsection=0)
virtual void emitFnStart()=0
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
virtual void emitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset=0)=0
virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
virtual void EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding)
virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol)=0
MCStreamer * createWinCOFFStreamer(MCContext &Ctx, MCAsmBackend &TAB, MCCodeEmitter &CE, raw_ostream &OS, bool RelaxAll=false)
virtual void EmitWin64EHStartChained()
virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, unsigned CUID=0)
virtual void EmitCFIRestoreState()
MCWin64EHUnwindInfo & getW64UnwindInfo(unsigned i)
virtual void EmitIntValue(uint64_t Value, unsigned Size)
void EmitValue(const MCExpr *Value, unsigned Size)
virtual void EmitCFIRestore(int64_t Register)
virtual void EmitWin64EHAllocStack(unsigned Size)
virtual raw_ostream & GetCommentOS()
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag)=0
EmitAssemblerFlag - Note in the output the specified Flag.
virtual void EmitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros. This function properly handles data in virtual sections.
virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment)=0
virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue)
void SwitchSectionNoChange(const MCSection *Section, const MCExpr *Subsection=0)
virtual void EmitSLEB128Value(const MCExpr *Value)=0
unsigned getNumW64UnwindInfos()
virtual void emitRegSave(const SmallVectorImpl< unsigned > &RegList, bool isVector)=0
void InitStreamer()
Initialize the streamer.
virtual void EmitCFIDefCfaRegister(int64_t Register)
virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value)=0
void EmitDwarfSetLineAddr(int64_t LineDelta, const MCSymbol *Label, int PointerSize)
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
EmitSymbolAttribute - Add the given Attribute to Symbol.
virtual void EmitCOFFSecRel32(MCSymbol const *Symbol)
virtual void Flush()
Flush - Causes any cached state to be written out.
virtual void EmitRawTextImpl(StringRef String)
virtual void EmitCFIUndefined(int64_t Register)
virtual void EmitIdent(StringRef IdentString)
void Finish()
Finish - Finish emission of machine code.
virtual void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol)
virtual void EmitBundleLock(bool AlignToEnd)=0
The following instructions are a bundle-locked group.
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0)=0
void generateCompactUnwindEncodings(MCAsmBackend *MAB)
bool SubSection(const MCExpr *Subsection)
virtual void EmitDataRegion(MCDataRegionType Kind)
EmitDataRegion - Note in the output the specified region Kind.
virtual void FinishImpl()=0
FinishImpl - Streamer specific finalization.
virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, bool Except)
virtual void EmitCOFFSymbolType(int Type)=0
virtual void emitAttribute(unsigned Attribute, unsigned Value)=0
virtual void emitFPU(unsigned FPU)=0
virtual void EmitLabel(MCSymbol *Symbol)
virtual void EmitCFIOffset(int64_t Register, int64_t Offset)
virtual void EmitDebugLabel(MCSymbol *Symbol)
Promote Memory to Register
virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment=0)=0
MCStreamer * createAsmStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer, formatted_raw_ostream &OS, bool isVerboseAsm, bool useLoc, bool useCFI, bool useDwarfDirectory, MCInstPrinter *InstPrint=0, MCCodeEmitter *CE=0, MCAsmBackend *TAB=0, bool ShowInst=false)
std::pair< const MCSection *, const MCExpr * > MCSectionSubPair
virtual void EmitWin64EHSaveXMM(unsigned Register, unsigned Offset)
#define LLVM_DELETED_FUNCTION
virtual void EmitWin64EHEndProc()
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue)=0
virtual void EmitWin64EHHandlerData()
virtual bool EmitValueToOffset(const MCExpr *Offset, unsigned char Value=0)=0
virtual void EmitBundleUnlock()=0
Ends a bundle-locked group.
const MCDwarfFrameInfo & getFrameInfo(unsigned i)
virtual void EndCOFFSymbolDef()=0
EndCOFFSymbolDef - Marks the end of the symbol definition.
void setAutoInitSections(bool AutoInitSections)
Tell this MCStreamer to call InitSections upon initialization.
virtual void emitCantUnwind()=0
virtual MCSymbolData & getOrCreateSymbolData(MCSymbol *Symbol)
getOrCreateSymbolData - Get symbol data for given symbol.
unsigned getNumFrameInfos()
virtual void emitPad(int64_t Offset)=0
virtual void EmitLinkerOptions(ArrayRef< std::string > Kind)
virtual void EmitCFISignalFrame()
virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset)
virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, const MCSymbol *Label)
void RecordProcEnd(MCDwarfFrameInfo &Frame)
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol)=0
MCTargetStreamer & getTargetStreamer()
virtual void EmitWin64EHEndChained()
void EmitAbsValue(const MCExpr *Value, unsigned Size)
virtual void emitHandlerData()=0
virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset)
void EmitULEB128IntValue(uint64_t Value, unsigned Padding=0)
virtual void EmitWin64EHSaveReg(unsigned Register, unsigned Offset)
virtual void EmitWin64EHStartProc(const MCSymbol *Symbol)
virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment)=0
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))
virtual void ChangeSection(const MCSection *, const MCExpr *)=0
virtual void emitTextAttribute(unsigned Attribute, StringRef String)=0
cl::opt< bool > RelaxAll("mc-relax-all", cl::desc("When used with filetype=obj, ""relax all fixups in the emitted object file"))
virtual void EmitCodeAlignment(unsigned ByteAlignment, unsigned MaxBytesToEmit=0)=0
void EmitSymbolValue(const MCSymbol *Sym, unsigned Size)
virtual void EmitWin64EHSetFrame(unsigned Register, unsigned Offset)
virtual void EmitWin64EHPushReg(unsigned Register)
virtual void EmitCOFFSymbolStorageClass(int StorageClass)=0
virtual void InitToTextSection()=0
InitToTextSection - Create a text section and switch the streamer to it.
virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment)
unsigned GetSymbolOrder(const MCSymbol *Sym) const
virtual void EmitCFIWindowSave()