[clang] [TBAA] Emit distinct TBAA tags for pointers with different depths,types. (PR #76612)

John McCall via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 26 11:13:35 PDT 2024


================
@@ -185,10 +185,33 @@ llvm::MDNode *CodeGenTBAA::getTypeInfoHelper(const Type *Ty) {
     return getChar();
 
   // Handle pointers and references.
----------------
rjmccall wrote:

Probably worth putting standard citations here:
```suggestion
  // Handle pointers and references.
  //
  // C has a very strict rule for pointer aliasing. C23 6.7.6.1p2:
  //     For two pointer types to be compatible, both shall be identically
  //     qualified and both shall be pointers to compatible types.
  //
  // This rule is impractically strict; we want to at least ignore CVR
  // qualifiers. Distinguishing by CVR qualifiers would make it UB to
  // e.g. cast a `char **` to `const char * const *` and dereference it,
  // which is too common and useful to invalidate. C++'s similar types
  // rule permits qualifier differences in these nested positions; in fact,
  // C++ even allows that cast as an implicit conversion.
  //
  // Other qualifiers could theoretically be distinguished, especially if
  // they involve a significant representation difference.  We don't
  // currently do so, however.
  //
  // Computing the pointee type string recursively is implicitly more
  // forgiving than the standards require.  Effectively, we are turning
  // the question "are these types compatible/similar" into "are
  // accesses to these types allowed to alias".  In both C and C++,
  // the latter question has special carve-outs for signedness
  // mismatches that only apply at the top level.  As a result, we are
  // allowing e.g. `int *` l-values to access `unsigned *` objects.
```

https://github.com/llvm/llvm-project/pull/76612


More information about the cfe-commits mailing list