Add a no-op builtin function which shouldn't generate code. (#5306)

This is part of a broader plan to have noop destructor functions for
trivial destruction.

Note this emits a SemIR call (`%no_op: init %empty_tuple.type = call
%NoOp.ref() [concrete = constants.%empty_tuple]`), but not LLVM IR. My
thought was this was probably okay, since even though it'll be a little
spammy with destructor calls, the flipside is there'll probably already
be a fair amount for the name reference, and this at least shows when
the call is injected (and discarded).

---------

Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
This commit is contained in:
Jon Ross-Perkins
2025-04-15 00:33:39 +00:00
committed by GitHub
co-authored by Chandler Carruth
parent da83b65aa2
commit b49e89e97e
8 changed files with 256 additions and 2 deletions
@@ -218,6 +218,8 @@ using FloatT = TypeParam<0, AnyFloat>;
// Not a builtin function.
constexpr BuiltinInfo None = {"", nullptr};
constexpr BuiltinInfo NoOp = {"no_op", ValidateSignature<auto()->NoReturn>};
// Prints a single character.
constexpr BuiltinInfo PrintChar = {
"print.char", ValidateSignature<auto(AnySizedInt)->AnySizedInt>};