> On Sep 5, 2024, at 18:22, Bill Wendling <isanb...@gmail.com> wrote: > > 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.
Yes, “silently fail” should workaround this problem if fixing the issue in the current __builtin_choose_expr is too complicate. I will study a little bit on how to fix the issue in __builtin_choose_expr first. Martin and Joseph, any comment or suggestion from you? thanks. Qing > > -bw