zygoloid wrote:

Taking a step back, while this patch is not the right direction, we can and 
should do better for the original example. Probably the best way to do that is 
to analyze the operand to `__builtin_[dynamic_]object_size` in the frontend and 
compute a better bound based on the form of the expression. It looks like it 
should be feasible to produce a tighter bound for an array-to-pointer-decay 
expression like `f.bar[argc]` in subobject mode, as:

- `select llvm.is.constant(argc) and (argc < 0 or argc >= 2), 0, 
sizeof(f.bar[argc])` for the non-dynamic case, and just
- `select (argc < 0 or argc >= 2), 0, sizeof(f.bar[argc])` for the dynamic case.

A possibly simpler alternative would be for the frontend to pass an upper bound 
on the result to the LLVM builtin in mode 1, so Clang could say "I know the 
result will never be more than 40" and LLVM could provide either that size or 
the complete object size, whichever is smaller. That wouldn't give as tight a 
bound for the argc == 2 case, though.

https://github.com/llvm/llvm-project/pull/78526
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to