mboehme marked 5 inline comments as done.
mboehme added inline comments.

================
Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:307-311
+      auto &ParamLoc =
+          createStorageLocation(ParamDecl->getType().getNonReferenceType());
       setStorageLocation(*ParamDecl, ParamLoc);
-      if (Value *ParamVal = createValue(ParamDecl->getType()))
-        setValue(ParamLoc, *ParamVal);
+      if (Value *ParamVal =
+              createValue(ParamDecl->getType().getNonReferenceType()))
----------------
ymandel wrote:
> Maybe comment as to why we're not use the `VarDecl` overloads of 
> `createStorageLocation` and why we're specifically using 
> `getNonReferenceType` for `createValue`.
Added comment on the `getNonReferenceType()`.

As to why we're not using the `VarDecl` overload -- it's really just because we 
don't need the "stable" location behavior here. Wasn't sure if this rises to 
the level of needing to be addressed in a comment, so I've left it out for now. 
WDYT?


================
Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:616
+  bool erased = DeclToLoc.erase(&D);
+  if (!erased)
+    D.dump();
----------------
xazax.hun wrote:
> Would we dump this in release builds? Do we want to limit this to 
> debug/assert builds?
True, we'd want to do this only in debug builds. For simplicity, I've taken out 
the `dump` entirely -- it's easy enough to add back if we do actually encounter 
assertion failures here.


================
Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:631
+
+  assert(dyn_cast_or_null<ReferenceValue>(getValue(*Loc)) == nullptr);
+
----------------
ymandel wrote:
> would `isa_and_nonnull` work?
Good point, done!


================
Comment at: clang/lib/Analysis/FlowSensitive/Transfer.cpp:329
+          // against this above.
+          ProcessVarDecl(*VD);
+          auto *VDLoc = Env.getStorageLocation(*VD);
----------------
ymandel wrote:
> why the recursive call rather than relying on what we know about their 
> structure?
Not sure exactly what you're asking?

If we don't want to make a recursive call here, we'd need to duplicate behavior 
that `ProcessVarDecl()` already contains and inline that code here. It seems 
preferable to just call `ProcessVarDecl()` instead? (Or to put it differently, 
what is a reason against making this call?)


================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:329
+static void
+builtinTransferScopeEnd(const CFGScopeEnd &Elt,
+                        TypeErasedDataflowAnalysisState &InputState) {
----------------
xazax.hun wrote:
> I think one question is whether we are interested in ScopeEnd or LifetimeEnd, 
> see the discussions in https://reviews.llvm.org/D15031 and 
> https://reviews.llvm.org/D16403, specifically Devin's comment: 
> 
> >>! In D16403#799926, @dcoughlin wrote:
> >> @dcoughlin As a reviewer of both patches - could you tell us what's the 
> >> difference between them? And how are we going to resolve this issue?
> > 
> > These two patches are emitting markers in the CFG for different things.
> > 
> > Here is how I would characterize the difference between the two patches.
> > 
> > - Despite its name, https://reviews.llvm.org/D15031, is really emitting 
> > markers for when the lifetime of a C++ object in an automatic variable 
> > ends.  For C++ objects with non-trivial destructors, this point is when the 
> > destructor is called. At this point the storage for the variable still 
> > exists, but what you can do with that storage is very restricted by the 
> > language because its contents have been destroyed. Note that even with the 
> > contents of the object have been destroyed, it is still meaningful to, say, 
> > take the address of the variable and construct a new object into it with a 
> > placement new. In other words, the same variable can have different 
> > objects, with different lifetimes, in it at different program points.
> > 
> > - In contrast, the purpose of this patch (https://reviews.llvm.org/D16403) 
> > is to add markers for when the storage duration for the variable begins and 
> > ends (this is, when the storage exists). Once the storage duration has 
> > ended, you can't placement new into the variables address, because another 
> > variable may already be at that address.
> > 
> > I don't think there is an "issue" to resolve here.  We should make sure the 
> > two patches play nicely with each other, though. In particular, we should 
> > make sure that the markers for when lifetime ends and when storage duration 
> > ends are ordered correctly.
> 
> 
> What I wanted to add, I wonder if we might not get ScopeEnd event for 
> temporaries and there might be other differences. The Clang implementation of 
> P1179 used LifetimeEnd instead of ScopeEnd, and I believe probably most 
> clients are more interested in LifetimeEnd events rather than ScopeEnd.
> 
> I think I understand why you went with ScopeEnd for this specific problem, 
> but to avoid the confusion from having both in the Cfg (because I anticipate 
> someone will need LifetimeEnd at some point), I wonder if we can make this 
> work with LifetimeEnd. 
Hm, thanks for bringing it up.

Conincidentally, I realized while chasing another issue that `CFGScopeEnd` 
isn't the right construct here. I assumed that we would get a `CFGScopeEnd` for 
every variable, but I now realize that we only get a `CFGScopeEnd` for the 
first variable in the scope.

So `CFGLifetimeEnds` definitely looks like the right construct to use here, and 
indeed it's what I originally tried to use. Unfortuately, 
`CFG::BuildOptions::AddLifetime` cannot be used at the same time as 
`AddImplicitDtors`, which we already use. We don't actually need the 
`CFGElement`s added by `AddImplicitDtors`, but we do need `AddTemporaryDtors`, 
and that in turn can only be turned on if `AddImplicitDtors` is turned on.

It looks as if I will need to break one of these constraints. It looks as if 
the constraint that is easiest to break is that `AddLifetime` currently cannot 
be used at the same time as `AddImplicitDtors`. I'm not sure why this 
constraint currently exists (I'd appreciate any insights you or others may 
have), but I suspect it's because it's hard to ensure that the `CFGElement`s 
added by `AddImplicitDtors` are ordered correctly with respect to the 
`CFGLifetimeEnds` elements.

Anyway, this requires a change to `CFG` one way or another. I'll work on that 
next. I'll then make the required changes to this patch and will ask for 
another look before submitting.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D149144/new/

https://reviews.llvm.org/D149144

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

Reply via email to