[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