Add clang.arc.used to ModuleHasARC so ARC always runs if said call is present in a module.

clang.arc.used is an interesting call for ARC since ObjCARCContract
needs to run to remove said intrinsic to avoid a linker error (since the
call does not exist).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178369 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael Gottesman 2013-03-29 21:15:23 +00:00
parent 2a88555e0d
commit 3e9f3a0389
2 changed files with 18 additions and 1 deletions

View File

@ -64,7 +64,8 @@ static inline bool ModuleHasARC(const Module &M) {
M.getNamedValue("objc_copyWeak") || M.getNamedValue("objc_copyWeak") ||
M.getNamedValue("objc_retainedObject") || M.getNamedValue("objc_retainedObject") ||
M.getNamedValue("objc_unretainedObject") || M.getNamedValue("objc_unretainedObject") ||
M.getNamedValue("objc_unretainedPointer"); M.getNamedValue("objc_unretainedPointer") ||
M.getNamedValue("clang.arc.use");
} }
/// \enum InstructionClass /// \enum InstructionClass

View File

@ -0,0 +1,16 @@
; RUN: opt -objc-arc-contract -S < %s | FileCheck %s
; This file makes sure that clang.arc.used is removed even if no other ARC
; interesting calls are in the module.
declare void @clang.arc.use(...) nounwind
; Kill calls to @clang.arc.use(...)
; CHECK: define void @test0(
; CHECK-NOT: clang.arc.use
; CHECK: }
define void @test0(i8* %a, i8* %b) {
call void (...)* @clang.arc.use(i8* %a, i8* %b) nounwind
ret void
}