diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -199,7 +199,7 @@ std::unique_ptr TargetStreamer; std::vector DwarfFrameInfos; - MCDwarfFrameInfo *getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *getCurrentDwarfFrameInfo(SMLoc Loc); /// Similar to DwarfFrameInfos, but for SEH unwind info. Chained frames may /// refer to each other, so use std::unique_ptr to provide pointer stability. @@ -869,7 +869,7 @@ Optional Source, unsigned CUID = 0); - virtual void emitCFIBKeyFrame(); + virtual void emitCFIBKeyFrame(SMLoc Loc); /// This implements the DWARF2 '.loc fileno lineno ...' assembler /// directive. @@ -960,28 +960,29 @@ virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID); virtual void emitCFISections(bool EH, bool Debug); - void emitCFIStartProc(bool IsSimple, SMLoc Loc = SMLoc()); - void emitCFIEndProc(); - 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 emitCFIRestore(int64_t Register); - virtual void emitCFIRelOffset(int64_t Register, int64_t Offset); - virtual void emitCFIAdjustCfaOffset(int64_t Adjustment); - virtual void emitCFIEscape(StringRef Values); - virtual void emitCFIReturnColumn(int64_t Register); - virtual void emitCFIGnuArgsSize(int64_t Size); - virtual void emitCFISignalFrame(); - virtual void emitCFIUndefined(int64_t Register); - virtual void emitCFIRegister(int64_t Register1, int64_t Register2); - virtual void emitCFIWindowSave(); - virtual void emitCFINegateRAState(); + void emitCFIStartProc(bool IsSimple, SMLoc Loc); + void emitCFIEndProc(SMLoc Loc); + virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc); + virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc); + virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc); + virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc); + virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding, + SMLoc Loc); + virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding, SMLoc Loc); + virtual void emitCFIRememberState(SMLoc Loc); + virtual void emitCFIRestoreState(SMLoc Loc); + virtual void emitCFISameValue(int64_t Register, SMLoc Loc); + virtual void emitCFIRestore(int64_t Register, SMLoc Loc); + virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc); + virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc); + virtual void emitCFIEscape(StringRef Values, SMLoc Loc); + virtual void emitCFIReturnColumn(int64_t Register, SMLoc Loc); + virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc); + virtual void emitCFISignalFrame(SMLoc Loc); + virtual void emitCFIUndefined(int64_t Register, SMLoc Loc); + virtual void emitCFIRegister(int64_t Register1, int64_t Register2, SMLoc Loc); + virtual void emitCFIWindowSave(SMLoc Loc); + virtual void emitCFINegateRAState(SMLoc Loc); virtual void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc = SMLoc()); virtual void EmitWinCFIEndProc(SMLoc Loc = SMLoc()); @@ -1055,7 +1056,7 @@ /// Streamer specific finalization. virtual void finishImpl(); /// Finish emission of machine code. - void Finish(); + void Finish(SMLoc Loc = SMLoc()); virtual bool mayHaveInstructions(MCSection &Sec) const { return true; } }; diff --git a/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp b/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp --- a/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp @@ -51,7 +51,7 @@ } shouldEmitCFI = true; - Asm->OutStreamer->emitCFIStartProc(false); + Asm->OutStreamer->emitCFIStartProc(false, SMLoc()); } } diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp @@ -237,48 +237,49 @@ //===----------------------------------------------------------------------===// void AsmPrinter::emitCFIInstruction(const MCCFIInstruction &Inst) const { + SMLoc Loc; switch (Inst.getOperation()) { default: llvm_unreachable("Unexpected instruction"); case MCCFIInstruction::OpDefCfaOffset: - OutStreamer->emitCFIDefCfaOffset(Inst.getOffset()); + OutStreamer->emitCFIDefCfaOffset(Inst.getOffset(), Loc); break; case MCCFIInstruction::OpAdjustCfaOffset: - OutStreamer->emitCFIAdjustCfaOffset(Inst.getOffset()); + OutStreamer->emitCFIAdjustCfaOffset(Inst.getOffset(), Loc); break; case MCCFIInstruction::OpDefCfa: - OutStreamer->emitCFIDefCfa(Inst.getRegister(), Inst.getOffset()); + OutStreamer->emitCFIDefCfa(Inst.getRegister(), Inst.getOffset(), Loc); break; case MCCFIInstruction::OpDefCfaRegister: - OutStreamer->emitCFIDefCfaRegister(Inst.getRegister()); + OutStreamer->emitCFIDefCfaRegister(Inst.getRegister(), Loc); break; case MCCFIInstruction::OpOffset: - OutStreamer->emitCFIOffset(Inst.getRegister(), Inst.getOffset()); + OutStreamer->emitCFIOffset(Inst.getRegister(), Inst.getOffset(), Loc); break; case MCCFIInstruction::OpRegister: - OutStreamer->emitCFIRegister(Inst.getRegister(), Inst.getRegister2()); + OutStreamer->emitCFIRegister(Inst.getRegister(), Inst.getRegister2(), Loc); break; case MCCFIInstruction::OpWindowSave: - OutStreamer->emitCFIWindowSave(); + OutStreamer->emitCFIWindowSave(Loc); break; case MCCFIInstruction::OpNegateRAState: - OutStreamer->emitCFINegateRAState(); + OutStreamer->emitCFINegateRAState(Loc); break; case MCCFIInstruction::OpSameValue: - OutStreamer->emitCFISameValue(Inst.getRegister()); + OutStreamer->emitCFISameValue(Inst.getRegister(), Loc); break; case MCCFIInstruction::OpGnuArgsSize: - OutStreamer->emitCFIGnuArgsSize(Inst.getOffset()); + OutStreamer->emitCFIGnuArgsSize(Inst.getOffset(), Loc); break; case MCCFIInstruction::OpEscape: OutStreamer->AddComment(Inst.getComment()); - OutStreamer->emitCFIEscape(Inst.getValues()); + OutStreamer->emitCFIEscape(Inst.getValues(), Loc); break; case MCCFIInstruction::OpRestore: - OutStreamer->emitCFIRestore(Inst.getRegister()); + OutStreamer->emitCFIRestore(Inst.getRegister(), Loc); break; case MCCFIInstruction::OpUndefined: - OutStreamer->emitCFIUndefined(Inst.getRegister()); + OutStreamer->emitCFIUndefined(Inst.getRegister(), Loc); break; } } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp @@ -48,7 +48,7 @@ void DwarfCFIExceptionBase::endFragment() { if (shouldEmitCFI && !Asm->MF->hasBBSections()) - Asm->OutStreamer->emitCFIEndProc(); + Asm->OutStreamer->emitCFIEndProc(SMLoc()); } DwarfCFIException::DwarfCFIException(AsmPrinter *A) @@ -140,7 +140,7 @@ hasEmittedCFISections = true; } - Asm->OutStreamer->emitCFIStartProc(/*IsSimple=*/false); + Asm->OutStreamer->emitCFIStartProc(/*IsSimple=*/false, SMLoc()); // Indicate personality routine, if any. if (!shouldEmitPersonality) @@ -158,11 +158,12 @@ const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); unsigned PerEncoding = TLOF.getPersonalityEncoding(); const MCSymbol *Sym = TLOF.getCFIPersonalitySymbol(P, Asm->TM, MMI); - Asm->OutStreamer->emitCFIPersonality(Sym, PerEncoding); + Asm->OutStreamer->emitCFIPersonality(Sym, PerEncoding, SMLoc()); // Provide LSDA information. if (shouldEmitLSDA) - Asm->OutStreamer->emitCFILsda(ESP(Asm, MBB), TLOF.getLSDAEncoding()); + Asm->OutStreamer->emitCFILsda(ESP(Asm, MBB), TLOF.getLSDAEncoding(), + SMLoc()); } /// endFunction - Gather and emit post-function exception information. @@ -180,5 +181,5 @@ void DwarfCFIException::endBasicBlock(const MachineBasicBlock &MBB) { if (shouldEmitCFI) - Asm->OutStreamer->emitCFIEndProc(); + Asm->OutStreamer->emitCFIEndProc(SMLoc()); } diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -297,28 +297,30 @@ void EmitCVFPOData(const MCSymbol *ProcSym, SMLoc L) override; void emitIdent(StringRef IdentString) override; - void emitCFIBKeyFrame() override; + void emitCFIBKeyFrame(SMLoc Loc) 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 emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc) override; + void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc) override; + void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc) override; + void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc) override; + void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding, + SMLoc Loc) override; + void emitCFILsda(const MCSymbol *Sym, unsigned Encoding, SMLoc Loc) override; + void emitCFIRememberState(SMLoc Loc) override; + void emitCFIRestoreState(SMLoc Loc) override; + void emitCFIRestore(int64_t Register, SMLoc Loc) override; + void emitCFISameValue(int64_t Register, SMLoc Loc) override; + void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc) override; + void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc) override; + void emitCFIEscape(StringRef Values, SMLoc Loc) override; + void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc) override; + void emitCFISignalFrame(SMLoc Loc) override; + void emitCFIUndefined(int64_t Register, SMLoc Loc) override; + void emitCFIRegister(int64_t Register1, int64_t Register2, + SMLoc Loc) override; + void emitCFIWindowSave(SMLoc Loc) override; + void emitCFINegateRAState(SMLoc Loc) override; + void emitCFIReturnColumn(int64_t Register, SMLoc Loc) override; void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) override; void EmitWinCFIEndProc(SMLoc Loc) override; @@ -1700,16 +1702,16 @@ OS << Register; } -void MCAsmStreamer::emitCFIDefCfa(int64_t Register, int64_t Offset) { - MCStreamer::emitCFIDefCfa(Register, Offset); +void MCAsmStreamer::emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc) { + MCStreamer::emitCFIDefCfa(Register, Offset, Loc); 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, SMLoc Loc) { + MCStreamer::emitCFIDefCfaOffset(Offset, Loc); OS << "\t.cfi_def_cfa_offset " << Offset; EmitEOL(); } @@ -1724,14 +1726,14 @@ } } -void MCAsmStreamer::emitCFIEscape(StringRef Values) { - MCStreamer::emitCFIEscape(Values); +void MCAsmStreamer::emitCFIEscape(StringRef Values, SMLoc Loc) { + MCStreamer::emitCFIEscape(Values, Loc); PrintCFIEscape(OS, Values); EmitEOL(); } -void MCAsmStreamer::emitCFIGnuArgsSize(int64_t Size) { - MCStreamer::emitCFIGnuArgsSize(Size); +void MCAsmStreamer::emitCFIGnuArgsSize(int64_t Size, SMLoc Loc) { + MCStreamer::emitCFIGnuArgsSize(Size, Loc); uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size }; unsigned Len = encodeULEB128(Size, Buffer + 1) + 1; @@ -1740,91 +1742,94 @@ EmitEOL(); } -void MCAsmStreamer::emitCFIDefCfaRegister(int64_t Register) { - MCStreamer::emitCFIDefCfaRegister(Register); +void MCAsmStreamer::emitCFIDefCfaRegister(int64_t Register, SMLoc Loc) { + MCStreamer::emitCFIDefCfaRegister(Register, Loc); 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, SMLoc Loc) { + this->MCStreamer::emitCFIOffset(Register, Offset, Loc); OS << "\t.cfi_offset "; EmitRegisterName(Register); OS << ", " << Offset; EmitEOL(); } -void MCAsmStreamer::emitCFIPersonality(const MCSymbol *Sym, - unsigned Encoding) { - MCStreamer::emitCFIPersonality(Sym, Encoding); +void MCAsmStreamer::emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding, + SMLoc Loc) { + MCStreamer::emitCFIPersonality(Sym, Encoding, Loc); 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, + SMLoc Loc) { + MCStreamer::emitCFILsda(Sym, Encoding, Loc); OS << "\t.cfi_lsda " << Encoding << ", "; Sym->print(OS, MAI); EmitEOL(); } -void MCAsmStreamer::emitCFIRememberState() { - MCStreamer::emitCFIRememberState(); +void MCAsmStreamer::emitCFIRememberState(SMLoc Loc) { + MCStreamer::emitCFIRememberState(Loc); OS << "\t.cfi_remember_state"; EmitEOL(); } -void MCAsmStreamer::emitCFIRestoreState() { - MCStreamer::emitCFIRestoreState(); +void MCAsmStreamer::emitCFIRestoreState(SMLoc Loc) { + MCStreamer::emitCFIRestoreState(Loc); OS << "\t.cfi_restore_state"; EmitEOL(); } -void MCAsmStreamer::emitCFIRestore(int64_t Register) { - MCStreamer::emitCFIRestore(Register); +void MCAsmStreamer::emitCFIRestore(int64_t Register, SMLoc Loc) { + MCStreamer::emitCFIRestore(Register, Loc); OS << "\t.cfi_restore "; EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::emitCFISameValue(int64_t Register) { - MCStreamer::emitCFISameValue(Register); +void MCAsmStreamer::emitCFISameValue(int64_t Register, SMLoc Loc) { + MCStreamer::emitCFISameValue(Register, Loc); 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, + SMLoc Loc) { + MCStreamer::emitCFIRelOffset(Register, Offset, Loc); 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, SMLoc Loc) { + MCStreamer::emitCFIAdjustCfaOffset(Adjustment, Loc); OS << "\t.cfi_adjust_cfa_offset " << Adjustment; EmitEOL(); } -void MCAsmStreamer::emitCFISignalFrame() { - MCStreamer::emitCFISignalFrame(); +void MCAsmStreamer::emitCFISignalFrame(SMLoc Loc) { + MCStreamer::emitCFISignalFrame(Loc); OS << "\t.cfi_signal_frame"; EmitEOL(); } -void MCAsmStreamer::emitCFIUndefined(int64_t Register) { - MCStreamer::emitCFIUndefined(Register); +void MCAsmStreamer::emitCFIUndefined(int64_t Register, SMLoc Loc) { + MCStreamer::emitCFIUndefined(Register, Loc); OS << "\t.cfi_undefined "; EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2) { - MCStreamer::emitCFIRegister(Register1, Register2); +void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2, + SMLoc Loc) { + MCStreamer::emitCFIRegister(Register1, Register2, Loc); OS << "\t.cfi_register "; EmitRegisterName(Register1); OS << ", "; @@ -1832,27 +1837,27 @@ EmitEOL(); } -void MCAsmStreamer::emitCFIWindowSave() { - MCStreamer::emitCFIWindowSave(); +void MCAsmStreamer::emitCFIWindowSave(SMLoc Loc) { + MCStreamer::emitCFIWindowSave(Loc); OS << "\t.cfi_window_save"; EmitEOL(); } -void MCAsmStreamer::emitCFINegateRAState() { - MCStreamer::emitCFINegateRAState(); +void MCAsmStreamer::emitCFINegateRAState(SMLoc Loc) { + MCStreamer::emitCFINegateRAState(Loc); OS << "\t.cfi_negate_ra_state"; EmitEOL(); } -void MCAsmStreamer::emitCFIReturnColumn(int64_t Register) { - MCStreamer::emitCFIReturnColumn(Register); +void MCAsmStreamer::emitCFIReturnColumn(int64_t Register, SMLoc Loc) { + MCStreamer::emitCFIReturnColumn(Register, Loc); OS << "\t.cfi_return_column "; EmitRegisterName(Register); EmitEOL(); } -void MCAsmStreamer::emitCFIBKeyFrame() { - MCStreamer::emitCFIBKeyFrame(); +void MCAsmStreamer::emitCFIBKeyFrame(SMLoc Loc) { + MCStreamer::emitCFIBKeyFrame(Loc); OS << "\t.cfi_b_key_frame"; EmitEOL(); } diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -573,24 +573,25 @@ // .cfi directives bool parseDirectiveCFIRegister(SMLoc DirectiveLoc); - bool parseDirectiveCFIWindowSave(); + bool parseDirectiveCFIWindowSave(SMLoc DirectiveLoc); bool parseDirectiveCFISections(); - bool parseDirectiveCFIStartProc(); - bool parseDirectiveCFIEndProc(); - bool parseDirectiveCFIDefCfaOffset(); + bool parseDirectiveCFIStartProc(SMLoc DirectiveLoc); + bool parseDirectiveCFIEndProc(SMLoc DirectiveLoc); + bool parseDirectiveCFIDefCfaOffset(SMLoc DirectiveLoc); bool parseDirectiveCFIDefCfa(SMLoc DirectiveLoc); - bool parseDirectiveCFIAdjustCfaOffset(); + bool parseDirectiveCFIAdjustCfaOffset(SMLoc DirectiveLoc); bool parseDirectiveCFIDefCfaRegister(SMLoc DirectiveLoc); bool parseDirectiveCFIOffset(SMLoc DirectiveLoc); bool parseDirectiveCFIRelOffset(SMLoc DirectiveLoc); - bool parseDirectiveCFIPersonalityOrLsda(bool IsPersonality); - bool parseDirectiveCFIRememberState(); - bool parseDirectiveCFIRestoreState(); + bool parseDirectiveCFIPersonalityOrLsda(bool IsPersonality, + SMLoc DirectiveLoc); + bool parseDirectiveCFIRememberState(SMLoc DirectiveLoc); + bool parseDirectiveCFIRestoreState(SMLoc DirectiveLoc); bool parseDirectiveCFISameValue(SMLoc DirectiveLoc); bool parseDirectiveCFIRestore(SMLoc DirectiveLoc); - bool parseDirectiveCFIEscape(); + bool parseDirectiveCFIEscape(SMLoc DirectiveLoc); bool parseDirectiveCFIReturnColumn(SMLoc DirectiveLoc); - bool parseDirectiveCFISignalFrame(); + bool parseDirectiveCFISignalFrame(SMLoc DirectiveLoc); bool parseDirectiveCFIUndefined(SMLoc DirectiveLoc); // macro directives @@ -989,7 +990,7 @@ // Finalize the output stream if there are no errors and if the client wants // us to. if (!HadError && !NoFinalize) - Out.Finish(); + Out.Finish(Lexer.getLoc()); return HadError || getContext().hadError(); } @@ -2098,15 +2099,15 @@ case DK_CFI_SECTIONS: return parseDirectiveCFISections(); case DK_CFI_STARTPROC: - return parseDirectiveCFIStartProc(); + return parseDirectiveCFIStartProc(IDLoc); case DK_CFI_ENDPROC: - return parseDirectiveCFIEndProc(); + return parseDirectiveCFIEndProc(IDLoc); case DK_CFI_DEF_CFA: return parseDirectiveCFIDefCfa(IDLoc); case DK_CFI_DEF_CFA_OFFSET: - return parseDirectiveCFIDefCfaOffset(); + return parseDirectiveCFIDefCfaOffset(IDLoc); case DK_CFI_ADJUST_CFA_OFFSET: - return parseDirectiveCFIAdjustCfaOffset(); + return parseDirectiveCFIAdjustCfaOffset(IDLoc); case DK_CFI_DEF_CFA_REGISTER: return parseDirectiveCFIDefCfaRegister(IDLoc); case DK_CFI_OFFSET: @@ -2114,29 +2115,29 @@ case DK_CFI_REL_OFFSET: return parseDirectiveCFIRelOffset(IDLoc); case DK_CFI_PERSONALITY: - return parseDirectiveCFIPersonalityOrLsda(true); + return parseDirectiveCFIPersonalityOrLsda(true, IDLoc); case DK_CFI_LSDA: - return parseDirectiveCFIPersonalityOrLsda(false); + return parseDirectiveCFIPersonalityOrLsda(false, IDLoc); case DK_CFI_REMEMBER_STATE: - return parseDirectiveCFIRememberState(); + return parseDirectiveCFIRememberState(IDLoc); case DK_CFI_RESTORE_STATE: - return parseDirectiveCFIRestoreState(); + return parseDirectiveCFIRestoreState(IDLoc); case DK_CFI_SAME_VALUE: return parseDirectiveCFISameValue(IDLoc); case DK_CFI_RESTORE: return parseDirectiveCFIRestore(IDLoc); case DK_CFI_ESCAPE: - return parseDirectiveCFIEscape(); + return parseDirectiveCFIEscape(IDLoc); case DK_CFI_RETURN_COLUMN: return parseDirectiveCFIReturnColumn(IDLoc); case DK_CFI_SIGNAL_FRAME: - return parseDirectiveCFISignalFrame(); + return parseDirectiveCFISignalFrame(IDLoc); case DK_CFI_UNDEFINED: return parseDirectiveCFIUndefined(IDLoc); case DK_CFI_REGISTER: return parseDirectiveCFIRegister(IDLoc); case DK_CFI_WINDOW_SAVE: - return parseDirectiveCFIWindowSave(); + return parseDirectiveCFIWindowSave(IDLoc); case DK_MACROS_ON: case DK_MACROS_OFF: return parseDirectiveMacrosOnOff(IDVal); @@ -4077,7 +4078,7 @@ /// parseDirectiveCFIStartProc /// ::= .cfi_startproc [simple] -bool AsmParser::parseDirectiveCFIStartProc() { +bool AsmParser::parseDirectiveCFIStartProc(SMLoc DirectiveLoc) { StringRef Simple; if (!parseOptionalToken(AsmToken::EndOfStatement)) { if (check(parseIdentifier(Simple) || Simple != "simple", @@ -4091,14 +4092,14 @@ // expansion which can *ONLY* happen if Clang's cc1as is the API consumer. // Tools like llvm-mc on the other hand are not affected by it, and report // correct context information. - getStreamer().emitCFIStartProc(!Simple.empty(), Lexer.getLoc()); + getStreamer().emitCFIStartProc(!Simple.empty(), DirectiveLoc); return false; } /// parseDirectiveCFIEndProc /// ::= .cfi_endproc -bool AsmParser::parseDirectiveCFIEndProc() { - getStreamer().emitCFIEndProc(); +bool AsmParser::parseDirectiveCFIEndProc(SMLoc DirectiveLoc) { + getStreamer().emitCFIEndProc(DirectiveLoc); return false; } @@ -4126,18 +4127,18 @@ parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIDefCfa(Register, Offset); + getStreamer().emitCFIDefCfa(Register, Offset, DirectiveLoc); return false; } /// parseDirectiveCFIDefCfaOffset /// ::= .cfi_def_cfa_offset offset -bool AsmParser::parseDirectiveCFIDefCfaOffset() { +bool AsmParser::parseDirectiveCFIDefCfaOffset(SMLoc DirectiveLoc) { int64_t Offset = 0; if (parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIDefCfaOffset(Offset); + getStreamer().emitCFIDefCfaOffset(Offset, DirectiveLoc); return false; } @@ -4150,25 +4151,25 @@ parseRegisterOrRegisterNumber(Register2, DirectiveLoc)) return true; - getStreamer().emitCFIRegister(Register1, Register2); + getStreamer().emitCFIRegister(Register1, Register2, DirectiveLoc); return false; } /// parseDirectiveCFIWindowSave /// ::= .cfi_window_save -bool AsmParser::parseDirectiveCFIWindowSave() { - getStreamer().emitCFIWindowSave(); +bool AsmParser::parseDirectiveCFIWindowSave(SMLoc DirectiveLoc) { + getStreamer().emitCFIWindowSave(DirectiveLoc); return false; } /// parseDirectiveCFIAdjustCfaOffset /// ::= .cfi_adjust_cfa_offset adjustment -bool AsmParser::parseDirectiveCFIAdjustCfaOffset() { +bool AsmParser::parseDirectiveCFIAdjustCfaOffset(SMLoc DirectiveLoc) { int64_t Adjustment = 0; if (parseAbsoluteExpression(Adjustment)) return true; - getStreamer().emitCFIAdjustCfaOffset(Adjustment); + getStreamer().emitCFIAdjustCfaOffset(Adjustment, DirectiveLoc); return false; } @@ -4179,7 +4180,7 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIDefCfaRegister(Register); + getStreamer().emitCFIDefCfaRegister(Register, DirectiveLoc); return false; } @@ -4194,7 +4195,7 @@ parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIOffset(Register, Offset); + getStreamer().emitCFIOffset(Register, Offset, DirectiveLoc); return false; } @@ -4208,7 +4209,7 @@ parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIRelOffset(Register, Offset); + getStreamer().emitCFIRelOffset(Register, Offset, DirectiveLoc); return false; } @@ -4238,7 +4239,8 @@ /// IsPersonality true for cfi_personality, false for cfi_lsda /// ::= .cfi_personality encoding, [symbol_name] /// ::= .cfi_lsda encoding, [symbol_name] -bool AsmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality) { +bool AsmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality, + SMLoc DirectiveLoc) { int64_t Encoding = 0; if (parseAbsoluteExpression(Encoding)) return true; @@ -4254,23 +4256,23 @@ MCSymbol *Sym = getContext().getOrCreateSymbol(Name); if (IsPersonality) - getStreamer().emitCFIPersonality(Sym, Encoding); + getStreamer().emitCFIPersonality(Sym, Encoding, DirectiveLoc); else - getStreamer().emitCFILsda(Sym, Encoding); + getStreamer().emitCFILsda(Sym, Encoding, DirectiveLoc); return false; } /// parseDirectiveCFIRememberState /// ::= .cfi_remember_state -bool AsmParser::parseDirectiveCFIRememberState() { - getStreamer().emitCFIRememberState(); +bool AsmParser::parseDirectiveCFIRememberState(SMLoc DirectiveLoc) { + getStreamer().emitCFIRememberState(DirectiveLoc); return false; } /// parseDirectiveCFIRestoreState /// ::= .cfi_remember_state -bool AsmParser::parseDirectiveCFIRestoreState() { - getStreamer().emitCFIRestoreState(); +bool AsmParser::parseDirectiveCFIRestoreState(SMLoc DirectiveLoc) { + getStreamer().emitCFIRestoreState(DirectiveLoc); return false; } @@ -4282,7 +4284,7 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFISameValue(Register); + getStreamer().emitCFISameValue(Register, DirectiveLoc); return false; } @@ -4293,13 +4295,13 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIRestore(Register); + getStreamer().emitCFIRestore(Register, DirectiveLoc); return false; } /// parseDirectiveCFIEscape /// ::= .cfi_escape expression[,...] -bool AsmParser::parseDirectiveCFIEscape() { +bool AsmParser::parseDirectiveCFIEscape(SMLoc DirectiveLoc) { std::string Values; int64_t CurrValue; if (parseAbsoluteExpression(CurrValue)) @@ -4316,7 +4318,7 @@ Values.push_back((uint8_t)CurrValue); } - getStreamer().emitCFIEscape(Values); + getStreamer().emitCFIEscape(Values, DirectiveLoc); return false; } @@ -4326,18 +4328,18 @@ int64_t Register = 0; if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIReturnColumn(Register); + getStreamer().emitCFIReturnColumn(Register, DirectiveLoc); return false; } /// parseDirectiveCFISignalFrame /// ::= .cfi_signal_frame -bool AsmParser::parseDirectiveCFISignalFrame() { +bool AsmParser::parseDirectiveCFISignalFrame(SMLoc DirectiveLoc) { if (parseToken(AsmToken::EndOfStatement, "unexpected token in '.cfi_signal_frame'")) return true; - getStreamer().emitCFISignalFrame(); + getStreamer().emitCFISignalFrame(DirectiveLoc); return false; } @@ -4349,7 +4351,7 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIUndefined(Register); + getStreamer().emitCFIUndefined(Register, DirectiveLoc); return false; } diff --git a/llvm/lib/MC/MCParser/MasmParser.cpp b/llvm/lib/MC/MCParser/MasmParser.cpp --- a/llvm/lib/MC/MCParser/MasmParser.cpp +++ b/llvm/lib/MC/MCParser/MasmParser.cpp @@ -865,24 +865,25 @@ // .cfi directives bool parseDirectiveCFIRegister(SMLoc DirectiveLoc); - bool parseDirectiveCFIWindowSave(); + bool parseDirectiveCFIWindowSave(SMLoc DirectiveLoc); bool parseDirectiveCFISections(); - bool parseDirectiveCFIStartProc(); - bool parseDirectiveCFIEndProc(); - bool parseDirectiveCFIDefCfaOffset(); + bool parseDirectiveCFIStartProc(SMLoc DirectiveLoc); + bool parseDirectiveCFIEndProc(SMLoc DirectiveLoc); + bool parseDirectiveCFIDefCfaOffset(SMLoc DirectiveLoc); bool parseDirectiveCFIDefCfa(SMLoc DirectiveLoc); - bool parseDirectiveCFIAdjustCfaOffset(); + bool parseDirectiveCFIAdjustCfaOffset(SMLoc DirectiveLoc); bool parseDirectiveCFIDefCfaRegister(SMLoc DirectiveLoc); bool parseDirectiveCFIOffset(SMLoc DirectiveLoc); bool parseDirectiveCFIRelOffset(SMLoc DirectiveLoc); - bool parseDirectiveCFIPersonalityOrLsda(bool IsPersonality); - bool parseDirectiveCFIRememberState(); - bool parseDirectiveCFIRestoreState(); + bool parseDirectiveCFIPersonalityOrLsda(bool IsPersonality, + SMLoc DirectiveLoc); + bool parseDirectiveCFIRememberState(SMLoc DirectiveLoc); + bool parseDirectiveCFIRestoreState(SMLoc DirectiveLoc); bool parseDirectiveCFISameValue(SMLoc DirectiveLoc); bool parseDirectiveCFIRestore(SMLoc DirectiveLoc); - bool parseDirectiveCFIEscape(); + bool parseDirectiveCFIEscape(SMLoc DirectiveLoc); bool parseDirectiveCFIReturnColumn(SMLoc DirectiveLoc); - bool parseDirectiveCFISignalFrame(); + bool parseDirectiveCFISignalFrame(SMLoc DirectiveLoc); bool parseDirectiveCFIUndefined(SMLoc DirectiveLoc); // macro directives @@ -1266,7 +1267,7 @@ // Finalize the output stream if there are no errors and if the client wants // us to. if (!HadError && !NoFinalize) - Out.Finish(); + Out.Finish(Lexer.getLoc()); return HadError || getContext().hadError(); } @@ -2213,15 +2214,15 @@ case DK_CFI_SECTIONS: return parseDirectiveCFISections(); case DK_CFI_STARTPROC: - return parseDirectiveCFIStartProc(); + return parseDirectiveCFIStartProc(IDLoc); case DK_CFI_ENDPROC: - return parseDirectiveCFIEndProc(); + return parseDirectiveCFIEndProc(IDLoc); case DK_CFI_DEF_CFA: return parseDirectiveCFIDefCfa(IDLoc); case DK_CFI_DEF_CFA_OFFSET: - return parseDirectiveCFIDefCfaOffset(); + return parseDirectiveCFIDefCfaOffset(IDLoc); case DK_CFI_ADJUST_CFA_OFFSET: - return parseDirectiveCFIAdjustCfaOffset(); + return parseDirectiveCFIAdjustCfaOffset(IDLoc); case DK_CFI_DEF_CFA_REGISTER: return parseDirectiveCFIDefCfaRegister(IDLoc); case DK_CFI_OFFSET: @@ -2229,29 +2230,29 @@ case DK_CFI_REL_OFFSET: return parseDirectiveCFIRelOffset(IDLoc); case DK_CFI_PERSONALITY: - return parseDirectiveCFIPersonalityOrLsda(true); + return parseDirectiveCFIPersonalityOrLsda(true, IDLoc); case DK_CFI_LSDA: - return parseDirectiveCFIPersonalityOrLsda(false); + return parseDirectiveCFIPersonalityOrLsda(false, IDLoc); case DK_CFI_REMEMBER_STATE: - return parseDirectiveCFIRememberState(); + return parseDirectiveCFIRememberState(IDLoc); case DK_CFI_RESTORE_STATE: - return parseDirectiveCFIRestoreState(); + return parseDirectiveCFIRestoreState(IDLoc); case DK_CFI_SAME_VALUE: return parseDirectiveCFISameValue(IDLoc); case DK_CFI_RESTORE: return parseDirectiveCFIRestore(IDLoc); case DK_CFI_ESCAPE: - return parseDirectiveCFIEscape(); + return parseDirectiveCFIEscape(IDLoc); case DK_CFI_RETURN_COLUMN: return parseDirectiveCFIReturnColumn(IDLoc); case DK_CFI_SIGNAL_FRAME: - return parseDirectiveCFISignalFrame(); + return parseDirectiveCFISignalFrame(IDLoc); case DK_CFI_UNDEFINED: return parseDirectiveCFIUndefined(IDLoc); case DK_CFI_REGISTER: return parseDirectiveCFIRegister(IDLoc); case DK_CFI_WINDOW_SAVE: - return parseDirectiveCFIWindowSave(); + return parseDirectiveCFIWindowSave(IDLoc); case DK_MACRO: return parseDirectiveMacro(IDLoc); case DK_ALTMACRO: @@ -5036,7 +5037,7 @@ /// parseDirectiveCFIStartProc /// ::= .cfi_startproc [simple] -bool MasmParser::parseDirectiveCFIStartProc() { +bool MasmParser::parseDirectiveCFIStartProc(SMLoc DirectiveLoc) { StringRef Simple; if (!parseOptionalToken(AsmToken::EndOfStatement)) { if (check(parseIdentifier(Simple) || Simple != "simple", @@ -5050,14 +5051,14 @@ // expansion which can *ONLY* happen if Clang's cc1as is the API consumer. // Tools like llvm-mc on the other hand are not affected by it, and report // correct context information. - getStreamer().emitCFIStartProc(!Simple.empty(), Lexer.getLoc()); + getStreamer().emitCFIStartProc(!Simple.empty(), DirectiveLoc); return false; } /// parseDirectiveCFIEndProc /// ::= .cfi_endproc -bool MasmParser::parseDirectiveCFIEndProc() { - getStreamer().emitCFIEndProc(); +bool MasmParser::parseDirectiveCFIEndProc(SMLoc DirectiveLoc) { + getStreamer().emitCFIEndProc(DirectiveLoc); return false; } @@ -5085,18 +5086,18 @@ parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIDefCfa(Register, Offset); + getStreamer().emitCFIDefCfa(Register, Offset, DirectiveLoc); return false; } /// parseDirectiveCFIDefCfaOffset /// ::= .cfi_def_cfa_offset offset -bool MasmParser::parseDirectiveCFIDefCfaOffset() { +bool MasmParser::parseDirectiveCFIDefCfaOffset(SMLoc DirectiveLoc) { int64_t Offset = 0; if (parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIDefCfaOffset(Offset); + getStreamer().emitCFIDefCfaOffset(Offset, DirectiveLoc); return false; } @@ -5109,25 +5110,25 @@ parseRegisterOrRegisterNumber(Register2, DirectiveLoc)) return true; - getStreamer().emitCFIRegister(Register1, Register2); + getStreamer().emitCFIRegister(Register1, Register2, DirectiveLoc); return false; } /// parseDirectiveCFIWindowSave /// ::= .cfi_window_save -bool MasmParser::parseDirectiveCFIWindowSave() { - getStreamer().emitCFIWindowSave(); +bool MasmParser::parseDirectiveCFIWindowSave(SMLoc DirectiveLoc) { + getStreamer().emitCFIWindowSave(DirectiveLoc); return false; } /// parseDirectiveCFIAdjustCfaOffset /// ::= .cfi_adjust_cfa_offset adjustment -bool MasmParser::parseDirectiveCFIAdjustCfaOffset() { +bool MasmParser::parseDirectiveCFIAdjustCfaOffset(SMLoc DirectiveLoc) { int64_t Adjustment = 0; if (parseAbsoluteExpression(Adjustment)) return true; - getStreamer().emitCFIAdjustCfaOffset(Adjustment); + getStreamer().emitCFIAdjustCfaOffset(Adjustment, DirectiveLoc); return false; } @@ -5138,7 +5139,7 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIDefCfaRegister(Register); + getStreamer().emitCFIDefCfaRegister(Register, DirectiveLoc); return false; } @@ -5153,7 +5154,7 @@ parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIOffset(Register, Offset); + getStreamer().emitCFIOffset(Register, Offset, DirectiveLoc); return false; } @@ -5167,7 +5168,7 @@ parseAbsoluteExpression(Offset)) return true; - getStreamer().emitCFIRelOffset(Register, Offset); + getStreamer().emitCFIRelOffset(Register, Offset, DirectiveLoc); return false; } @@ -5197,7 +5198,8 @@ /// IsPersonality true for cfi_personality, false for cfi_lsda /// ::= .cfi_personality encoding, [symbol_name] /// ::= .cfi_lsda encoding, [symbol_name] -bool MasmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality) { +bool MasmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality, + SMLoc DirectiveLoc) { int64_t Encoding = 0; if (parseAbsoluteExpression(Encoding)) return true; @@ -5213,23 +5215,23 @@ MCSymbol *Sym = getContext().getOrCreateSymbol(Name); if (IsPersonality) - getStreamer().emitCFIPersonality(Sym, Encoding); + getStreamer().emitCFIPersonality(Sym, Encoding, DirectiveLoc); else - getStreamer().emitCFILsda(Sym, Encoding); + getStreamer().emitCFILsda(Sym, Encoding, DirectiveLoc); return false; } /// parseDirectiveCFIRememberState /// ::= .cfi_remember_state -bool MasmParser::parseDirectiveCFIRememberState() { - getStreamer().emitCFIRememberState(); +bool MasmParser::parseDirectiveCFIRememberState(SMLoc DirectiveLoc) { + getStreamer().emitCFIRememberState(DirectiveLoc); return false; } /// parseDirectiveCFIRestoreState /// ::= .cfi_remember_state -bool MasmParser::parseDirectiveCFIRestoreState() { - getStreamer().emitCFIRestoreState(); +bool MasmParser::parseDirectiveCFIRestoreState(SMLoc DirectiveLoc) { + getStreamer().emitCFIRestoreState(DirectiveLoc); return false; } @@ -5241,7 +5243,7 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFISameValue(Register); + getStreamer().emitCFISameValue(Register, DirectiveLoc); return false; } @@ -5252,13 +5254,13 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIRestore(Register); + getStreamer().emitCFIRestore(Register, DirectiveLoc); return false; } /// parseDirectiveCFIEscape /// ::= .cfi_escape expression[,...] -bool MasmParser::parseDirectiveCFIEscape() { +bool MasmParser::parseDirectiveCFIEscape(SMLoc DirectiveLoc) { std::string Values; int64_t CurrValue; if (parseAbsoluteExpression(CurrValue)) @@ -5275,7 +5277,7 @@ Values.push_back((uint8_t)CurrValue); } - getStreamer().emitCFIEscape(Values); + getStreamer().emitCFIEscape(Values, DirectiveLoc); return false; } @@ -5285,18 +5287,18 @@ int64_t Register = 0; if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIReturnColumn(Register); + getStreamer().emitCFIReturnColumn(Register, DirectiveLoc); return false; } /// parseDirectiveCFISignalFrame /// ::= .cfi_signal_frame -bool MasmParser::parseDirectiveCFISignalFrame() { +bool MasmParser::parseDirectiveCFISignalFrame(SMLoc DirectiveLoc) { if (parseToken(AsmToken::EndOfStatement, "unexpected token in '.cfi_signal_frame'")) return true; - getStreamer().emitCFISignalFrame(); + getStreamer().emitCFISignalFrame(DirectiveLoc); return false; } @@ -5308,7 +5310,7 @@ if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().emitCFIUndefined(Register); + getStreamer().emitCFIUndefined(Register, DirectiveLoc); return false; } diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -242,8 +242,8 @@ Source); } -void MCStreamer::emitCFIBKeyFrame() { - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); +void MCStreamer::emitCFIBKeyFrame(SMLoc Loc) { + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->IsBKeyFrame = true; @@ -271,11 +271,10 @@ return !DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End; } -MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo() { +MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo(SMLoc Loc) { if (!hasUnfinishedDwarfFrameInfo()) { - getContext().reportError(SMLoc(), "this directive must appear between " - ".cfi_startproc and .cfi_endproc " - "directives"); + getContext().reportError(Loc, "this directive must appear between " + ".cfi_startproc and .cfi_endproc directives"); return nullptr; } return &DwarfFrameInfos.back(); @@ -457,8 +456,8 @@ void MCStreamer::emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { } -void MCStreamer::emitCFIEndProc() { - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); +void MCStreamer::emitCFIEndProc(SMLoc Loc) { + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; emitCFIEndProcImpl(*CurFrame); @@ -476,191 +475,193 @@ return (MCSymbol *)1; } -void MCStreamer::emitCFIDefCfa(int64_t Register, int64_t Offset) { +void MCStreamer::emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::cfiDefCfa(Label, Register, Offset); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); CurFrame->CurrentCfaRegister = static_cast(Register); } -void MCStreamer::emitCFIDefCfaOffset(int64_t Offset) { +void MCStreamer::emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::cfiDefCfaOffset(Label, Offset); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment) { +void MCStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIDefCfaRegister(int64_t Register) { +void MCStreamer::emitCFIDefCfaRegister(int64_t Register, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createDefCfaRegister(Label, Register); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); CurFrame->CurrentCfaRegister = static_cast(Register); } -void MCStreamer::emitCFIOffset(int64_t Register, int64_t Offset) { +void MCStreamer::emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createOffset(Label, Register, Offset); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIRelOffset(int64_t Register, int64_t Offset) { +void MCStreamer::emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createRelOffset(Label, Register, Offset); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIPersonality(const MCSymbol *Sym, - unsigned Encoding) { - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); +void MCStreamer::emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding, + SMLoc Loc) { + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Personality = Sym; CurFrame->PersonalityEncoding = Encoding; } -void MCStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding) { - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); +void MCStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding, + SMLoc Loc) { + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Lsda = Sym; CurFrame->LsdaEncoding = Encoding; } -void MCStreamer::emitCFIRememberState() { +void MCStreamer::emitCFIRememberState(SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createRememberState(Label); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIRestoreState() { +void MCStreamer::emitCFIRestoreState(SMLoc Loc) { // FIXME: Error if there is no matching cfi_remember_state. MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createRestoreState(Label); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFISameValue(int64_t Register) { +void MCStreamer::emitCFISameValue(int64_t Register, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createSameValue(Label, Register); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIRestore(int64_t Register) { +void MCStreamer::emitCFIRestore(int64_t Register, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createRestore(Label, Register); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIEscape(StringRef Values) { +void MCStreamer::emitCFIEscape(StringRef Values, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createEscape(Label, Values); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIGnuArgsSize(int64_t Size) { +void MCStreamer::emitCFIGnuArgsSize(int64_t Size, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createGnuArgsSize(Label, Size); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFISignalFrame() { - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); +void MCStreamer::emitCFISignalFrame(SMLoc Loc) { + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->IsSignalFrame = true; } -void MCStreamer::emitCFIUndefined(int64_t Register) { +void MCStreamer::emitCFIUndefined(int64_t Register, SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createUndefined(Label, Register); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIRegister(int64_t Register1, int64_t Register2) { +void MCStreamer::emitCFIRegister(int64_t Register1, int64_t Register2, + SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createRegister(Label, Register1, Register2); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIWindowSave() { +void MCStreamer::emitCFIWindowSave(SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createWindowSave(Label); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFINegateRAState() { +void MCStreamer::emitCFINegateRAState(SMLoc Loc) { MCSymbol *Label = emitCFILabel(); MCCFIInstruction Instruction = MCCFIInstruction::createNegateRAState(Label); - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::emitCFIReturnColumn(int64_t Register) { - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); +void MCStreamer::emitCFIReturnColumn(int64_t Register, SMLoc Loc) { + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(Loc); if (!CurFrame) return; CurFrame->RAReg = Register; @@ -967,10 +968,10 @@ void MCStreamer::EmitWindowsUnwindTables() { } -void MCStreamer::Finish() { +void MCStreamer::Finish(SMLoc Loc) { if ((!DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End) || (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) { - getContext().reportError(SMLoc(), "Unfinished frame!"); + getContext().reportError(Loc, "Unfinished frame!"); return; } diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -1162,7 +1162,7 @@ if (needsCFIMoves() == CFI_M_None) return; - OutStreamer->emitCFIBKeyFrame(); + OutStreamer->emitCFIBKeyFrame(SMLoc()); return; } } diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -181,8 +181,8 @@ bool parseDirectiveReq(StringRef Name, SMLoc L); bool parseDirectiveUnreq(SMLoc L); - bool parseDirectiveCFINegateRAState(); - bool parseDirectiveCFIBKeyFrame(); + bool parseDirectiveCFINegateRAState(SMLoc L); + bool parseDirectiveCFIBKeyFrame(SMLoc L); bool parseDirectiveVariantPCS(SMLoc L); @@ -5168,9 +5168,9 @@ else if (IDVal == ".inst") parseDirectiveInst(Loc); else if (IDVal == ".cfi_negate_ra_state") - parseDirectiveCFINegateRAState(); + parseDirectiveCFINegateRAState(Loc); else if (IDVal == ".cfi_b_key_frame") - parseDirectiveCFIBKeyFrame(); + parseDirectiveCFIBKeyFrame(Loc); else if (IDVal == ".arch_extension") parseDirectiveArchExtension(Loc); else if (IDVal == ".variant_pcs") @@ -5637,20 +5637,20 @@ return false; } -bool AArch64AsmParser::parseDirectiveCFINegateRAState() { +bool AArch64AsmParser::parseDirectiveCFINegateRAState(SMLoc L) { if (parseToken(AsmToken::EndOfStatement, "unexpected token in directive")) return true; - getStreamer().emitCFINegateRAState(); + getStreamer().emitCFINegateRAState(L); return false; } /// parseDirectiveCFIBKeyFrame /// ::= .cfi_b_key -bool AArch64AsmParser::parseDirectiveCFIBKeyFrame() { +bool AArch64AsmParser::parseDirectiveCFIBKeyFrame(SMLoc L) { if (parseToken(AsmToken::EndOfStatement, "unexpected token in '.cfi_b_key_frame'")) return true; - getStreamer().emitCFIBKeyFrame(); + getStreamer().emitCFIBKeyFrame(L); return false; } diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp --- a/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -2475,7 +2475,7 @@ int stackGrowth = -RI->getSlotSize(); if (HasActiveDwarfFrame && !hasFP) { - OutStreamer->emitCFIAdjustCfaOffset(-stackGrowth); + OutStreamer->emitCFIAdjustCfaOffset(-stackGrowth, SMLoc()); } // Emit the label. @@ -2486,7 +2486,7 @@ MCInstBuilder(X86::POP32r).addReg(MI->getOperand(0).getReg())); if (HasActiveDwarfFrame && !hasFP) { - OutStreamer->emitCFIAdjustCfaOffset(stackGrowth); + OutStreamer->emitCFIAdjustCfaOffset(stackGrowth, SMLoc()); } return; } diff --git a/llvm/test/MC/X86/cfi-open-within-another-crash.s b/llvm/test/MC/X86/cfi-open-within-another-crash.s --- a/llvm/test/MC/X86/cfi-open-within-another-crash.s +++ b/llvm/test/MC/X86/cfi-open-within-another-crash.s @@ -12,7 +12,7 @@ .globl proc_two proc_two: .cfi_startproc - +# CHECK: [[@LINE-1]]:2: error: starting new .cfi frame before finishing the previous one + .cfi_endproc -# CHECK: error: starting new .cfi frame before finishing the previous one diff --git a/llvm/test/MC/X86/cfi-scope-errors.s b/llvm/test/MC/X86/cfi-scope-errors.s --- a/llvm/test/MC/X86/cfi-scope-errors.s +++ b/llvm/test/MC/X86/cfi-scope-errors.s @@ -3,23 +3,17 @@ .text .cfi_def_cfa rsp, 8 -# CHECK: error: this directive must appear between .cfi_startproc and .cfi_endproc directives +# CHECK: [[@LINE-1]]:1: error: this directive must appear between .cfi_startproc and .cfi_endproc directives .cfi_startproc nop -# TODO(kristina): As Reid suggested, this now supports source locations as a side effect -# of another patch aimed at fixing the crash that would occur here, however the other -# ones do not unfortunately. Will address it in a further patch propogating SMLoc down to -# other CFI directives at which point more LINE checks can be added to ensure proper source -# location reporting. - # This tests source location correctness as well as the error and it not crashing. -# CHECK: [[@LINE+2]]:1: error: starting new .cfi frame before finishing the previous one +# CHECK: [[@LINE+1]]:1: error: starting new .cfi frame before finishing the previous one .cfi_startproc nop .cfi_endproc .cfi_def_cfa rsp, 8 -# CHECK: error: this directive must appear between .cfi_startproc and .cfi_endproc directives +# CHECK: [[@LINE-1]]:1: error: this directive must appear between .cfi_startproc and .cfi_endproc directives diff --git a/llvm/test/MC/X86/cfi-scope-unclosed.s b/llvm/test/MC/X86/cfi-scope-unclosed.s --- a/llvm/test/MC/X86/cfi-scope-unclosed.s +++ b/llvm/test/MC/X86/cfi-scope-unclosed.s @@ -2,9 +2,9 @@ # RUN: -o /dev/null 2>&1 | FileCheck %s ## Check we don't crash on unclosed frame scope. -# CHECK: error: Unfinished frame! .text .globl foo foo: .cfi_startproc +# CHECK: [[@LINE+1]]:1: error: Unfinished frame!