• Leszek Swirski's avatar
    [codegen] Add static interface descriptors · ae0752df
    Leszek Swirski authored
    Add a new CRTP StaticCallInterfaceDescriptor class, which provides
    static constexpr getters for a descriptor's registers, parameter counts,
    and so on. Each CallInterfaceDescriptor subclass is changed to extend
    StaticCallInterfaceDescriptor, with StaticCallInterfaceDescriptor itself
    extending CallInterfaceDescriptor to still provide a dynamic lookup
    where needed.
    
    StaticCallInterfaceDescriptor provides a couple of customisation points,
    where it reads its CRTP derived descriptor's static fields and
    functions, with default fallbacks where appropriate. With these
    customisation points, the definition of CallInterfaceDescriptor
    subclasses is simplified to:
    
        a) Providing parameter names (as before)
        b) Providing parameter types (as before)
        c) Optionally setting flags (like kNoContext or kAllowVarArgs) as
           static booleans on the class.
        d) Optionally providing a `registers()` method that returns a
           std::array<Register, N> of registers that may be used for
           parameters (if not provided, this defaults to the implementation
           specific default register set).
    
    Parameter registers (and register count) are automagically set based on
    the number of parameters and number of given registers, with extra magic
    to ignore no_reg registers (to reduce ia32 special casing). The
    CallInterfaceDescriptorData is initialized based on these static
    functions, rather than manual per-descriptor initializers.
    
    This allows us to skip loading descriptors dynamically for CallBuiltin
    in Sparkplug, and instead lets us use a bit of template magic to
    statically set up arguments for the calls. Any other users of statically
    known descriptors will also benefit, thanks to C++ picking the static
    methods over the dynamic methods on the base class when available.
    
    Because we can remove various virtual functions and trigger heavier
    inlining of constantly known values, binary size slightly decreases with
    this change.
    
    Note that torque-generated descriptors are changed to use the same magic,
    rather than having Torque-specific magic, for consistency.
    
    Bug: v8:11420
    Change-Id: Icc5e238b6313a08734feb564204a13226b450c22
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2814518
    Auto-Submit: Leszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarNico Hartmann <nicohartmann@chromium.org>
    Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
    Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
    Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Commit-Queue: Clemens Backes <clemensb@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#73996}
    ae0752df
interface-descriptors.cc 3.88 KB