diff options
| author | Adrian Prantl <aprantl@apple.com> | 2017-05-09 19:47:37 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2017-05-09 19:47:37 +0000 |
| commit | c10d0e5ccd12f049bddb24dcf8bbb7fbbc6c68f2 (patch) | |
| tree | 040042696a2447b6326e2086d645a95c5eca8954 /llvm/include | |
| parent | d979c1f80607eabadf8395ac690daf1b93f24789 (diff) | |
| download | bcm5719-llvm-c10d0e5ccd12f049bddb24dcf8bbb7fbbc6c68f2.tar.gz bcm5719-llvm-c10d0e5ccd12f049bddb24dcf8bbb7fbbc6c68f2.zip | |
Make it illegal for two Functions to point to the same DISubprogram
As recently discussed on llvm-dev [1], this patch makes it illegal for
two Functions to point to the same DISubprogram and updates
FunctionCloner to also clone the debug info of a function to conform
to the new requirement. To simplify the implementation it also factors
out the creation of inlineAt locations from the Inliner into a
general-purpose utility in DILocation.
[1] http://lists.llvm.org/pipermail/llvm-dev/2017-May/112661.html
<rdar://problem/31926379>
Differential Revision: https://reviews.llvm.org/D32975
This reapplies r302469 with a fix for a bot failure (reparentDebugInfo
now checks for the case the orig and new function are identical).
llvm-svn: 302576
Diffstat (limited to 'llvm/include')
| -rw-r--r-- | llvm/include/llvm/IR/DebugLoc.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/include/llvm/IR/DebugLoc.h b/llvm/include/llvm/IR/DebugLoc.h index 202be3da14d..aa74f361cda 100644 --- a/llvm/include/llvm/IR/DebugLoc.h +++ b/llvm/include/llvm/IR/DebugLoc.h @@ -80,6 +80,22 @@ namespace llvm { static DebugLoc get(unsigned Line, unsigned Col, const MDNode *Scope, const MDNode *InlinedAt = nullptr); + enum { ReplaceLastInlinedAt = true }; + /// Rebuild the entire inlined-at chain for this instruction so that the top of + /// the chain now is inlined-at the new call site. + /// \param InlinedAt The new outermost inlined-at in the chain. + /// \param ReplaceLast Replace the last location in the inlined-at chain. + static DebugLoc appendInlinedAt(DebugLoc DL, DILocation *InlinedAt, + LLVMContext &Ctx, + DenseMap<const MDNode *, MDNode *> &Cache, + bool ReplaceLast = false); + + /// Reparent all debug locations referenced by \c I that belong to \c OrigSP + /// to become (possibly indirect) children of \c NewSP. + static void reparentDebugInfo(Instruction &I, DISubprogram *OrigSP, + DISubprogram *NewSP, + DenseMap<const MDNode *, MDNode *> &Cache); + unsigned getLine() const; unsigned getCol() const; MDNode *getScope() const; |

