From 74195b2df3785ef2c7cedbbfc5e5784f6f5b7d46 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 14 Jan 2015 01:20:27 +0000 Subject: [PATCH] Utils: Add mapping for uniqued MDLocations Still doesn't handle distinct ones. Part of PR21433. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225914 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/ValueMapper.cpp | 26 +++++++++++++++++++++++--- test/Linker/Inputs/mdlocation.ll | 10 ++++++++++ test/Linker/mdlocation.ll | 27 +++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 test/Linker/Inputs/mdlocation.ll create mode 100644 test/Linker/mdlocation.ll diff --git a/lib/Transforms/Utils/ValueMapper.cpp b/lib/Transforms/Utils/ValueMapper.cpp index 825aee66964..533b265ef04 100644 --- a/lib/Transforms/Utils/ValueMapper.cpp +++ b/lib/Transforms/Utils/ValueMapper.cpp @@ -219,8 +219,8 @@ static bool shouldRemapUniquedNode(const UniquableMDNode *Node, return false; } -static Metadata *cloneMDTuple(const UniquableMDNode *Node, - ValueToValueMapTy &VM, RemapFlags Flags, +static Metadata *cloneMDTuple(const MDTuple *Node, ValueToValueMapTy &VM, + RemapFlags Flags, ValueMapTypeRemapper *TypeMapper, ValueMaterializer *Materializer) { SmallVector Elts; @@ -232,6 +232,16 @@ static Metadata *cloneMDTuple(const UniquableMDNode *Node, return MDTuple::get(Node->getContext(), Elts); } +static Metadata *cloneMDLocation(const MDLocation *Node, ValueToValueMapTy &VM, + RemapFlags Flags, + ValueMapTypeRemapper *TypeMapper, + ValueMaterializer *Materializer) { + return MDLocation::get( + Node->getContext(), Node->getLine(), Node->getColumn(), + mapMetadataOp(Node->getScope(), VM, Flags, TypeMapper, Materializer), + mapMetadataOp(Node->getInlinedAt(), VM, Flags, TypeMapper, Materializer)); +} + /// \brief Map a uniqued MDNode. /// /// Uniqued nodes may not need to be recreated (they may map to themselves). @@ -254,7 +264,17 @@ static Metadata *mapUniquedNode(const UniquableMDNode *Node, } // At least one operand needs remapping. - Metadata *NewMD = cloneMDTuple(Node, VM, Flags, TypeMapper, Materializer); + Metadata *NewMD; + switch (Node->getMetadataID()) { + default: + llvm_unreachable("Invalid UniquableMDNode subclass"); +#define HANDLE_UNIQUABLE_LEAF(CLASS) \ + case Metadata::CLASS##Kind: \ + NewMD = \ + clone##CLASS(cast(Node), VM, Flags, TypeMapper, Materializer); \ + break; +#include "llvm/IR/Metadata.def" + } Dummy->replaceAllUsesWith(NewMD); MDNode::deleteTemporary(Dummy); return mapToMetadata(VM, Node, NewMD); diff --git a/test/Linker/Inputs/mdlocation.ll b/test/Linker/Inputs/mdlocation.ll new file mode 100644 index 00000000000..b01b459b933 --- /dev/null +++ b/test/Linker/Inputs/mdlocation.ll @@ -0,0 +1,10 @@ +!named = !{!0, !1, !2, !3, !4, !5, !6, !7} + +!0 = !{} ; Use this as a scope. +!1 = !MDLocation(line: 3, column: 7, scope: !0) +!2 = !MDLocation(line: 3, column: 7, scope: !0, inlinedAt: !1) +!3 = !MDLocation(line: 3, column: 7, scope: !0, inlinedAt: !2) +!4 = distinct !{} ; Test actual remapping. +!5 = !MDLocation(line: 3, column: 7, scope: !4) +!6 = !MDLocation(line: 3, column: 7, scope: !4, inlinedAt: !5) +!7 = !MDLocation(line: 3, column: 7, scope: !4, inlinedAt: !6) diff --git a/test/Linker/mdlocation.ll b/test/Linker/mdlocation.ll new file mode 100644 index 00000000000..0b949d836fe --- /dev/null +++ b/test/Linker/mdlocation.ll @@ -0,0 +1,27 @@ +; RUN: llvm-link %s %S/Inputs/mdlocation.ll -o - -S | FileCheck %s + +; Test that MDLocations are remapped properly. + +; CHECK: !named = !{!0, !1, !2, !3, !4, !5, !6, !7, !0, !1, !2, !3, !8, !9, !10, !11} +!named = !{!0, !1, !2, !3, !4, !5, !6, !7} + +; CHECK: !0 = !{} +; CHECK-NEXT: !1 = !MDLocation(line: 3, column: 7, scope: !0) +; CHECK-NEXT: !2 = !MDLocation(line: 3, column: 7, scope: !0, inlinedAt: !1) +; CHECK-NEXT: !3 = !MDLocation(line: 3, column: 7, scope: !0, inlinedAt: !2) +; CHECK-NEXT: !4 = distinct !{} +; CHECK-NEXT: !5 = !MDLocation(line: 3, column: 7, scope: !4) +; CHECK-NEXT: !6 = !MDLocation(line: 3, column: 7, scope: !4, inlinedAt: !5) +; CHECK-NEXT: !7 = !MDLocation(line: 3, column: 7, scope: !4, inlinedAt: !6) +; CHECK-NEXT: !8 = distinct !{} +; CHECK-NEXT: !9 = !MDLocation(line: 3, column: 7, scope: !8) +; CHECK-NEXT: !10 = !MDLocation(line: 3, column: 7, scope: !8, inlinedAt: !9) +; CHECK-NEXT: !11 = !MDLocation(line: 3, column: 7, scope: !8, inlinedAt: !10) +!0 = !{} ; Use this as a scope. +!1 = !MDLocation(line: 3, column: 7, scope: !0) +!2 = !MDLocation(line: 3, column: 7, scope: !0, inlinedAt: !1) +!3 = !MDLocation(line: 3, column: 7, scope: !0, inlinedAt: !2) +!4 = distinct !{} ; Test actual remapping. +!5 = !MDLocation(line: 3, column: 7, scope: !4) +!6 = !MDLocation(line: 3, column: 7, scope: !4, inlinedAt: !5) +!7 = !MDLocation(line: 3, column: 7, scope: !4, inlinedAt: !6)