summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGObjC.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-06-24 23:21:27 +0000
committerJohn McCall <rjmccall@apple.com>2011-06-24 23:21:27 +0000
commit1bd2556cccdb1336bf05e2e34d2d972ea484046e (patch)
treec1757685102650639bc3d8dc5a15fcc77018152f /clang/lib/CodeGen/CGObjC.cpp
parent6e3dfa6025c301df749adb1251a9ea592bffb391 (diff)
downloadbcm5719-llvm-1bd2556cccdb1336bf05e2e34d2d972ea484046e.tar.gz
bcm5719-llvm-1bd2556cccdb1336bf05e2e34d2d972ea484046e.zip
Honor objc_precise_lifetime in GC mode by feeding the value
in the variable to an inline asm which gets run when the variable goes out of scope. llvm-svn: 133840
Diffstat (limited to 'clang/lib/CodeGen/CGObjC.cpp')
-rw-r--r--clang/lib/CodeGen/CGObjC.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index 9107e9859e5..62ee03c089f 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -2484,4 +2484,22 @@ void CodeGenFunction::EmitObjCAutoreleasePoolStmt(
DI->EmitRegionEnd(Builder);
}
}
+
+/// EmitExtendGCLifetime - Given a pointer to an Objective-C object,
+/// make sure it survives garbage collection until this point.
+void CodeGenFunction::EmitExtendGCLifetime(llvm::Value *object) {
+ // We just use an inline assembly.
+ const llvm::Type *paramTypes[] = { VoidPtrTy };
+ llvm::FunctionType *extenderType
+ = llvm::FunctionType::get(VoidTy, paramTypes, /*variadic*/ false);
+ llvm::Value *extender
+ = llvm::InlineAsm::get(extenderType,
+ /* assembly */ "",
+ /* constraints */ "r",
+ /* side effects */ true);
+
+ object = Builder.CreateBitCast(object, VoidPtrTy);
+ Builder.CreateCall(extender, object)->setDoesNotThrow();
+}
+
CGObjCRuntime::~CGObjCRuntime() {}
OpenPOWER on IntegriCloud