[ Builtins ] Returning a custom struct

Dear cfe-dev,

I am new at hacking on Clang and I’ve made a decent amount of forward progress in defining my own Constant Expression builtin for C++. It takes arguments which must be compile-time evaluatable. This worked out just fine so far, and has allowed me to get started on implementing std::embed.

I wanted to wrap my Constant Expression builtin in a C+±defined constexpr function. The problem with this is that any argument passed to my wrapping function that used my builtin ended up becoming non-evaluatable in Visit calls during the Sema::ActOnFinish phase.

This has a few consequences. My wrapper function uses 2 less arguments than my builtin currently, passing 2 variables to the builtin to be filled in as output parameters, and then placed into a nice struct the user can use (unsigned char* and a size_t). I lose the interface if I use the builtin directly and someone has to provide the output parameters.

I tried to use the “t” specifier on the Builtin in Builtin.def to let me define my own type checking, but so far it seems like even with “t” I can’t make my builtin have a signature that returns a custom structure.

Does anyone know how I would begin to work around these problems? My first interest is to make the builtin I wrote match the struct-returning interface I need. That would allow me to drop the 2 output parameters and instead return a structure. I do not know how to do this.

My second idea is to abandon defining it through Builtins.def altogether, but I’m not sure how to go about defining a builtin that’s not part of that list.

Does anyone have any insight into this?

Sincerely and Hopefully,

ThePhD

Dear cfe-dev,

I am new at hacking on Clang and I’ve made a decent amount of forward progress in defining my own Constant Expression builtin for C++. It takes arguments which must be compile-time evaluatable. This worked out just fine so far, and has allowed me to get started on implementing std::embed.

I wanted to wrap my Constant Expression builtin in a C+±defined constexpr function. The problem with this is that any argument passed to my wrapping function that used my builtin ended up becoming non-evaluatable in Visit calls during the Sema::ActOnFinish phase.

This has a few consequences. My wrapper function uses 2 less arguments than my builtin currently, passing 2 variables to the builtin to be filled in as output parameters, and then placed into a nice struct the user can use (unsigned char* and a size_t). I lose the interface if I use the builtin directly and someone has to provide the output parameters.

I tried to use the “t” specifier on the Builtin in Builtin.def to let me define my own type checking, but so far it seems like even with “t” I can’t make my builtin have a signature that returns a custom structure.

Are you trying to cast the result of the CallExpr? You should just set it directly; that’s allowed for custom-typechecked builtins.

John.

Dear John,

I didn’t quite realize you could do that! Thank you for that. I managed to make a lot of progress from your tip, and I’m almost done with the builtin!

I hope I can get something done to put up for basic discussion to the clang mailing list soon. As a slight side question, if I’m looking for “review” (but not necessarily with the goal of upstreaming to Clang just yet), would it be appropriate to send a diff to the mailing list here?

Sincerely,
ThePhD

Hi,

I don't know if we have a project policy for that. I think you're welcome to start a patch review as for a normal patch, as long as (1) you make it clear in your email that it's not intended to be committed, and therefore that we shouldn't bother reviewing things like its basic language design, and (2) you understand that nobody is under any obligation to actually review it.

John.