diff options
Diffstat (limited to 'contrib/llvm/lib/MC/MCAsmStreamer.cpp')
| -rw-r--r-- | contrib/llvm/lib/MC/MCAsmStreamer.cpp | 690 | 
1 files changed, 321 insertions, 369 deletions
diff --git a/contrib/llvm/lib/MC/MCAsmStreamer.cpp b/contrib/llvm/lib/MC/MCAsmStreamer.cpp index ca49f8f5908e..14f0f05edd1f 100644 --- a/contrib/llvm/lib/MC/MCAsmStreamer.cpp +++ b/contrib/llvm/lib/MC/MCAsmStreamer.cpp @@ -8,8 +8,8 @@  //===----------------------------------------------------------------------===//  #include "llvm/MC/MCStreamer.h" -#include "llvm/ADT/OwningPtr.h"  #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/StringExtras.h"  #include "llvm/ADT/Twine.h"  #include "llvm/MC/MCAsmBackend.h" @@ -32,6 +32,7 @@  #include "llvm/Support/MathExtras.h"  #include "llvm/Support/Path.h"  #include <cctype> +#include <unordered_map>  using namespace llvm;  namespace { @@ -41,44 +42,33 @@ protected:    formatted_raw_ostream &OS;    const MCAsmInfo *MAI;  private: -  OwningPtr<MCInstPrinter> InstPrinter; -  OwningPtr<MCCodeEmitter> Emitter; -  OwningPtr<MCAsmBackend> AsmBackend; +  std::unique_ptr<MCInstPrinter> InstPrinter; +  std::unique_ptr<MCCodeEmitter> Emitter; +  std::unique_ptr<MCAsmBackend> AsmBackend;    SmallString<128> CommentToEmit;    raw_svector_ostream CommentStream;    unsigned IsVerboseAsm : 1;    unsigned ShowInst : 1; -  unsigned UseLoc : 1; -  unsigned UseCFI : 1;    unsigned UseDwarfDirectory : 1; -  enum EHSymbolFlags { EHGlobal         = 1, -                       EHWeakDefinition = 1 << 1, -                       EHPrivateExtern  = 1 << 2 }; -  DenseMap<const MCSymbol*, unsigned> FlagMap; - -  bool needsSet(const MCExpr *Value); -    void EmitRegisterName(int64_t Register); -  virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame); -  virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame); +  void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; +  void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;  public: -  MCAsmStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, -                formatted_raw_ostream &os, bool isVerboseAsm, bool useLoc, -                bool useCFI, bool useDwarfDirectory, MCInstPrinter *printer, -                MCCodeEmitter *emitter, MCAsmBackend *asmbackend, bool showInst) -      : MCStreamer(Context, TargetStreamer), OS(os), MAI(Context.getAsmInfo()), +  MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os, +                bool isVerboseAsm, bool useDwarfDirectory, +                MCInstPrinter *printer, MCCodeEmitter *emitter, +                MCAsmBackend *asmbackend, bool showInst) +      : MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()),          InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend),          CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm), -        ShowInst(showInst), UseLoc(useLoc), UseCFI(useCFI), -        UseDwarfDirectory(useDwarfDirectory) { +        ShowInst(showInst), UseDwarfDirectory(useDwarfDirectory) {      if (InstPrinter && IsVerboseAsm)        InstPrinter->setCommentStream(CommentStream);    } -  ~MCAsmStreamer() {}    inline void EmitEOL() {      // If we don't have any comments, just emit a \n. @@ -92,172 +82,163 @@ public:    /// isVerboseAsm - Return true if this streamer supports verbose assembly at    /// all. -  virtual bool isVerboseAsm() const { return IsVerboseAsm; } +  bool isVerboseAsm() const override { return IsVerboseAsm; }    /// hasRawTextSupport - We support EmitRawText. -  virtual bool hasRawTextSupport() const { return true; } +  bool hasRawTextSupport() const override { return true; }    /// AddComment - Add a comment that can be emitted to the generated .s    /// file if applicable as a QoI issue to make the output of the compiler    /// more readable.  This only affects the MCAsmStreamer, and only when    /// verbose assembly output is enabled. -  virtual void AddComment(const Twine &T); +  void AddComment(const Twine &T) override;    /// AddEncodingComment - Add a comment showing the encoding of an instruction. -  virtual void AddEncodingComment(const MCInst &Inst); +  void AddEncodingComment(const MCInst &Inst, const MCSubtargetInfo &);    /// GetCommentOS - Return a raw_ostream that comments can be written to.    /// Unlike AddComment, you are required to terminate comments with \n if you    /// use this method. -  virtual raw_ostream &GetCommentOS() { +  raw_ostream &GetCommentOS() override {      if (!IsVerboseAsm)        return nulls();  // Discard comments unless in verbose asm mode.      return CommentStream;    } +  void emitRawComment(const Twine &T, bool TabPrefix = true) override; +    /// AddBlankLine - Emit a blank line to a .s file to pretty it up. -  virtual void AddBlankLine() { +  void AddBlankLine() override {      EmitEOL();    }    /// @name MCStreamer Interface    /// @{ -  virtual void ChangeSection(const MCSection *Section, -                             const MCExpr *Subsection); - -  virtual void InitSections() { -    InitToTextSection(); -  } - -  virtual void InitToTextSection() { -    SwitchSection(getContext().getObjectFileInfo()->getTextSection()); -  } - -  virtual void EmitLabel(MCSymbol *Symbol); -  virtual void EmitDebugLabel(MCSymbol *Symbol); - -  virtual void EmitEHSymAttributes(const MCSymbol *Symbol, -                                   MCSymbol *EHSymbol); -  virtual void EmitAssemblerFlag(MCAssemblerFlag Flag); -  virtual void EmitLinkerOptions(ArrayRef<std::string> Options); -  virtual void EmitDataRegion(MCDataRegionType Kind); -  virtual void EmitThumbFunc(MCSymbol *Func); - -  virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value); -  virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); -  virtual void EmitDwarfAdvanceLineAddr(int64_t LineDelta, -                                        const MCSymbol *LastLabel, -                                        const MCSymbol *Label, -                                        unsigned PointerSize); -  virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, -                                         const MCSymbol *Label); - -  virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute); - -  virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); -  virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol); -  virtual void EmitCOFFSymbolStorageClass(int StorageClass); -  virtual void EmitCOFFSymbolType(int Type); -  virtual void EndCOFFSymbolDef(); -  virtual void EmitCOFFSecRel32(MCSymbol const *Symbol); -  virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value); -  virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, -                                unsigned ByteAlignment); +  void ChangeSection(const MCSection *Section, +                     const MCExpr *Subsection) override; + +  void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override; +  void EmitLabel(MCSymbol *Symbol) override; + +  void EmitAssemblerFlag(MCAssemblerFlag Flag) override; +  void EmitLinkerOptions(ArrayRef<std::string> Options) override; +  void EmitDataRegion(MCDataRegionType Kind) override; +  void EmitVersionMin(MCVersionMinType Kind, unsigned Major, unsigned Minor, +                      unsigned Update) override; +  void EmitThumbFunc(MCSymbol *Func) override; + +  void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; +  void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; +  bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override; + +  void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; +  void BeginCOFFSymbolDef(const MCSymbol *Symbol) override; +  void EmitCOFFSymbolStorageClass(int StorageClass) override; +  void EmitCOFFSymbolType(int Type) override; +  void EndCOFFSymbolDef() override; +  void EmitCOFFSectionIndex(MCSymbol const *Symbol) override; +  void EmitCOFFSecRel32(MCSymbol const *Symbol) override; +  void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) override; +  void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, +                        unsigned ByteAlignment) override;    /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol.    ///    /// @param Symbol - The common symbol to emit.    /// @param Size - The size of the common symbol.    /// @param ByteAlignment - The alignment of the common symbol in bytes. -  virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, -                                     unsigned ByteAlignment); - -  virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, -                            uint64_t Size = 0, unsigned ByteAlignment = 0); - -  virtual void EmitTBSSSymbol (const MCSection *Section, MCSymbol *Symbol, -                               uint64_t Size, unsigned ByteAlignment = 0); - -  virtual void EmitBytes(StringRef Data); - -  virtual void EmitValueImpl(const MCExpr *Value, unsigned Size); -  virtual void EmitIntValue(uint64_t Value, unsigned Size); - -  virtual void EmitULEB128Value(const MCExpr *Value); - -  virtual void EmitSLEB128Value(const MCExpr *Value); - -  virtual void EmitGPRel64Value(const MCExpr *Value); - -  virtual void EmitGPRel32Value(const MCExpr *Value); - - -  virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue); - -  virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, -                                    unsigned ValueSize = 1, -                                    unsigned MaxBytesToEmit = 0); - -  virtual void EmitCodeAlignment(unsigned ByteAlignment, -                                 unsigned MaxBytesToEmit = 0); - -  virtual bool EmitValueToOffset(const MCExpr *Offset, -                                 unsigned char Value = 0); - -  virtual void EmitFileDirective(StringRef Filename); -  virtual bool EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, -                                      StringRef Filename, unsigned CUID = 0); -  virtual void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, -                                     unsigned Column, unsigned Flags, -                                     unsigned Isa, unsigned Discriminator, -                                     StringRef FileName); - -  virtual void EmitIdent(StringRef IdentString); -  virtual void EmitCFISections(bool EH, bool Debug); -  virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset); -  virtual void EmitCFIDefCfaOffset(int64_t Offset); -  virtual void EmitCFIDefCfaRegister(int64_t Register); -  virtual void EmitCFIOffset(int64_t Register, int64_t Offset); -  virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding); -  virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding); -  virtual void EmitCFIRememberState(); -  virtual void EmitCFIRestoreState(); -  virtual void EmitCFISameValue(int64_t Register); -  virtual void EmitCFIRelOffset(int64_t Register, int64_t Offset); -  virtual void EmitCFIAdjustCfaOffset(int64_t Adjustment); -  virtual void EmitCFISignalFrame(); -  virtual void EmitCFIUndefined(int64_t Register); -  virtual void EmitCFIRegister(int64_t Register1, int64_t Register2); -  virtual void EmitCFIWindowSave(); - -  virtual void EmitWin64EHStartProc(const MCSymbol *Symbol); -  virtual void EmitWin64EHEndProc(); -  virtual void EmitWin64EHStartChained(); -  virtual void EmitWin64EHEndChained(); -  virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, -                                  bool Except); -  virtual void EmitWin64EHHandlerData(); -  virtual void EmitWin64EHPushReg(unsigned Register); -  virtual void EmitWin64EHSetFrame(unsigned Register, unsigned Offset); -  virtual void EmitWin64EHAllocStack(unsigned Size); -  virtual void EmitWin64EHSaveReg(unsigned Register, unsigned Offset); -  virtual void EmitWin64EHSaveXMM(unsigned Register, unsigned Offset); -  virtual void EmitWin64EHPushFrame(bool Code); -  virtual void EmitWin64EHEndProlog(); - -  virtual void EmitInstruction(const MCInst &Inst); - -  virtual void EmitBundleAlignMode(unsigned AlignPow2); -  virtual void EmitBundleLock(bool AlignToEnd); -  virtual void EmitBundleUnlock(); +  void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, +                             unsigned ByteAlignment) override; + +  void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = nullptr, +                    uint64_t Size = 0, unsigned ByteAlignment = 0) override; + +  void EmitTBSSSymbol (const MCSection *Section, MCSymbol *Symbol, +                       uint64_t Size, unsigned ByteAlignment = 0) override; + +  void EmitBytes(StringRef Data) override; + +  void EmitValueImpl(const MCExpr *Value, unsigned Size, +                     const SMLoc &Loc = SMLoc()) override; +  void EmitIntValue(uint64_t Value, unsigned Size) override; + +  void EmitULEB128Value(const MCExpr *Value) override; + +  void EmitSLEB128Value(const MCExpr *Value) override; + +  void EmitGPRel64Value(const MCExpr *Value) override; + +  void EmitGPRel32Value(const MCExpr *Value) override; + + +  void EmitFill(uint64_t NumBytes, uint8_t FillValue) override; + +  void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, +                            unsigned ValueSize = 1, +                            unsigned MaxBytesToEmit = 0) override; + +  void EmitCodeAlignment(unsigned ByteAlignment, +                         unsigned MaxBytesToEmit = 0) override; + +  bool EmitValueToOffset(const MCExpr *Offset, +                         unsigned char Value = 0) override; + +  void EmitFileDirective(StringRef Filename) override; +  unsigned EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, +                                  StringRef Filename, +                                  unsigned CUID = 0) override; +  void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, +                             unsigned Column, unsigned Flags, +                             unsigned Isa, unsigned Discriminator, +                             StringRef FileName) override; +  MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override; + +  void EmitIdent(StringRef IdentString) override; +  void EmitCFISections(bool EH, bool Debug) override; +  void EmitCFIDefCfa(int64_t Register, int64_t Offset) override; +  void EmitCFIDefCfaOffset(int64_t Offset) override; +  void EmitCFIDefCfaRegister(int64_t Register) override; +  void EmitCFIOffset(int64_t Register, int64_t Offset) override; +  void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) override; +  void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) override; +  void EmitCFIRememberState() override; +  void EmitCFIRestoreState() override; +  void EmitCFISameValue(int64_t Register) override; +  void EmitCFIRelOffset(int64_t Register, int64_t Offset) override; +  void EmitCFIAdjustCfaOffset(int64_t Adjustment) override; +  void EmitCFISignalFrame() override; +  void EmitCFIUndefined(int64_t Register) override; +  void EmitCFIRegister(int64_t Register1, int64_t Register2) override; +  void EmitCFIWindowSave() override; + +  void EmitWinCFIStartProc(const MCSymbol *Symbol) override; +  void EmitWinCFIEndProc() override; +  void EmitWinCFIStartChained() override; +  void EmitWinCFIEndChained() override; +  void EmitWinCFIPushReg(unsigned Register) override; +  void EmitWinCFISetFrame(unsigned Register, unsigned Offset) override; +  void EmitWinCFIAllocStack(unsigned Size) override; +  void EmitWinCFISaveReg(unsigned Register, unsigned Offset) override; +  void EmitWinCFISaveXMM(unsigned Register, unsigned Offset) override; +  void EmitWinCFIPushFrame(bool Code) override; +  void EmitWinCFIEndProlog() override; + +  void EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except) override; +  void EmitWinEHHandlerData() override; + +  void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; + +  void EmitBundleAlignMode(unsigned AlignPow2) override; +  void EmitBundleLock(bool AlignToEnd) override; +  void EmitBundleUnlock() override;    /// EmitRawText - If this file is backed by an assembly streamer, this dumps    /// the specified string in the output .s file.  This capability is    /// indicated by the hasRawTextSupport() predicate. -  virtual void EmitRawTextImpl(StringRef String); +  void EmitRawTextImpl(StringRef String) override; -  virtual void FinishImpl(); +  void FinishImpl() override;  };  } // end anonymous namespace. @@ -310,27 +291,19 @@ static inline int64_t truncateToSize(int64_t Value, unsigned Bytes) {    return Value & ((uint64_t) (int64_t) -1 >> (64 - Bytes * 8));  } +void MCAsmStreamer::emitRawComment(const Twine &T, bool TabPrefix) { +  if (TabPrefix) +    OS << '\t'; +  OS << MAI->getCommentString() << T; +  EmitEOL(); +} +  void MCAsmStreamer::ChangeSection(const MCSection *Section,                                    const MCExpr *Subsection) {    assert(Section && "Cannot switch to a null section!");    Section->PrintSwitchToSection(*MAI, OS, Subsection);  } -void MCAsmStreamer::EmitEHSymAttributes(const MCSymbol *Symbol, -                                        MCSymbol *EHSymbol) { -  if (UseCFI) -    return; - -  unsigned Flags = FlagMap.lookup(Symbol); - -  if (Flags & EHGlobal) -    EmitSymbolAttribute(EHSymbol, MCSA_Global); -  if (Flags & EHWeakDefinition) -    EmitSymbolAttribute(EHSymbol, MCSA_WeakDefinition); -  if (Flags & EHPrivateExtern) -    EmitSymbolAttribute(EHSymbol, MCSA_PrivateExtern); -} -  void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) {    assert(Symbol->isUndefined() && "Cannot define a symbol twice!");    MCStreamer::EmitLabel(Symbol); @@ -339,11 +312,24 @@ void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) {    EmitEOL();  } -void MCAsmStreamer::EmitDebugLabel(MCSymbol *Symbol) { -  assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); -  MCStreamer::EmitDebugLabel(Symbol); +void MCAsmStreamer::EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) { +  StringRef str = MCLOHIdToName(Kind); + +#ifndef NDEBUG +  int NbArgs = MCLOHIdToNbArgs(Kind); +  assert(NbArgs != -1 && ((size_t)NbArgs) == Args.size() && "Malformed LOH!"); +  assert(str != "" && "Invalid LOH name"); +#endif -  OS << *Symbol << MAI->getDebugLabelSuffix(); +  OS << "\t" << MCLOHDirectiveName() << " " << str << "\t"; +  bool IsFirst = true; +  for (MCLOHArgs::const_iterator It = Args.begin(), EndIt = Args.end(); +       It != EndIt; ++It) { +    if (!IsFirst) +      OS << ", "; +    IsFirst = false; +    OS << **It; +  }    EmitEOL();  } @@ -381,6 +367,18 @@ void MCAsmStreamer::EmitDataRegion(MCDataRegionType Kind) {    EmitEOL();  } +void MCAsmStreamer::EmitVersionMin(MCVersionMinType Kind, unsigned Major, +                                   unsigned Minor, unsigned Update) { +  switch (Kind) { +  case MCVM_IOSVersionMin:        OS << "\t.ios_version_min"; break; +  case MCVM_OSXVersionMin:        OS << "\t.macosx_version_min"; break; +  } +  OS << " " << Major << ", " << Minor; +  if (Update) +    OS << ", " << Update; +  EmitEOL(); +} +  void MCAsmStreamer::EmitThumbFunc(MCSymbol *Func) {    // This needs to emit to a temporary string to get properly quoted    // MCSymbols when they have spaces in them. @@ -395,8 +393,7 @@ void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {    OS << *Symbol << " = " << *Value;    EmitEOL(); -  // FIXME: Lift context changes into super class. -  Symbol->setVariableValue(Value); +  MCStreamer::EmitAssignment(Symbol, Value);  }  void MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { @@ -404,22 +401,6 @@ void MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {    EmitEOL();  } -void MCAsmStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta, -                                             const MCSymbol *LastLabel, -                                             const MCSymbol *Label, -                                             unsigned PointerSize) { -  EmitDwarfSetLineAddr(LineDelta, Label, PointerSize); -} - -void MCAsmStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, -                                              const MCSymbol *Label) { -  EmitIntValue(dwarf::DW_CFA_advance_loc4, 1); -  const MCExpr *AddrDelta = BuildSymbolDiff(getContext(), Label, LastLabel); -  AddrDelta = ForceExpAbs(AddrDelta); -  EmitValue(AddrDelta, 4); -} - -  bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,                                          MCSymbolAttr Attribute) {    switch (Attribute) { @@ -449,7 +430,6 @@ bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,      return true;    case MCSA_Global: // .globl/.global      OS << MAI->getGlobalDirective(); -    FlagMap[Symbol] |= EHGlobal;      break;    case MCSA_Hidden:         OS << "\t.hidden\t";          break;    case MCSA_IndirectSymbol: OS << "\t.indirect_symbol\t"; break; @@ -460,14 +440,12 @@ bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,    case MCSA_SymbolResolver: OS << "\t.symbol_resolver\t"; break;    case MCSA_PrivateExtern:      OS << "\t.private_extern\t"; -    FlagMap[Symbol] |= EHPrivateExtern;      break;    case MCSA_Protected:      OS << "\t.protected\t";       break;    case MCSA_Reference:      OS << "\t.reference\t";       break;    case MCSA_Weak:           OS << "\t.weak\t";            break;    case MCSA_WeakDefinition:      OS << "\t.weak_definition\t"; -    FlagMap[Symbol] |= EHWeakDefinition;      break;        // .weak_reference    case MCSA_WeakReference:  OS << MAI->getWeakRefDirective(); break; @@ -505,8 +483,13 @@ void MCAsmStreamer::EndCOFFSymbolDef() {    EmitEOL();  } +void MCAsmStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) { +  OS << "\t.secidx\t" << *Symbol; +  EmitEOL(); +} +  void MCAsmStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { -  OS << "\t.secrel32\t" << *Symbol << '\n'; +  OS << "\t.secrel32\t" << *Symbol;    EmitEOL();  } @@ -518,7 +501,7 @@ void MCAsmStreamer::EmitELFSize(MCSymbol *Symbol, const MCExpr *Value) {  void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,                                       unsigned ByteAlignment) {    // Common symbols do not belong to any actual section. -  AssignSection(Symbol, NULL); +  AssignSection(Symbol, nullptr);    OS << "\t.comm\t" << *Symbol << ',' << Size;    if (ByteAlignment != 0) { @@ -537,7 +520,7 @@ void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,  void MCAsmStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,                                            unsigned ByteAlign) {    // Common symbols do not belong to any actual section. -  AssignSection(Symbol, NULL); +  AssignSection(Symbol, nullptr);    OS << "\t.lcomm\t" << *Symbol << ',' << Size;    if (ByteAlign > 1) { @@ -568,7 +551,7 @@ void MCAsmStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol,    const MCSectionMachO *MOSection = ((const MCSectionMachO*)Section);    OS << MOSection->getSegmentName() << "," << MOSection->getSectionName(); -  if (Symbol != NULL) { +  if (Symbol) {      OS << ',' << *Symbol << ',' << Size;      if (ByteAlignment != 0)        OS << ',' << Log2_32(ByteAlignment); @@ -583,7 +566,7 @@ void MCAsmStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol,                                     uint64_t Size, unsigned ByteAlignment) {    AssignSection(Symbol, Section); -  assert(Symbol != NULL && "Symbol shouldn't be NULL!"); +  assert(Symbol && "Symbol shouldn't be NULL!");    // Instead of using the Section we'll just use the shortcut.    // This is a mach-o specific directive and section.    OS << ".tbss " << *Symbol << ", " << Size; @@ -660,28 +643,48 @@ void MCAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size) {    EmitValue(MCConstantExpr::Create(Value, getContext()), Size);  } -void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size) { +void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, +                                  const SMLoc &Loc) { +  assert(Size <= 8 && "Invalid size");    assert(getCurrentSection().first &&           "Cannot emit contents before setting section!"); -  const char *Directive = 0; +  const char *Directive = nullptr;    switch (Size) {    default: break;    case 1: Directive = MAI->getData8bitsDirective();  break;    case 2: Directive = MAI->getData16bitsDirective(); break;    case 4: Directive = MAI->getData32bitsDirective(); break; -  case 8: -    Directive = MAI->getData64bitsDirective(); -    // If the target doesn't support 64-bit data, emit as two 32-bit halves. -    if (Directive) break; +  case 8: Directive = MAI->getData64bitsDirective(); break; +  } + +  if (!Directive) {      int64_t IntValue;      if (!Value->EvaluateAsAbsolute(IntValue))        report_fatal_error("Don't know how to emit this value."); -    if (MAI->isLittleEndian()) { -      EmitIntValue((uint32_t)(IntValue >> 0 ), 4); -      EmitIntValue((uint32_t)(IntValue >> 32), 4); -    } else { -      EmitIntValue((uint32_t)(IntValue >> 32), 4); -      EmitIntValue((uint32_t)(IntValue >> 0 ), 4); + +    // We couldn't handle the requested integer size so we fallback by breaking +    // the request down into several, smaller, integers.  Since sizes greater +    // than eight are invalid and size equivalent to eight should have been +    // handled earlier, we use four bytes as our largest piece of granularity. +    bool IsLittleEndian = MAI->isLittleEndian(); +    for (unsigned Emitted = 0; Emitted != Size;) { +      unsigned Remaining = Size - Emitted; +      // The size of our partial emission must be a power of two less than +      // eight. +      unsigned EmissionSize = PowerOf2Floor(Remaining); +      if (EmissionSize > 4) +        EmissionSize = 4; +      // Calculate the byte offset of our partial emission taking into account +      // the endianness of the target. +      unsigned ByteOffset = +          IsLittleEndian ? Emitted : (Remaining - EmissionSize); +      uint64_t ValueToEmit = IntValue >> (ByteOffset * 8); +      // We truncate our partial emission to fit within the bounds of the +      // emission domain.  This produces nicer output and silences potential +      // truncation warnings when round tripping through another assembler. +      ValueToEmit &= ~0ULL >> (64 - EmissionSize * 8); +      EmitIntValue(ValueToEmit, EmissionSize); +      Emitted += EmissionSize;      }      return;    } @@ -714,13 +717,13 @@ void MCAsmStreamer::EmitSLEB128Value(const MCExpr *Value) {  }  void MCAsmStreamer::EmitGPRel64Value(const MCExpr *Value) { -  assert(MAI->getGPRel64Directive() != 0); +  assert(MAI->getGPRel64Directive() != nullptr);    OS << MAI->getGPRel64Directive() << *Value;    EmitEOL();  }  void MCAsmStreamer::EmitGPRel32Value(const MCExpr *Value) { -  assert(MAI->getGPRel32Directive() != 0); +  assert(MAI->getGPRel32Directive() != nullptr);    OS << MAI->getGPRel32Directive() << *Value;    EmitEOL();  } @@ -750,12 +753,19 @@ void MCAsmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,    // emit alignments as a power of two if possible.    if (isPowerOf2_32(ByteAlignment)) {      switch (ValueSize) { -    default: llvm_unreachable("Invalid size for machine code value!"); -    case 1: OS << MAI->getAlignDirective(); break; -    // FIXME: use MAI for this! -    case 2: OS << ".p2alignw "; break; -    case 4: OS << ".p2alignl "; break; -    case 8: llvm_unreachable("Unsupported alignment size!"); +    default: +      llvm_unreachable("Invalid size for machine code value!"); +    case 1: +      OS << "\t.align\t"; +      break; +    case 2: +      OS << ".p2alignw "; +      break; +    case 4: +      OS << ".p2alignl "; +      break; +    case 8: +      llvm_unreachable("Unsupported alignment size!");      }      if (MAI->getAlignmentIsInBytes()) @@ -814,30 +824,42 @@ void MCAsmStreamer::EmitFileDirective(StringRef Filename) {    EmitEOL();  } -bool MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Directory, -                                           StringRef Filename, unsigned CUID) { +unsigned MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, +                                               StringRef Directory, +                                               StringRef Filename, +                                               unsigned CUID) { +  assert(CUID == 0); + +  MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID); +  unsigned NumFiles = Table.getMCDwarfFiles().size(); +  FileNo = Table.getFile(Directory, Filename, FileNo); +  if (FileNo == 0) +    return 0; +  if (NumFiles == Table.getMCDwarfFiles().size()) +    return FileNo; + +  SmallString<128> FullPathName; +    if (!UseDwarfDirectory && !Directory.empty()) {      if (sys::path::is_absolute(Filename)) -      return EmitDwarfFileDirective(FileNo, "", Filename, CUID); - -    SmallString<128> FullPathName = Directory; -    sys::path::append(FullPathName, Filename); -    return EmitDwarfFileDirective(FileNo, "", FullPathName, CUID); +      Directory = ""; +    else { +      FullPathName = Directory; +      sys::path::append(FullPathName, Filename); +      Directory = ""; +      Filename = FullPathName; +    }    } -  if (UseLoc) { -    OS << "\t.file\t" << FileNo << ' '; -    if (!Directory.empty()) { -      PrintQuotedString(Directory, OS); -      OS << ' '; -    } -    PrintQuotedString(Filename, OS); -    EmitEOL(); -    // All .file will belong to a single CUID. -    CUID = 0; +  OS << "\t.file\t" << FileNo << ' '; +  if (!Directory.empty()) { +    PrintQuotedString(Directory, OS); +    OS << ' ';    } -  return this->MCStreamer::EmitDwarfFileDirective(FileNo, Directory, Filename, -                                                  CUID); +  PrintQuotedString(Filename, OS); +  EmitEOL(); + +  return FileNo;  }  void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, @@ -847,9 +869,6 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,                                            StringRef FileName) {    this->MCStreamer::EmitDwarfLocDirective(FileNo, Line, Column, Flags,                                            Isa, Discriminator, FileName); -  if (!UseLoc) -    return; -    OS << "\t.loc\t" << FileNo << " " << Line << " " << Column;    if (Flags & DWARF2_FLAG_BASIC_BLOCK)      OS << " basic_block"; @@ -869,9 +888,9 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,    }    if (Isa) -    OS << "isa " << Isa; +    OS << " isa " << Isa;    if (Discriminator) -    OS << "discriminator " << Discriminator; +    OS << " discriminator " << Discriminator;    if (IsVerboseAsm) {      OS.PadToColumn(MAI->getCommentColumn()); @@ -881,6 +900,12 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line,    EmitEOL();  } +MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(unsigned CUID) { +  // Always use the zeroth line table, since asm syntax only supports one line +  // table for now. +  return MCStreamer::getDwarfLineTableSymbol(0); +} +  void MCAsmStreamer::EmitIdent(StringRef IdentString) {    assert(MAI->hasIdentDirective() && ".ident directive not supported");    OS << "\t.ident\t"; @@ -890,10 +915,6 @@ void MCAsmStreamer::EmitIdent(StringRef IdentString) {  void MCAsmStreamer::EmitCFISections(bool EH, bool Debug) {    MCStreamer::EmitCFISections(EH, Debug); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_sections ";    if (EH) {      OS << ".eh_frame"; @@ -907,25 +928,14 @@ void MCAsmStreamer::EmitCFISections(bool EH, bool Debug) {  }  void MCAsmStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { -  if (!UseCFI) { -    RecordProcStart(Frame); -    return; -  } -    OS << "\t.cfi_startproc"; +  if (Frame.IsSimple) +    OS << " simple";    EmitEOL();  }  void MCAsmStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) { -  if (!UseCFI) { -    RecordProcEnd(Frame); -    return; -  } - -  // Put a dummy non-null value in Frame.End to mark that this frame has been -  // closed. -  Frame.End = (MCSymbol *) 1; - +  MCStreamer::EmitCFIEndProcImpl(Frame);    OS << "\t.cfi_endproc";    EmitEOL();  } @@ -942,10 +952,6 @@ void MCAsmStreamer::EmitRegisterName(int64_t Register) {  void MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {    MCStreamer::EmitCFIDefCfa(Register, Offset); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_def_cfa ";    EmitRegisterName(Register);    OS << ", " << Offset; @@ -954,20 +960,12 @@ void MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) {  void MCAsmStreamer::EmitCFIDefCfaOffset(int64_t Offset) {    MCStreamer::EmitCFIDefCfaOffset(Offset); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_def_cfa_offset " << Offset;    EmitEOL();  }  void MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) {    MCStreamer::EmitCFIDefCfaRegister(Register); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_def_cfa_register ";    EmitRegisterName(Register);    EmitEOL(); @@ -975,10 +973,6 @@ void MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) {  void MCAsmStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {    this->MCStreamer::EmitCFIOffset(Register, Offset); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_offset ";    EmitRegisterName(Register);    OS << ", " << Offset; @@ -988,50 +982,30 @@ void MCAsmStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) {  void MCAsmStreamer::EmitCFIPersonality(const MCSymbol *Sym,                                         unsigned Encoding) {    MCStreamer::EmitCFIPersonality(Sym, Encoding); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_personality " << Encoding << ", " << *Sym;    EmitEOL();  }  void MCAsmStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {    MCStreamer::EmitCFILsda(Sym, Encoding); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_lsda " << Encoding << ", " << *Sym;    EmitEOL();  }  void MCAsmStreamer::EmitCFIRememberState() {    MCStreamer::EmitCFIRememberState(); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_remember_state";    EmitEOL();  }  void MCAsmStreamer::EmitCFIRestoreState() {    MCStreamer::EmitCFIRestoreState(); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_restore_state";    EmitEOL();  }  void MCAsmStreamer::EmitCFISameValue(int64_t Register) {    MCStreamer::EmitCFISameValue(Register); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_same_value ";    EmitRegisterName(Register);    EmitEOL(); @@ -1039,10 +1013,6 @@ void MCAsmStreamer::EmitCFISameValue(int64_t Register) {  void MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {    MCStreamer::EmitCFIRelOffset(Register, Offset); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_rel_offset ";    EmitRegisterName(Register);    OS << ", " << Offset; @@ -1051,85 +1021,65 @@ void MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) {  void MCAsmStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {    MCStreamer::EmitCFIAdjustCfaOffset(Adjustment); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_adjust_cfa_offset " << Adjustment;    EmitEOL();  }  void MCAsmStreamer::EmitCFISignalFrame() {    MCStreamer::EmitCFISignalFrame(); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_signal_frame";    EmitEOL();  }  void MCAsmStreamer::EmitCFIUndefined(int64_t Register) {    MCStreamer::EmitCFIUndefined(Register); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_undefined " << Register;    EmitEOL();  }  void MCAsmStreamer::EmitCFIRegister(int64_t Register1, int64_t Register2) {    MCStreamer::EmitCFIRegister(Register1, Register2); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_register " << Register1 << ", " << Register2;    EmitEOL();  }  void MCAsmStreamer::EmitCFIWindowSave() {    MCStreamer::EmitCFIWindowSave(); - -  if (!UseCFI) -    return; -    OS << "\t.cfi_window_save";    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHStartProc(const MCSymbol *Symbol) { -  MCStreamer::EmitWin64EHStartProc(Symbol); +void MCAsmStreamer::EmitWinCFIStartProc(const MCSymbol *Symbol) { +  MCStreamer::EmitWinCFIStartProc(Symbol);    OS << ".seh_proc " << *Symbol;    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHEndProc() { -  MCStreamer::EmitWin64EHEndProc(); +void MCAsmStreamer::EmitWinCFIEndProc() { +  MCStreamer::EmitWinCFIEndProc();    OS << "\t.seh_endproc";    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHStartChained() { -  MCStreamer::EmitWin64EHStartChained(); +void MCAsmStreamer::EmitWinCFIStartChained() { +  MCStreamer::EmitWinCFIStartChained();    OS << "\t.seh_startchained";    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHEndChained() { -  MCStreamer::EmitWin64EHEndChained(); +void MCAsmStreamer::EmitWinCFIEndChained() { +  MCStreamer::EmitWinCFIEndChained();    OS << "\t.seh_endchained";    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, -                                       bool Except) { -  MCStreamer::EmitWin64EHHandler(Sym, Unwind, Except); +void MCAsmStreamer::EmitWinEHHandler(const MCSymbol *Sym, bool Unwind, +                                      bool Except) { +  MCStreamer::EmitWinEHHandler(Sym, Unwind, Except);    OS << "\t.seh_handler " << *Sym;    if (Unwind) @@ -1152,14 +1102,14 @@ static const MCSection *getWin64EHTableSection(StringRef suffix,                                  SectionKind::getDataRel());  } -void MCAsmStreamer::EmitWin64EHHandlerData() { -  MCStreamer::EmitWin64EHHandlerData(); +void MCAsmStreamer::EmitWinEHHandlerData() { +  MCStreamer::EmitWinEHHandlerData();    // Switch sections. Don't call SwitchSection directly, because that will    // cause the section switch to be visible in the emitted assembly.    // We only do this so the section switch that terminates the handler    // data block is visible. -  MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo(); +  MCWinFrameInfo *CurFrame = getCurrentWinFrameInfo();    StringRef suffix=MCWin64EHUnwindEmitter::GetSectionSuffix(CurFrame->Function);    const MCSection *xdataSect = getWin64EHTableSection(suffix, getContext());    if (xdataSect) @@ -1169,43 +1119,43 @@ void MCAsmStreamer::EmitWin64EHHandlerData() {    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHPushReg(unsigned Register) { -  MCStreamer::EmitWin64EHPushReg(Register); +void MCAsmStreamer::EmitWinCFIPushReg(unsigned Register) { +  MCStreamer::EmitWinCFIPushReg(Register);    OS << "\t.seh_pushreg " << Register;    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHSetFrame(unsigned Register, unsigned Offset) { -  MCStreamer::EmitWin64EHSetFrame(Register, Offset); +void MCAsmStreamer::EmitWinCFISetFrame(unsigned Register, unsigned Offset) { +  MCStreamer::EmitWinCFISetFrame(Register, Offset);    OS << "\t.seh_setframe " << Register << ", " << Offset;    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHAllocStack(unsigned Size) { -  MCStreamer::EmitWin64EHAllocStack(Size); +void MCAsmStreamer::EmitWinCFIAllocStack(unsigned Size) { +  MCStreamer::EmitWinCFIAllocStack(Size);    OS << "\t.seh_stackalloc " << Size;    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHSaveReg(unsigned Register, unsigned Offset) { -  MCStreamer::EmitWin64EHSaveReg(Register, Offset); +void MCAsmStreamer::EmitWinCFISaveReg(unsigned Register, unsigned Offset) { +  MCStreamer::EmitWinCFISaveReg(Register, Offset);    OS << "\t.seh_savereg " << Register << ", " << Offset;    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHSaveXMM(unsigned Register, unsigned Offset) { -  MCStreamer::EmitWin64EHSaveXMM(Register, Offset); +void MCAsmStreamer::EmitWinCFISaveXMM(unsigned Register, unsigned Offset) { +  MCStreamer::EmitWinCFISaveXMM(Register, Offset);    OS << "\t.seh_savexmm " << Register << ", " << Offset;    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHPushFrame(bool Code) { -  MCStreamer::EmitWin64EHPushFrame(Code); +void MCAsmStreamer::EmitWinCFIPushFrame(bool Code) { +  MCStreamer::EmitWinCFIPushFrame(Code);    OS << "\t.seh_pushframe";    if (Code) @@ -1213,19 +1163,20 @@ void MCAsmStreamer::EmitWin64EHPushFrame(bool Code) {    EmitEOL();  } -void MCAsmStreamer::EmitWin64EHEndProlog(void) { -  MCStreamer::EmitWin64EHEndProlog(); +void MCAsmStreamer::EmitWinCFIEndProlog(void) { +  MCStreamer::EmitWinCFIEndProlog();    OS << "\t.seh_endprologue";    EmitEOL();  } -void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) { +void MCAsmStreamer::AddEncodingComment(const MCInst &Inst, +                                       const MCSubtargetInfo &STI) {    raw_ostream &OS = GetCommentOS();    SmallString<256> Code;    SmallVector<MCFixup, 4> Fixups;    raw_svector_ostream VecOS(Code); -  Emitter->EncodeInstruction(Inst, VecOS, Fixups); +  Emitter->EncodeInstruction(Inst, VecOS, Fixups, STI);    VecOS.flush();    // If we are showing fixups, create symbolic markers in the encoded @@ -1304,13 +1255,13 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {    }  } -void MCAsmStreamer::EmitInstruction(const MCInst &Inst) { +void MCAsmStreamer::EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) {    assert(getCurrentSection().first &&           "Cannot emit contents before setting section!");    // Show the encoding in a comment if we have a code emitter.    if (Emitter) -    AddEncodingComment(Inst); +    AddEncodingComment(Inst, STI);    // Show the MCInst if enabled.    if (ShowInst) { @@ -1354,27 +1305,28 @@ void MCAsmStreamer::EmitRawTextImpl(StringRef String) {  }  void MCAsmStreamer::FinishImpl() { -  // FIXME: This header is duplicated with MCObjectStreamer -  // Dump out the dwarf file & directory tables and line tables. -  const MCSymbol *LineSectionSymbol = NULL; -  if (getContext().hasDwarfFiles() && !UseLoc) -    LineSectionSymbol = MCDwarfFileTable::Emit(this); -    // If we are generating dwarf for assembly source files dump out the sections.    if (getContext().getGenDwarfForAssembly()) -    MCGenDwarfInfo::Emit(this, LineSectionSymbol); - -  if (!UseCFI) -    EmitFrames(AsmBackend.get(), false); +    MCGenDwarfInfo::Emit(this); + +  // Emit the label for the line table, if requested - since the rest of the +  // line table will be defined by .loc/.file directives, and not emitted +  // directly, the label is the only work required here. +  auto &Tables = getContext().getMCDwarfLineTables(); +  if (!Tables.empty()) { +    assert(Tables.size() == 1 && "asm output only supports one line table"); +    if (auto *Label = Tables.begin()->second.getLabel()) { +      SwitchSection(getContext().getObjectFileInfo()->getDwarfLineSection()); +      EmitLabel(Label); +    } +  }  }  MCStreamer *llvm::createAsmStreamer(MCContext &Context, -                                    MCTargetStreamer *TargetStreamer,                                      formatted_raw_ostream &OS, -                                    bool isVerboseAsm, bool useLoc, bool useCFI, -                                    bool useDwarfDirectory, MCInstPrinter *IP, -                                    MCCodeEmitter *CE, MCAsmBackend *MAB, -                                    bool ShowInst) { -  return new MCAsmStreamer(Context, TargetStreamer, OS, isVerboseAsm, useLoc, -                           useCFI, useDwarfDirectory, IP, CE, MAB, ShowInst); +                                    bool isVerboseAsm, bool useDwarfDirectory, +                                    MCInstPrinter *IP, MCCodeEmitter *CE, +                                    MCAsmBackend *MAB, bool ShowInst) { +  return new MCAsmStreamer(Context, OS, isVerboseAsm, useDwarfDirectory, IP, CE, +                           MAB, ShowInst);  }  | 
