diff --git a/include/llvm/IR/AutoUpgrade.h b/include/llvm/IR/AutoUpgrade.h index 3f406f0cf19..a186b05d437 100644 --- a/include/llvm/IR/AutoUpgrade.h +++ b/include/llvm/IR/AutoUpgrade.h @@ -51,6 +51,10 @@ namespace llvm { /// module is modified. bool UpgradeModuleFlags(Module &M); + /// This checks for objc retain release marker which should be upgraded. It + /// returns true if module is modified. + bool UpgradeRetainReleaseMarker(Module &M); + void UpgradeSectionAttributes(Module &M); /// If the given TBAA tag uses the scalar TBAA format, create a new node diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 75374e7bef3..1a65cee0bf9 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -4788,6 +4788,9 @@ Error BitcodeReader::materializeModule() { UpgradeDebugInfo(*TheModule); UpgradeModuleFlags(*TheModule); + + UpgradeRetainReleaseMarker(*TheModule); + return Error::success(); } diff --git a/lib/IR/AutoUpgrade.cpp b/lib/IR/AutoUpgrade.cpp index 0cf28c9fd22..1c0a3195a75 100644 --- a/lib/IR/AutoUpgrade.cpp +++ b/lib/IR/AutoUpgrade.cpp @@ -2685,6 +2685,30 @@ bool llvm::UpgradeDebugInfo(Module &M) { return Modified; } +bool llvm::UpgradeRetainReleaseMarker(Module &M) { + bool Changed = false; + NamedMDNode *ModRetainReleaseMarker = + M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker"); + if (ModRetainReleaseMarker) { + MDNode *Op = ModRetainReleaseMarker->getOperand(0); + if (Op) { + MDString *ID = dyn_cast_or_null(Op->getOperand(0)); + if (ID) { + SmallVector ValueComp; + 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; + } + } + } + } + return Changed; +} + bool llvm::UpgradeModuleFlags(Module &M) { NamedMDNode *ModFlags = M.getModuleFlagsMetadata(); if (!ModFlags) diff --git a/test/Bitcode/upgrade-objcretainrelease.ll b/test/Bitcode/upgrade-objcretainrelease.ll new file mode 100644 index 00000000000..5397327f80a --- /dev/null +++ b/test/Bitcode/upgrade-objcretainrelease.ll @@ -0,0 +1,6 @@ +; Test that comment token for objc retain release is upgraded from '#' to ';' +; +; RUN: llvm-dis < %s.bc | FileCheck %s + +; CHECK: "mov\09fp, fp\09\09; marker for objc_retainAutoreleaseReturnValue" + diff --git a/test/Bitcode/upgrade-objcretainrelease.ll.bc b/test/Bitcode/upgrade-objcretainrelease.ll.bc new file mode 100644 index 00000000000..70758ff6bb0 Binary files /dev/null and b/test/Bitcode/upgrade-objcretainrelease.ll.bc differ