[PATCH] D52440: Emit lifetime markers for temporary function parameter aggregates

John McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 14 13:35:25 PST 2018


rjmccall added a comment.

In https://reviews.llvm.org/D52440#1298816, @itessier wrote:

> > This is problematic because we're not necessarily in a scope that usefully limits the duration of cleanups — we don't push full-expression scopes when emitting an arbitrary statement. Probably we should, but we don't.
>
>
>
> > If you'd like to take a look at solving that problem first, that would be great.
>
> Sure I'd like to take a look at this, but I'm not familiar with the code gen module. Can you point me to where I should start looking to understand and figure out where to add scopes?


It's not as well documented as I'd like.  The main bits of infrastructure to understand are `CodeGenFunction::RunCleanupsScope` and the basic mechanics of pushing/popping cleanups in `CGCleanups`.  Then the basic idea is that you want to find a way to push a scope around any sort of "top-level" expression emission (i.e. whenever we emit an expression that isn't part of an outer full-expression — which is a language concept you might need to look up).  Fortunately, that's largely taken care of already because we have an `ExprWithCleanups` node that we create in Sema whenever there are certain kinds of semantic cleanups in a full-expression, and all the top-level places that emit expressions are probably already looking for that node to treat it specially.  (As an example of that, look for the call to `enterFullExpression` in `CodeGenFunction::EmitScalarInit`.

So the general guidelines for the patch are:

1. Introduce a `EmitIgnoredFullExpression` function that checks for `ExprWithCleanups`, calls `enterFullExpression` if necessary, pushes a scope, and then calls `EmitIgnoredExpr`.

2. Change the expression case of `CodeGenFunction::EmitStmt` to call `EmitIgnoredFullExpression`.  1+2 should be a stable intermediate point where you can fix any test changes and submit a patch.

3. Change the general emission cases for `ExprWithCleanups` to unconditionally assert.  (This means the case in `EmitLValue`, the cases in `CGExprScalar`, `CGExprComplex`, and `CGExprAgg`, and maybe a few others.)  The idea here is that *nothing* should be relying for correctness on just encountering an `ExprWithCleanups` at an arbitrary position within the expression tree — they should all be pushing scopes anyway, and as part of that they all need to be checking for `ExprWithCleanups`, so they should never just find it alone.

4. Deal with any ramifications of (3).

5. Look at all the uses of `ExprWithCleanups` / `enterFullExpression` in CodeGen to make sure that they indeed unconditionally push a scope around expression-emission.

At that point, we should be reasonably confident that we're actually pushing scopes around every expression emission.


Repository:
  rC Clang

https://reviews.llvm.org/D52440





More information about the cfe-commits mailing list