diff --git a/include/llvm/MC/MCObjectStreamer.h b/include/llvm/MC/MCObjectStreamer.h index 71354477b33..0866ff5a9fc 100644 --- a/include/llvm/MC/MCObjectStreamer.h +++ b/include/llvm/MC/MCObjectStreamer.h @@ -41,8 +41,7 @@ class MCObjectStreamer : public MCStreamer { SmallVector PendingLabels; virtual void EmitInstToData(const MCInst &Inst, const MCSubtargetInfo&) = 0; - void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame, - MCSymbol *FuncSym) override; + void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override; // If any labels have been emitted but not assigned fragments, ensure that diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 7303bc9dc6c..5cded5cfff9 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -198,7 +198,7 @@ class MCStreamer { protected: MCStreamer(MCContext &Ctx); - virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame, MCSymbol *FuncSym); + virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame); virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame); WinEH::FrameInfo *getCurrentWinFrameInfo() { @@ -661,7 +661,7 @@ public: virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID); virtual void EmitCFISections(bool EH, bool Debug); - void EmitCFIStartProc(bool IsSimple, MCSymbol *FuncSym); + void EmitCFIStartProc(bool IsSimple); void EmitCFIEndProc(); virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset); virtual void EmitCFIDefCfaOffset(int64_t Offset); diff --git a/lib/CodeGen/AsmPrinter/ARMException.cpp b/lib/CodeGen/AsmPrinter/ARMException.cpp index e79ede9a5ae..251f5effd6b 100644 --- a/lib/CodeGen/AsmPrinter/ARMException.cpp +++ b/lib/CodeGen/AsmPrinter/ARMException.cpp @@ -66,7 +66,7 @@ void ARMException::beginFunction(const MachineFunction *MF) { "non-EH CFI not yet supported in prologue with EHABI lowering"); if (MoveType == AsmPrinter::CFI_M_Debug) { shouldEmitCFI = true; - Asm->OutStreamer.EmitCFIStartProc(false, Asm->CurrentFnSym); + Asm->OutStreamer.EmitCFIStartProc(false); } } diff --git a/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp b/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp index b8051fee9fa..74215aa695d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp @@ -102,7 +102,7 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) { if (!shouldEmitPersonality && !shouldEmitMoves) return; - Asm->OutStreamer.EmitCFIStartProc(/*IsSimple=*/false, Asm->CurrentFnSym); + Asm->OutStreamer.EmitCFIStartProc(/*IsSimple=*/false); // Indicate personality routine, if any. if (!shouldEmitPersonality) diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 9e100333e9b..f60c7fc5041 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -54,8 +54,7 @@ private: unsigned UseDwarfDirectory : 1; void EmitRegisterName(int64_t Register); - void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame, - MCSymbol *FuncSym) override; + void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override; public: @@ -926,8 +925,7 @@ void MCAsmStreamer::EmitCFISections(bool EH, bool Debug) { EmitEOL(); } -void MCAsmStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame, - MCSymbol *FuncSym) { +void MCAsmStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { OS << "\t.cfi_startproc"; if (Frame.IsSimple) OS << " simple"; diff --git a/lib/MC/MCObjectStreamer.cpp b/lib/MC/MCObjectStreamer.cpp index 17371a28508..21e68678e75 100644 --- a/lib/MC/MCObjectStreamer.cpp +++ b/lib/MC/MCObjectStreamer.cpp @@ -128,13 +128,10 @@ void MCObjectStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, DF->getContents().resize(DF->getContents().size() + Size, 0); } -void MCObjectStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame, - MCSymbol *FuncSym) { - if (!FuncSym) { - FuncSym = getContext().CreateTempSymbol(); - EmitLabel(FuncSym); - } - Frame.Begin = FuncSym; +void MCObjectStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { + // We need to create a local symbol to avoid relocations. + Frame.Begin = getContext().CreateTempSymbol(); + EmitLabel(Frame.Begin); } void MCObjectStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) { diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 5a56094a3c7..de7d96129f1 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -172,9 +172,6 @@ private: /// \brief Are we parsing ms-style inline assembly? bool ParsingInlineAsm; - /// \brief The last symbol we emitted, used for call frame information. - MCSymbol *LastFuncSymbol; - public: AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out, const MCAsmInfo &MAI); @@ -494,8 +491,7 @@ AsmParser::AsmParser(SourceMgr &_SM, MCContext &_Ctx, MCStreamer &_Out, : Lexer(_MAI), Ctx(_Ctx), Out(_Out), MAI(_MAI), SrcMgr(_SM), PlatformParser(nullptr), CurBuffer(_SM.getMainFileID()), MacrosEnabledFlag(true), HadError(false), CppHashLineNumber(0), - AssemblerDialect(~0U), IsDarwin(false), ParsingInlineAsm(false), - LastFuncSymbol(nullptr) { + AssemblerDialect(~0U), IsDarwin(false), ParsingInlineAsm(false) { // Save the old handler. SavedDiagHandler = SrcMgr.getDiagHandler(); SavedDiagContext = SrcMgr.getDiagContext(); @@ -1309,9 +1305,6 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, if (!ParsingInlineAsm) Out.EmitLabel(Sym); - // Record the symbol, so that it can be used for call frame information - LastFuncSymbol = Sym; - // If we are generating dwarf for assembly source files then gather the // info to make a dwarf label entry for this label if needed. if (getContext().getGenDwarfForAssembly()) @@ -2968,7 +2961,7 @@ bool AsmParser::parseDirectiveCFIStartProc() { if (parseIdentifier(Simple) || Simple != "simple") return TokError("unexpected token in .cfi_startproc directive"); - getStreamer().EmitCFIStartProc(!Simple.empty(), LastFuncSymbol); + getStreamer().EmitCFIStartProc(!Simple.empty()); return false; } diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 23e816c24bf..f11ee669b4b 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -211,14 +211,14 @@ void MCStreamer::EmitCFISections(bool EH, bool Debug) { assert(EH || Debug); } -void MCStreamer::EmitCFIStartProc(bool IsSimple, MCSymbol *FuncSym) { +void MCStreamer::EmitCFIStartProc(bool IsSimple) { MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); if (CurFrame && !CurFrame->End) report_fatal_error("Starting a frame before finishing the previous one!"); MCDwarfFrameInfo Frame; Frame.IsSimple = IsSimple; - EmitCFIStartProcImpl(Frame, FuncSym); + EmitCFIStartProcImpl(Frame); const MCAsmInfo* MAI = Context.getAsmInfo(); if (MAI) { @@ -233,8 +233,8 @@ void MCStreamer::EmitCFIStartProc(bool IsSimple, MCSymbol *FuncSym) { DwarfFrameInfos.push_back(Frame); } -void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame, - MCSymbol *FuncSym) {} +void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { +} void MCStreamer::EmitCFIEndProc() { EnsureValidDwarfFrame(); diff --git a/test/DebugInfo/AArch64/eh_frame.s b/test/DebugInfo/AArch64/eh_frame.s index 75b036eac26..12a58961d71 100644 --- a/test/DebugInfo/AArch64/eh_frame.s +++ b/test/DebugInfo/AArch64/eh_frame.s @@ -1,6 +1,5 @@ // RUN: llvm-mc -triple aarch64-none-linux-gnu -filetype=obj %s -o %t -// RUN: llvm-objdump -s %t | FileCheck %s --check-prefix=CHECK -// RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELOC +// RUN: llvm-objdump -s %t | FileCheck %s .text .globl foo .type foo,@function @@ -47,11 +46,3 @@ foo: // 00000000: PC begin for this FDE is at 00000000 (relocation is applied here) // 04000000: FDE applies up to PC begin+0x14 // 00: Augmentation string length 0 for this FDE - - -// Check the relocations applied to the .eh_frame section. -// These must not contain section-relative relocations to a section which -// is part of a group, as it could be removed. -// RELOC: Section ({{[0-9]+}}) .rela.eh_frame { -// RELOC-NEXT: 0x{{[0-9A-F]+}} R_AARCH64_PREL32 foo 0x0 -// RELOC-NEXT: } diff --git a/test/DebugInfo/AArch64/eh_frame_personality.ll b/test/DebugInfo/AArch64/eh_frame_personality.ll index 0cc53a810e9..51d6bf80b95 100644 --- a/test/DebugInfo/AArch64/eh_frame_personality.ll +++ b/test/DebugInfo/AArch64/eh_frame_personality.ll @@ -1,6 +1,5 @@ ; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu %s -filetype=obj -o %t -; RUN: llvm-objdump -s %t | FileCheck %s --check-prefix=CHECK -; RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELOC +; RUN: llvm-objdump -s %t | FileCheck %s declare i32 @__gxx_personality_v0(...) @@ -45,12 +44,3 @@ clean: ; 00: Second part of aug (language-specific data): absolute pointer format used ; 1b: pointer format: pc-relative signed 4-byte. Just like GNU. ; 0c 1f 00: Initial instructions ("DW_CFA_def_cfa x31 ofs 0" in this case) - -; Check the relocations applied to the .eh_frame section. -; These must not contain section-relative relocations to a section which -; is part of a group, as it could be removed. -; RELOC: Section ({{[0-9]+}}) .rela.eh_frame { -; RELOC-NEXT: 0x{{[0-9A-F]+}} R_AARCH64_ABS64 __gxx_personality_v0 0x0 -; RELOC-NEXT: 0x{{[0-9A-F]+}} R_AARCH64_PREL32 foo 0x0 -; RELOC-NEXT: 0x{{[0-9A-F]+}} R_AARCH64_ABS64 .gcc_except_table 0x0 -; RELOC-NEXT: }