diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-08-02 20:24:22 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-08-02 20:24:22 +0000 |
commit | 49cb9b88867426d1a430f248550d3cc785a68fe4 (patch) | |
tree | a60af1ce1746ebb5936a94235f418974b0895cba /lib/MC/MCStreamer.cpp | |
parent | 6cdc1f43e6a6dd7ba38a334b0b2f8fa70d4dc4cd (diff) | |
download | llvm-49cb9b88867426d1a430f248550d3cc785a68fe4.tar.gz llvm-49cb9b88867426d1a430f248550d3cc785a68fe4.tar.bz2 llvm-49cb9b88867426d1a430f248550d3cc785a68fe4.tar.xz |
Assume .cfi_startproc is the first thing in a function. If the function is
externally visable, create a local symbol to use in the CFE. If not, use the
function label itself.
Fixes PR10420.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136716 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCStreamer.cpp')
-rw-r--r-- | lib/MC/MCStreamer.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 4a717ed12e..5295d0f58f 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); } |