File indexing completed on 2026-05-10 08:44:15
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_MC_MCSTREAMER_H
0014 #define LLVM_MC_MCSTREAMER_H
0015
0016 #include "llvm/ADT/ArrayRef.h"
0017 #include "llvm/ADT/DenseMap.h"
0018 #include "llvm/ADT/SmallVector.h"
0019 #include "llvm/ADT/StringRef.h"
0020 #include "llvm/MC/MCDirectives.h"
0021 #include "llvm/MC/MCDwarf.h"
0022 #include "llvm/MC/MCFragment.h"
0023 #include "llvm/MC/MCLinkerOptimizationHint.h"
0024 #include "llvm/MC/MCPseudoProbe.h"
0025 #include "llvm/MC/MCWinEH.h"
0026 #include "llvm/Support/Error.h"
0027 #include "llvm/Support/MD5.h"
0028 #include "llvm/Support/SMLoc.h"
0029 #include "llvm/Support/VersionTuple.h"
0030 #include "llvm/TargetParser/ARMTargetParser.h"
0031 #include <cassert>
0032 #include <cstdint>
0033 #include <memory>
0034 #include <optional>
0035 #include <string>
0036 #include <utility>
0037 #include <vector>
0038
0039 namespace llvm {
0040
0041 class APInt;
0042 class AssemblerConstantPools;
0043 class MCAsmBackend;
0044 class MCAssembler;
0045 class MCContext;
0046 class MCExpr;
0047 class MCFragment;
0048 class MCInst;
0049 class MCInstPrinter;
0050 class MCRegister;
0051 class MCSection;
0052 class MCStreamer;
0053 class MCSubtargetInfo;
0054 class MCSymbol;
0055 class MCSymbolRefExpr;
0056 class Triple;
0057 class Twine;
0058 class raw_ostream;
0059
0060 namespace codeview {
0061 struct DefRangeRegisterRelHeader;
0062 struct DefRangeSubfieldRegisterHeader;
0063 struct DefRangeRegisterHeader;
0064 struct DefRangeFramePointerRelHeader;
0065 }
0066
0067 using MCSectionSubPair = std::pair<MCSection *, uint32_t>;
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094 class MCTargetStreamer {
0095 protected:
0096 MCStreamer &Streamer;
0097
0098 public:
0099 MCTargetStreamer(MCStreamer &S);
0100 virtual ~MCTargetStreamer();
0101
0102 MCStreamer &getStreamer() { return Streamer; }
0103
0104
0105 virtual void emitLabel(MCSymbol *Symbol);
0106
0107 virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value);
0108
0109 virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, uint64_t Address,
0110 const MCInst &Inst, const MCSubtargetInfo &STI,
0111 raw_ostream &OS);
0112
0113 virtual void emitDwarfFileDirective(StringRef Directive);
0114
0115
0116
0117
0118
0119 virtual void changeSection(const MCSection *CurSection, MCSection *Section,
0120 uint32_t SubSection, raw_ostream &OS);
0121
0122 virtual void emitValue(const MCExpr *Value);
0123
0124
0125
0126
0127 virtual void emitRawBytes(StringRef Data);
0128
0129 virtual void emitConstantPools();
0130
0131 virtual void finish();
0132 };
0133
0134
0135
0136 class ARMTargetStreamer : public MCTargetStreamer {
0137 public:
0138 ARMTargetStreamer(MCStreamer &S);
0139 ~ARMTargetStreamer() override;
0140
0141 virtual void emitFnStart();
0142 virtual void emitFnEnd();
0143 virtual void emitCantUnwind();
0144 virtual void emitPersonality(const MCSymbol *Personality);
0145 virtual void emitPersonalityIndex(unsigned Index);
0146 virtual void emitHandlerData();
0147 virtual void emitSetFP(MCRegister FpReg, MCRegister SpReg,
0148 int64_t Offset = 0);
0149 virtual void emitMovSP(MCRegister Reg, int64_t Offset = 0);
0150 virtual void emitPad(int64_t Offset);
0151 virtual void emitRegSave(const SmallVectorImpl<MCRegister> &RegList,
0152 bool isVector);
0153 virtual void emitUnwindRaw(int64_t StackOffset,
0154 const SmallVectorImpl<uint8_t> &Opcodes);
0155
0156 virtual void switchVendor(StringRef Vendor);
0157 virtual void emitAttribute(unsigned Attribute, unsigned Value);
0158 virtual void emitTextAttribute(unsigned Attribute, StringRef String);
0159 virtual void emitIntTextAttribute(unsigned Attribute, unsigned IntValue,
0160 StringRef StringValue = "");
0161 virtual void emitFPU(ARM::FPUKind FPU);
0162 virtual void emitArch(ARM::ArchKind Arch);
0163 virtual void emitArchExtension(uint64_t ArchExt);
0164 virtual void emitObjectArch(ARM::ArchKind Arch);
0165 void emitTargetAttributes(const MCSubtargetInfo &STI);
0166 virtual void finishAttributeSection();
0167 virtual void emitInst(uint32_t Inst, char Suffix = '\0');
0168
0169 virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE);
0170
0171 virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value);
0172
0173 void emitConstantPools() override;
0174
0175 virtual void emitARMWinCFIAllocStack(unsigned Size, bool Wide);
0176 virtual void emitARMWinCFISaveRegMask(unsigned Mask, bool Wide);
0177 virtual void emitARMWinCFISaveSP(unsigned Reg);
0178 virtual void emitARMWinCFISaveFRegs(unsigned First, unsigned Last);
0179 virtual void emitARMWinCFISaveLR(unsigned Offset);
0180 virtual void emitARMWinCFIPrologEnd(bool Fragment);
0181 virtual void emitARMWinCFINop(bool Wide);
0182 virtual void emitARMWinCFIEpilogStart(unsigned Condition);
0183 virtual void emitARMWinCFIEpilogEnd();
0184 virtual void emitARMWinCFICustom(unsigned Opcode);
0185
0186
0187
0188 virtual void reset();
0189
0190
0191
0192
0193 const MCExpr *addConstantPoolEntry(const MCExpr *, SMLoc Loc);
0194
0195
0196
0197 void emitCurrentConstantPool();
0198
0199 private:
0200 std::unique_ptr<AssemblerConstantPools> ConstantPools;
0201 };
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213 class MCStreamer {
0214 MCContext &Context;
0215 std::unique_ptr<MCTargetStreamer> TargetStreamer;
0216
0217 std::vector<MCDwarfFrameInfo> DwarfFrameInfos;
0218
0219
0220
0221 SmallVector<std::pair<size_t, MCSection *>, 1> FrameInfoStack;
0222 MCDwarfFrameInfo *getCurrentDwarfFrameInfo();
0223
0224
0225
0226 std::vector<std::unique_ptr<WinEH::FrameInfo>> WinFrameInfos;
0227
0228 WinEH::FrameInfo *CurrentWinFrameInfo;
0229 size_t CurrentProcWinFrameInfoStartIndex;
0230
0231
0232
0233 SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack;
0234
0235
0236
0237 const SMLoc *StartTokLocPtr = nullptr;
0238
0239
0240
0241
0242
0243 unsigned NextWinCFIID = 0;
0244
0245 bool UseAssemblerInfoForParsing = true;
0246
0247
0248
0249
0250
0251
0252 bool AllowAutoPadding = false;
0253
0254 protected:
0255 MCFragment *CurFrag = nullptr;
0256
0257 MCStreamer(MCContext &Ctx);
0258
0259
0260
0261 virtual void changeSection(MCSection *, uint32_t);
0262
0263 virtual void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame);
0264 virtual void emitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame);
0265
0266 WinEH::FrameInfo *getCurrentWinFrameInfo() {
0267 return CurrentWinFrameInfo;
0268 }
0269
0270 virtual void emitWindowsUnwindTables(WinEH::FrameInfo *Frame);
0271
0272 virtual void emitWindowsUnwindTables();
0273
0274 virtual void emitRawTextImpl(StringRef String);
0275
0276
0277 bool checkCVLocSection(unsigned FuncId, unsigned FileNo, SMLoc Loc);
0278
0279 public:
0280 MCStreamer(const MCStreamer &) = delete;
0281 MCStreamer &operator=(const MCStreamer &) = delete;
0282 virtual ~MCStreamer();
0283
0284 void visitUsedExpr(const MCExpr &Expr);
0285 virtual void visitUsedSymbol(const MCSymbol &Sym);
0286
0287 void setTargetStreamer(MCTargetStreamer *TS) {
0288 TargetStreamer.reset(TS);
0289 }
0290
0291 void setStartTokLocPtr(const SMLoc *Loc) { StartTokLocPtr = Loc; }
0292 SMLoc getStartTokLoc() const {
0293 return StartTokLocPtr ? *StartTokLocPtr : SMLoc();
0294 }
0295
0296
0297
0298 virtual void reset();
0299
0300 MCContext &getContext() const { return Context; }
0301
0302
0303
0304 virtual MCAssembler *getAssemblerPtr() { return nullptr; }
0305
0306 void setUseAssemblerInfoForParsing(bool v) { UseAssemblerInfoForParsing = v; }
0307 bool getUseAssemblerInfoForParsing() { return UseAssemblerInfoForParsing; }
0308
0309 MCTargetStreamer *getTargetStreamer() {
0310 return TargetStreamer.get();
0311 }
0312
0313 void setAllowAutoPadding(bool v) { AllowAutoPadding = v; }
0314 bool getAllowAutoPadding() const { return AllowAutoPadding; }
0315
0316 MCSymbol *emitLineTableLabel();
0317
0318
0319
0320 virtual MCSymbol *emitCFILabel();
0321
0322
0323
0324 WinEH::FrameInfo *EnsureValidWinFrameInfo(SMLoc Loc);
0325
0326 unsigned getNumFrameInfos();
0327 ArrayRef<MCDwarfFrameInfo> getDwarfFrameInfos() const;
0328
0329 bool hasUnfinishedDwarfFrameInfo();
0330
0331 unsigned getNumWinFrameInfos() { return WinFrameInfos.size(); }
0332 ArrayRef<std::unique_ptr<WinEH::FrameInfo>> getWinFrameInfos() const {
0333 return WinFrameInfos;
0334 }
0335
0336 void generateCompactUnwindEncodings(MCAsmBackend *MAB);
0337
0338
0339
0340
0341
0342
0343 virtual bool isVerboseAsm() const { return false; }
0344
0345
0346
0347 virtual bool hasRawTextSupport() const { return false; }
0348
0349
0350
0351 virtual bool isIntegratedAssemblerRequired() const { return false; }
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366 virtual void AddComment(const Twine &T, bool EOL = true) {}
0367
0368
0369
0370
0371 virtual raw_ostream &getCommentOS();
0372
0373
0374
0375
0376
0377 virtual void emitRawComment(const Twine &T, bool TabPrefix = true);
0378
0379
0380
0381 virtual void addExplicitComment(const Twine &T);
0382
0383
0384 virtual void emitExplicitComments();
0385
0386
0387 virtual void addBlankLine() {}
0388
0389
0390
0391
0392
0393
0394
0395 MCSectionSubPair getCurrentSection() const {
0396 if (!SectionStack.empty())
0397 return SectionStack.back().first;
0398 return MCSectionSubPair();
0399 }
0400 MCSection *getCurrentSectionOnly() const {
0401 return CurFrag->getParent();
0402 }
0403
0404
0405 MCSectionSubPair getPreviousSection() const {
0406 if (!SectionStack.empty())
0407 return SectionStack.back().second;
0408 return MCSectionSubPair();
0409 }
0410
0411 MCFragment *getCurrentFragment() const {
0412 assert(!getCurrentSection().first ||
0413 CurFrag->getParent() == getCurrentSection().first);
0414 return CurFrag;
0415 }
0416
0417
0418 void pushSection() {
0419 SectionStack.push_back(
0420 std::make_pair(getCurrentSection(), getPreviousSection()));
0421 }
0422
0423
0424
0425
0426
0427 virtual bool popSection();
0428
0429
0430
0431
0432
0433 virtual void switchSection(MCSection *Section, uint32_t Subsec = 0);
0434 bool switchSection(MCSection *Section, const MCExpr *);
0435
0436
0437 virtual void switchSectionNoPrint(MCSection *Section);
0438
0439
0440 virtual void initSections(bool NoExecStack, const MCSubtargetInfo &STI);
0441
0442 MCSymbol *endSection(MCSection *Section);
0443
0444
0445
0446 virtual StringRef getMnemonic(const MCInst &MI) const { return ""; }
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458 virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc());
0459
0460 virtual void emitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol);
0461
0462
0463 virtual void emitAssemblerFlag(MCAssemblerFlag Flag);
0464
0465
0466
0467 virtual void emitLinkerOptions(ArrayRef<std::string> Kind) {}
0468
0469
0470 virtual void emitDataRegion(MCDataRegionType Kind) {}
0471
0472
0473 virtual void emitVersionMin(MCVersionMinType Type, unsigned Major,
0474 unsigned Minor, unsigned Update,
0475 VersionTuple SDKVersion) {}
0476
0477
0478
0479 virtual void emitBuildVersion(unsigned Platform, unsigned Major,
0480 unsigned Minor, unsigned Update,
0481 VersionTuple SDKVersion) {}
0482
0483 virtual void emitDarwinTargetVariantBuildVersion(unsigned Platform,
0484 unsigned Major,
0485 unsigned Minor,
0486 unsigned Update,
0487 VersionTuple SDKVersion) {}
0488
0489 void emitVersionForTarget(const Triple &Target,
0490 const VersionTuple &SDKVersion,
0491 const Triple *DarwinTargetVariantTriple,
0492 const VersionTuple &DarwinTargetVariantSDKVersion);
0493
0494
0495
0496 virtual void emitThumbFunc(MCSymbol *Func);
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509 virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value);
0510
0511
0512
0513 virtual void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value);
0514
0515
0516
0517
0518
0519
0520
0521
0522 virtual void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
0523
0524
0525 virtual bool emitSymbolAttribute(MCSymbol *Symbol,
0526 MCSymbolAttr Attribute) = 0;
0527
0528
0529
0530
0531
0532 virtual void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
0533
0534
0535
0536
0537 virtual void beginCOFFSymbolDef(const MCSymbol *Symbol);
0538
0539
0540
0541
0542 virtual void emitCOFFSymbolStorageClass(int StorageClass);
0543
0544
0545
0546
0547 virtual void emitCOFFSymbolType(int Type);
0548
0549
0550 virtual void endCOFFSymbolDef();
0551
0552 virtual void emitCOFFSafeSEH(MCSymbol const *Symbol);
0553
0554
0555 virtual void emitCOFFSymbolIndex(MCSymbol const *Symbol);
0556
0557
0558
0559
0560 virtual void emitCOFFSectionIndex(MCSymbol const *Symbol);
0561
0562
0563
0564
0565 virtual void emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset);
0566
0567
0568
0569
0570 virtual void emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset);
0571
0572
0573
0574 virtual void emitCOFFSecNumber(MCSymbol const *Symbol);
0575
0576
0577
0578 virtual void emitCOFFSecOffset(MCSymbol const *Symbol);
0579
0580
0581
0582
0583
0584
0585
0586 virtual void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size,
0587 MCSymbol *CsectSym, Align Alignment);
0588
0589
0590
0591
0592
0593
0594
0595 virtual void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol,
0596 MCSymbolAttr Linkage,
0597 MCSymbolAttr Visibility);
0598
0599
0600
0601
0602
0603
0604
0605
0606 virtual void emitXCOFFRenameDirective(const MCSymbol *Name, StringRef Rename);
0607
0608
0609
0610
0611
0612
0613
0614 virtual void emitXCOFFExceptDirective(const MCSymbol *Symbol,
0615 const MCSymbol *Trap,
0616 unsigned Lang, unsigned Reason,
0617 unsigned FunctionSize, bool hasDebug);
0618
0619
0620
0621
0622
0623 virtual void emitXCOFFRefDirective(const MCSymbol *Symbol);
0624
0625
0626
0627
0628
0629 virtual void emitXCOFFCInfoSym(StringRef Name, StringRef Metadata);
0630
0631
0632
0633
0634
0635 virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value);
0636
0637
0638
0639
0640
0641 virtual void emitELFSymverDirective(const MCSymbol *OriginalSym,
0642 StringRef Name, bool KeepOriginalSym);
0643
0644
0645
0646 virtual void emitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) {}
0647
0648
0649 virtual void emitGNUAttribute(unsigned Tag, unsigned Value) {}
0650
0651
0652
0653
0654
0655
0656 virtual void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
0657 Align ByteAlignment) = 0;
0658
0659
0660
0661
0662
0663
0664 virtual void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
0665 Align ByteAlignment);
0666
0667
0668
0669
0670
0671
0672
0673 virtual void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
0674 uint64_t Size = 0, Align ByteAlignment = Align(1),
0675 SMLoc Loc = SMLoc()) = 0;
0676
0677
0678
0679
0680
0681
0682
0683 virtual void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
0684 uint64_t Size, Align ByteAlignment = Align(1));
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694 virtual void emitBytes(StringRef Data);
0695
0696
0697
0698 virtual void emitBinaryData(StringRef Data);
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710 virtual void emitValueImpl(const MCExpr *Value, unsigned Size,
0711 SMLoc Loc = SMLoc());
0712
0713 void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc = SMLoc());
0714
0715
0716
0717 virtual void emitIntValue(uint64_t Value, unsigned Size);
0718 virtual void emitIntValue(const APInt &Value);
0719
0720
0721
0722
0723 virtual void emitIntValueInHex(uint64_t Value, unsigned Size) {
0724 emitIntValue(Value, Size);
0725 }
0726
0727 void emitInt8(uint64_t Value) { emitIntValue(Value, 1); }
0728 void emitInt16(uint64_t Value) { emitIntValue(Value, 2); }
0729 void emitInt32(uint64_t Value) { emitIntValue(Value, 4); }
0730 void emitInt64(uint64_t Value) { emitIntValue(Value, 8); }
0731
0732
0733
0734
0735 virtual void emitIntValueInHexWithPadding(uint64_t Value, unsigned Size) {
0736 emitIntValue(Value, Size);
0737 }
0738
0739 virtual void emitULEB128Value(const MCExpr *Value);
0740
0741 virtual void emitSLEB128Value(const MCExpr *Value);
0742
0743
0744
0745 unsigned emitULEB128IntValue(uint64_t Value, unsigned PadTo = 0);
0746
0747
0748
0749 unsigned emitSLEB128IntValue(int64_t Value);
0750
0751
0752
0753 void emitSymbolValue(const MCSymbol *Sym, unsigned Size,
0754 bool IsSectionRelative = false);
0755
0756
0757
0758
0759
0760
0761 virtual void emitDTPRel64Value(const MCExpr *Value);
0762
0763
0764
0765
0766
0767
0768 virtual void emitDTPRel32Value(const MCExpr *Value);
0769
0770
0771
0772
0773
0774
0775 virtual void emitTPRel64Value(const MCExpr *Value);
0776
0777
0778
0779
0780
0781
0782 virtual void emitTPRel32Value(const MCExpr *Value);
0783
0784
0785
0786
0787
0788
0789 virtual void emitGPRel64Value(const MCExpr *Value);
0790
0791
0792
0793
0794
0795
0796 virtual void emitGPRel32Value(const MCExpr *Value);
0797
0798
0799
0800 void emitFill(uint64_t NumBytes, uint8_t FillValue);
0801
0802
0803
0804
0805
0806
0807
0808
0809 virtual void emitFill(const MCExpr &NumBytes, uint64_t FillValue,
0810 SMLoc Loc = SMLoc());
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820 virtual void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
0821 SMLoc Loc = SMLoc());
0822
0823 virtual void emitNops(int64_t NumBytes, int64_t ControlledNopLength,
0824 SMLoc Loc, const MCSubtargetInfo& STI);
0825
0826
0827
0828 void emitZeros(uint64_t NumBytes);
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846 virtual void emitValueToAlignment(Align Alignment, int64_t Value = 0,
0847 unsigned ValueSize = 1,
0848 unsigned MaxBytesToEmit = 0);
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860 virtual void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI,
0861 unsigned MaxBytesToEmit = 0);
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871 virtual void emitValueToOffset(const MCExpr *Offset, unsigned char Value,
0872 SMLoc Loc);
0873
0874
0875
0876
0877
0878 virtual void emitFileDirective(StringRef Filename);
0879
0880
0881 virtual void emitFileDirective(StringRef Filename, StringRef CompilerVersion,
0882 StringRef TimeStamp, StringRef Description);
0883
0884
0885
0886 virtual void emitIdent(StringRef IdentString) {}
0887
0888
0889
0890 unsigned emitDwarfFileDirective(
0891 unsigned FileNo, StringRef Directory, StringRef Filename,
0892 std::optional<MD5::MD5Result> Checksum = std::nullopt,
0893 std::optional<StringRef> Source = std::nullopt, unsigned CUID = 0) {
0894 return cantFail(
0895 tryEmitDwarfFileDirective(FileNo, Directory, Filename, Checksum,
0896 Source, CUID));
0897 }
0898
0899
0900
0901
0902
0903
0904 virtual Expected<unsigned> tryEmitDwarfFileDirective(
0905 unsigned FileNo, StringRef Directory, StringRef Filename,
0906 std::optional<MD5::MD5Result> Checksum = std::nullopt,
0907 std::optional<StringRef> Source = std::nullopt, unsigned CUID = 0);
0908
0909
0910 virtual void emitDwarfFile0Directive(StringRef Directory, StringRef Filename,
0911 std::optional<MD5::MD5Result> Checksum,
0912 std::optional<StringRef> Source,
0913 unsigned CUID = 0);
0914
0915 virtual void emitCFIBKeyFrame();
0916 virtual void emitCFIMTETaggedFrame();
0917
0918
0919
0920 virtual void emitDwarfLocDirective(unsigned FileNo, unsigned Line,
0921 unsigned Column, unsigned Flags,
0922 unsigned Isa, unsigned Discriminator,
0923 StringRef FileName);
0924
0925
0926 virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name);
0927
0928
0929
0930
0931 virtual bool emitCVFileDirective(unsigned FileNo, StringRef Filename,
0932 ArrayRef<uint8_t> Checksum,
0933 unsigned ChecksumKind);
0934
0935
0936 virtual bool emitCVFuncIdDirective(unsigned FunctionId);
0937
0938
0939
0940 virtual bool emitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc,
0941 unsigned IAFile, unsigned IALine,
0942 unsigned IACol, SMLoc Loc);
0943
0944
0945 virtual void emitCVLocDirective(unsigned FunctionId, unsigned FileNo,
0946 unsigned Line, unsigned Column,
0947 bool PrologueEnd, bool IsStmt,
0948 StringRef FileName, SMLoc Loc);
0949
0950
0951 virtual void emitCVLinetableDirective(unsigned FunctionId,
0952 const MCSymbol *FnStart,
0953 const MCSymbol *FnEnd);
0954
0955
0956
0957 virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
0958 unsigned SourceFileId,
0959 unsigned SourceLineNum,
0960 const MCSymbol *FnStartSym,
0961 const MCSymbol *FnEndSym);
0962
0963
0964
0965 virtual void emitCVDefRangeDirective(
0966 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
0967 StringRef FixedSizePortion);
0968
0969 virtual void emitCVDefRangeDirective(
0970 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
0971 codeview::DefRangeRegisterRelHeader DRHdr);
0972
0973 virtual void emitCVDefRangeDirective(
0974 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
0975 codeview::DefRangeSubfieldRegisterHeader DRHdr);
0976
0977 virtual void emitCVDefRangeDirective(
0978 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
0979 codeview::DefRangeRegisterHeader DRHdr);
0980
0981 virtual void emitCVDefRangeDirective(
0982 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
0983 codeview::DefRangeFramePointerRelHeader DRHdr);
0984
0985
0986 virtual void emitCVStringTableDirective() {}
0987
0988
0989 virtual void emitCVFileChecksumsDirective() {}
0990
0991
0992
0993 virtual void emitCVFileChecksumOffsetDirective(unsigned FileNo) {}
0994
0995
0996 virtual void emitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc = {}) {}
0997
0998
0999
1000
1001 virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
1002 unsigned Size);
1003
1004
1005 virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
1006 const MCSymbol *Lo);
1007
1008 virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID);
1009 virtual void emitCFISections(bool EH, bool Debug);
1010 void emitCFIStartProc(bool IsSimple, SMLoc Loc = SMLoc());
1011 void emitCFIEndProc();
1012 virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc = {});
1013 virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc = {});
1014 virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc = {});
1015 virtual void emitCFILLVMDefAspaceCfa(int64_t Register, int64_t Offset,
1016 int64_t AddressSpace, SMLoc Loc = {});
1017 virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc = {});
1018 virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding);
1019 virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding);
1020 virtual void emitCFIRememberState(SMLoc Loc);
1021 virtual void emitCFIRestoreState(SMLoc Loc);
1022 virtual void emitCFISameValue(int64_t Register, SMLoc Loc = {});
1023 virtual void emitCFIRestore(int64_t Register, SMLoc Loc = {});
1024 virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc);
1025 virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc = {});
1026 virtual void emitCFIEscape(StringRef Values, SMLoc Loc = {});
1027 virtual void emitCFIReturnColumn(int64_t Register);
1028 virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc = {});
1029 virtual void emitCFISignalFrame();
1030 virtual void emitCFIUndefined(int64_t Register, SMLoc Loc = {});
1031 virtual void emitCFIRegister(int64_t Register1, int64_t Register2,
1032 SMLoc Loc = {});
1033 virtual void emitCFIWindowSave(SMLoc Loc = {});
1034 virtual void emitCFINegateRAState(SMLoc Loc = {});
1035 virtual void emitCFINegateRAStateWithPC(SMLoc Loc = {});
1036 virtual void emitCFILabelDirective(SMLoc Loc, StringRef Name);
1037 virtual void emitCFIValOffset(int64_t Register, int64_t Offset,
1038 SMLoc Loc = {});
1039
1040 virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc = SMLoc());
1041 virtual void emitWinCFIEndProc(SMLoc Loc = SMLoc());
1042
1043
1044
1045
1046 virtual void emitWinCFIFuncletOrFuncEnd(SMLoc Loc = SMLoc());
1047 virtual void emitWinCFIStartChained(SMLoc Loc = SMLoc());
1048 virtual void emitWinCFIEndChained(SMLoc Loc = SMLoc());
1049 virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc = SMLoc());
1050 virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset,
1051 SMLoc Loc = SMLoc());
1052 virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc = SMLoc());
1053 virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset,
1054 SMLoc Loc = SMLoc());
1055 virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset,
1056 SMLoc Loc = SMLoc());
1057 virtual void emitWinCFIPushFrame(bool Code, SMLoc Loc = SMLoc());
1058 virtual void emitWinCFIEndProlog(SMLoc Loc = SMLoc());
1059 virtual void emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
1060 SMLoc Loc = SMLoc());
1061 virtual void emitWinEHHandlerData(SMLoc Loc = SMLoc());
1062
1063 virtual void emitCGProfileEntry(const MCSymbolRefExpr *From,
1064 const MCSymbolRefExpr *To, uint64_t Count);
1065
1066
1067
1068
1069 MCSection *getAssociatedPDataSection(const MCSection *TextSec);
1070
1071
1072 MCSection *getAssociatedXDataSection(const MCSection *TextSec);
1073
1074 virtual void emitSyntaxDirective();
1075
1076
1077
1078 virtual std::optional<std::pair<bool, std::string>>
1079 emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr,
1080 SMLoc Loc, const MCSubtargetInfo &STI) {
1081 return std::nullopt;
1082 }
1083
1084 virtual void emitAddrsig() {}
1085 virtual void emitAddrsigSym(const MCSymbol *Sym) {}
1086
1087
1088 virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI);
1089
1090
1091 virtual void emitPseudoProbe(uint64_t Guid, uint64_t Index, uint64_t Type,
1092 uint64_t Attr, uint64_t Discriminator,
1093 const MCPseudoProbeInlineStack &InlineStack,
1094 MCSymbol *FnSym);
1095
1096
1097
1098 virtual void emitBundleAlignMode(Align Alignment);
1099
1100
1101
1102
1103
1104 virtual void emitBundleLock(bool AlignToEnd);
1105
1106
1107 virtual void emitBundleUnlock();
1108
1109
1110
1111
1112 void emitRawText(const Twine &String);
1113
1114
1115 virtual void finishImpl();
1116
1117 void finish(SMLoc EndLoc = SMLoc());
1118
1119 virtual bool mayHaveInstructions(MCSection &Sec) const { return true; }
1120
1121
1122 void maybeEmitDwarf64Mark();
1123
1124
1125
1126 virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment);
1127
1128
1129
1130
1131 virtual MCSymbol *emitDwarfUnitLength(const Twine &Prefix,
1132 const Twine &Comment);
1133
1134
1135 virtual void emitDwarfLineStartLabel(MCSymbol *StartSym);
1136
1137
1138 virtual void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
1139 MCSymbol *EndLabel = nullptr) {}
1140
1141
1142
1143
1144 virtual void emitDwarfAdvanceLineAddr(int64_t LineDelta,
1145 const MCSymbol *LastLabel,
1146 const MCSymbol *Label,
1147 unsigned PointerSize) {}
1148 };
1149
1150
1151
1152 MCStreamer *createNullStreamer(MCContext &Ctx);
1153
1154 }
1155
1156 #endif