diff options
author | John McCall <rjmccall@apple.com> | 2011-06-24 23:21:27 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-06-24 23:21:27 +0000 |
commit | 1bd2556cccdb1336bf05e2e34d2d972ea484046e (patch) | |
tree | c1757685102650639bc3d8dc5a15fcc77018152f /clang/lib/CodeGen/CGObjC.cpp | |
parent | 6e3dfa6025c301df749adb1251a9ea592bffb391 (diff) | |
download | bcm5719-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.cpp | 18 |
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() {} |