diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index a38a5a46e48..c5c7583f103 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -64,7 +64,7 @@ namespace llvm { void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame); void EnsureValidW64UnwindInfo(); - const MCSymbol* LastNonPrivate; + MCSymbol* LastSymbol; /// SectionStack - This is stack of current and previous section /// values saved by PushSection. diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 4a717ed12e5..5295d0f58f3 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -171,10 +171,7 @@ void MCStreamer::EmitLabel(MCSymbol *Symbol) { assert(!Symbol->isVariable() && "Cannot emit a variable symbol!"); assert(getCurrentSection() && "Cannot emit before setting section!"); Symbol->setSection(*getCurrentSection()); - - StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix(); - if (!Symbol->getName().startswith(Prefix)) - LastNonPrivate = Symbol; + LastSymbol = Symbol; } void MCStreamer::EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding) { @@ -194,9 +191,19 @@ void MCStreamer::EmitCFIStartProc() { if (CurFrame && !CurFrame->End) report_fatal_error("Starting a frame before finishing the previous one!"); MCDwarfFrameInfo Frame; - Frame.Begin = getContext().CreateTempSymbol(); - Frame.Function = LastNonPrivate; - EmitLabel(Frame.Begin); + + Frame.Function = LastSymbol; + + // If the function is externally visible, we need to create a local + // symbol to avoid relocations. + StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix(); + if (LastSymbol->getName().startswith(Prefix)) { + Frame.Begin = LastSymbol; + } else { + Frame.Begin = getContext().CreateTempSymbol(); + EmitLabel(Frame.Begin); + } + FrameInfos.push_back(Frame); } diff --git a/test/CodeGen/X86/pr10420.ll b/test/CodeGen/X86/pr10420.ll new file mode 100644 index 00000000000..3993f24954e --- /dev/null +++ b/test/CodeGen/X86/pr10420.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s -mtriple=x86_64-apple-macosx -disable-cfi | FileCheck %s + +define private void @foo() { + ret void +} + +define void @bar() { + call void @foo() + ret void; +} + +; CHECK: _bar: ## @bar +; CHECK-NEXT: Ltmp2: + +; CHECK: Ltmp12: +; CHECK-NEXT: Ltmp13 = L_foo-Ltmp12 ## FDE initial location +; CHECK-NEXT: .quad Ltmp13 + +; CHECK: Ltmp19: +; CHECK-NEXT: Ltmp20 = Ltmp2-Ltmp19 ## FDE initial location +; CHECK-NEXT: .quad Ltmp20