[llvm] r358047 - [ObjC][ARC] Convert the retainRV marker that is passed as a named

Akira Hatanaka via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 9 23:20:20 PDT 2019


Author: ahatanak
Date: Tue Apr  9 23:20:20 2019
New Revision: 358047

URL: http://llvm.org/viewvc/llvm-project?rev=358047&view=rev
Log:
[ObjC][ARC] Convert the retainRV marker that is passed as a named
metadata into a module flag in the auto-upgrader and make the ARC
contract pass read the marker as a module flag.

This is needed to fix a bug where ARC contract wasn't inserting the
retainRV marker when LTO was enabled, which caused objects returned
from a function to be auto-released.

rdar://problem/49464214

Differential Revision: https://reviews.llvm.org/D60303

Modified:
    llvm/trunk/lib/IR/AutoUpgrade.cpp
    llvm/trunk/lib/Transforms/ObjCARC/ObjCARCContract.cpp
    llvm/trunk/test/Bitcode/upgrade-objcretainrelease.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-marker-funclet.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-marker.ll
    llvm/trunk/test/Transforms/ObjCARC/contract-testcases.ll

Modified: llvm/trunk/lib/IR/AutoUpgrade.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AutoUpgrade.cpp?rev=358047&r1=358046&r2=358047&view=diff
==============================================================================
--- llvm/trunk/lib/IR/AutoUpgrade.cpp (original)
+++ llvm/trunk/lib/IR/AutoUpgrade.cpp Tue Apr  9 23:20:20 2019
@@ -3765,8 +3765,8 @@ bool llvm::UpgradeDebugInfo(Module &M) {
 
 bool llvm::UpgradeRetainReleaseMarker(Module &M) {
   bool Changed = false;
-  NamedMDNode *ModRetainReleaseMarker =
-      M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker");
+  const char *MarkerKey = "clang.arc.retainAutoreleasedReturnValueMarker";
+  NamedMDNode *ModRetainReleaseMarker = M.getNamedMetadata(MarkerKey);
   if (ModRetainReleaseMarker) {
     MDNode *Op = ModRetainReleaseMarker->getOperand(0);
     if (Op) {
@@ -3776,11 +3776,11 @@ bool llvm::UpgradeRetainReleaseMarker(Mo
         ID->getString().split(ValueComp, "#");
         if (ValueComp.size() == 2) {
           std::string NewValue = ValueComp[0].str() + ";" + ValueComp[1].str();
-          Metadata *Ops[1] = {MDString::get(M.getContext(), NewValue)};
-          ModRetainReleaseMarker->setOperand(0,
-                                             MDNode::get(M.getContext(), Ops));
-          Changed = true;
+          ID = MDString::get(M.getContext(), NewValue);
         }
+        M.addModuleFlag(Module::Error, MarkerKey, ID);
+        M.eraseNamedMetadata(ModRetainReleaseMarker);
+        Changed = true;
       }
     }
   }

Modified: llvm/trunk/lib/Transforms/ObjCARC/ObjCARCContract.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/ObjCARC/ObjCARCContract.cpp?rev=358047&r1=358046&r2=358047&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/ObjCARC/ObjCARCContract.cpp (original)
+++ llvm/trunk/lib/Transforms/ObjCARC/ObjCARCContract.cpp Tue Apr  9 23:20:20 2019
@@ -744,15 +744,8 @@ bool ObjCARCContract::doInitialization(M
   EP.init(&M);
 
   // Initialize RVInstMarker.
-  RVInstMarker = nullptr;
-  if (NamedMDNode *NMD =
-          M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker"))
-    if (NMD->getNumOperands() == 1) {
-      const MDNode *N = NMD->getOperand(0);
-      if (N->getNumOperands() == 1)
-        if (const MDString *S = dyn_cast<MDString>(N->getOperand(0)))
-          RVInstMarker = S;
-    }
+  const char *MarkerKey = "clang.arc.retainAutoreleasedReturnValueMarker";
+  RVInstMarker = dyn_cast_or_null<MDString>(M.getModuleFlag(MarkerKey));
 
   return false;
 }

Modified: llvm/trunk/test/Bitcode/upgrade-objcretainrelease.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bitcode/upgrade-objcretainrelease.ll?rev=358047&r1=358046&r2=358047&view=diff
==============================================================================
--- llvm/trunk/test/Bitcode/upgrade-objcretainrelease.ll (original)
+++ llvm/trunk/test/Bitcode/upgrade-objcretainrelease.ll Tue Apr  9 23:20:20 2019
@@ -2,5 +2,5 @@
 ;
 ; RUN: llvm-dis < %s.bc | FileCheck %s
 
-; CHECK: "mov\09fp, fp\09\09; marker for objc_retainAutoreleaseReturnValue"
-
+; CHECK: !llvm.module.flags = !{!0}
+; CHECK: !0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov\09fp, fp\09\09; marker for objc_retainAutoreleaseReturnValue"}

Modified: llvm/trunk/test/Transforms/ObjCARC/contract-marker-funclet.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ObjCARC/contract-marker-funclet.ll?rev=358047&r1=358046&r2=358047&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ObjCARC/contract-marker-funclet.ll (original)
+++ llvm/trunk/test/Transforms/ObjCARC/contract-marker-funclet.ll Tue Apr  9 23:20:20 2019
@@ -48,8 +48,9 @@ declare dllimport i8* @llvm.objc.retainA
 
 declare dllimport void @llvm.objc.release(i8*)
 
-!clang.arc.retainAutoreleasedReturnValueMarker = !{!0}
-!0 = !{!"movl\09%ebp, %ebp\09\09// marker for objc_retainAutoreleaseReturnValue"}
+!llvm.module.flags = !{!0}
+
+!0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"movl\09%ebp, %ebp\09\09// marker for objc_retainAutoreleaseReturnValue"}
 
 ; CHECK-LABEL: catch
 ; CHECK: call void asm sideeffect "movl{{.*}}%ebp, %ebp{{.*}}", ""() [ "funclet"(token %1) ]

Modified: llvm/trunk/test/Transforms/ObjCARC/contract-marker.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ObjCARC/contract-marker.ll?rev=358047&r1=358046&r2=358047&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ObjCARC/contract-marker.ll (original)
+++ llvm/trunk/test/Transforms/ObjCARC/contract-marker.ll Tue Apr  9 23:20:20 2019
@@ -38,8 +38,8 @@ declare i8* @llvm.objc.retainAutorelease
 declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
 declare void @bar(i8*)
 
-!clang.arc.retainAutoreleasedReturnValueMarker = !{!0}
+!llvm.module.flags = !{!0}
 
-!0 = !{!"mov\09r7, r7\09\09@ marker for return value optimization"}
+!0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov\09r7, r7\09\09@ marker for return value optimization"}
 
 ; CHECK: attributes [[NUW]] = { nounwind }

Modified: llvm/trunk/test/Transforms/ObjCARC/contract-testcases.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ObjCARC/contract-testcases.ll?rev=358047&r1=358046&r2=358047&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/ObjCARC/contract-testcases.ll (original)
+++ llvm/trunk/test/Transforms/ObjCARC/contract-testcases.ll Tue Apr  9 23:20:20 2019
@@ -87,9 +87,9 @@ lpad:
   resume { i8*, i32 } undef
 }
 
-!clang.arc.retainAutoreleasedReturnValueMarker = !{!0}
+!llvm.module.flags = !{!0}
 
-!0 = !{!"mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue"}
+!0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov\09r7, r7\09\09@ marker for objc_retainAutoreleaseReturnValue"}
 
 ; CHECK: attributes #0 = { optsize }
 ; CHECK: attributes [[NUW]] = { nounwind }




More information about the llvm-commits mailing list