jyknight added inline comments.

================
Comment at: clang/lib/CodeGen/Address.h:26
   llvm::Value *Pointer;
+  llvm::Type *PointeeType;
   CharUnits Alignment;
----------------
erichkeane wrote:
> I think this will still end up being a problem when we try to look into the 
> type for multi-dimension pointers.  Should we have this just store the 
> `QualType` of the value instead, so we can unpack it later?  If we ever 
> needed the `llvm::Type` of the Pointee, a `convertTypeForMem` is all that is 
> standing in our way.
Do we do that? I didn't think Address was used that way.


================
Comment at: clang/lib/CodeGen/Address.h:29-30
 public:
   Address(llvm::Value *pointer, CharUnits alignment)
-      : Pointer(pointer), Alignment(alignment) {
+      : Address(pointer, nullptr, alignment) {}
+  Address(llvm::Value *pointer, llvm::Type *PointeeType, CharUnits alignment)
----------------
nikic wrote:
> dblaikie wrote:
> > At some point will this include an assertion that 'pointer' isn't a 
> > PointerType? I guess some uses of PointerTyped values won't need to know 
> > their pointee type?
> > 
> > (or are all values in Address PointerTyped? (owing to them being 
> > "addresses"))?
> Based on the unconditional cast in getType(), I'd assume that addresses are 
> always pointer typed.
This constructor seems odd. We shouldn't ever construct Address with a non-null 
pointer and a null PointeeType, should we?


================
Comment at: clang/lib/CodeGen/Address.h:31
+      : Address(pointer, nullptr, alignment) {}
+  Address(llvm::Value *pointer, llvm::Type *PointeeType, CharUnits alignment)
+      : Pointer(pointer), PointeeType(PointeeType), Alignment(alignment) {
----------------
craig.topper wrote:
> Is PointeeType expected to be non-null when pointer is non-null?
That would be my expectation.


================
Comment at: clang/lib/CodeGen/Address.h:58
   /// store it in Address instead for the convenience of writing code.
-  llvm::Type *getElementType() const {
-    return getType()->getElementType();
-  }
+  llvm::Type *getElementType() const { return PointeeType; }
 
----------------
craig.topper wrote:
> Should this assert isValid() since it no longer goes through getType() and 
> getPointer() which would have asserted previously?
+1.


================
Comment at: clang/lib/CodeGen/CGValue.h:230-231
 private:
   void Initialize(QualType Type, Qualifiers Quals, CharUnits Alignment,
                   LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo) {
     assert((!Alignment.isZero() || Type->isIncompleteType()) &&
----------------
dblaikie wrote:
> Maybe this could use some assertions added to check the PointeeType is 
> correct?
I think Initialize should be modified to take Addr instead of Alignment, and 
move
```
    R.V = Addr.getPointer();
    R.PointeeType = Addr.getElementType();
```
into this function, from all the callers.

If that's done, I don't think a separate assert is useful.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D103465

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

Reply via email to