[PATCH] D63371: Rewrite ConstStructBuilder with a mechanism that can cope with splitting and updating constants.
John McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 17 12:11:12 PDT 2019
rjmccall added inline comments.
================
Comment at: lib/CodeGen/CGExprConstant.cpp:73
+/// Incremental builder for an llvm::Constant* holding a structure constant.
+class ConstantBuilder : private ConstantBuilderUtils {
+ llvm::SmallVector<llvm::Constant*, 32> Elems;
----------------
This seems like a very generic name for this type.
================
Comment at: lib/CodeGen/CGExprConstant.cpp:75
+ llvm::SmallVector<llvm::Constant*, 32> Elems;
+ llvm::SmallVector<CharUnits, 32> Offsets;
+ CharUnits Size = CharUnits::Zero();
----------------
Are there invariants about these? I assume they're parallel arrays; are they kept sorted?
================
Comment at: lib/CodeGen/CGExprConstant.cpp:76
+ llvm::SmallVector<CharUnits, 32> Offsets;
+ CharUnits Size = CharUnits::Zero();
+
----------------
This is one past the last byte that's been covered by an actual `Constant*` value, or does it include unoccupied padding, or does it exclude even occupied padding?
================
Comment at: lib/CodeGen/CGExprConstant.cpp:98
+ Offsets.reserve(N);
+ }
+
----------------
Might be worth clarifying what `N` is here.
================
Comment at: lib/CodeGen/CGExprConstant.cpp:190
+bool ConstantBuilder::addBits(llvm::APInt Bits, uint64_t OffsetInBits,
+ bool AllowOverwrite) {
+ const ASTContext &Context = CGM.getContext();
----------------
`AllowOversized` (which you used in the interface) seems like a better name.
================
Comment at: lib/CodeGen/CGExprConstant.cpp:196
+ // current char.
+ unsigned CharOffset = OffsetInBits % CharWidth;
+
----------------
`OffsetWithinChar`?
================
Comment at: lib/CodeGen/CGExprConstant.cpp:201
+ for (CharUnits Char = Context.toCharUnitsFromBits(OffsetInBits);
+ /**/; ++Char) {
+ // Number of bits we want to fill in this byte.
----------------
`OffsetInChars`?
================
Comment at: lib/CodeGen/CGExprConstant.cpp:237
+ if (!LastElemToUpdate)
+ return false;
+ assert(*LastElemToUpdate - *FirstElemToUpdate < 2 &&
----------------
Especially in the context of the comment above, I think it would be good to clarify that both of these are hard "we can't emit this constant" bail-outs.
================
Comment at: lib/CodeGen/CGExprConstant.cpp:258
+ return false;
+ assert(CI->getBitWidth() == CharWidth && "splitAt failed");
+ assert((!(CI->getValue() & UpdateMask) || AllowOverwrite) &&
----------------
Oh, because we're splitting before and after a single-`CharUnits` range? That seems worthy of a somewhat clearer explanation in the code.
I guess we could have a non-`ConstantInt` single-byte value. Unlikely but not impossible. :)
================
Comment at: lib/CodeGen/CGExprConstant.cpp:375
+
+ // FIXME: We could theoretically split a ConstantInt if the need ever arose.
+
----------------
Does this not come up all the time with bit-fields? I guess we emit them in single-`char` chunks, so it wouldn't. Probably worth a comment.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D63371/new/
https://reviews.llvm.org/D63371
More information about the cfe-commits
mailing list