summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR
diff options
context:
space:
mode:
authorKeno Fischer <keno@alumni.harvard.edu>2017-06-01 20:42:44 +0000
committerKeno Fischer <keno@alumni.harvard.edu>2017-06-01 20:42:44 +0000
commit3cdd4935cdde535b63fee1665f931f4c66384261 (patch)
tree037257a98e4b58237e6acbf97b140c13d5f7db38 /llvm/lib/IR
parent56584bbf16d70fbf2f07b5ce1a2fbf15f447abe5 (diff)
downloadbcm5719-llvm-3cdd4935cdde535b63fee1665f931f4c66384261.tar.gz
bcm5719-llvm-3cdd4935cdde535b63fee1665f931f4c66384261.zip
[DIBuilder] Add a more fine-grained finalization method
Summary: Clang wants to clone a function before it is done building the entire compilation unit. As of now, there is no good way to do that, because CloneFunction doesn't like dealing with temporary metadata. However, as long as clang doesn't want to add any variables to this SP, it should be fine to just prematurely finalize it. Add an API to allow this. This is done in preparation of a clang commit to fix the assertion that necessitated the revert of D33655. Reviewers: aprantl, dblaikie Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D33704 llvm-svn: 304467
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/DIBuilder.cpp33
1 files changed, 17 insertions, 16 deletions
diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp
index 7e6f9a7804b..7754ac03b43 100644
--- a/llvm/lib/IR/DIBuilder.cpp
+++ b/llvm/lib/IR/DIBuilder.cpp
@@ -39,6 +39,21 @@ void DIBuilder::trackIfUnresolved(MDNode *N) {
UnresolvedNodes.emplace_back(N);
}
+void DIBuilder::finalizeSubprogram(DISubprogram *SP) {
+ MDTuple *Temp = SP->getVariables().get();
+ if (!Temp || !Temp->isTemporary())
+ return;
+
+ SmallVector<Metadata *, 4> Variables;
+
+ auto PV = PreservedVariables.find(SP);
+ if (PV != PreservedVariables.end())
+ Variables.append(PV->second.begin(), PV->second.end());
+
+ DINodeArray AV = getOrCreateArray(Variables);
+ TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
+}
+
void DIBuilder::finalize() {
if (!CUNode) {
assert(!AllowUnresolvedNodes &&
@@ -62,25 +77,11 @@ void DIBuilder::finalize() {
CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues));
DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
- auto resolveVariables = [&](DISubprogram *SP) {
- MDTuple *Temp = SP->getVariables().get();
- if (!Temp)
- return;
-
- SmallVector<Metadata *, 4> Variables;
-
- auto PV = PreservedVariables.find(SP);
- if (PV != PreservedVariables.end())
- Variables.append(PV->second.begin(), PV->second.end());
-
- DINodeArray AV = getOrCreateArray(Variables);
- TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
- };
for (auto *SP : SPs)
- resolveVariables(SP);
+ finalizeSubprogram(SP);
for (auto *N : RetainValues)
if (auto *SP = dyn_cast<DISubprogram>(N))
- resolveVariables(SP);
+ finalizeSubprogram(SP);
if (!AllGVs.empty())
CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs));
OpenPOWER on IntegriCloud