1 //===- MCStreamer.h - High-level Streaming Machine Code Output --*- C++ -*-===// 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 // This file declares the MCStreamer class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_MC_MCSTREAMER_H 15 #define LLVM_MC_MCSTREAMER_H 16 17 #include "llvm/ADT/ArrayRef.h" 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/Optional.h" 20 #include "llvm/ADT/SmallVector.h" 21 #include "llvm/ADT/StringRef.h" 22 #include "llvm/MC/MCDirectives.h" 23 #include "llvm/MC/MCDwarf.h" 24 #include "llvm/MC/MCLinkerOptimizationHint.h" 25 #include "llvm/MC/MCSymbol.h" 26 #include "llvm/MC/MCWinEH.h" 27 #include "llvm/Support/Error.h" 28 #include "llvm/Support/MD5.h" 29 #include "llvm/Support/SMLoc.h" 30 #include "llvm/Support/TargetParser.h" 31 #include <cassert> 32 #include <cstdint> 33 #include <memory> 34 #include <string> 35 #include <utility> 36 #include <vector> 37 38 namespace llvm { 39 40 class AssemblerConstantPools; 41 class formatted_raw_ostream; 42 class MCAsmBackend; 43 class MCCodeEmitter; 44 struct MCCodePaddingContext; 45 class MCContext; 46 class MCExpr; 47 class MCInst; 48 class MCInstPrinter; 49 class MCSection; 50 class MCStreamer; 51 class MCSymbolRefExpr; 52 class MCSubtargetInfo; 53 class raw_ostream; 54 class Twine; 55 56 using MCSectionSubPair = std::pair<MCSection *, const MCExpr *>; 57 58 /// Target specific streamer interface. This is used so that targets can 59 /// implement support for target specific assembly directives. 60 /// 61 /// If target foo wants to use this, it should implement 3 classes: 62 /// * FooTargetStreamer : public MCTargetStreamer 63 /// * FooTargetAsmStreamer : public FooTargetStreamer 64 /// * FooTargetELFStreamer : public FooTargetStreamer 65 /// 66 /// FooTargetStreamer should have a pure virtual method for each directive. For 67 /// example, for a ".bar symbol_name" directive, it should have 68 /// virtual emitBar(const MCSymbol &Symbol) = 0; 69 /// 70 /// The FooTargetAsmStreamer and FooTargetELFStreamer classes implement the 71 /// method. The assembly streamer just prints ".bar symbol_name". The object 72 /// streamer does whatever is needed to implement .bar in the object file. 73 /// 74 /// In the assembly printer and parser the target streamer can be used by 75 /// calling getTargetStreamer and casting it to FooTargetStreamer: 76 /// 77 /// MCTargetStreamer &TS = OutStreamer.getTargetStreamer(); 78 /// FooTargetStreamer &ATS = static_cast<FooTargetStreamer &>(TS); 79 /// 80 /// The base classes FooTargetAsmStreamer and FooTargetELFStreamer should 81 /// *never* be treated differently. Callers should always talk to a 82 /// FooTargetStreamer. 83 class MCTargetStreamer { 84 protected: 85 MCStreamer &Streamer; 86 87 public: 88 MCTargetStreamer(MCStreamer &S); 89 virtual ~MCTargetStreamer(); 90 getStreamer()91 MCStreamer &getStreamer() { return Streamer; } 92 93 // Allow a target to add behavior to the EmitLabel of MCStreamer. 94 virtual void emitLabel(MCSymbol *Symbol); 95 // Allow a target to add behavior to the emitAssignment of MCStreamer. 96 virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value); 97 98 virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, raw_ostream &OS, 99 const MCInst &Inst, const MCSubtargetInfo &STI); 100 101 virtual void emitDwarfFileDirective(StringRef Directive); 102 103 /// Update streamer for a new active section. 104 /// 105 /// This is called by PopSection and SwitchSection, if the current 106 /// section changes. 107 virtual void changeSection(const MCSection *CurSection, MCSection *Section, 108 const MCExpr *SubSection, raw_ostream &OS); 109 110 virtual void emitValue(const MCExpr *Value); 111 112 virtual void finish(); 113 }; 114 115 // FIXME: declared here because it is used from 116 // lib/CodeGen/AsmPrinter/ARMException.cpp. 117 class ARMTargetStreamer : public MCTargetStreamer { 118 public: 119 ARMTargetStreamer(MCStreamer &S); 120 ~ARMTargetStreamer() override; 121 122 virtual void emitFnStart(); 123 virtual void emitFnEnd(); 124 virtual void emitCantUnwind(); 125 virtual void emitPersonality(const MCSymbol *Personality); 126 virtual void emitPersonalityIndex(unsigned Index); 127 virtual void emitHandlerData(); 128 virtual void emitSetFP(unsigned FpReg, unsigned SpReg, 129 int64_t Offset = 0); 130 virtual void emitMovSP(unsigned Reg, int64_t Offset = 0); 131 virtual void emitPad(int64_t Offset); 132 virtual void emitRegSave(const SmallVectorImpl<unsigned> &RegList, 133 bool isVector); 134 virtual void emitUnwindRaw(int64_t StackOffset, 135 const SmallVectorImpl<uint8_t> &Opcodes); 136 137 virtual void switchVendor(StringRef Vendor); 138 virtual void emitAttribute(unsigned Attribute, unsigned Value); 139 virtual void emitTextAttribute(unsigned Attribute, StringRef String); 140 virtual void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, 141 StringRef StringValue = ""); 142 virtual void emitFPU(unsigned FPU); 143 virtual void emitArch(ARM::ArchKind Arch); 144 virtual void emitArchExtension(unsigned ArchExt); 145 virtual void emitObjectArch(ARM::ArchKind Arch); 146 void emitTargetAttributes(const MCSubtargetInfo &STI); 147 virtual void finishAttributeSection(); 148 virtual void emitInst(uint32_t Inst, char Suffix = '\0'); 149 150 virtual void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE); 151 152 virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value); 153 154 void finish() override; 155 156 /// Reset any state between object emissions, i.e. the equivalent of 157 /// MCStreamer's reset method. 158 virtual void reset(); 159 160 /// Callback used to implement the ldr= pseudo. 161 /// Add a new entry to the constant pool for the current section and return an 162 /// MCExpr that can be used to refer to the constant pool location. 163 const MCExpr *addConstantPoolEntry(const MCExpr *, SMLoc Loc); 164 165 /// Callback used to implemnt the .ltorg directive. 166 /// Emit contents of constant pool for the current section. 167 void emitCurrentConstantPool(); 168 169 private: 170 std::unique_ptr<AssemblerConstantPools> ConstantPools; 171 }; 172 173 /// Streaming machine code generation interface. 174 /// 175 /// This interface is intended to provide a programatic interface that is very 176 /// similar to the level that an assembler .s file provides. It has callbacks 177 /// to emit bytes, handle directives, etc. The implementation of this interface 178 /// retains state to know what the current section is etc. 179 /// 180 /// There are multiple implementations of this interface: one for writing out 181 /// a .s file, and implementations that write out .o files of various formats. 182 /// 183 class MCStreamer { 184 MCContext &Context; 185 std::unique_ptr<MCTargetStreamer> TargetStreamer; 186 187 std::vector<MCDwarfFrameInfo> DwarfFrameInfos; 188 MCDwarfFrameInfo *getCurrentDwarfFrameInfo(); 189 190 /// Similar to DwarfFrameInfos, but for SEH unwind info. Chained frames may 191 /// refer to each other, so use std::unique_ptr to provide pointer stability. 192 std::vector<std::unique_ptr<WinEH::FrameInfo>> WinFrameInfos; 193 194 WinEH::FrameInfo *CurrentWinFrameInfo; 195 196 /// Retreive the current frame info if one is available and it is not yet 197 /// closed. Otherwise, issue an error and return null. 198 WinEH::FrameInfo *EnsureValidWinFrameInfo(SMLoc Loc); 199 200 /// Tracks an index to represent the order a symbol was emitted in. 201 /// Zero means we did not emit that symbol. 202 DenseMap<const MCSymbol *, unsigned> SymbolOrdering; 203 204 /// This is stack of current and previous section values saved by 205 /// PushSection. 206 SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack; 207 208 /// The next unique ID to use when creating a WinCFI-related section (.pdata 209 /// or .xdata). This ID ensures that we have a one-to-one mapping from 210 /// code section to unwind info section, which MSVC's incremental linker 211 /// requires. 212 unsigned NextWinCFIID = 0; 213 214 bool UseAssemblerInfoForParsing; 215 216 protected: 217 MCStreamer(MCContext &Ctx); 218 219 virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame); 220 virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame); 221 222 /// When emitting an object file, create and emit a real label. When emitting 223 /// textual assembly, this should do nothing to avoid polluting our output. 224 virtual MCSymbol *EmitCFILabel(); 225 getCurrentWinFrameInfo()226 WinEH::FrameInfo *getCurrentWinFrameInfo() { 227 return CurrentWinFrameInfo; 228 } 229 230 virtual void EmitWindowsUnwindTables(); 231 232 virtual void EmitRawTextImpl(StringRef String); 233 234 public: 235 MCStreamer(const MCStreamer &) = delete; 236 MCStreamer &operator=(const MCStreamer &) = delete; 237 virtual ~MCStreamer(); 238 239 void visitUsedExpr(const MCExpr &Expr); 240 virtual void visitUsedSymbol(const MCSymbol &Sym); 241 setTargetStreamer(MCTargetStreamer * TS)242 void setTargetStreamer(MCTargetStreamer *TS) { 243 TargetStreamer.reset(TS); 244 } 245 246 /// State management 247 /// 248 virtual void reset(); 249 getContext()250 MCContext &getContext() const { return Context; } 251 getAssemblerPtr()252 virtual MCAssembler *getAssemblerPtr() { return nullptr; } 253 setUseAssemblerInfoForParsing(bool v)254 void setUseAssemblerInfoForParsing(bool v) { UseAssemblerInfoForParsing = v; } getUseAssemblerInfoForParsing()255 bool getUseAssemblerInfoForParsing() { return UseAssemblerInfoForParsing; } 256 getTargetStreamer()257 MCTargetStreamer *getTargetStreamer() { 258 return TargetStreamer.get(); 259 } 260 getNumFrameInfos()261 unsigned getNumFrameInfos() { return DwarfFrameInfos.size(); } getDwarfFrameInfos()262 ArrayRef<MCDwarfFrameInfo> getDwarfFrameInfos() const { 263 return DwarfFrameInfos; 264 } 265 266 bool hasUnfinishedDwarfFrameInfo(); 267 getNumWinFrameInfos()268 unsigned getNumWinFrameInfos() { return WinFrameInfos.size(); } getWinFrameInfos()269 ArrayRef<std::unique_ptr<WinEH::FrameInfo>> getWinFrameInfos() const { 270 return WinFrameInfos; 271 } 272 273 void generateCompactUnwindEncodings(MCAsmBackend *MAB); 274 275 /// \name Assembly File Formatting. 276 /// @{ 277 278 /// Return true if this streamer supports verbose assembly and if it is 279 /// enabled. isVerboseAsm()280 virtual bool isVerboseAsm() const { return false; } 281 282 /// Return true if this asm streamer supports emitting unformatted text 283 /// to the .s file with EmitRawText. hasRawTextSupport()284 virtual bool hasRawTextSupport() const { return false; } 285 286 /// Is the integrated assembler required for this streamer to function 287 /// correctly? isIntegratedAssemblerRequired()288 virtual bool isIntegratedAssemblerRequired() const { return false; } 289 290 /// Add a textual comment. 291 /// 292 /// Typically for comments that can be emitted to the generated .s 293 /// file if applicable as a QoI issue to make the output of the compiler 294 /// more readable. This only affects the MCAsmStreamer, and only when 295 /// verbose assembly output is enabled. 296 /// 297 /// If the comment includes embedded \n's, they will each get the comment 298 /// prefix as appropriate. The added comment should not end with a \n. 299 /// By default, each comment is terminated with an end of line, i.e. the 300 /// EOL param is set to true by default. If one prefers not to end the 301 /// comment with a new line then the EOL param should be passed 302 /// with a false value. 303 virtual void AddComment(const Twine &T, bool EOL = true) {} 304 305 /// Return a raw_ostream that comments can be written to. Unlike 306 /// AddComment, you are required to terminate comments with \n if you use this 307 /// method. 308 virtual raw_ostream &GetCommentOS(); 309 310 /// Print T and prefix it with the comment string (normally #) and 311 /// optionally a tab. This prints the comment immediately, not at the end of 312 /// the current line. It is basically a safe version of EmitRawText: since it 313 /// only prints comments, the object streamer ignores it instead of asserting. 314 virtual void emitRawComment(const Twine &T, bool TabPrefix = true); 315 316 /// Add explicit comment T. T is required to be a valid 317 /// comment in the output and does not need to be escaped. 318 virtual void addExplicitComment(const Twine &T); 319 320 /// Emit added explicit comments. 321 virtual void emitExplicitComments(); 322 323 /// AddBlankLine - Emit a blank line to a .s file to pretty it up. AddBlankLine()324 virtual void AddBlankLine() {} 325 326 /// @} 327 328 /// \name Symbol & Section Management 329 /// @{ 330 331 /// Return the current section that the streamer is emitting code to. getCurrentSection()332 MCSectionSubPair getCurrentSection() const { 333 if (!SectionStack.empty()) 334 return SectionStack.back().first; 335 return MCSectionSubPair(); 336 } getCurrentSectionOnly()337 MCSection *getCurrentSectionOnly() const { return getCurrentSection().first; } 338 339 /// Return the previous section that the streamer is emitting code to. getPreviousSection()340 MCSectionSubPair getPreviousSection() const { 341 if (!SectionStack.empty()) 342 return SectionStack.back().second; 343 return MCSectionSubPair(); 344 } 345 346 /// Returns an index to represent the order a symbol was emitted in. 347 /// (zero if we did not emit that symbol) GetSymbolOrder(const MCSymbol * Sym)348 unsigned GetSymbolOrder(const MCSymbol *Sym) const { 349 return SymbolOrdering.lookup(Sym); 350 } 351 352 /// Update streamer for a new active section. 353 /// 354 /// This is called by PopSection and SwitchSection, if the current 355 /// section changes. 356 virtual void ChangeSection(MCSection *, const MCExpr *); 357 358 /// Save the current and previous section on the section stack. PushSection()359 void PushSection() { 360 SectionStack.push_back( 361 std::make_pair(getCurrentSection(), getPreviousSection())); 362 } 363 364 /// Restore the current and previous section from the section stack. 365 /// Calls ChangeSection as needed. 366 /// 367 /// Returns false if the stack was empty. PopSection()368 bool PopSection() { 369 if (SectionStack.size() <= 1) 370 return false; 371 auto I = SectionStack.end(); 372 --I; 373 MCSectionSubPair OldSection = I->first; 374 --I; 375 MCSectionSubPair NewSection = I->first; 376 377 if (OldSection != NewSection) 378 ChangeSection(NewSection.first, NewSection.second); 379 SectionStack.pop_back(); 380 return true; 381 } 382 SubSection(const MCExpr * Subsection)383 bool SubSection(const MCExpr *Subsection) { 384 if (SectionStack.empty()) 385 return false; 386 387 SwitchSection(SectionStack.back().first.first, Subsection); 388 return true; 389 } 390 391 /// Set the current section where code is being emitted to \p Section. This 392 /// is required to update CurSection. 393 /// 394 /// This corresponds to assembler directives like .section, .text, etc. 395 virtual void SwitchSection(MCSection *Section, 396 const MCExpr *Subsection = nullptr); 397 398 /// Set the current section where code is being emitted to \p Section. 399 /// This is required to update CurSection. This version does not call 400 /// ChangeSection. 401 void SwitchSectionNoChange(MCSection *Section, 402 const MCExpr *Subsection = nullptr) { 403 assert(Section && "Cannot switch to a null section!"); 404 MCSectionSubPair curSection = SectionStack.back().first; 405 SectionStack.back().second = curSection; 406 if (MCSectionSubPair(Section, Subsection) != curSection) 407 SectionStack.back().first = MCSectionSubPair(Section, Subsection); 408 } 409 410 /// Create the default sections and set the initial one. 411 virtual void InitSections(bool NoExecStack); 412 413 MCSymbol *endSection(MCSection *Section); 414 415 /// Sets the symbol's section. 416 /// 417 /// Each emitted symbol will be tracked in the ordering table, 418 /// so we can sort on them later. 419 void AssignFragment(MCSymbol *Symbol, MCFragment *Fragment); 420 421 /// Emit a label for \p Symbol into the current section. 422 /// 423 /// This corresponds to an assembler statement such as: 424 /// foo: 425 /// 426 /// \param Symbol - The symbol to emit. A given symbol should only be 427 /// emitted as a label once, and symbols emitted as a label should never be 428 /// used in an assignment. 429 // FIXME: These emission are non-const because we mutate the symbol to 430 // add the section we're emitting it to later. 431 virtual void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()); 432 433 virtual void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol); 434 435 /// Note in the output the specified \p Flag. 436 virtual void EmitAssemblerFlag(MCAssemblerFlag Flag); 437 438 /// Emit the given list \p Options of strings as linker 439 /// options into the output. EmitLinkerOptions(ArrayRef<std::string> Kind)440 virtual void EmitLinkerOptions(ArrayRef<std::string> Kind) {} 441 442 /// Note in the output the specified region \p Kind. EmitDataRegion(MCDataRegionType Kind)443 virtual void EmitDataRegion(MCDataRegionType Kind) {} 444 445 /// Specify the Mach-O minimum deployment target version. EmitVersionMin(MCVersionMinType Type,unsigned Major,unsigned Minor,unsigned Update)446 virtual void EmitVersionMin(MCVersionMinType Type, unsigned Major, 447 unsigned Minor, unsigned Update) {} 448 449 /// Emit/Specify Mach-O build version command. 450 /// \p Platform should be one of MachO::PlatformType. EmitBuildVersion(unsigned Platform,unsigned Major,unsigned Minor,unsigned Update)451 virtual void EmitBuildVersion(unsigned Platform, unsigned Major, 452 unsigned Minor, unsigned Update) {} 453 454 void EmitVersionForTarget(const Triple &Target); 455 456 /// Note in the output that the specified \p Func is a Thumb mode 457 /// function (ARM target only). 458 virtual void EmitThumbFunc(MCSymbol *Func); 459 460 /// Emit an assignment of \p Value to \p Symbol. 461 /// 462 /// This corresponds to an assembler statement such as: 463 /// symbol = value 464 /// 465 /// The assignment generates no code, but has the side effect of binding the 466 /// value in the current context. For the assembly streamer, this prints the 467 /// binding into the .s file. 468 /// 469 /// \param Symbol - The symbol being assigned to. 470 /// \param Value - The value for the symbol. 471 virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value); 472 473 /// Emit an weak reference from \p Alias to \p Symbol. 474 /// 475 /// This corresponds to an assembler statement such as: 476 /// .weakref alias, symbol 477 /// 478 /// \param Alias - The alias that is being created. 479 /// \param Symbol - The symbol being aliased. 480 virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); 481 482 /// Add the given \p Attribute to \p Symbol. 483 virtual bool EmitSymbolAttribute(MCSymbol *Symbol, 484 MCSymbolAttr Attribute) = 0; 485 486 /// Set the \p DescValue for the \p Symbol. 487 /// 488 /// \param Symbol - The symbol to have its n_desc field set. 489 /// \param DescValue - The value to set into the n_desc field. 490 virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); 491 492 /// Start emitting COFF symbol definition 493 /// 494 /// \param Symbol - The symbol to have its External & Type fields set. 495 virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol); 496 497 /// Emit the storage class of the symbol. 498 /// 499 /// \param StorageClass - The storage class the symbol should have. 500 virtual void EmitCOFFSymbolStorageClass(int StorageClass); 501 502 /// Emit the type of the symbol. 503 /// 504 /// \param Type - A COFF type identifier (see COFF::SymbolType in X86COFF.h) 505 virtual void EmitCOFFSymbolType(int Type); 506 507 /// Marks the end of the symbol definition. 508 virtual void EndCOFFSymbolDef(); 509 510 virtual void EmitCOFFSafeSEH(MCSymbol const *Symbol); 511 512 /// Emits the symbol table index of a Symbol into the current section. 513 virtual void EmitCOFFSymbolIndex(MCSymbol const *Symbol); 514 515 /// Emits a COFF section index. 516 /// 517 /// \param Symbol - Symbol the section number relocation should point to. 518 virtual void EmitCOFFSectionIndex(MCSymbol const *Symbol); 519 520 /// Emits a COFF section relative relocation. 521 /// 522 /// \param Symbol - Symbol the section relative relocation should point to. 523 virtual void EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset); 524 525 /// Emits a COFF image relative relocation. 526 /// 527 /// \param Symbol - Symbol the image relative relocation should point to. 528 virtual void EmitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset); 529 530 /// Emit an ELF .size directive. 531 /// 532 /// This corresponds to an assembler statement such as: 533 /// .size symbol, expression 534 virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value); 535 536 /// Emit an ELF .symver directive. 537 /// 538 /// This corresponds to an assembler statement such as: 539 /// .symver _start, foo@@SOME_VERSION 540 /// \param AliasName - The versioned alias (i.e. "foo@@SOME_VERSION") 541 /// \param Aliasee - The aliased symbol (i.e. "_start") 542 virtual void emitELFSymverDirective(StringRef AliasName, 543 const MCSymbol *Aliasee); 544 545 /// Emit a Linker Optimization Hint (LOH) directive. 546 /// \param Args - Arguments of the LOH. EmitLOHDirective(MCLOHType Kind,const MCLOHArgs & Args)547 virtual void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) {} 548 549 /// Emit a common symbol. 550 /// 551 /// \param Symbol - The common symbol to emit. 552 /// \param Size - The size of the common symbol. 553 /// \param ByteAlignment - The alignment of the symbol if 554 /// non-zero. This must be a power of 2. 555 virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 556 unsigned ByteAlignment) = 0; 557 558 /// Emit a local common (.lcomm) symbol. 559 /// 560 /// \param Symbol - The common symbol to emit. 561 /// \param Size - The size of the common symbol. 562 /// \param ByteAlignment - The alignment of the common symbol in bytes. 563 virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 564 unsigned ByteAlignment); 565 566 /// Emit the zerofill section and an optional symbol. 567 /// 568 /// \param Section - The zerofill section to create and or to put the symbol 569 /// \param Symbol - The zerofill symbol to emit, if non-NULL. 570 /// \param Size - The size of the zerofill symbol. 571 /// \param ByteAlignment - The alignment of the zerofill symbol if 572 /// non-zero. This must be a power of 2 on some targets. 573 virtual void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr, 574 uint64_t Size = 0, unsigned ByteAlignment = 0, 575 SMLoc Loc = SMLoc()) = 0; 576 577 /// Emit a thread local bss (.tbss) symbol. 578 /// 579 /// \param Section - The thread local common section. 580 /// \param Symbol - The thread local common symbol to emit. 581 /// \param Size - The size of the symbol. 582 /// \param ByteAlignment - The alignment of the thread local common symbol 583 /// if non-zero. This must be a power of 2 on some targets. 584 virtual void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, 585 uint64_t Size, unsigned ByteAlignment = 0); 586 587 /// @} 588 /// \name Generating Data 589 /// @{ 590 591 /// Emit the bytes in \p Data into the output. 592 /// 593 /// This is used to implement assembler directives such as .byte, .ascii, 594 /// etc. 595 virtual void EmitBytes(StringRef Data); 596 597 /// Functionally identical to EmitBytes. When emitting textual assembly, this 598 /// method uses .byte directives instead of .ascii or .asciz for readability. 599 virtual void EmitBinaryData(StringRef Data); 600 601 /// Emit the expression \p Value into the output as a native 602 /// integer of the given \p Size bytes. 603 /// 604 /// This is used to implement assembler directives such as .word, .quad, 605 /// etc. 606 /// 607 /// \param Value - The value to emit. 608 /// \param Size - The size of the integer (in bytes) to emit. This must 609 /// match a native machine width. 610 /// \param Loc - The location of the expression for error reporting. 611 virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, 612 SMLoc Loc = SMLoc()); 613 614 void EmitValue(const MCExpr *Value, unsigned Size, SMLoc Loc = SMLoc()); 615 616 /// Special case of EmitValue that avoids the client having 617 /// to pass in a MCExpr for constant integers. 618 virtual void EmitIntValue(uint64_t Value, unsigned Size); 619 620 virtual void EmitULEB128Value(const MCExpr *Value); 621 622 virtual void EmitSLEB128Value(const MCExpr *Value); 623 624 /// Special case of EmitULEB128Value that avoids the client having to 625 /// pass in a MCExpr for constant integers. 626 void EmitULEB128IntValue(uint64_t Value); 627 628 /// Special case of EmitSLEB128Value that avoids the client having to 629 /// pass in a MCExpr for constant integers. 630 void EmitSLEB128IntValue(int64_t Value); 631 632 /// Special case of EmitValue that avoids the client having to pass in 633 /// a MCExpr for MCSymbols. 634 void EmitSymbolValue(const MCSymbol *Sym, unsigned Size, 635 bool IsSectionRelative = false); 636 637 /// Emit the expression \p Value into the output as a dtprel 638 /// (64-bit DTP relative) value. 639 /// 640 /// This is used to implement assembler directives such as .dtpreldword on 641 /// targets that support them. 642 virtual void EmitDTPRel64Value(const MCExpr *Value); 643 644 /// Emit the expression \p Value into the output as a dtprel 645 /// (32-bit DTP relative) value. 646 /// 647 /// This is used to implement assembler directives such as .dtprelword on 648 /// targets that support them. 649 virtual void EmitDTPRel32Value(const MCExpr *Value); 650 651 /// Emit the expression \p Value into the output as a tprel 652 /// (64-bit TP relative) value. 653 /// 654 /// This is used to implement assembler directives such as .tpreldword on 655 /// targets that support them. 656 virtual void EmitTPRel64Value(const MCExpr *Value); 657 658 /// Emit the expression \p Value into the output as a tprel 659 /// (32-bit TP relative) value. 660 /// 661 /// This is used to implement assembler directives such as .tprelword on 662 /// targets that support them. 663 virtual void EmitTPRel32Value(const MCExpr *Value); 664 665 /// Emit the expression \p Value into the output as a gprel64 (64-bit 666 /// GP relative) value. 667 /// 668 /// This is used to implement assembler directives such as .gpdword on 669 /// targets that support them. 670 virtual void EmitGPRel64Value(const MCExpr *Value); 671 672 /// Emit the expression \p Value into the output as a gprel32 (32-bit 673 /// GP relative) value. 674 /// 675 /// This is used to implement assembler directives such as .gprel32 on 676 /// targets that support them. 677 virtual void EmitGPRel32Value(const MCExpr *Value); 678 679 /// Emit NumBytes bytes worth of the value specified by FillValue. 680 /// This implements directives such as '.space'. 681 void emitFill(uint64_t NumBytes, uint8_t FillValue); 682 683 /// Emit \p Size bytes worth of the value specified by \p FillValue. 684 /// 685 /// This is used to implement assembler directives such as .space or .skip. 686 /// 687 /// \param NumBytes - The number of bytes to emit. 688 /// \param FillValue - The value to use when filling bytes. 689 /// \param Loc - The location of the expression for error reporting. 690 virtual void emitFill(const MCExpr &NumBytes, uint64_t FillValue, 691 SMLoc Loc = SMLoc()); 692 693 /// Emit \p NumValues copies of \p Size bytes. Each \p Size bytes is 694 /// taken from the lowest order 4 bytes of \p Expr expression. 695 /// 696 /// This is used to implement assembler directives such as .fill. 697 /// 698 /// \param NumValues - The number of copies of \p Size bytes to emit. 699 /// \param Size - The size (in bytes) of each repeated value. 700 /// \param Expr - The expression from which \p Size bytes are used. 701 virtual void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr, 702 SMLoc Loc = SMLoc()); 703 704 /// Emit NumBytes worth of zeros. 705 /// This function properly handles data in virtual sections. 706 void EmitZeros(uint64_t NumBytes); 707 708 /// Emit some number of copies of \p Value until the byte alignment \p 709 /// ByteAlignment is reached. 710 /// 711 /// If the number of bytes need to emit for the alignment is not a multiple 712 /// of \p ValueSize, then the contents of the emitted fill bytes is 713 /// undefined. 714 /// 715 /// This used to implement the .align assembler directive. 716 /// 717 /// \param ByteAlignment - The alignment to reach. This must be a power of 718 /// two on some targets. 719 /// \param Value - The value to use when filling bytes. 720 /// \param ValueSize - The size of the integer (in bytes) to emit for 721 /// \p Value. This must match a native machine width. 722 /// \param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 723 /// the alignment cannot be reached in this many bytes, no bytes are 724 /// emitted. 725 virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, 726 unsigned ValueSize = 1, 727 unsigned MaxBytesToEmit = 0); 728 729 /// Emit nops until the byte alignment \p ByteAlignment is reached. 730 /// 731 /// This used to align code where the alignment bytes may be executed. This 732 /// can emit different bytes for different sizes to optimize execution. 733 /// 734 /// \param ByteAlignment - The alignment to reach. This must be a power of 735 /// two on some targets. 736 /// \param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If 737 /// the alignment cannot be reached in this many bytes, no bytes are 738 /// emitted. 739 virtual void EmitCodeAlignment(unsigned ByteAlignment, 740 unsigned MaxBytesToEmit = 0); 741 742 /// Emit some number of copies of \p Value until the byte offset \p 743 /// Offset is reached. 744 /// 745 /// This is used to implement assembler directives such as .org. 746 /// 747 /// \param Offset - The offset to reach. This may be an expression, but the 748 /// expression must be associated with the current section. 749 /// \param Value - The value to use when filling bytes. 750 virtual void emitValueToOffset(const MCExpr *Offset, unsigned char Value, 751 SMLoc Loc); 752 753 virtual void EmitCodePaddingBasicBlockStart(const MCCodePaddingContext & Context)754 EmitCodePaddingBasicBlockStart(const MCCodePaddingContext &Context) {} 755 756 virtual void EmitCodePaddingBasicBlockEnd(const MCCodePaddingContext & Context)757 EmitCodePaddingBasicBlockEnd(const MCCodePaddingContext &Context) {} 758 759 /// @} 760 761 /// Switch to a new logical file. This is used to implement the '.file 762 /// "foo.c"' assembler directive. 763 virtual void EmitFileDirective(StringRef Filename); 764 765 /// Emit the "identifiers" directive. This implements the 766 /// '.ident "version foo"' assembler directive. EmitIdent(StringRef IdentString)767 virtual void EmitIdent(StringRef IdentString) {} 768 769 /// Associate a filename with a specified logical file number. This 770 /// implements the DWARF2 '.file 4 "foo.c"' assembler directive. 771 unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, 772 StringRef Filename, 773 MD5::MD5Result *Checksum = nullptr, 774 Optional<StringRef> Source = None, 775 unsigned CUID = 0) { 776 return cantFail( 777 tryEmitDwarfFileDirective(FileNo, Directory, Filename, Checksum, 778 Source, CUID)); 779 } 780 781 /// Associate a filename with a specified logical file number. 782 /// Also associate a directory, optional checksum, and optional source 783 /// text with the logical file. This implements the DWARF2 784 /// '.file 4 "dir/foo.c"' assembler directive, and the DWARF5 785 /// '.file 4 "dir/foo.c" md5 "..." source "..."' assembler directive. 786 virtual Expected<unsigned> tryEmitDwarfFileDirective( 787 unsigned FileNo, StringRef Directory, StringRef Filename, 788 MD5::MD5Result *Checksum = nullptr, Optional<StringRef> Source = None, 789 unsigned CUID = 0); 790 791 /// Specify the "root" file of the compilation, using the ".file 0" extension. 792 virtual void emitDwarfFile0Directive(StringRef Directory, StringRef Filename, 793 MD5::MD5Result *Checksum, 794 Optional<StringRef> Source, 795 unsigned CUID = 0); 796 797 /// This implements the DWARF2 '.loc fileno lineno ...' assembler 798 /// directive. 799 virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, 800 unsigned Column, unsigned Flags, 801 unsigned Isa, unsigned Discriminator, 802 StringRef FileName); 803 804 /// Associate a filename with a specified logical file number, and also 805 /// specify that file's checksum information. This implements the '.cv_file 4 806 /// "foo.c"' assembler directive. Returns true on success. 807 virtual bool EmitCVFileDirective(unsigned FileNo, StringRef Filename, 808 ArrayRef<uint8_t> Checksum, 809 unsigned ChecksumKind); 810 811 /// Introduces a function id for use with .cv_loc. 812 virtual bool EmitCVFuncIdDirective(unsigned FunctionId); 813 814 /// Introduces an inline call site id for use with .cv_loc. Includes 815 /// extra information for inline line table generation. 816 virtual bool EmitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc, 817 unsigned IAFile, unsigned IALine, 818 unsigned IACol, SMLoc Loc); 819 820 /// This implements the CodeView '.cv_loc' assembler directive. 821 virtual void EmitCVLocDirective(unsigned FunctionId, unsigned FileNo, 822 unsigned Line, unsigned Column, 823 bool PrologueEnd, bool IsStmt, 824 StringRef FileName, SMLoc Loc); 825 826 /// This implements the CodeView '.cv_linetable' assembler directive. 827 virtual void EmitCVLinetableDirective(unsigned FunctionId, 828 const MCSymbol *FnStart, 829 const MCSymbol *FnEnd); 830 831 /// This implements the CodeView '.cv_inline_linetable' assembler 832 /// directive. 833 virtual void EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId, 834 unsigned SourceFileId, 835 unsigned SourceLineNum, 836 const MCSymbol *FnStartSym, 837 const MCSymbol *FnEndSym); 838 839 /// This implements the CodeView '.cv_def_range' assembler 840 /// directive. 841 virtual void EmitCVDefRangeDirective( 842 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, 843 StringRef FixedSizePortion); 844 845 /// This implements the CodeView '.cv_stringtable' assembler directive. EmitCVStringTableDirective()846 virtual void EmitCVStringTableDirective() {} 847 848 /// This implements the CodeView '.cv_filechecksums' assembler directive. EmitCVFileChecksumsDirective()849 virtual void EmitCVFileChecksumsDirective() {} 850 851 /// This implements the CodeView '.cv_filechecksumoffset' assembler 852 /// directive. EmitCVFileChecksumOffsetDirective(unsigned FileNo)853 virtual void EmitCVFileChecksumOffsetDirective(unsigned FileNo) {} 854 855 /// This implements the CodeView '.cv_fpo_data' assembler directive. 856 virtual void EmitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc = {}) {} 857 858 /// Emit the absolute difference between two symbols. 859 /// 860 /// \pre Offset of \c Hi is greater than the offset \c Lo. 861 virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, 862 unsigned Size); 863 864 /// Emit the absolute difference between two symbols encoded with ULEB128. 865 virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, 866 const MCSymbol *Lo); 867 868 virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID); 869 virtual void EmitCFISections(bool EH, bool Debug); 870 void EmitCFIStartProc(bool IsSimple); 871 void EmitCFIEndProc(); 872 virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset); 873 virtual void EmitCFIDefCfaOffset(int64_t Offset); 874 virtual void EmitCFIDefCfaRegister(int64_t Register); 875 virtual void EmitCFIOffset(int64_t Register, int64_t Offset); 876 virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding); 877 virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding); 878 virtual void EmitCFIRememberState(); 879 virtual void EmitCFIRestoreState(); 880 virtual void EmitCFISameValue(int64_t Register); 881 virtual void EmitCFIRestore(int64_t Register); 882 virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset); 883 virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment); 884 virtual void EmitCFIEscape(StringRef Values); 885 virtual void EmitCFIReturnColumn(int64_t Register); 886 virtual void EmitCFIGnuArgsSize(int64_t Size); 887 virtual void EmitCFISignalFrame(); 888 virtual void EmitCFIUndefined(int64_t Register); 889 virtual void EmitCFIRegister(int64_t Register1, int64_t Register2); 890 virtual void EmitCFIWindowSave(); 891 892 virtual void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc = SMLoc()); 893 virtual void EmitWinCFIEndProc(SMLoc Loc = SMLoc()); 894 virtual void EmitWinCFIStartChained(SMLoc Loc = SMLoc()); 895 virtual void EmitWinCFIEndChained(SMLoc Loc = SMLoc()); 896 virtual void EmitWinCFIPushReg(unsigned Register, SMLoc Loc = SMLoc()); 897 virtual void EmitWinCFISetFrame(unsigned Register, unsigned Offset, 898 SMLoc Loc = SMLoc()); 899 virtual void EmitWinCFIAllocStack(unsigned Size, SMLoc Loc = SMLoc()); 900 virtual void EmitWinCFISaveReg(unsigned Register, unsigned Offset, 901 SMLoc Loc = SMLoc()); 902 virtual void EmitWinCFISaveXMM(unsigned Register, unsigned Offset, 903 SMLoc Loc = SMLoc()); 904 virtual void EmitWinCFIPushFrame(bool Code, SMLoc Loc = SMLoc()); 905 virtual void EmitWinCFIEndProlog(SMLoc Loc = SMLoc()); 906 virtual void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except, 907 SMLoc Loc = SMLoc()); 908 virtual void EmitWinEHHandlerData(SMLoc Loc = SMLoc()); 909 910 virtual void emitCGProfileEntry(const MCSymbolRefExpr *From, 911 const MCSymbolRefExpr *To, uint64_t Count); 912 913 /// Get the .pdata section used for the given section. Typically the given 914 /// section is either the main .text section or some other COMDAT .text 915 /// section, but it may be any section containing code. 916 MCSection *getAssociatedPDataSection(const MCSection *TextSec); 917 918 /// Get the .xdata section used for the given section. 919 MCSection *getAssociatedXDataSection(const MCSection *TextSec); 920 921 virtual void EmitSyntaxDirective(); 922 923 /// Emit a .reloc directive. 924 /// Returns true if the relocation could not be emitted because Name is not 925 /// known. EmitRelocDirective(const MCExpr & Offset,StringRef Name,const MCExpr * Expr,SMLoc Loc,const MCSubtargetInfo & STI)926 virtual bool EmitRelocDirective(const MCExpr &Offset, StringRef Name, 927 const MCExpr *Expr, SMLoc Loc, 928 const MCSubtargetInfo &STI) { 929 return true; 930 } 931 EmitAddrsig()932 virtual void EmitAddrsig() {} EmitAddrsigSym(const MCSymbol * Sym)933 virtual void EmitAddrsigSym(const MCSymbol *Sym) {} 934 935 /// Emit the given \p Instruction into the current section. 936 /// PrintSchedInfo == true then schedul comment should be added to output 937 virtual void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, 938 bool PrintSchedInfo = false); 939 940 /// Set the bundle alignment mode from now on in the section. 941 /// The argument is the power of 2 to which the alignment is set. The 942 /// value 0 means turn the bundle alignment off. 943 virtual void EmitBundleAlignMode(unsigned AlignPow2); 944 945 /// The following instructions are a bundle-locked group. 946 /// 947 /// \param AlignToEnd - If true, the bundle-locked group will be aligned to 948 /// the end of a bundle. 949 virtual void EmitBundleLock(bool AlignToEnd); 950 951 /// Ends a bundle-locked group. 952 virtual void EmitBundleUnlock(); 953 954 /// If this file is backed by a assembly streamer, this dumps the 955 /// specified string in the output .s file. This capability is indicated by 956 /// the hasRawTextSupport() predicate. By default this aborts. 957 void EmitRawText(const Twine &String); 958 959 /// Streamer specific finalization. 960 virtual void FinishImpl(); 961 /// Finish emission of machine code. 962 void Finish(); 963 mayHaveInstructions(MCSection & Sec)964 virtual bool mayHaveInstructions(MCSection &Sec) const { return true; } 965 }; 966 967 /// Create a dummy machine code streamer, which does nothing. This is useful for 968 /// timing the assembler front end. 969 MCStreamer *createNullStreamer(MCContext &Ctx); 970 971 /// Create a machine code streamer which will print out assembly for the native 972 /// target, suitable for compiling with a native assembler. 973 /// 974 /// \param InstPrint - If given, the instruction printer to use. If not given 975 /// the MCInst representation will be printed. This method takes ownership of 976 /// InstPrint. 977 /// 978 /// \param CE - If given, a code emitter to use to show the instruction 979 /// encoding inline with the assembly. This method takes ownership of \p CE. 980 /// 981 /// \param TAB - If given, a target asm backend to use to show the fixup 982 /// information in conjunction with encoding information. This method takes 983 /// ownership of \p TAB. 984 /// 985 /// \param ShowInst - Whether to show the MCInst representation inline with 986 /// the assembly. 987 MCStreamer *createAsmStreamer(MCContext &Ctx, 988 std::unique_ptr<formatted_raw_ostream> OS, 989 bool isVerboseAsm, bool useDwarfDirectory, 990 MCInstPrinter *InstPrint, MCCodeEmitter *CE, 991 MCAsmBackend *TAB, bool ShowInst); 992 993 } // end namespace llvm 994 995 #endif // LLVM_MC_MCSTREAMER_H 996