diff options
Diffstat (limited to 'llvm/lib/MC/MCAsmStreamer.cpp')
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 535 |
1 files changed, 317 insertions, 218 deletions
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 5d369503995b3..6a8572e57922c 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -28,6 +28,7 @@ #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCSectionMachO.h" #include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbolXCOFF.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Format.h" #include "llvm/Support/FormattedStream.h" @@ -58,8 +59,8 @@ class MCAsmStreamer final : public MCStreamer { unsigned UseDwarfDirectory : 1; void EmitRegisterName(int64_t Register); - void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; - void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override; + void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; + void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override; public: MCAsmStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os, @@ -79,6 +80,8 @@ public: InstPrinter->setCommentStream(CommentStream); if (Assembler->getBackendPtr()) setAllowAutoPadding(Assembler->getBackend().allowAutoPadding()); + + Context.setUseNamesOnTempLabels(true); } MCAssembler &getAssembler() { return *Assembler; } @@ -95,7 +98,7 @@ public: EmitCommentsAndEOL(); } - void EmitSyntaxDirective() override; + void emitSyntaxDirective() override; void EmitCommentsAndEOL(); @@ -135,28 +138,28 @@ public: /// @name MCStreamer Interface /// @{ - void ChangeSection(MCSection *Section, const MCExpr *Subsection) override; + void changeSection(MCSection *Section, const MCExpr *Subsection) override; void emitELFSymverDirective(StringRef AliasName, const MCSymbol *Aliasee) override; - void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override; - void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; + void emitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override; + void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) 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, + 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, VersionTuple SDKVersion) override; - void EmitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, + void emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion) override; - void EmitThumbFunc(MCSymbol *Func) 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 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 emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; void BeginCOFFSymbolDef(const MCSymbol *Symbol) override; void EmitCOFFSymbolStorageClass(int StorageClass) override; void EmitCOFFSymbolType(int Type) override; @@ -166,11 +169,17 @@ public: void EmitCOFFSectionIndex(MCSymbol const *Symbol) override; void EmitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) override; void EmitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) override; - void EmitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size, + void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size, MCSymbol *CsectSym, unsigned ByteAlign) override; + void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol, + MCSymbolAttr Linakge, + MCSymbolAttr Visibility) override; + void emitXCOFFRenameDirective(const MCSymbol *Name, + StringRef Rename) override; + void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override; - void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, + void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override; /// Emit a local common (.lcomm) symbol. @@ -178,37 +187,38 @@ public: /// @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. - void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, + void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override; - void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr, + void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr, uint64_t Size = 0, unsigned ByteAlignment = 0, SMLoc Loc = SMLoc()) override; - void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, + void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment = 0) override; - void EmitBinaryData(StringRef Data) override; + void emitBinaryData(StringRef Data) override; - void EmitBytes(StringRef Data) override; + void emitBytes(StringRef Data) override; - void EmitValueImpl(const MCExpr *Value, unsigned Size, + void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc = SMLoc()) override; - void EmitIntValue(uint64_t Value, unsigned Size) override; - void EmitIntValueInHex(uint64_t Value, unsigned Size) override; + void emitIntValue(uint64_t Value, unsigned Size) override; + void emitIntValueInHex(uint64_t Value, unsigned Size) override; + void emitIntValueInHexWithPadding(uint64_t Value, unsigned Size) override; - void EmitULEB128Value(const MCExpr *Value) override; + void emitULEB128Value(const MCExpr *Value) override; - void EmitSLEB128Value(const MCExpr *Value) override; + void emitSLEB128Value(const MCExpr *Value) override; - void EmitDTPRel32Value(const MCExpr *Value) override; - void EmitDTPRel64Value(const MCExpr *Value) override; - void EmitTPRel32Value(const MCExpr *Value) override; - void EmitTPRel64Value(const MCExpr *Value) override; + void emitDTPRel32Value(const MCExpr *Value) override; + void emitDTPRel64Value(const MCExpr *Value) override; + void emitTPRel32Value(const MCExpr *Value) override; + void emitTPRel64Value(const MCExpr *Value) override; - void EmitGPRel64Value(const MCExpr *Value) override; + void emitGPRel64Value(const MCExpr *Value) override; - void EmitGPRel32Value(const MCExpr *Value) override; + void emitGPRel32Value(const MCExpr *Value) override; void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc = SMLoc()) override; @@ -216,18 +226,18 @@ public: void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr, SMLoc Loc = SMLoc()) override; - void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, + void emitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, unsigned ValueSize = 1, unsigned MaxBytesToEmit = 0) override; - void EmitCodeAlignment(unsigned ByteAlignment, + void emitCodeAlignment(unsigned ByteAlignment, unsigned MaxBytesToEmit = 0) override; void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc) override; - void EmitFileDirective(StringRef Filename) override; + void emitFileDirective(StringRef Filename) override; Expected<unsigned> tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, @@ -238,9 +248,9 @@ public: Optional<MD5::MD5Result> Checksum, Optional<StringRef> Source, unsigned CUID = 0) override; - void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, - unsigned Column, unsigned Flags, - unsigned Isa, unsigned Discriminator, + void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, + unsigned Flags, unsigned Isa, + unsigned Discriminator, StringRef FileName) override; MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override; @@ -251,12 +261,12 @@ public: bool EmitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc, unsigned IAFile, unsigned IALine, unsigned IACol, SMLoc Loc) override; - void EmitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, + void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc) override; - void EmitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, + void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd) override; - void EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId, + void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, @@ -265,50 +275,50 @@ public: void PrintCVDefRangePrefix( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges); - void EmitCVDefRangeDirective( + void emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeRegisterRelHeader DRHdr) override; - void EmitCVDefRangeDirective( + void emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeSubfieldRegisterHeader DRHdr) override; - void EmitCVDefRangeDirective( + void emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeRegisterHeader DRHdr) override; - void EmitCVDefRangeDirective( + void emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeFramePointerRelHeader DRHdr) override; - void EmitCVStringTableDirective() override; - void EmitCVFileChecksumsDirective() override; - void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override; + void emitCVStringTableDirective() override; + void emitCVFileChecksumsDirective() override; + void emitCVFileChecksumOffsetDirective(unsigned FileNo) override; void EmitCVFPOData(const MCSymbol *ProcSym, SMLoc L) override; - void EmitIdent(StringRef IdentString) override; - void EmitCFIBKeyFrame() 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 EmitCFIRestore(int64_t Register) override; - void EmitCFISameValue(int64_t Register) override; - void EmitCFIRelOffset(int64_t Register, int64_t Offset) override; - void EmitCFIAdjustCfaOffset(int64_t Adjustment) override; - void EmitCFIEscape(StringRef Values) override; - void EmitCFIGnuArgsSize(int64_t Size) override; - void EmitCFISignalFrame() override; - void EmitCFIUndefined(int64_t Register) override; - void EmitCFIRegister(int64_t Register1, int64_t Register2) override; - void EmitCFIWindowSave() override; - void EmitCFINegateRAState() override; - void EmitCFIReturnColumn(int64_t Register) override; + void emitIdent(StringRef IdentString) override; + void emitCFIBKeyFrame() 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 emitCFIRestore(int64_t Register) override; + void emitCFISameValue(int64_t Register) override; + void emitCFIRelOffset(int64_t Register, int64_t Offset) override; + void emitCFIAdjustCfaOffset(int64_t Adjustment) override; + void emitCFIEscape(StringRef Values) override; + void emitCFIGnuArgsSize(int64_t Size) override; + void emitCFISignalFrame() override; + void emitCFIUndefined(int64_t Register) override; + void emitCFIRegister(int64_t Register1, int64_t Register2) override; + void emitCFIWindowSave() override; + void emitCFINegateRAState() override; + void emitCFIReturnColumn(int64_t Register) override; void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) override; void EmitWinCFIEndProc(SMLoc Loc) override; @@ -333,25 +343,25 @@ public: void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count) override; - void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; + void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; - void EmitBundleAlignMode(unsigned AlignPow2) override; - void EmitBundleLock(bool AlignToEnd) override; - void EmitBundleUnlock() override; + void emitBundleAlignMode(unsigned AlignPow2) override; + void emitBundleLock(bool AlignToEnd) override; + void emitBundleUnlock() override; - bool EmitRelocDirective(const MCExpr &Offset, StringRef Name, - const MCExpr *Expr, SMLoc Loc, - const MCSubtargetInfo &STI) override; + Optional<std::pair<bool, std::string>> + emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, + SMLoc Loc, const MCSubtargetInfo &STI) override; - void EmitAddrsig() override; - void EmitAddrsigSym(const MCSymbol *Sym) override; + void emitAddrsig() override; + void emitAddrsigSym(const MCSymbol *Sym) override; /// 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. - void EmitRawTextImpl(StringRef String) override; + void emitRawTextImpl(StringRef String) override; - void FinishImpl() override; + void finishImpl() override; }; } // end anonymous namespace. @@ -443,7 +453,7 @@ void MCAsmStreamer::emitExplicitComments() { ExplicitCommentToEmit.clear(); } -void MCAsmStreamer::ChangeSection(MCSection *Section, +void MCAsmStreamer::changeSection(MCSection *Section, const MCExpr *Subsection) { assert(Section && "Cannot switch to a null section!"); if (MCTargetStreamer *TS = getTargetStreamer()) { @@ -463,8 +473,8 @@ void MCAsmStreamer::emitELFSymverDirective(StringRef AliasName, EmitEOL(); } -void MCAsmStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) { - MCStreamer::EmitLabel(Symbol, Loc); +void MCAsmStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) { + MCStreamer::emitLabel(Symbol, Loc); Symbol->print(OS, MAI); OS << MAI->getLabelSuffix(); @@ -472,7 +482,7 @@ void MCAsmStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) { EmitEOL(); } -void MCAsmStreamer::EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) { +void MCAsmStreamer::emitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) { StringRef str = MCLOHIdToName(Kind); #ifndef NDEBUG @@ -492,7 +502,7 @@ void MCAsmStreamer::EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) { EmitEOL(); } -void MCAsmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { +void MCAsmStreamer::emitAssemblerFlag(MCAssemblerFlag Flag) { switch (Flag) { case MCAF_SyntaxUnified: OS << "\t.syntax unified"; break; case MCAF_SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break; @@ -503,7 +513,7 @@ void MCAsmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { EmitEOL(); } -void MCAsmStreamer::EmitLinkerOptions(ArrayRef<std::string> Options) { +void MCAsmStreamer::emitLinkerOptions(ArrayRef<std::string> Options) { assert(!Options.empty() && "At least one option is required!"); OS << "\t.linker_option \"" << Options[0] << '"'; for (ArrayRef<std::string>::iterator it = Options.begin() + 1, @@ -513,7 +523,7 @@ void MCAsmStreamer::EmitLinkerOptions(ArrayRef<std::string> Options) { EmitEOL(); } -void MCAsmStreamer::EmitDataRegion(MCDataRegionType Kind) { +void MCAsmStreamer::emitDataRegion(MCDataRegionType Kind) { if (!MAI->doesSupportDataRegionDirectives()) return; switch (Kind) { @@ -549,7 +559,7 @@ static void EmitSDKVersionSuffix(raw_ostream &OS, } } -void MCAsmStreamer::EmitVersionMin(MCVersionMinType Type, unsigned Major, +void MCAsmStreamer::emitVersionMin(MCVersionMinType Type, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion) { OS << '\t' << getVersionMinDirective(Type) << ' ' << Major << ", " << Minor; @@ -574,7 +584,7 @@ static const char *getPlatformName(MachO::PlatformType Type) { llvm_unreachable("Invalid Mach-O platform type"); } -void MCAsmStreamer::EmitBuildVersion(unsigned Platform, unsigned Major, +void MCAsmStreamer::emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion) { const char *PlatformName = getPlatformName((MachO::PlatformType)Platform); @@ -585,7 +595,7 @@ void MCAsmStreamer::EmitBuildVersion(unsigned Platform, unsigned Major, EmitEOL(); } -void MCAsmStreamer::EmitThumbFunc(MCSymbol *Func) { +void MCAsmStreamer::emitThumbFunc(MCSymbol *Func) { // This needs to emit to a temporary string to get properly quoted // MCSymbols when they have spaces in them. OS << "\t.thumb_func"; @@ -597,7 +607,7 @@ void MCAsmStreamer::EmitThumbFunc(MCSymbol *Func) { EmitEOL(); } -void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { +void MCAsmStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) { // Do not emit a .set on inlined target assignments. bool EmitSet = true; if (auto *E = dyn_cast<MCTargetExpr>(Value)) @@ -612,10 +622,10 @@ void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { EmitEOL(); } - MCStreamer::EmitAssignment(Symbol, Value); + MCStreamer::emitAssignment(Symbol, Value); } -void MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { +void MCAsmStreamer::emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { OS << ".weakref "; Alias->print(OS, MAI); OS << ", "; @@ -623,7 +633,7 @@ void MCAsmStreamer::EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) { EmitEOL(); } -bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, +bool MCAsmStreamer::emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) { switch (Attribute) { case MCSA_Invalid: llvm_unreachable("Invalid symbol attribute"); @@ -672,6 +682,9 @@ bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, break; case MCSA_Protected: OS << "\t.protected\t"; break; case MCSA_Reference: OS << "\t.reference\t"; break; + case MCSA_Extern: + OS << "\t.extern\t"; + break; case MCSA_Weak: OS << MAI->getWeakDirective(); break; case MCSA_WeakDefinition: OS << "\t.weak_definition\t"; @@ -690,14 +703,14 @@ bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, return true; } -void MCAsmStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { +void MCAsmStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { OS << ".desc" << ' '; Symbol->print(OS, MAI); OS << ',' << DescValue; EmitEOL(); } -void MCAsmStreamer::EmitSyntaxDirective() { +void MCAsmStreamer::emitSyntaxDirective() { if (MAI->getAssemblerDialect() == 1) { OS << "\t.intel_syntax noprefix"; EmitEOL(); @@ -768,7 +781,7 @@ void MCAsmStreamer::EmitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) { // We need an XCOFF-specific version of this directive as the AIX syntax // requires a QualName argument identifying the csect name and storage mapping // class to appear before the alignment if we are specifying it. -void MCAsmStreamer::EmitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, +void MCAsmStreamer::emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size, MCSymbol *CsectSym, unsigned ByteAlignment) { @@ -785,6 +798,65 @@ void MCAsmStreamer::EmitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, EmitEOL(); } +void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility( + MCSymbol *Symbol, MCSymbolAttr Linkage, MCSymbolAttr Visibility) { + // Print symbol's rename (original name contains invalid character(s)) if + // there is one. + if (cast<MCSymbolXCOFF>(Symbol)->hasRename()) + emitXCOFFRenameDirective(Symbol, + cast<MCSymbolXCOFF>(Symbol)->getSymbolTableName()); + + switch (Linkage) { + case MCSA_Global: + OS << MAI->getGlobalDirective(); + break; + case MCSA_Weak: + OS << MAI->getWeakDirective(); + break; + case MCSA_Extern: + OS << "\t.extern\t"; + break; + case MCSA_LGlobal: + OS << "\t.lglobl\t"; + break; + default: + report_fatal_error("unhandled linkage type"); + } + + Symbol->print(OS, MAI); + + switch (Visibility) { + case MCSA_Invalid: + // Nothing to do. + break; + case MCSA_Hidden: + OS << ",hidden"; + break; + case MCSA_Protected: + OS << ",protected"; + break; + default: + report_fatal_error("unexpected value for Visibility type"); + } + EmitEOL(); +} + +void MCAsmStreamer::emitXCOFFRenameDirective(const MCSymbol *Name, + StringRef Rename) { + OS << "\t.rename\t"; + Name->print(OS, MAI); + const char DQ = '"'; + OS << ',' << DQ; + for (char C : Rename) { + // To escape a double quote character, the character should be doubled. + if (C == DQ) + OS << DQ; + OS << C; + } + OS << DQ; + EmitEOL(); +} + void MCAsmStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) { assert(MAI->hasDotTypeDotSizeDirective()); OS << "\t.size\t"; @@ -794,8 +866,14 @@ void MCAsmStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) { EmitEOL(); } -void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, +void MCAsmStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) { + // Print symbol's rename (original name contains invalid character(s)) if + // there is one. + MCSymbolXCOFF *XSym = dyn_cast<MCSymbolXCOFF>(Symbol); + if (XSym && XSym->hasRename()) + emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName()); + OS << "\t.comm\t"; Symbol->print(OS, MAI); OS << ',' << Size; @@ -809,7 +887,7 @@ void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, EmitEOL(); } -void MCAsmStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, +void MCAsmStreamer::emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlign) { OS << "\t.lcomm\t"; Symbol->print(OS, MAI); @@ -831,7 +909,7 @@ void MCAsmStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, EmitEOL(); } -void MCAsmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, +void MCAsmStreamer::emitZerofill(MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment, SMLoc Loc) { if (Symbol) @@ -845,7 +923,7 @@ void MCAsmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, // This is a mach-o specific directive. const MCSectionMachO *MOSection = ((const MCSectionMachO*)Section); - OS << MOSection->getSegmentName() << "," << MOSection->getSectionName(); + OS << MOSection->getSegmentName() << "," << MOSection->getName(); if (Symbol) { OS << ','; @@ -860,7 +938,7 @@ void MCAsmStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, // .tbss sym, size, align // This depends that the symbol has already been mangled from the original, // e.g. _a. -void MCAsmStreamer::EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, +void MCAsmStreamer::emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) { AssignFragment(Symbol, &Section->getDummyFragment()); @@ -917,7 +995,7 @@ static void PrintQuotedString(StringRef Data, raw_ostream &OS) { OS << '"'; } -void MCAsmStreamer::EmitBytes(StringRef Data) { +void MCAsmStreamer::emitBytes(StringRef Data) { assert(getCurrentSectionOnly() && "Cannot emit contents before setting section!"); if (Data.empty()) return; @@ -951,7 +1029,7 @@ void MCAsmStreamer::EmitBytes(StringRef Data) { EmitEOL(); } -void MCAsmStreamer::EmitBinaryData(StringRef Data) { +void MCAsmStreamer::emitBinaryData(StringRef Data) { // This is binary data. Print it in a grid of hex bytes for readability. const size_t Cols = 4; for (size_t I = 0, EI = alignTo(Data.size(), Cols); I < EI; I += Cols) { @@ -965,15 +1043,20 @@ void MCAsmStreamer::EmitBinaryData(StringRef Data) { } } -void MCAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size) { - EmitValue(MCConstantExpr::create(Value, getContext()), Size); +void MCAsmStreamer::emitIntValue(uint64_t Value, unsigned Size) { + emitValue(MCConstantExpr::create(Value, getContext()), Size); +} + +void MCAsmStreamer::emitIntValueInHex(uint64_t Value, unsigned Size) { + emitValue(MCConstantExpr::create(Value, getContext(), true), Size); } -void MCAsmStreamer::EmitIntValueInHex(uint64_t Value, unsigned Size) { - EmitValue(MCConstantExpr::create(Value, getContext(), true), Size); +void MCAsmStreamer::emitIntValueInHexWithPadding(uint64_t Value, + unsigned Size) { + emitValue(MCConstantExpr::create(Value, getContext(), true, Size), Size); } -void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, +void MCAsmStreamer::emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) { assert(Size <= 8 && "Invalid size"); assert(getCurrentSectionOnly() && @@ -1015,7 +1098,7 @@ void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, std::numeric_limits<unsigned long long>::digits) && "undefined behavior"); ValueToEmit &= ~0ULL >> Shift; - EmitIntValue(ValueToEmit, EmissionSize); + emitIntValue(ValueToEmit, EmissionSize); Emitted += EmissionSize; } return; @@ -1031,10 +1114,10 @@ void MCAsmStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, } } -void MCAsmStreamer::EmitULEB128Value(const MCExpr *Value) { +void MCAsmStreamer::emitULEB128Value(const MCExpr *Value) { int64_t IntValue; if (Value->evaluateAsAbsolute(IntValue)) { - EmitULEB128IntValue(IntValue); + emitULEB128IntValue(IntValue); return; } OS << "\t.uleb128 "; @@ -1042,10 +1125,10 @@ void MCAsmStreamer::EmitULEB128Value(const MCExpr *Value) { EmitEOL(); } -void MCAsmStreamer::EmitSLEB128Value(const MCExpr *Value) { +void MCAsmStreamer::emitSLEB128Value(const MCExpr *Value) { int64_t IntValue; if (Value->evaluateAsAbsolute(IntValue)) { - EmitSLEB128IntValue(IntValue); + emitSLEB128IntValue(IntValue); return; } OS << "\t.sleb128 "; @@ -1053,42 +1136,42 @@ void MCAsmStreamer::EmitSLEB128Value(const MCExpr *Value) { EmitEOL(); } -void MCAsmStreamer::EmitDTPRel64Value(const MCExpr *Value) { +void MCAsmStreamer::emitDTPRel64Value(const MCExpr *Value) { assert(MAI->getDTPRel64Directive() != nullptr); OS << MAI->getDTPRel64Directive(); Value->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::EmitDTPRel32Value(const MCExpr *Value) { +void MCAsmStreamer::emitDTPRel32Value(const MCExpr *Value) { assert(MAI->getDTPRel32Directive() != nullptr); OS << MAI->getDTPRel32Directive(); Value->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::EmitTPRel64Value(const MCExpr *Value) { +void MCAsmStreamer::emitTPRel64Value(const MCExpr *Value) { assert(MAI->getTPRel64Directive() != nullptr); OS << MAI->getTPRel64Directive(); Value->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::EmitTPRel32Value(const MCExpr *Value) { +void MCAsmStreamer::emitTPRel32Value(const MCExpr *Value) { assert(MAI->getTPRel32Directive() != nullptr); OS << MAI->getTPRel32Directive(); Value->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::EmitGPRel64Value(const MCExpr *Value) { +void MCAsmStreamer::emitGPRel64Value(const MCExpr *Value) { assert(MAI->getGPRel64Directive() != nullptr); OS << MAI->getGPRel64Directive(); Value->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::EmitGPRel32Value(const MCExpr *Value) { +void MCAsmStreamer::emitGPRel32Value(const MCExpr *Value) { assert(MAI->getGPRel32Directive() != nullptr); OS << MAI->getGPRel32Directive(); Value->print(OS, MAI); @@ -1098,16 +1181,27 @@ void MCAsmStreamer::EmitGPRel32Value(const MCExpr *Value) { void MCAsmStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc) { int64_t IntNumBytes; - if (NumBytes.evaluateAsAbsolute(IntNumBytes) && IntNumBytes == 0) + const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes); + if (IsAbsolute && IntNumBytes == 0) return; if (const char *ZeroDirective = MAI->getZeroDirective()) { - // FIXME: Emit location directives - OS << ZeroDirective; - NumBytes.print(OS, MAI); - if (FillValue != 0) - OS << ',' << (int)FillValue; - EmitEOL(); + if (MAI->doesZeroDirectiveSupportNonZeroValue() || FillValue == 0) { + // FIXME: Emit location directives + OS << ZeroDirective; + NumBytes.print(OS, MAI); + if (FillValue != 0) + OS << ',' << (int)FillValue; + EmitEOL(); + } else { + if (!IsAbsolute) + report_fatal_error( + "Cannot emit non-absolute expression lengths of fill."); + for (int i = 0; i < IntNumBytes; ++i) { + OS << MAI->getData8bitsDirective() << (int)FillValue; + EmitEOL(); + } + } return; } @@ -1124,7 +1218,7 @@ void MCAsmStreamer::emitFill(const MCExpr &NumValues, int64_t Size, EmitEOL(); } -void MCAsmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value, +void MCAsmStreamer::emitValueToAlignment(unsigned ByteAlignment, int64_t Value, unsigned ValueSize, unsigned MaxBytesToEmit) { if (MAI->useDotAlignForAlignment()) { @@ -1186,10 +1280,10 @@ void MCAsmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value, EmitEOL(); } -void MCAsmStreamer::EmitCodeAlignment(unsigned ByteAlignment, +void MCAsmStreamer::emitCodeAlignment(unsigned ByteAlignment, unsigned MaxBytesToEmit) { // Emit with a text fill value. - EmitValueToAlignment(ByteAlignment, MAI->getTextAlignFillValue(), + emitValueToAlignment(ByteAlignment, MAI->getTextAlignFillValue(), 1, MaxBytesToEmit); } @@ -1203,7 +1297,7 @@ void MCAsmStreamer::emitValueToOffset(const MCExpr *Offset, EmitEOL(); } -void MCAsmStreamer::EmitFileDirective(StringRef Filename) { +void MCAsmStreamer::emitFileDirective(StringRef Filename) { assert(MAI->hasSingleParameterDotFile()); OS << "\t.file\t"; PrintQuotedString(Filename, OS); @@ -1267,7 +1361,7 @@ Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective( if (MCTargetStreamer *TS = getTargetStreamer()) TS->emitDwarfFileDirective(OS1.str()); else - EmitRawText(OS1.str()); + emitRawText(OS1.str()); return FileNo; } @@ -1293,13 +1387,12 @@ void MCAsmStreamer::emitDwarfFile0Directive(StringRef Directory, if (MCTargetStreamer *TS = getTargetStreamer()) TS->emitDwarfFileDirective(OS1.str()); else - EmitRawText(OS1.str()); + emitRawText(OS1.str()); } -void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, +void MCAsmStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, - unsigned Isa, - unsigned Discriminator, + unsigned Isa, unsigned Discriminator, StringRef FileName) { OS << "\t.loc\t" << FileNo << " " << Line << " " << Column; if (MAI->supportsExtendedDwarfLocDirective()) { @@ -1332,8 +1425,8 @@ void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, << Line << ':' << Column; } EmitEOL(); - this->MCStreamer::EmitDwarfLocDirective(FileNo, Line, Column, Flags, - Isa, Discriminator, FileName); + this->MCStreamer::emitDwarfLocDirective(FileNo, Line, Column, Flags, Isa, + Discriminator, FileName); } MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(unsigned CUID) { @@ -1381,7 +1474,7 @@ bool MCAsmStreamer::EmitCVInlineSiteIdDirective(unsigned FunctionId, IALine, IACol, Loc); } -void MCAsmStreamer::EmitCVLocDirective(unsigned FunctionId, unsigned FileNo, +void MCAsmStreamer::emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc) { @@ -1405,7 +1498,7 @@ void MCAsmStreamer::EmitCVLocDirective(unsigned FunctionId, unsigned FileNo, EmitEOL(); } -void MCAsmStreamer::EmitCVLinetableDirective(unsigned FunctionId, +void MCAsmStreamer::emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd) { OS << "\t.cv_linetable\t" << FunctionId << ", "; @@ -1413,10 +1506,10 @@ void MCAsmStreamer::EmitCVLinetableDirective(unsigned FunctionId, OS << ", "; FnEnd->print(OS, MAI); EmitEOL(); - this->MCStreamer::EmitCVLinetableDirective(FunctionId, FnStart, FnEnd); + this->MCStreamer::emitCVLinetableDirective(FunctionId, FnStart, FnEnd); } -void MCAsmStreamer::EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId, +void MCAsmStreamer::emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, @@ -1427,7 +1520,7 @@ void MCAsmStreamer::EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId, OS << ' '; FnEndSym->print(OS, MAI); EmitEOL(); - this->MCStreamer::EmitCVInlineLinetableDirective( + this->MCStreamer::emitCVInlineLinetableDirective( PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym); } @@ -1442,7 +1535,7 @@ void MCAsmStreamer::PrintCVDefRangePrefix( } } -void MCAsmStreamer::EmitCVDefRangeDirective( +void MCAsmStreamer::emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeRegisterRelHeader DRHdr) { PrintCVDefRangePrefix(Ranges); @@ -1452,7 +1545,7 @@ void MCAsmStreamer::EmitCVDefRangeDirective( EmitEOL(); } -void MCAsmStreamer::EmitCVDefRangeDirective( +void MCAsmStreamer::emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeSubfieldRegisterHeader DRHdr) { PrintCVDefRangePrefix(Ranges); @@ -1461,7 +1554,7 @@ void MCAsmStreamer::EmitCVDefRangeDirective( EmitEOL(); } -void MCAsmStreamer::EmitCVDefRangeDirective( +void MCAsmStreamer::emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeRegisterHeader DRHdr) { PrintCVDefRangePrefix(Ranges); @@ -1470,7 +1563,7 @@ void MCAsmStreamer::EmitCVDefRangeDirective( EmitEOL(); } -void MCAsmStreamer::EmitCVDefRangeDirective( +void MCAsmStreamer::emitCVDefRangeDirective( ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges, codeview::DefRangeFramePointerRelHeader DRHdr) { PrintCVDefRangePrefix(Ranges); @@ -1479,17 +1572,17 @@ void MCAsmStreamer::EmitCVDefRangeDirective( EmitEOL(); } -void MCAsmStreamer::EmitCVStringTableDirective() { +void MCAsmStreamer::emitCVStringTableDirective() { OS << "\t.cv_stringtable"; EmitEOL(); } -void MCAsmStreamer::EmitCVFileChecksumsDirective() { +void MCAsmStreamer::emitCVFileChecksumsDirective() { OS << "\t.cv_filechecksums"; EmitEOL(); } -void MCAsmStreamer::EmitCVFileChecksumOffsetDirective(unsigned FileNo) { +void MCAsmStreamer::emitCVFileChecksumOffsetDirective(unsigned FileNo) { OS << "\t.cv_filechecksumoffset\t" << FileNo; EmitEOL(); } @@ -1500,15 +1593,15 @@ void MCAsmStreamer::EmitCVFPOData(const MCSymbol *ProcSym, SMLoc L) { EmitEOL(); } -void MCAsmStreamer::EmitIdent(StringRef IdentString) { +void MCAsmStreamer::emitIdent(StringRef IdentString) { assert(MAI->hasIdentDirective() && ".ident directive not supported"); OS << "\t.ident\t"; PrintQuotedString(IdentString, OS); EmitEOL(); } -void MCAsmStreamer::EmitCFISections(bool EH, bool Debug) { - MCStreamer::EmitCFISections(EH, Debug); +void MCAsmStreamer::emitCFISections(bool EH, bool Debug) { + MCStreamer::emitCFISections(EH, Debug); OS << "\t.cfi_sections "; if (EH) { OS << ".eh_frame"; @@ -1521,15 +1614,15 @@ void MCAsmStreamer::EmitCFISections(bool EH, bool Debug) { EmitEOL(); } -void MCAsmStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { +void MCAsmStreamer::emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { OS << "\t.cfi_startproc"; if (Frame.IsSimple) OS << " simple"; EmitEOL(); } -void MCAsmStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) { - MCStreamer::EmitCFIEndProcImpl(Frame); +void MCAsmStreamer::emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) { + MCStreamer::emitCFIEndProcImpl(Frame); OS << "\t.cfi_endproc"; EmitEOL(); } @@ -1548,16 +1641,16 @@ void MCAsmStreamer::EmitRegisterName(int64_t Register) { OS << Register; } -void MCAsmStreamer::EmitCFIDefCfa(int64_t Register, int64_t Offset) { - MCStreamer::EmitCFIDefCfa(Register, Offset); +void MCAsmStreamer::emitCFIDefCfa(int64_t Register, int64_t Offset) { + MCStreamer::emitCFIDefCfa(Register, Offset); OS << "\t.cfi_def_cfa "; EmitRegisterName(Register); OS << ", " << Offset; EmitEOL(); } -void MCAsmStreamer::EmitCFIDefCfaOffset(int64_t Offset) { - MCStreamer::EmitCFIDefCfaOffset(Offset); +void MCAsmStreamer::emitCFIDefCfaOffset(int64_t Offset) { + MCStreamer::emitCFIDefCfaOffset(Offset); OS << "\t.cfi_def_cfa_offset " << Offset; EmitEOL(); } @@ -1572,14 +1665,14 @@ static void PrintCFIEscape(llvm::formatted_raw_ostream &OS, StringRef Values) { } } -void MCAsmStreamer::EmitCFIEscape(StringRef Values) { - MCStreamer::EmitCFIEscape(Values); +void MCAsmStreamer::emitCFIEscape(StringRef Values) { + MCStreamer::emitCFIEscape(Values); PrintCFIEscape(OS, Values); EmitEOL(); } -void MCAsmStreamer::EmitCFIGnuArgsSize(int64_t Size) { - MCStreamer::EmitCFIGnuArgsSize(Size); +void MCAsmStreamer::emitCFIGnuArgsSize(int64_t Size) { + MCStreamer::emitCFIGnuArgsSize(Size); uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size }; unsigned Len = encodeULEB128(Size, Buffer + 1) + 1; @@ -1588,114 +1681,119 @@ void MCAsmStreamer::EmitCFIGnuArgsSize(int64_t Size) { EmitEOL(); } -void MCAsmStreamer::EmitCFIDefCfaRegister(int64_t Register) { - MCStreamer::EmitCFIDefCfaRegister(Register); +void MCAsmStreamer::emitCFIDefCfaRegister(int64_t Register) { + MCStreamer::emitCFIDefCfaRegister(Register); OS << "\t.cfi_def_cfa_register "; EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::EmitCFIOffset(int64_t Register, int64_t Offset) { - this->MCStreamer::EmitCFIOffset(Register, Offset); +void MCAsmStreamer::emitCFIOffset(int64_t Register, int64_t Offset) { + this->MCStreamer::emitCFIOffset(Register, Offset); OS << "\t.cfi_offset "; EmitRegisterName(Register); OS << ", " << Offset; EmitEOL(); } -void MCAsmStreamer::EmitCFIPersonality(const MCSymbol *Sym, +void MCAsmStreamer::emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) { - MCStreamer::EmitCFIPersonality(Sym, Encoding); + MCStreamer::emitCFIPersonality(Sym, Encoding); OS << "\t.cfi_personality " << Encoding << ", "; Sym->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) { - MCStreamer::EmitCFILsda(Sym, Encoding); +void MCAsmStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding) { + MCStreamer::emitCFILsda(Sym, Encoding); OS << "\t.cfi_lsda " << Encoding << ", "; Sym->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::EmitCFIRememberState() { - MCStreamer::EmitCFIRememberState(); +void MCAsmStreamer::emitCFIRememberState() { + MCStreamer::emitCFIRememberState(); OS << "\t.cfi_remember_state"; EmitEOL(); } -void MCAsmStreamer::EmitCFIRestoreState() { - MCStreamer::EmitCFIRestoreState(); +void MCAsmStreamer::emitCFIRestoreState() { + MCStreamer::emitCFIRestoreState(); OS << "\t.cfi_restore_state"; EmitEOL(); } -void MCAsmStreamer::EmitCFIRestore(int64_t Register) { - MCStreamer::EmitCFIRestore(Register); +void MCAsmStreamer::emitCFIRestore(int64_t Register) { + MCStreamer::emitCFIRestore(Register); OS << "\t.cfi_restore "; EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::EmitCFISameValue(int64_t Register) { - MCStreamer::EmitCFISameValue(Register); +void MCAsmStreamer::emitCFISameValue(int64_t Register) { + MCStreamer::emitCFISameValue(Register); OS << "\t.cfi_same_value "; EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::EmitCFIRelOffset(int64_t Register, int64_t Offset) { - MCStreamer::EmitCFIRelOffset(Register, Offset); +void MCAsmStreamer::emitCFIRelOffset(int64_t Register, int64_t Offset) { + MCStreamer::emitCFIRelOffset(Register, Offset); OS << "\t.cfi_rel_offset "; EmitRegisterName(Register); OS << ", " << Offset; EmitEOL(); } -void MCAsmStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) { - MCStreamer::EmitCFIAdjustCfaOffset(Adjustment); +void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment) { + MCStreamer::emitCFIAdjustCfaOffset(Adjustment); OS << "\t.cfi_adjust_cfa_offset " << Adjustment; EmitEOL(); } -void MCAsmStreamer::EmitCFISignalFrame() { - MCStreamer::EmitCFISignalFrame(); +void MCAsmStreamer::emitCFISignalFrame() { + MCStreamer::emitCFISignalFrame(); OS << "\t.cfi_signal_frame"; EmitEOL(); } -void MCAsmStreamer::EmitCFIUndefined(int64_t Register) { - MCStreamer::EmitCFIUndefined(Register); - OS << "\t.cfi_undefined " << Register; +void MCAsmStreamer::emitCFIUndefined(int64_t Register) { + MCStreamer::emitCFIUndefined(Register); + OS << "\t.cfi_undefined "; + EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::EmitCFIRegister(int64_t Register1, int64_t Register2) { - MCStreamer::EmitCFIRegister(Register1, Register2); - OS << "\t.cfi_register " << Register1 << ", " << Register2; +void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2) { + MCStreamer::emitCFIRegister(Register1, Register2); + OS << "\t.cfi_register "; + EmitRegisterName(Register1); + OS << ", "; + EmitRegisterName(Register2); EmitEOL(); } -void MCAsmStreamer::EmitCFIWindowSave() { - MCStreamer::EmitCFIWindowSave(); +void MCAsmStreamer::emitCFIWindowSave() { + MCStreamer::emitCFIWindowSave(); OS << "\t.cfi_window_save"; EmitEOL(); } -void MCAsmStreamer::EmitCFINegateRAState() { - MCStreamer::EmitCFINegateRAState(); +void MCAsmStreamer::emitCFINegateRAState() { + MCStreamer::emitCFINegateRAState(); OS << "\t.cfi_negate_ra_state"; EmitEOL(); } -void MCAsmStreamer::EmitCFIReturnColumn(int64_t Register) { - MCStreamer::EmitCFIReturnColumn(Register); - OS << "\t.cfi_return_column " << Register; +void MCAsmStreamer::emitCFIReturnColumn(int64_t Register) { + MCStreamer::emitCFIReturnColumn(Register); + OS << "\t.cfi_return_column "; + EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::EmitCFIBKeyFrame() { - MCStreamer::EmitCFIBKeyFrame(); +void MCAsmStreamer::emitCFIBKeyFrame() { + MCStreamer::emitCFIBKeyFrame(); OS << "\t.cfi_b_key_frame"; EmitEOL(); } @@ -1931,7 +2029,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst, } } -void MCAsmStreamer::EmitInstruction(const MCInst &Inst, +void MCAsmStreamer::emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) { assert(getCurrentSectionOnly() && "Cannot emit contents before setting section!"); @@ -1957,26 +2055,27 @@ void MCAsmStreamer::EmitInstruction(const MCInst &Inst, EmitEOL(); } -void MCAsmStreamer::EmitBundleAlignMode(unsigned AlignPow2) { +void MCAsmStreamer::emitBundleAlignMode(unsigned AlignPow2) { OS << "\t.bundle_align_mode " << AlignPow2; EmitEOL(); } -void MCAsmStreamer::EmitBundleLock(bool AlignToEnd) { +void MCAsmStreamer::emitBundleLock(bool AlignToEnd) { OS << "\t.bundle_lock"; if (AlignToEnd) OS << " align_to_end"; EmitEOL(); } -void MCAsmStreamer::EmitBundleUnlock() { +void MCAsmStreamer::emitBundleUnlock() { OS << "\t.bundle_unlock"; EmitEOL(); } -bool MCAsmStreamer::EmitRelocDirective(const MCExpr &Offset, StringRef Name, - const MCExpr *Expr, SMLoc, - const MCSubtargetInfo &STI) { +Optional<std::pair<bool, std::string>> +MCAsmStreamer::emitRelocDirective(const MCExpr &Offset, StringRef Name, + const MCExpr *Expr, SMLoc, + const MCSubtargetInfo &STI) { OS << "\t.reloc "; Offset.print(OS, MAI); OS << ", " << Name; @@ -1985,15 +2084,15 @@ bool MCAsmStreamer::EmitRelocDirective(const MCExpr &Offset, StringRef Name, Expr->print(OS, MAI); } EmitEOL(); - return false; + return None; } -void MCAsmStreamer::EmitAddrsig() { +void MCAsmStreamer::emitAddrsig() { OS << "\t.addrsig"; EmitEOL(); } -void MCAsmStreamer::EmitAddrsigSym(const MCSymbol *Sym) { +void MCAsmStreamer::emitAddrsigSym(const MCSymbol *Sym) { OS << "\t.addrsig_sym "; Sym->print(OS, MAI); EmitEOL(); @@ -2002,14 +2101,14 @@ void MCAsmStreamer::EmitAddrsigSym(const MCSymbol *Sym) { /// 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. -void MCAsmStreamer::EmitRawTextImpl(StringRef String) { +void MCAsmStreamer::emitRawTextImpl(StringRef String) { if (!String.empty() && String.back() == '\n') String = String.substr(0, String.size()-1); OS << String; EmitEOL(); } -void MCAsmStreamer::FinishImpl() { +void MCAsmStreamer::finishImpl() { // If we are generating dwarf for assembly source files dump out the sections. if (getContext().getGenDwarfForAssembly()) MCGenDwarfInfo::Emit(this); @@ -2022,7 +2121,7 @@ void MCAsmStreamer::FinishImpl() { assert(Tables.size() == 1 && "asm output only supports one line table"); if (auto *Label = Tables.begin()->second.getLabel()) { SwitchSection(getContext().getObjectFileInfo()->getDwarfLineSection()); - EmitLabel(Label); + emitLabel(Label); } } } |