[PATCH] D41669: Use ODR debug type uniquing when enabled during function cloning

Teresa Johnson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 23 13:58:51 PST 2018


tejohnson added a comment.

In https://reviews.llvm.org/D41669#982160, @pcc wrote:

> Should we instead change the ValueMapper to call `DICompositeType::buildODRType` if ODR uniquing is enabled?


We could. Confirmed change works instead of the other approach here (same test case). Let me know if you prefer that and I will change this patch.

diff --git a/lib/Transforms/Utils/ValueMapper.cpp b/lib/Transforms/Utils/ValueMapper.cpp
index 8c9ecbc3503..fc36501b145 100644

- a/lib/Transforms/Utils/ValueMapper.cpp

+++ b/lib/Transforms/Utils/ValueMapper.cpp
@@ -25,6 +25,7 @@
 #include "llvm/IR/CallSite.h"
 #include "llvm/IR/Constant.h"
 #include "llvm/IR/Constants.h"
+#include "llvm/IR/DebugInfoMetadata.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/GlobalAlias.h"
@@ -536,13 +537,30 @@ Optional<Metadata *> MDNodeMapper::tryToMapOperand(const Metadata *Op) {

  return None;

}

+static Metadata *cloneOrBuildODR(const MDNode &N) {
+  auto *CT = dyn_cast_or_null<DICompositeType>(&N);
+  if (CT && CT->getIdentifier() != "") {
+    auto *NewCT = DICompositeType::buildODRType(
+        CT->getContext(),
+        *getCanonicalMDString(CT->getContext(), CT->getIdentifier()),
+        CT->getTag(), CT->getRawName(), CT->getFile(), CT->getLine(),
+        CT->getScope(), CT->getBaseType(), CT->getSizeInBits(),
+        CT->getAlignInBits(), CT->getOffsetInBits(), CT->getFlags(),
+        CT->getRawElements(), CT->getRuntimeLang(), CT->getVTableHolder(),
+        CT->getRawTemplateParams());
+    if (NewCT)
+      return NewCT;
+  }
+  return MDNode::replaceWithDistinct(N.clone());
+};
+
 MDNode *MDNodeMapper::mapDistinctNode(const MDNode &N) {

  assert(N.isDistinct() && "Expected a distinct node");
  assert(!M.getVM().getMappedMD(&N) && "Expected an unmapped node");

- DistinctWorklist.push_back(cast<MDNode>(
- (M.Flags & RF_MoveDistinctMDs)
- ? M.mapToSelf(&N)
- : M.mapToMetadata(&N, MDNode::replaceWithDistinct(N.clone()))));

+  DistinctWorklist.push_back(
+      cast<MDNode>((M.Flags & RF_MoveDistinctMDs)
+                       ? M.mapToSelf(&N)
+                       : M.mapToMetadata(&N, cloneOrBuildODR(N))));

  return DistinctWorklist.back();

}


https://reviews.llvm.org/D41669





More information about the llvm-commits mailing list