Cydox wrote: > > Yeah so the problem is if you do `__builtin_dynamic_object_size(v, 0)` > > In that case it's a `DeclRefExpr`, a pointer, and an `LValue`. > > Can you give a more complete example? I just tried the following, and I see > an lvaluetorvalue cast. > > ``` > int f(const void *p) { return __builtin_dynamic_object_size(p, 0); } > ```
```C // test2.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> struct variable { int a; int b; int length; short array[] __attribute__((counted_by(length))); }; int main(int argc, char *argv[]) { struct variable *v; v = malloc(sizeof(struct variable) + sizeof(short) * 32); v->length = 32; printf("%zu\n", __builtin_dynamic_object_size(v, 0)); return 0; } ``` I added this `StructBase->dump`: ``` diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 4aca60685f37..7a06819f1a67 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1162,6 +1162,8 @@ llvm::Value *CodeGenFunction::EmitLoadOfCountedByField( if (!StructBase || StructBase->HasSideEffects(getContext())) return nullptr; + StructBase->dump(); + llvm::Value *Res = nullptr; if (StructBase->getType()->isPointerType()) { LValueBaseInfo BaseInfo; ``` ``` $ clang test2.c DeclRefExpr 0x34b302c8 'struct variable *' lvalue Var 0x34b2fce8 'v' 'struct variable *' $ ./a.out 76 ``` In my testing I also added a print statement that printed a dump when both `StructBase->getType()->isPointerType()` and `StructBase->isLValue()` were true and there were a bunch of hits when compiling the kernel. https://github.com/llvm/llvm-project/pull/110497 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits