Hi Qing, Sorry for my late reply.
On Thu, Aug 29, 2024 at 7:22 AM Qing Zhao <qing.z...@oracle.com> wrote: > > Hi, > > Thanks for the information. > > Yes, providing a unary operator similar as __counted_by(PTR) as suggested by > multiple people previously is a cleaner approach. > > Then the programmer will use the following: > > __builtin_choose_expr( > __builtin_has_attribute (__p->FAM, "counted_by”) > __builtin_get_counted_by(__p->FAM) = COUNT, 0); > > From the programmer’s point of view, it’s cleaner too. > > However, there is one issue with “__builtin_choose_expr” currently in GCC, > its documentation explicitly mentions this limitation: > (https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fchoose_005fexpr) > > "Note: This construct is only available for C. Furthermore, the unused > expression (exp1 or exp2 depending on the value of const_exp) may still > generate syntax errors. This may change in future revisions.” > > So, due to this limitation, when there is no counted_by attribute, the > __builtin_get_counted_by() still is evaluated by the compiler and errors is > issued and the compilation stops, this can be show from the small testing > case: > > [opc@qinzhao-ol8u3-x86 gcc]$ cat ttt.c > > struct flex { > unsigned int b; > int c[]; > } *array_flex; > > #define MY_ALLOC(P, FAM, COUNT) ({ \ > typeof(P) __p; \ > unsigned int __size = sizeof(*P) + sizeof(*P->FAM) * COUNT; \ > __p = (typeof(P)) __builtin_malloc(__size); \ > __builtin_choose_expr( \ > __builtin_has_attribute (__p->FAM, counted_by), \ > __builtin_counted_by_ref(__p->FAM) = COUNT, 0); \ > P = __p; \ > }) > > int main(int argc, char *argv[]) > { > MY_ALLOC(array_flex, c, 20); > return 0; > } > [opc@qinzhao-ol8u3-x86 gcc]$ sh t > ttt.c: In function ‘main’: > ttt.c:13:5: error: the argument must have ‘counted_by’ attribute > ‘__builtin_counted_by_ref’ > ttt.c:19:3: note: in expansion of macro ‘MY_ALLOC’ > > I checked the FE code on handling “__buiiltin_choose_expr”, Yes, it does > parse the __builtin_counted_by_ref(__p->FAM) even when > __builtin_has_attribute(__p->FAM, counted_by) is FALSE, and issued the error > when parsing __builtin_counted_by_ref and stopped the compilation. > > So, in order to support this approach, we first must fix the issue in the > current __builtin_choose_expr in GCC. Otherwise, it’s impossible for the user > to use this new builtin. > > Let me know your comments and suggestions. > Do you need to emit a diagnostic if the FAM doesn't have the counted_by attribute? It was originally supposed to "silently fail" if it didn't. We may need to do the same for Clang if so. -bw