LCOV - code coverage report
Current view: top level - lib/MC - MCStreamer.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 477 557 85.6 %
Date: 2018-10-20 13:21:21 Functions: 103 138 74.6 %
Legend: Lines: hit not hit

          Line data    Source code
       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/Optional.h"
      12             : #include "llvm/ADT/SmallString.h"
      13             : #include "llvm/ADT/StringRef.h"
      14             : #include "llvm/ADT/Twine.h"
      15             : #include "llvm/BinaryFormat/COFF.h"
      16             : #include "llvm/MC/MCAsmBackend.h"
      17             : #include "llvm/MC/MCAsmInfo.h"
      18             : #include "llvm/MC/MCCodeView.h"
      19             : #include "llvm/MC/MCContext.h"
      20             : #include "llvm/MC/MCDwarf.h"
      21             : #include "llvm/MC/MCExpr.h"
      22             : #include "llvm/MC/MCInst.h"
      23             : #include "llvm/MC/MCInstPrinter.h"
      24             : #include "llvm/MC/MCObjectFileInfo.h"
      25             : #include "llvm/MC/MCSection.h"
      26             : #include "llvm/MC/MCSectionCOFF.h"
      27             : #include "llvm/MC/MCSymbol.h"
      28             : #include "llvm/MC/MCWin64EH.h"
      29             : #include "llvm/MC/MCWinEH.h"
      30             : #include "llvm/Support/Casting.h"
      31             : #include "llvm/Support/ErrorHandling.h"
      32             : #include "llvm/Support/LEB128.h"
      33             : #include "llvm/Support/MathExtras.h"
      34             : #include "llvm/Support/raw_ostream.h"
      35             : #include <cassert>
      36             : #include <cstdint>
      37             : #include <cstdlib>
      38             : #include <utility>
      39             : 
      40             : using namespace llvm;
      41             : 
      42       24766 : MCTargetStreamer::MCTargetStreamer(MCStreamer &S) : Streamer(S) {
      43             :   S.setTargetStreamer(this);
      44       24766 : }
      45             : 
      46             : // Pin the vtables to this file.
      47             : MCTargetStreamer::~MCTargetStreamer() = default;
      48             : 
      49      445668 : void MCTargetStreamer::emitLabel(MCSymbol *Symbol) {}
      50             : 
      51       15683 : void MCTargetStreamer::finish() {}
      52             : 
      53      150152 : void MCTargetStreamer::changeSection(const MCSection *CurSection,
      54             :                                      MCSection *Section,
      55             :                                      const MCExpr *Subsection,
      56             :                                      raw_ostream &OS) {
      57      300304 :   Section->PrintSwitchToSection(
      58      150152 :       *Streamer.getContext().getAsmInfo(),
      59      150152 :       Streamer.getContext().getObjectFileInfo()->getTargetTriple(), OS,
      60      150152 :       Subsection);
      61      150151 : }
      62             : 
      63         368 : void MCTargetStreamer::emitDwarfFileDirective(StringRef Directive) {
      64         736 :   Streamer.EmitRawText(Directive);
      65         368 : }
      66             : 
      67      452235 : void MCTargetStreamer::emitValue(const MCExpr *Value) {
      68             :   SmallString<128> Str;
      69             :   raw_svector_ostream OS(Str);
      70             : 
      71      452235 :   Value->print(OS, Streamer.getContext().getAsmInfo());
      72     1356705 :   Streamer.EmitRawText(OS.str());
      73      452235 : }
      74             : 
      75        2801 : void MCTargetStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
      76             : 
      77       36292 : MCStreamer::MCStreamer(MCContext &Ctx)
      78             :     : Context(Ctx), CurrentWinFrameInfo(nullptr),
      79       72584 :       UseAssemblerInfoForParsing(false) {
      80       72584 :   SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
      81       36292 : }
      82             : 
      83       72213 : MCStreamer::~MCStreamer() {}
      84             : 
      85       27117 : void MCStreamer::reset() {
      86             :   DwarfFrameInfos.clear();
      87       27118 :   CurrentWinFrameInfo = nullptr;
      88             :   WinFrameInfos.clear();
      89       27118 :   SymbolOrdering.clear();
      90             :   SectionStack.clear();
      91       54236 :   SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
      92       27118 : }
      93             : 
      94           0 : raw_ostream &MCStreamer::GetCommentOS() {
      95             :   // By default, discard comments.
      96           0 :   return nulls();
      97             : }
      98             : 
      99        1140 : void MCStreamer::emitRawComment(const Twine &T, bool TabPrefix) {}
     100             : 
     101       76059 : void MCStreamer::addExplicitComment(const Twine &T) {}
     102           0 : void MCStreamer::emitExplicitComments() {}
     103             : 
     104        6992 : void MCStreamer::generateCompactUnwindEncodings(MCAsmBackend *MAB) {
     105      215078 :   for (auto &FI : DwarfFrameInfos)
     106      208086 :     FI.CompactUnwindEncoding =
     107      208086 :         (MAB ? MAB->generateCompactUnwindEncoding(FI.Instructions) : 0);
     108        6992 : }
     109             : 
     110             : /// EmitIntValue - Special case of EmitValue that avoids the client having to
     111             : /// pass in a MCExpr for constant integers.
     112     6040281 : void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size) {
     113             :   assert(1 <= Size && Size <= 8 && "Invalid size");
     114             :   assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
     115             :          "Invalid size");
     116             :   char buf[8];
     117     6040281 :   const bool isLittleEndian = Context.getAsmInfo()->isLittleEndian();
     118    16364432 :   for (unsigned i = 0; i != Size; ++i) {
     119    10324151 :     unsigned index = isLittleEndian ? i : (Size - i - 1);
     120    10324151 :     buf[i] = uint8_t(Value >> (index * 8));
     121             :   }
     122    12080562 :   EmitBytes(StringRef(buf, Size));
     123     6040280 : }
     124             : 
     125             : /// EmitULEB128IntValue - Special case of EmitULEB128Value that avoids the
     126             : /// client having to pass in a MCExpr for constant integers.
     127     5102055 : void MCStreamer::EmitULEB128IntValue(uint64_t Value) {
     128             :   SmallString<128> Tmp;
     129             :   raw_svector_ostream OSE(Tmp);
     130     5102061 :   encodeULEB128(Value, OSE);
     131    10204104 :   EmitBytes(OSE.str());
     132     5102058 : }
     133             : 
     134             : /// EmitSLEB128IntValue - Special case of EmitSLEB128Value that avoids the
     135             : /// client having to pass in a MCExpr for constant integers.
     136       94600 : void MCStreamer::EmitSLEB128IntValue(int64_t Value) {
     137             :   SmallString<128> Tmp;
     138             :   raw_svector_ostream OSE(Tmp);
     139       94600 :   encodeSLEB128(Value, OSE);
     140      189200 :   EmitBytes(OSE.str());
     141       94600 : }
     142             : 
     143     2000996 : void MCStreamer::EmitValue(const MCExpr *Value, unsigned Size, SMLoc Loc) {
     144     2000996 :   EmitValueImpl(Value, Size, Loc);
     145     2000996 : }
     146             : 
     147      717979 : void MCStreamer::EmitSymbolValue(const MCSymbol *Sym, unsigned Size,
     148             :                                  bool IsSectionRelative) {
     149             :   assert((!IsSectionRelative || Size == 4) &&
     150             :          "SectionRelative value requires 4-bytes");
     151             : 
     152      717979 :   if (!IsSectionRelative)
     153      717973 :     EmitValueImpl(MCSymbolRefExpr::create(Sym, getContext()), Size);
     154             :   else
     155           6 :     EmitCOFFSecRel32(Sym, /*Offset=*/0);
     156      717979 : }
     157             : 
     158           0 : void MCStreamer::EmitDTPRel64Value(const MCExpr *Value) {
     159           0 :   report_fatal_error("unsupported directive in streamer");
     160             : }
     161             : 
     162           0 : void MCStreamer::EmitDTPRel32Value(const MCExpr *Value) {
     163           0 :   report_fatal_error("unsupported directive in streamer");
     164             : }
     165             : 
     166           0 : void MCStreamer::EmitTPRel64Value(const MCExpr *Value) {
     167           0 :   report_fatal_error("unsupported directive in streamer");
     168             : }
     169             : 
     170           0 : void MCStreamer::EmitTPRel32Value(const MCExpr *Value) {
     171           0 :   report_fatal_error("unsupported directive in streamer");
     172             : }
     173             : 
     174           0 : void MCStreamer::EmitGPRel64Value(const MCExpr *Value) {
     175           0 :   report_fatal_error("unsupported directive in streamer");
     176             : }
     177             : 
     178           0 : void MCStreamer::EmitGPRel32Value(const MCExpr *Value) {
     179           0 :   report_fatal_error("unsupported directive in streamer");
     180             : }
     181             : 
     182             : /// Emit NumBytes bytes worth of the value specified by FillValue.
     183             : /// This implements directives such as '.space'.
     184      330804 : void MCStreamer::emitFill(uint64_t NumBytes, uint8_t FillValue) {
     185      330804 :   emitFill(*MCConstantExpr::create(NumBytes, getContext()), FillValue);
     186      330804 : }
     187             : 
     188             : /// The implementation in this class just redirects to emitFill.
     189      328008 : void MCStreamer::EmitZeros(uint64_t NumBytes) {
     190      328008 :   emitFill(NumBytes, 0);
     191      328008 : }
     192             : 
     193             : Expected<unsigned>
     194      889181 : MCStreamer::tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory,
     195             :                                       StringRef Filename,
     196             :                                       MD5::MD5Result *Checksum,
     197             :                                       Optional<StringRef> Source,
     198             :                                       unsigned CUID) {
     199      889181 :   return getContext().getDwarfFile(Directory, Filename, FileNo, Checksum,
     200      889181 :                                    Source, CUID);
     201             : }
     202             : 
     203        1033 : void MCStreamer::emitDwarfFile0Directive(StringRef Directory,
     204             :                                          StringRef Filename,
     205             :                                          MD5::MD5Result *Checksum,
     206             :                                          Optional<StringRef> Source,
     207             :                                          unsigned CUID) {
     208        1035 :   getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
     209             :                                       Source);
     210        1033 : }
     211             : 
     212      622487 : void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,
     213             :                                        unsigned Column, unsigned Flags,
     214             :                                        unsigned Isa,
     215             :                                        unsigned Discriminator,
     216             :                                        StringRef FileName) {
     217      622487 :   getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
     218             :                                   Discriminator);
     219      622487 : }
     220             : 
     221        1371 : MCSymbol *MCStreamer::getDwarfLineTableSymbol(unsigned CUID) {
     222        1371 :   MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID);
     223        1371 :   if (!Table.getLabel()) {
     224        1362 :     StringRef Prefix = Context.getAsmInfo()->getPrivateGlobalPrefix();
     225        1362 :     Table.setLabel(
     226        1362 :         Context.getOrCreateSymbol(Prefix + "line_table_start" + Twine(CUID)));
     227             :   }
     228        1371 :   return Table.getLabel();
     229             : }
     230             : 
     231     1708073 : bool MCStreamer::hasUnfinishedDwarfFrameInfo() {
     232     1708073 :   return !DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End;
     233             : }
     234             : 
     235     1390959 : MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo() {
     236     1390959 :   if (!hasUnfinishedDwarfFrameInfo()) {
     237           2 :     getContext().reportError(SMLoc(), "this directive must appear between "
     238             :                                       ".cfi_startproc and .cfi_endproc "
     239           2 :                                       "directives");
     240           2 :     return nullptr;
     241             :   }
     242     1390958 :   return &DwarfFrameInfos.back();
     243             : }
     244             : 
     245          86 : bool MCStreamer::EmitCVFileDirective(unsigned FileNo, StringRef Filename,
     246             :                                      ArrayRef<uint8_t> Checksum,
     247             :                                      unsigned ChecksumKind) {
     248          86 :   return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
     249          86 :                                              ChecksumKind);
     250             : }
     251             : 
     252         269 : bool MCStreamer::EmitCVFuncIdDirective(unsigned FunctionId) {
     253         269 :   return getContext().getCVContext().recordFunctionId(FunctionId);
     254             : }
     255             : 
     256          33 : bool MCStreamer::EmitCVInlineSiteIdDirective(unsigned FunctionId,
     257             :                                              unsigned IAFunc, unsigned IAFile,
     258             :                                              unsigned IALine, unsigned IACol,
     259             :                                              SMLoc Loc) {
     260          33 :   if (getContext().getCVContext().getCVFunctionInfo(IAFunc) == nullptr) {
     261           0 :     getContext().reportError(Loc, "parent function id not introduced by "
     262             :                                   ".cv_func_id or .cv_inline_site_id");
     263           0 :     return true;
     264             :   }
     265             : 
     266          33 :   return getContext().getCVContext().recordInlinedCallSiteId(
     267          33 :       FunctionId, IAFunc, IAFile, IALine, IACol);
     268             : }
     269             : 
     270           0 : void MCStreamer::EmitCVLocDirective(unsigned FunctionId, unsigned FileNo,
     271             :                                     unsigned Line, unsigned Column,
     272             :                                     bool PrologueEnd, bool IsStmt,
     273           0 :                                     StringRef FileName, SMLoc Loc) {}
     274             : 
     275         979 : bool MCStreamer::checkCVLocSection(unsigned FuncId, unsigned FileNo,
     276             :                                    SMLoc Loc) {
     277         979 :   CodeViewContext &CVC = getContext().getCVContext();
     278         979 :   MCCVFunctionInfo *FI = CVC.getCVFunctionInfo(FuncId);
     279         979 :   if (!FI) {
     280           0 :     getContext().reportError(
     281             :         Loc, "function id not introduced by .cv_func_id or .cv_inline_site_id");
     282           0 :     return false;
     283             :   }
     284             : 
     285             :   // Track the section
     286         979 :   if (FI->Section == nullptr)
     287         295 :     FI->Section = getCurrentSectionOnly();
     288         684 :   else if (FI->Section != getCurrentSectionOnly()) {
     289           2 :     getContext().reportError(
     290             :         Loc,
     291             :         "all .cv_loc directives for a function must be in the same section");
     292           1 :     return false;
     293             :   }
     294             :   return true;
     295             : }
     296             : 
     297         258 : void MCStreamer::EmitCVLinetableDirective(unsigned FunctionId,
     298             :                                           const MCSymbol *Begin,
     299         258 :                                           const MCSymbol *End) {}
     300             : 
     301          31 : void MCStreamer::EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
     302             :                                                 unsigned SourceFileId,
     303             :                                                 unsigned SourceLineNum,
     304             :                                                 const MCSymbol *FnStartSym,
     305          31 :                                                 const MCSymbol *FnEndSym) {}
     306             : 
     307         324 : void MCStreamer::EmitCVDefRangeDirective(
     308             :     ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
     309         324 :     StringRef FixedSizePortion) {}
     310             : 
     311           0 : void MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol,
     312             :                                      MCSymbol *EHSymbol) {
     313           0 : }
     314             : 
     315       24299 : void MCStreamer::InitSections(bool NoExecStack) {
     316       24299 :   SwitchSection(getContext().getObjectFileInfo()->getTextSection());
     317       24299 : }
     318             : 
     319         351 : void MCStreamer::AssignFragment(MCSymbol *Symbol, MCFragment *Fragment) {
     320             :   assert(Fragment);
     321             :   Symbol->setFragment(Fragment);
     322             : 
     323             :   // As we emit symbols into a section, track the order so that they can
     324             :   // be sorted upon later. Zero is reserved to mean 'unemitted'.
     325         351 :   SymbolOrdering[Symbol] = 1 + SymbolOrdering.size();
     326         351 : }
     327             : 
     328     8242741 : void MCStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) {
     329             :   Symbol->redefineIfPossible();
     330             : 
     331     8242743 :   if (!Symbol->isUndefined() || Symbol->isVariable())
     332          32 :     return getContext().reportError(Loc, "invalid symbol redefinition");
     333             : 
     334             :   assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
     335             :   assert(getCurrentSectionOnly() && "Cannot emit before setting section!");
     336             :   assert(!Symbol->getFragment() && "Unexpected fragment on symbol data!");
     337             :   assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
     338             : 
     339             :   Symbol->setFragment(&getCurrentSectionOnly()->getDummyFragment());
     340             : 
     341             :   MCTargetStreamer *TS = getTargetStreamer();
     342     8242727 :   if (TS)
     343      462122 :     TS->emitLabel(Symbol);
     344             : }
     345             : 
     346         226 : void MCStreamer::EmitCFISections(bool EH, bool Debug) {
     347             :   assert(EH || Debug);
     348         226 : }
     349             : 
     350      317113 : void MCStreamer::EmitCFIStartProc(bool IsSimple) {
     351      317113 :   if (hasUnfinishedDwarfFrameInfo())
     352           1 :     getContext().reportError(
     353           1 :         SMLoc(), "starting new .cfi frame before finishing the previous one");
     354             : 
     355             :   MCDwarfFrameInfo Frame;
     356      317113 :   Frame.IsSimple = IsSimple;
     357      317113 :   EmitCFIStartProcImpl(Frame);
     358             : 
     359      317113 :   const MCAsmInfo* MAI = Context.getAsmInfo();
     360      317113 :   if (MAI) {
     361      917844 :     for (const MCCFIInstruction& Inst : MAI->getInitialFrameState()) {
     362      600731 :       if (Inst.getOperation() == MCCFIInstruction::OpDefCfa ||
     363             :           Inst.getOperation() == MCCFIInstruction::OpDefCfaRegister) {
     364      316898 :         Frame.CurrentCfaRegister = Inst.getRegister();
     365             :       }
     366             :     }
     367             :   }
     368             : 
     369      317113 :   DwarfFrameInfos.push_back(Frame);
     370      317112 : }
     371             : 
     372          13 : void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
     373          13 : }
     374             : 
     375      317110 : void MCStreamer::EmitCFIEndProc() {
     376      317110 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     377      317110 :   if (!CurFrame)
     378             :     return;
     379      317110 :   EmitCFIEndProcImpl(*CurFrame);
     380             : }
     381             : 
     382      109024 : void MCStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
     383             :   // Put a dummy non-null value in Frame.End to mark that this frame has been
     384             :   // closed.
     385      109024 :   Frame.End = (MCSymbol *)1;
     386      109024 : }
     387             : 
     388       42375 : MCSymbol *MCStreamer::EmitCFILabel() {
     389             :   // Return a dummy non-null value so that label fields appear filled in when
     390             :   // generating textual assembly.
     391       42375 :   return (MCSymbol *)1;
     392             : }
     393             : 
     394      234219 : void MCStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {
     395      234219 :   MCSymbol *Label = EmitCFILabel();
     396             :   MCCFIInstruction Instruction =
     397      234219 :     MCCFIInstruction::createDefCfa(Label, Register, Offset);
     398      234219 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     399      234219 :   if (!CurFrame)
     400             :     return;
     401      234217 :   CurFrame->Instructions.push_back(Instruction);
     402      234217 :   CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
     403             : }
     404             : 
     405      270723 : void MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
     406      270723 :   MCSymbol *Label = EmitCFILabel();
     407             :   MCCFIInstruction Instruction =
     408      270723 :     MCCFIInstruction::createDefCfaOffset(Label, Offset);
     409      270723 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     410      270723 :   if (!CurFrame)
     411             :     return;
     412      270723 :   CurFrame->Instructions.push_back(Instruction);
     413             : }
     414             : 
     415       27841 : void MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
     416       27841 :   MCSymbol *Label = EmitCFILabel();
     417             :   MCCFIInstruction Instruction =
     418       27841 :     MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment);
     419       27841 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     420       27841 :   if (!CurFrame)
     421             :     return;
     422       27841 :   CurFrame->Instructions.push_back(Instruction);
     423             : }
     424             : 
     425      199328 : void MCStreamer::EmitCFIDefCfaRegister(int64_t Register) {
     426      199328 :   MCSymbol *Label = EmitCFILabel();
     427             :   MCCFIInstruction Instruction =
     428      199328 :     MCCFIInstruction::createDefCfaRegister(Label, Register);
     429      199328 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     430      199328 :   if (!CurFrame)
     431             :     return;
     432      199328 :   CurFrame->Instructions.push_back(Instruction);
     433      199328 :   CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
     434             : }
     435             : 
     436      242622 : void MCStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {
     437      242622 :   MCSymbol *Label = EmitCFILabel();
     438             :   MCCFIInstruction Instruction =
     439      242622 :     MCCFIInstruction::createOffset(Label, Register, Offset);
     440      242622 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     441      242622 :   if (!CurFrame)
     442             :     return;
     443      242622 :   CurFrame->Instructions.push_back(Instruction);
     444             : }
     445             : 
     446          24 : void MCStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {
     447          24 :   MCSymbol *Label = EmitCFILabel();
     448             :   MCCFIInstruction Instruction =
     449          24 :     MCCFIInstruction::createRelOffset(Label, Register, Offset);
     450          24 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     451          24 :   if (!CurFrame)
     452             :     return;
     453          24 :   CurFrame->Instructions.push_back(Instruction);
     454             : }
     455             : 
     456       46738 : void MCStreamer::EmitCFIPersonality(const MCSymbol *Sym,
     457             :                                     unsigned Encoding) {
     458       46738 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     459       46738 :   if (!CurFrame)
     460             :     return;
     461       46738 :   CurFrame->Personality = Sym;
     462       46738 :   CurFrame->PersonalityEncoding = Encoding;
     463             : }
     464             : 
     465       46701 : void MCStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
     466       46701 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     467       46701 :   if (!CurFrame)
     468             :     return;
     469       46701 :   CurFrame->Lsda = Sym;
     470       46701 :   CurFrame->LsdaEncoding = Encoding;
     471             : }
     472             : 
     473          30 : void MCStreamer::EmitCFIRememberState() {
     474          30 :   MCSymbol *Label = EmitCFILabel();
     475             :   MCCFIInstruction Instruction = MCCFIInstruction::createRememberState(Label);
     476          30 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     477          30 :   if (!CurFrame)
     478             :     return;
     479          30 :   CurFrame->Instructions.push_back(Instruction);
     480             : }
     481             : 
     482          30 : void MCStreamer::EmitCFIRestoreState() {
     483             :   // FIXME: Error if there is no matching cfi_remember_state.
     484          30 :   MCSymbol *Label = EmitCFILabel();
     485             :   MCCFIInstruction Instruction = MCCFIInstruction::createRestoreState(Label);
     486          30 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     487          30 :   if (!CurFrame)
     488             :     return;
     489          30 :   CurFrame->Instructions.push_back(Instruction);
     490             : }
     491             : 
     492           6 : void MCStreamer::EmitCFISameValue(int64_t Register) {
     493           6 :   MCSymbol *Label = EmitCFILabel();
     494             :   MCCFIInstruction Instruction =
     495           6 :     MCCFIInstruction::createSameValue(Label, Register);
     496           6 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     497           6 :   if (!CurFrame)
     498             :     return;
     499           6 :   CurFrame->Instructions.push_back(Instruction);
     500             : }
     501             : 
     502           5 : void MCStreamer::EmitCFIRestore(int64_t Register) {
     503           5 :   MCSymbol *Label = EmitCFILabel();
     504             :   MCCFIInstruction Instruction =
     505           5 :     MCCFIInstruction::createRestore(Label, Register);
     506           5 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     507           5 :   if (!CurFrame)
     508             :     return;
     509           5 :   CurFrame->Instructions.push_back(Instruction);
     510             : }
     511             : 
     512           2 : void MCStreamer::EmitCFIEscape(StringRef Values) {
     513           2 :   MCSymbol *Label = EmitCFILabel();
     514             :   MCCFIInstruction Instruction = MCCFIInstruction::createEscape(Label, Values);
     515           2 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     516           2 :   if (!CurFrame)
     517             :     return;
     518           2 :   CurFrame->Instructions.push_back(Instruction);
     519             : }
     520             : 
     521        4759 : void MCStreamer::EmitCFIGnuArgsSize(int64_t Size) {
     522        4759 :   MCSymbol *Label = EmitCFILabel();
     523             :   MCCFIInstruction Instruction =
     524        4759 :     MCCFIInstruction::createGnuArgsSize(Label, Size);
     525        4759 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     526        4759 :   if (!CurFrame)
     527             :     return;
     528        4759 :   CurFrame->Instructions.push_back(Instruction);
     529             : }
     530             : 
     531           1 : void MCStreamer::EmitCFISignalFrame() {
     532           1 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     533           1 :   if (!CurFrame)
     534             :     return;
     535           1 :   CurFrame->IsSignalFrame = true;
     536             : }
     537             : 
     538           1 : void MCStreamer::EmitCFIUndefined(int64_t Register) {
     539           1 :   MCSymbol *Label = EmitCFILabel();
     540             :   MCCFIInstruction Instruction =
     541           1 :     MCCFIInstruction::createUndefined(Label, Register);
     542           1 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     543           1 :   if (!CurFrame)
     544             :     return;
     545           1 :   CurFrame->Instructions.push_back(Instruction);
     546             : }
     547             : 
     548         408 : void MCStreamer::EmitCFIRegister(int64_t Register1, int64_t Register2) {
     549         408 :   MCSymbol *Label = EmitCFILabel();
     550             :   MCCFIInstruction Instruction =
     551         408 :     MCCFIInstruction::createRegister(Label, Register1, Register2);
     552         408 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     553         408 :   if (!CurFrame)
     554             :     return;
     555         408 :   CurFrame->Instructions.push_back(Instruction);
     556             : }
     557             : 
     558         406 : void MCStreamer::EmitCFIWindowSave() {
     559         406 :   MCSymbol *Label = EmitCFILabel();
     560             :   MCCFIInstruction Instruction =
     561             :     MCCFIInstruction::createWindowSave(Label);
     562         406 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     563         406 :   if (!CurFrame)
     564             :     return;
     565         406 :   CurFrame->Instructions.push_back(Instruction);
     566             : }
     567             : 
     568           6 : void MCStreamer::EmitCFIReturnColumn(int64_t Register) {
     569           6 :   MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
     570           6 :   if (!CurFrame)
     571             :     return;
     572           6 :   CurFrame->RAReg = Register;
     573             : }
     574             : 
     575        3152 : WinEH::FrameInfo *MCStreamer::EnsureValidWinFrameInfo(SMLoc Loc) {
     576        3152 :   const MCAsmInfo *MAI = Context.getAsmInfo();
     577        3152 :   if (!MAI->usesWindowsCFI()) {
     578           0 :     getContext().reportError(
     579             :         Loc, ".seh_* directives are not supported on this target");
     580           0 :     return nullptr;
     581             :   }
     582        3152 :   if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
     583           3 :     getContext().reportError(
     584             :         Loc, ".seh_ directive must appear within an active frame");
     585           3 :     return nullptr;
     586             :   }
     587             :   return CurrentWinFrameInfo;
     588             : }
     589             : 
     590         573 : void MCStreamer::EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) {
     591         573 :   const MCAsmInfo *MAI = Context.getAsmInfo();
     592         573 :   if (!MAI->usesWindowsCFI())
     593           0 :     return getContext().reportError(
     594             :         Loc, ".seh_* directives are not supported on this target");
     595         573 :   if (CurrentWinFrameInfo && !CurrentWinFrameInfo->End)
     596           0 :     getContext().reportError(
     597             :         Loc, "Starting a function before ending the previous one!");
     598             : 
     599         573 :   MCSymbol *StartProc = EmitCFILabel();
     600             : 
     601         573 :   WinFrameInfos.emplace_back(
     602        1146 :       llvm::make_unique<WinEH::FrameInfo>(Symbol, StartProc));
     603         573 :   CurrentWinFrameInfo = WinFrameInfos.back().get();
     604         573 :   CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
     605             : }
     606             : 
     607         572 : void MCStreamer::EmitWinCFIEndProc(SMLoc Loc) {
     608         572 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     609         572 :   if (!CurFrame)
     610             :     return;
     611         572 :   if (CurFrame->ChainedParent)
     612           0 :     getContext().reportError(Loc, "Not all chained regions terminated!");
     613             : 
     614         572 :   MCSymbol *Label = EmitCFILabel();
     615         572 :   CurFrame->End = Label;
     616             : }
     617             : 
     618           2 : void MCStreamer::EmitWinCFIStartChained(SMLoc Loc) {
     619           2 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     620           2 :   if (!CurFrame)
     621             :     return;
     622             : 
     623           2 :   MCSymbol *StartProc = EmitCFILabel();
     624             : 
     625           4 :   WinFrameInfos.emplace_back(llvm::make_unique<WinEH::FrameInfo>(
     626             :       CurFrame->Function, StartProc, CurFrame));
     627           2 :   CurrentWinFrameInfo = WinFrameInfos.back().get();
     628           2 :   CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
     629             : }
     630             : 
     631           2 : void MCStreamer::EmitWinCFIEndChained(SMLoc Loc) {
     632           2 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     633           2 :   if (!CurFrame)
     634             :     return;
     635           2 :   if (!CurFrame->ChainedParent)
     636           0 :     return getContext().reportError(
     637           0 :         Loc, "End of a chained region outside a chained region!");
     638             : 
     639           2 :   MCSymbol *Label = EmitCFILabel();
     640             : 
     641           2 :   CurFrame->End = Label;
     642           2 :   CurrentWinFrameInfo = const_cast<WinEH::FrameInfo *>(CurFrame->ChainedParent);
     643             : }
     644             : 
     645         135 : void MCStreamer::EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
     646             :                                   SMLoc Loc) {
     647         135 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     648         135 :   if (!CurFrame)
     649             :     return;
     650         135 :   if (CurFrame->ChainedParent)
     651           0 :     return getContext().reportError(
     652           0 :         Loc, "Chained unwind areas can't have handlers!");
     653         135 :   CurFrame->ExceptionHandler = Sym;
     654         135 :   if (!Except && !Unwind)
     655           0 :     getContext().reportError(Loc, "Don't know what kind of handler this is!");
     656         135 :   if (Unwind)
     657         132 :     CurFrame->HandlesUnwind = true;
     658         135 :   if (Except)
     659         135 :     CurFrame->HandlesExceptions = true;
     660             : }
     661             : 
     662         563 : void MCStreamer::EmitWinEHHandlerData(SMLoc Loc) {
     663         563 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     664         563 :   if (!CurFrame)
     665             :     return;
     666         563 :   if (CurFrame->ChainedParent)
     667           0 :     getContext().reportError(Loc, "Chained unwind areas can't have handlers!");
     668             : }
     669             : 
     670           0 : void MCStreamer::emitCGProfileEntry(const MCSymbolRefExpr *From,
     671             :                                     const MCSymbolRefExpr *To, uint64_t Count) {
     672           0 : }
     673             : 
     674         870 : static MCSection *getWinCFISection(MCContext &Context, unsigned *NextWinCFIID,
     675             :                                    MCSection *MainCFISec,
     676             :                                    const MCSection *TextSec) {
     677             :   // If this is the main .text section, use the main unwind info section.
     678         870 :   if (TextSec == Context.getObjectFileInfo()->getTextSection())
     679             :     return MainCFISec;
     680             : 
     681             :   const auto *TextSecCOFF = cast<MCSectionCOFF>(TextSec);
     682             :   auto *MainCFISecCOFF = cast<MCSectionCOFF>(MainCFISec);
     683             :   unsigned UniqueID = TextSecCOFF->getOrAssignWinCFISectionID(NextWinCFIID);
     684             : 
     685             :   // If this section is COMDAT, this unwind section should be COMDAT associative
     686             :   // with its group.
     687             :   const MCSymbol *KeySym = nullptr;
     688         116 :   if (TextSecCOFF->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
     689         112 :     KeySym = TextSecCOFF->getCOMDATSymbol();
     690             : 
     691             :     // In a GNU environment, we can't use associative comdats. Instead, do what
     692             :     // GCC does, which is to make plain comdat selectany section named like
     693             :     // ".[px]data$_Z3foov".
     694         112 :     if (!Context.getAsmInfo()->hasCOFFAssociativeComdats()) {
     695             :       std::string SectionName =
     696          11 :           (MainCFISecCOFF->getSectionName() + "$" +
     697          22 :            TextSecCOFF->getSectionName().split('$').second)
     698          11 :               .str();
     699          11 :       return Context.getCOFFSection(
     700             :           SectionName,
     701          11 :           MainCFISecCOFF->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT,
     702             :           MainCFISecCOFF->getKind(), "", COFF::IMAGE_COMDAT_SELECT_ANY);
     703             :     }
     704             :   }
     705             : 
     706         105 :   return Context.getAssociativeCOFFSection(MainCFISecCOFF, KeySym, UniqueID);
     707             : }
     708             : 
     709         105 : MCSection *MCStreamer::getAssociatedPDataSection(const MCSection *TextSec) {
     710         105 :   return getWinCFISection(getContext(), &NextWinCFIID,
     711         105 :                           getContext().getObjectFileInfo()->getPDataSection(),
     712         105 :                           TextSec);
     713             : }
     714             : 
     715         765 : MCSection *MCStreamer::getAssociatedXDataSection(const MCSection *TextSec) {
     716         765 :   return getWinCFISection(getContext(), &NextWinCFIID,
     717         765 :                           getContext().getObjectFileInfo()->getXDataSection(),
     718         765 :                           TextSec);
     719             : }
     720             : 
     721        7570 : void MCStreamer::EmitSyntaxDirective() {}
     722             : 
     723         467 : void MCStreamer::EmitWinCFIPushReg(unsigned Register, SMLoc Loc) {
     724         467 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     725         467 :   if (!CurFrame)
     726           2 :     return;
     727             : 
     728         465 :   MCSymbol *Label = EmitCFILabel();
     729             : 
     730             :   WinEH::Instruction Inst = Win64EH::Instruction::PushNonVol(Label, Register);
     731         465 :   CurFrame->Instructions.push_back(Inst);
     732             : }
     733             : 
     734         100 : void MCStreamer::EmitWinCFISetFrame(unsigned Register, unsigned Offset,
     735             :                                     SMLoc Loc) {
     736         100 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     737         100 :   if (!CurFrame)
     738           3 :     return;
     739         100 :   if (CurFrame->LastFrameInst >= 0)
     740           2 :     return getContext().reportError(
     741           1 :         Loc, "frame register and offset can be set at most once");
     742          99 :   if (Offset & 0x0F)
     743           2 :     return getContext().reportError(Loc, "offset is not a multiple of 16");
     744          98 :   if (Offset > 240)
     745           2 :     return getContext().reportError(
     746           1 :         Loc, "frame offset must be less than or equal to 240");
     747             : 
     748          97 :   MCSymbol *Label = EmitCFILabel();
     749             : 
     750             :   WinEH::Instruction Inst =
     751             :       Win64EH::Instruction::SetFPReg(Label, Register, Offset);
     752          97 :   CurFrame->LastFrameInst = CurFrame->Instructions.size();
     753          97 :   CurFrame->Instructions.push_back(Inst);
     754             : }
     755             : 
     756         541 : void MCStreamer::EmitWinCFIAllocStack(unsigned Size, SMLoc Loc) {
     757         541 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     758         541 :   if (!CurFrame)
     759           4 :     return;
     760         540 :   if (Size == 0)
     761           4 :     return getContext().reportError(Loc,
     762           2 :                                     "stack allocation size must be non-zero");
     763         538 :   if (Size & 7)
     764           2 :     return getContext().reportError(
     765           1 :         Loc, "stack allocation size is not a multiple of 8");
     766             : 
     767         537 :   MCSymbol *Label = EmitCFILabel();
     768             : 
     769             :   WinEH::Instruction Inst = Win64EH::Instruction::Alloc(Label, Size);
     770         537 :   CurFrame->Instructions.push_back(Inst);
     771             : }
     772             : 
     773           2 : void MCStreamer::EmitWinCFISaveReg(unsigned Register, unsigned Offset,
     774             :                                    SMLoc Loc) {
     775           2 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     776           2 :   if (!CurFrame)
     777           0 :     return;
     778             : 
     779           2 :   if (Offset & 7)
     780           0 :     return getContext().reportError(
     781           0 :         Loc, "register save offset is not 8 byte aligned");
     782             : 
     783           2 :   MCSymbol *Label = EmitCFILabel();
     784             : 
     785             :   WinEH::Instruction Inst =
     786             :       Win64EH::Instruction::SaveNonVol(Label, Register, Offset);
     787           2 :   CurFrame->Instructions.push_back(Inst);
     788             : }
     789             : 
     790         195 : void MCStreamer::EmitWinCFISaveXMM(unsigned Register, unsigned Offset,
     791             :                                    SMLoc Loc) {
     792         195 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     793         195 :   if (!CurFrame)
     794           1 :     return;
     795         195 :   if (Offset & 0x0F)
     796           2 :     return getContext().reportError(Loc, "offset is not a multiple of 16");
     797             : 
     798         194 :   MCSymbol *Label = EmitCFILabel();
     799             : 
     800             :   WinEH::Instruction Inst =
     801             :       Win64EH::Instruction::SaveXMM(Label, Register, Offset);
     802         194 :   CurFrame->Instructions.push_back(Inst);
     803             : }
     804             : 
     805           2 : void MCStreamer::EmitWinCFIPushFrame(bool Code, SMLoc Loc) {
     806           2 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     807           2 :   if (!CurFrame)
     808           0 :     return;
     809           2 :   if (!CurFrame->Instructions.empty())
     810           0 :     return getContext().reportError(
     811           0 :         Loc, "If present, PushMachFrame must be the first UOP");
     812             : 
     813           2 :   MCSymbol *Label = EmitCFILabel();
     814             : 
     815             :   WinEH::Instruction Inst = Win64EH::Instruction::PushMachFrame(Label, Code);
     816           2 :   CurFrame->Instructions.push_back(Inst);
     817             : }
     818             : 
     819         571 : void MCStreamer::EmitWinCFIEndProlog(SMLoc Loc) {
     820         571 :   WinEH::FrameInfo *CurFrame = EnsureValidWinFrameInfo(Loc);
     821         571 :   if (!CurFrame)
     822             :     return;
     823             : 
     824         571 :   MCSymbol *Label = EmitCFILabel();
     825             : 
     826         571 :   CurFrame->PrologEnd = Label;
     827             : }
     828             : 
     829           0 : void MCStreamer::EmitCOFFSafeSEH(MCSymbol const *Symbol) {
     830           0 : }
     831             : 
     832           0 : void MCStreamer::EmitCOFFSymbolIndex(MCSymbol const *Symbol) {}
     833             : 
     834           0 : void MCStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) {
     835           0 : }
     836             : 
     837          17 : void MCStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) {}
     838             : 
     839           0 : void MCStreamer::EmitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) {}
     840             : 
     841             : /// EmitRawText - If this file is backed by an assembly streamer, this dumps
     842             : /// the specified string in the output .s file.  This capability is
     843             : /// indicated by the hasRawTextSupport() predicate.
     844           0 : void MCStreamer::EmitRawTextImpl(StringRef String) {
     845           0 :   errs() << "EmitRawText called on an MCStreamer that doesn't support it, "
     846           0 :   " something must not be fully mc'ized\n";
     847           0 :   abort();
     848             : }
     849             : 
     850      463325 : void MCStreamer::EmitRawText(const Twine &T) {
     851             :   SmallString<128> Str;
     852      463325 :   EmitRawTextImpl(T.toStringRef(Str));
     853      463325 : }
     854             : 
     855           0 : void MCStreamer::EmitWindowsUnwindTables() {
     856           0 : }
     857             : 
     858       33602 : void MCStreamer::Finish() {
     859       33602 :   if ((!DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End) ||
     860         176 :       (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) {
     861           6 :     getContext().reportError(SMLoc(), "Unfinished frame!");
     862           3 :     return;
     863             :   }
     864             : 
     865             :   MCTargetStreamer *TS = getTargetStreamer();
     866       33599 :   if (TS)
     867       22430 :     TS->finish();
     868             : 
     869       33599 :   FinishImpl();
     870             : }
     871             : 
     872        8017 : void MCStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
     873        8017 :   visitUsedExpr(*Value);
     874        8017 :   Symbol->setVariableValue(Value);
     875             : 
     876             :   MCTargetStreamer *TS = getTargetStreamer();
     877        8017 :   if (TS)
     878        2856 :     TS->emitAssignment(Symbol, Value);
     879        8017 : }
     880             : 
     881     1877490 : void MCTargetStreamer::prettyPrintAsm(MCInstPrinter &InstPrinter, raw_ostream &OS,
     882             :                               const MCInst &Inst, const MCSubtargetInfo &STI) {
     883     3754980 :   InstPrinter.printInst(&Inst, OS, "", STI);
     884     1877490 : }
     885             : 
     886        2611 : void MCStreamer::visitUsedSymbol(const MCSymbol &Sym) {
     887        2611 : }
     888             : 
     889     9821433 : void MCStreamer::visitUsedExpr(const MCExpr &Expr) {
     890    11744722 :   switch (Expr.getKind()) {
     891             :   case MCExpr::Target:
     892       14244 :     cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
     893       14244 :     break;
     894             : 
     895             :   case MCExpr::Constant:
     896             :     break;
     897             : 
     898             :   case MCExpr::Binary: {
     899             :     const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
     900     1923266 :     visitUsedExpr(*BE.getLHS());
     901     1923266 :     visitUsedExpr(*BE.getRHS());
     902     1923266 :     break;
     903             :   }
     904             : 
     905     8767080 :   case MCExpr::SymbolRef:
     906     8767080 :     visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
     907     8767080 :     break;
     908             : 
     909             :   case MCExpr::Unary:
     910          23 :     visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
     911          23 :     break;
     912             :   }
     913     9821433 : }
     914             : 
     915    30185915 : void MCStreamer::EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,
     916             :                                  bool) {
     917             :   // Scan for values.
     918   167163513 :   for (unsigned i = Inst.getNumOperands(); i--;)
     919   136977598 :     if (Inst.getOperand(i).isExpr())
     920     5623603 :       visitUsedExpr(*Inst.getOperand(i).getExpr());
     921    30185915 : }
     922             : 
     923       43972 : void MCStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
     924             :                                         unsigned Size) {
     925             :   // Get the Hi-Lo expression.
     926             :   const MCExpr *Diff =
     927       43972 :       MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, Context),
     928             :                               MCSymbolRefExpr::create(Lo, Context), Context);
     929             : 
     930       43972 :   const MCAsmInfo *MAI = Context.getAsmInfo();
     931       43972 :   if (!MAI->doesSetDirectiveSuppressReloc()) {
     932       40771 :     EmitValue(Diff, Size);
     933       40771 :     return;
     934             :   }
     935             : 
     936             :   // Otherwise, emit with .set (aka assignment).
     937        3201 :   MCSymbol *SetLabel = Context.createTempSymbol("set", true);
     938        3201 :   EmitAssignment(SetLabel, Diff);
     939        3201 :   EmitSymbolValue(SetLabel, Size);
     940             : }
     941             : 
     942      166051 : void MCStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
     943             :                                                  const MCSymbol *Lo) {
     944             :   // Get the Hi-Lo expression.
     945             :   const MCExpr *Diff =
     946      166051 :       MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, Context),
     947             :                               MCSymbolRefExpr::create(Lo, Context), Context);
     948             : 
     949      166051 :   EmitULEB128Value(Diff);
     950      166051 : }
     951             : 
     952           4 : void MCStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {}
     953           0 : void MCStreamer::EmitThumbFunc(MCSymbol *Func) {}
     954           0 : void MCStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
     955           0 : void MCStreamer::BeginCOFFSymbolDef(const MCSymbol *Symbol) {
     956           0 :   llvm_unreachable("this directive only supported on COFF targets");
     957             : }
     958           0 : void MCStreamer::EndCOFFSymbolDef() {
     959           0 :   llvm_unreachable("this directive only supported on COFF targets");
     960             : }
     961           9 : void MCStreamer::EmitFileDirective(StringRef Filename) {}
     962           0 : void MCStreamer::EmitCOFFSymbolStorageClass(int StorageClass) {
     963           0 :   llvm_unreachable("this directive only supported on COFF targets");
     964             : }
     965           0 : void MCStreamer::EmitCOFFSymbolType(int Type) {
     966           0 :   llvm_unreachable("this directive only supported on COFF targets");
     967             : }
     968          42 : void MCStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) {}
     969           0 : void MCStreamer::emitELFSymverDirective(StringRef AliasName,
     970           0 :                                         const MCSymbol *Aliasee) {}
     971           0 : void MCStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
     972           0 :                                        unsigned ByteAlignment) {}
     973           0 : void MCStreamer::EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
     974           0 :                                 uint64_t Size, unsigned ByteAlignment) {}
     975         587 : void MCStreamer::ChangeSection(MCSection *, const MCExpr *) {}
     976           0 : void MCStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {}
     977         506 : void MCStreamer::EmitBytes(StringRef Data) {}
     978        1340 : void MCStreamer::EmitBinaryData(StringRef Data) { EmitBytes(Data); }
     979     2250006 : void MCStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) {
     980     2250006 :   visitUsedExpr(*Value);
     981     2250007 : }
     982           0 : void MCStreamer::EmitULEB128Value(const MCExpr *Value) {}
     983           0 : void MCStreamer::EmitSLEB128Value(const MCExpr *Value) {}
     984           7 : void MCStreamer::emitFill(const MCExpr &NumBytes, uint64_t Value, SMLoc Loc) {}
     985           0 : void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
     986           0 :                           SMLoc Loc) {}
     987           3 : void MCStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,
     988             :                                       unsigned ValueSize,
     989           3 :                                       unsigned MaxBytesToEmit) {}
     990          27 : void MCStreamer::EmitCodeAlignment(unsigned ByteAlignment,
     991          27 :                                    unsigned MaxBytesToEmit) {}
     992           0 : void MCStreamer::emitValueToOffset(const MCExpr *Offset, unsigned char Value,
     993           0 :                                    SMLoc Loc) {}
     994           0 : void MCStreamer::EmitBundleAlignMode(unsigned AlignPow2) {}
     995           0 : void MCStreamer::EmitBundleLock(bool AlignToEnd) {}
     996         536 : void MCStreamer::FinishImpl() {}
     997           0 : void MCStreamer::EmitBundleUnlock() {}
     998             : 
     999     1323385 : void MCStreamer::SwitchSection(MCSection *Section, const MCExpr *Subsection) {
    1000             :   assert(Section && "Cannot switch to a null section!");
    1001     1323385 :   MCSectionSubPair curSection = SectionStack.back().first;
    1002             :   SectionStack.back().second = curSection;
    1003             :   if (MCSectionSubPair(Section, Subsection) != curSection) {
    1004      957002 :     ChangeSection(Section, Subsection);
    1005             :     SectionStack.back().first = MCSectionSubPair(Section, Subsection);
    1006             :     assert(!Section->hasEnded() && "Section already ended");
    1007      957001 :     MCSymbol *Sym = Section->getBeginSymbol();
    1008      957001 :     if (Sym && !Sym->isInSection())
    1009        3435 :       EmitLabel(Sym);
    1010             :   }
    1011     1323384 : }
    1012             : 
    1013        8087 : MCSymbol *MCStreamer::endSection(MCSection *Section) {
    1014             :   // TODO: keep track of the last subsection so that this symbol appears in the
    1015             :   // correct place.
    1016        8087 :   MCSymbol *Sym = Section->getEndSymbol(Context);
    1017        8087 :   if (Sym->isInSection())
    1018             :     return Sym;
    1019             : 
    1020        8059 :   SwitchSection(Section);
    1021        8059 :   EmitLabel(Sym);
    1022        8059 :   return Sym;
    1023             : }
    1024             : 
    1025       27928 : void MCStreamer::EmitVersionForTarget(const Triple &Target) {
    1026       27928 :   if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
    1027       26891 :     return;
    1028             :   // Do we even know the version?
    1029        2790 :   if (Target.getOSMajorVersion() == 0)
    1030             :     return;
    1031             : 
    1032             :   unsigned Major;
    1033             :   unsigned Minor;
    1034             :   unsigned Update;
    1035             :   MCVersionMinType VersionType;
    1036        1037 :   if (Target.isWatchOS()) {
    1037             :     VersionType = MCVM_WatchOSVersionMin;
    1038          15 :     Target.getWatchOSVersion(Major, Minor, Update);
    1039        1022 :   } else if (Target.isTvOS()) {
    1040             :     VersionType = MCVM_TvOSVersionMin;
    1041           6 :     Target.getiOSVersion(Major, Minor, Update);
    1042             :   } else if (Target.isMacOSX()) {
    1043             :     VersionType = MCVM_OSXVersionMin;
    1044         825 :     if (!Target.getMacOSXVersion(Major, Minor, Update))
    1045           2 :       Major = 0;
    1046             :   } else {
    1047             :     VersionType = MCVM_IOSVersionMin;
    1048         191 :     Target.getiOSVersion(Major, Minor, Update);
    1049             :   }
    1050        1037 :   if (Major != 0)
    1051        1035 :     EmitVersionMin(VersionType, Major, Minor, Update);
    1052             : }

Generated by: LCOV version 1.13