ahatanak added inline comments.

================
Comment at: include/clang/AST/ASTContext.h:158
+    Expr *CopyExpr;
+    bool CanThrow;
+  };
----------------
rjmccall wrote:
> Using a PointerIntPair in the implementation of this is still a reasonable 
> choice.  Just make it a proper abstraction, with a constructor with the two 
> arguments and getters for the two fields.
I also needed a function that sets the pointer and flag.


================
Comment at: lib/CodeGen/CGBlocks.cpp:1682
+          if (IsCopyHelper && Ctx.getBlockVarCopyInits(Var).CanThrow)
+            Name += "c";
+        }
----------------
rjmccall wrote:
> I don't think you need to add `d` to the name of a copy helper.  It's a bit 
> weird, but while copying a `__block` variable can cause its copy helper to 
> run, destroying it immediately afterwards can never cause its destroy helper 
> to run.  That's because a newly-copied `__block` variable always has a 
> reference count of 2: the new reference in the copy and the forwarding 
> reference from the original.
> 
> I think that means you can just add a single letter which specifies whether 
> the corresponding `__block` variable operation is known to be able to throw.
I added 'd' to the name of the copy helper functions only because IRGen 
generates different code depending on whether the destructor can throw or not.

For example, if I compile the following code with -DTHROWS, IRGen uses 'invoke' 
(which jumps to the terminate block) for the calls to `_Block_object_dispose` 
on the EH path whereas it uses 'call' if the destructor doesn't throw.

```
struct S {
  S();
#ifdef THROWS
  ~S() noexcept(false);
#else
  ~S() noexcept(true);
#endif
  S(const S &);
  int a;
};

void test() {
  __block S s0, s1, s2;
  ^{ (void)s0, (void)s1; (void)s2; };
}
```

It seems like IRGen doesn't have to use 'invoke' when emitting a call to  
`_Block_object_dispose` even when the class has a destructor that can throw, if 
I understood your explanation correctly?


================
Comment at: lib/CodeGen/CGBlocks.cpp:1688
+        if (F == BLOCK_FIELD_IS_BLOCK)
+          Name += "b";
+      }
----------------
rjmccall wrote:
> Why `rb` for a captured block instead of some single-letter thing?  You don't 
> need to emulate the structure of the flags here.
I can use a single letter here, but I'm already using 'b' for byref captures. 
Perhaps I can use 'o' for non-arc objects, instead of 'r', and use 'r' for 
byref?


================
Comment at: lib/CodeGen/CGBlocks.cpp:1705
+                                                          IsVolatile, Ctx);
+      Name += llvm::to_string(Str.size()) + "_" + Str;
+      break;
----------------
rjmccall wrote:
> The underscore is necessary here because non-trivial destructor strings can 
> start with a number?  Worth a comment.
Yes, that's correct.


Repository:
  rC Clang

https://reviews.llvm.org/D50152



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to