summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBlocks.cpp
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2018-09-09 05:22:49 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2018-09-09 05:22:49 +0000
commit9bd24527082ff753f43ef4e211013e3c5a0a459e (patch)
tree090190ca4c73eae2a47a9bc6c548b154ac5b8b98 /clang/lib/CodeGen/CGBlocks.cpp
parentc14cb73c545297e8198d199f6cb783f544ac736c (diff)
downloadbcm5719-llvm-9bd24527082ff753f43ef4e211013e3c5a0a459e.tar.gz
bcm5719-llvm-9bd24527082ff753f43ef4e211013e3c5a0a459e.zip
Revert r341754.
The commit broke a couple of bots: http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/12347 http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/7310 llvm-svn: 341757
Diffstat (limited to 'clang/lib/CodeGen/CGBlocks.cpp')
-rw-r--r--clang/lib/CodeGen/CGBlocks.cpp28
1 files changed, 9 insertions, 19 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp
index 507ffec74cc..170e4f0c083 100644
--- a/clang/lib/CodeGen/CGBlocks.cpp
+++ b/clang/lib/CodeGen/CGBlocks.cpp
@@ -493,11 +493,7 @@ static QualType getCaptureFieldType(const CodeGenFunction &CGF,
return CGF.BlockInfo->getCapture(VD).fieldType();
if (auto *FD = CGF.LambdaCaptureFields.lookup(VD))
return FD->getType();
- // If the captured variable is a non-escaping __block variable, the field
- // type is the reference type. If the variable is a __block variable that
- // already has a reference type, the field type is the variable's type.
- return VD->isNonEscapingByref() ?
- CGF.getContext().getLValueReferenceType(VD->getType()) : VD->getType();
+ return VD->getType();
}
/// Compute the layout of the given block. Attempts to lay the block
@@ -553,7 +549,7 @@ static void computeBlockInfo(CodeGenModule &CGM, CodeGenFunction *CGF,
for (const auto &CI : block->captures()) {
const VarDecl *variable = CI.getVariable();
- if (CI.isEscapingByref()) {
+ if (CI.isByRef()) {
// We have to copy/dispose of the __block reference.
info.NeedsCopyDispose = true;
@@ -1036,7 +1032,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
// The lambda capture in a lambda's conversion-to-block-pointer is
// special; we'll simply emit it directly.
src = Address::invalid();
- } else if (CI.isEscapingByref()) {
+ } else if (CI.isByRef()) {
if (BlockInfo && CI.isNested()) {
// We need to use the capture from the enclosing block.
const CGBlockInfo::Capture &enclosingCapture =
@@ -1064,7 +1060,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
// the block field. There's no need to chase the forwarding
// pointer at this point, since we're building something that will
// live a shorter life than the stack byref anyway.
- if (CI.isEscapingByref()) {
+ if (CI.isByRef()) {
// Get a void* that points to the byref struct.
llvm::Value *byrefPointer;
if (CI.isNested())
@@ -1283,7 +1279,8 @@ RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr *E,
return EmitCall(FnInfo, Callee, ReturnValue, Args);
}
-Address CodeGenFunction::GetAddrOfBlockDecl(const VarDecl *variable) {
+Address CodeGenFunction::GetAddrOfBlockDecl(const VarDecl *variable,
+ bool isByRef) {
assert(BlockInfo && "evaluating block ref without block information?");
const CGBlockInfo::Capture &capture = BlockInfo->getCapture(variable);
@@ -1294,7 +1291,7 @@ Address CodeGenFunction::GetAddrOfBlockDecl(const VarDecl *variable) {
Builder.CreateStructGEP(LoadBlockStruct(), capture.getIndex(),
capture.getOffset(), "block.capture.addr");
- if (variable->isEscapingByref()) {
+ if (isByRef) {
// addr should be a void** right now. Load, then cast the result
// to byref*.
@@ -1308,10 +1305,6 @@ Address CodeGenFunction::GetAddrOfBlockDecl(const VarDecl *variable) {
variable->getName());
}
- assert((!variable->isNonEscapingByref() ||
- capture.fieldType()->isReferenceType()) &&
- "the capture field of a non-escaping variable should have a "
- "reference type");
if (capture.fieldType()->isReferenceType())
addr = EmitLoadOfReference(MakeAddrLValue(addr, capture.fieldType()));
@@ -1663,7 +1656,7 @@ computeCopyInfoForBlockCapture(const BlockDecl::Capture &CI, QualType T,
return std::make_pair(BlockCaptureEntityKind::CXXRecord, BlockFieldFlags());
}
BlockFieldFlags Flags;
- if (CI.isEscapingByref()) {
+ if (CI.isByRef()) {
Flags = BLOCK_FIELD_IS_BYREF;
if (T.isObjCGCWeak())
Flags |= BLOCK_FIELD_IS_WEAK;
@@ -2109,7 +2102,7 @@ getBlockFieldFlagsForObjCObjectPointer(const BlockDecl::Capture &CI,
static std::pair<BlockCaptureEntityKind, BlockFieldFlags>
computeDestroyInfoForBlockCapture(const BlockDecl::Capture &CI, QualType T,
const LangOptions &LangOpts) {
- if (CI.isEscapingByref()) {
+ if (CI.isByRef()) {
BlockFieldFlags Flags = BLOCK_FIELD_IS_BYREF;
if (T.isObjCGCWeak())
Flags |= BLOCK_FIELD_IS_WEAK;
@@ -2571,9 +2564,6 @@ BlockByrefHelpers *
CodeGenFunction::buildByrefHelpers(llvm::StructType &byrefType,
const AutoVarEmission &emission) {
const VarDecl &var = *emission.Variable;
- assert(var.isEscapingByref() &&
- "only escaping __block variables need byref helpers");
-
QualType type = var.getType();
auto &byrefInfo = getBlockByrefInfo(&var);
OpenPOWER on IntegriCloud