[PATCH] D135750: [clang][Interp] Track initialization state of local variables
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 2 06:56:59 PST 2022
aaron.ballman added inline comments.
================
Comment at: clang/lib/AST/Interp/Descriptor.h:141-145
unsigned getAllocSize() const { return AllocSize; }
/// returns the size of an element when the structure is viewed as an array.
unsigned getElemSize() const { return ElemSize; }
+ /// Returns the size of the metadata.
+ unsigned getMetadataSize() const { return MDSize; }
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > There's some interface awkwardness here where these values are of type `InterpSize` but the interface returns `unsigned`
> Yes. `InterpSize` is also only really used in `Descriptor.h`. No idea why.
Yeah, this should be cleaned up (either here or in an NFC follow-up soon after this lands).
================
Comment at: clang/lib/AST/Interp/Descriptor.h:73
+ /// Flag indicating if the field is mutable (if in a record).
+ unsigned IsMutable : 1;
+
----------------
tbaeder wrote:
> shafik wrote:
> > Maybe `IsFieldMutable` b/c we call `CreateDescriptor` it is a little confusing why we have `IsConst` and `IsMutable`
> Agreed, but this code was just moved up in this patch, the field was introduced earlier.
We can do a renaming pass once this lands, but FWIW, I'm also fine clarifying the names of things as we refactor code.
================
Comment at: clang/lib/AST/Interp/InterpBlock.h:97
void invokeCtor() {
- std::memset(data(), 0, getSize());
+ std::memset(rawData(), 0, Desc->getAllocSize());
if (Desc->CtorFn)
----------------
tbaeder wrote:
> aaron.ballman wrote:
> > tbaeder wrote:
> > > aaron.ballman wrote:
> > > > Why do we want to overwrite the metadata here?
> > > This is only called after creating an new block, so nothing is being overwritten, the metadata hasn't been filled-in yet.
> > Sounds like a good reason not to memset over that block then; it's useless work that will be thrown away anyway (I worry we may come to rely on this zero init accidentally)?
> FWIW I looked into this and I think zeroing everything is what we want, so the initmap is null initially
Hmmm, would it make more sense to have the init map setting that itself (in `allocate()`) rather than relying on `invokeCtor()` to do it?
================
Comment at: clang/lib/AST/Interp/Pointer.h:63-64
private:
static constexpr unsigned PastEndMark = (unsigned)-1;
static constexpr unsigned RootPtrMark = (unsigned)-1;
----------------
tbaeder wrote:
> shafik wrote:
> > or `-1u`
> Alright, but those were not introduced in this patch.
Preference for `~0u` so the types all match up nicely, fine to do in a post-commit NFC change.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135750/new/
https://reviews.llvm.org/D135750
More information about the cfe-commits
mailing list