[PATCH] D18583: Cloning: Reduce complexity of debug info cloning and fix correctness issue.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 30 15:10:44 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL264935: Cloning: Reduce complexity of debug info cloning and fix correctness issue. (authored by pcc).

Changed prior to commit:
  http://reviews.llvm.org/D18583?vs=52124&id=52136#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D18583

Files:
  llvm/trunk/include/llvm/Transforms/Utils/Cloning.h
  llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
  llvm/trunk/lib/Transforms/Utils/CloneModule.cpp
  llvm/trunk/unittests/Transforms/Utils/Cloning.cpp

Index: llvm/trunk/include/llvm/Transforms/Utils/Cloning.h
===================================================================
--- llvm/trunk/include/llvm/Transforms/Utils/Cloning.h
+++ llvm/trunk/include/llvm/Transforms/Utils/Cloning.h
@@ -130,11 +130,6 @@
                         bool ModuleLevelChanges,
                         ClonedCodeInfo *CodeInfo = nullptr);
 
-/// Clone the module-level debug info associated with OldFunc. The cloned data
-/// will point to NewFunc instead.
-void CloneDebugInfoMetadata(Function *NewFunc, const Function *OldFunc,
-                            ValueToValueMapTy &VMap);
-
 /// Clone OldFunc into NewFunc, transforming the old arguments into references
 /// to VMap values.  Note that if NewFunc already has basic blocks, the ones
 /// cloned into it will be added to the end of the function.  This function
Index: llvm/trunk/lib/Transforms/Utils/CloneModule.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/CloneModule.cpp
+++ llvm/trunk/lib/Transforms/Utils/CloneModule.cpp
@@ -138,7 +138,6 @@
         VMap[&*J] = &*DestI++;
       }
 
-      CloneDebugInfoMetadata(F, &*I, VMap);
       SmallVector<ReturnInst*, 8> Returns;  // Ignore returns cloned.
       CloneFunctionInto(F, &*I, VMap, /*ModuleLevelChanges=*/true, Returns);
     }
Index: llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
+++ llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
@@ -119,6 +119,15 @@
           .addAttributes(NewFunc->getContext(), AttributeSet::FunctionIndex,
                          OldAttrs.getFnAttributes()));
 
+  SmallVector<std::pair<unsigned, MDNode *>, 1> MDs;
+  OldFunc->getAllMetadata(MDs);
+  for (auto MD : MDs)
+    NewFunc->setMetadata(
+        MD.first,
+        MapMetadata(MD.second, VMap,
+                    ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges,
+                    TypeMapper, Materializer));
+
   // Loop over all of the basic blocks in the function, cloning them as
   // appropriate.  Note that we save BE this way in order to handle cloning of
   // recursive functions into themselves.
@@ -187,8 +196,8 @@
 
 // Clone the module-level debug info associated with OldFunc. The cloned data
 // will point to NewFunc instead.
-void llvm::CloneDebugInfoMetadata(Function *NewFunc, const Function *OldFunc,
-                                  ValueToValueMapTy &VMap) {
+static void CloneDebugInfoMetadata(Function *NewFunc, const Function *OldFunc,
+                                   ValueToValueMapTy &VMap) {
   DebugInfoFinder Finder;
   Finder.processModule(*OldFunc->getParent());
 
Index: llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
===================================================================
--- llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
+++ llvm/trunk/unittests/Transforms/Utils/Cloning.cpp
@@ -464,6 +464,12 @@
   EXPECT_FALSE(verifyModule(*NewM));
 }
 
+TEST_F(CloneModule, OldModuleUnchanged) {
+  DebugInfoFinder Finder;
+  Finder.processModule(*OldM);
+  EXPECT_EQ(1U, Finder.subprogram_count());
+}
+
 TEST_F(CloneModule, Subprogram) {
   Function *NewF = NewM->getFunction("f");
   DISubprogram *SP = NewF->getSubprogram();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18583.52136.patch
Type: text/x-patch
Size: 3321 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160330/36e4ca7c/attachment.bin>


More information about the llvm-commits mailing list