Re: [PATCH v2 10/16] scripts/qapi: add QAPISchemaType.is_predefined

Paolo Bonzini <[email protected]> Thu, 26 Feb 2026 15:12:20 +0100
Newsgroups org.nongnu.qemu-rust,org.nongnu.qemu-devel
Message-ID <[email protected]>
On 2/25/26 09:44, Markus Armbruster wrote:
> Paolo Bonzini <[email protected]> writes:
> 
>> On 2/25/26 08:33, Markus Armbruster wrote:
>>> Paolo Bonzini <[email protected]> writes:
>>>
>>>> It is impossible to call is_implicit on an enum type from the visitor, because
>>>> the QAPISchemaEnumType has already been exploded into its costituent fields.
>>>
>>> constituent
>>>
>>> Passing selected attributes instead of the entire object to its visitor
>>> method limits what the visitor can do.  This is both good and bad.
>>> We've run into "bad" a couple of times.  It's never been bad enough to
>>> change the interface, though.
>>>
>>> Thoughts?
>>
>> I think that applies here, is_predefined() is a reasonable addition.
>>
>>>> The Rust backend is also not modular (yet?) so it is not possible to filter
>>>> out the builtin module;
>>>
>>> Really?
>>>
>>> The visitors are all based on QAPISchemaVisitor.  Protocol:
>>>
>>>       .visit_begin()
>>>       for all modules:
>>>           .visit_module()
>>>           for all entities:
>>>               if .visit_needed():
>>>                   .visit_FOO()
>>>       .visit_end()
>>>
>>> QAPISchemaModularCVisitor implements .visit_module() to generate code
>>> per module.  Its .write() skips builtin modules unless opt_builtins.
>>
>> ... because its .write() already builds multiple QAPIGen{C,H,Trace}, one
>> per module.  Here instead there is just one QAPIGenRs.
>>
>> Using multiple QAPIGenRs instances, one per module, would be hackish.
> 
> I was thinking of having .visit_module() save .is_builtin_module(name)
> in self.in_builtin_module, then use that to recognize built-ins.
> 
>> I'd rather just go modular instead of that.  I can take a look, since
>> this series will be (early) 11.1 material anyway.
> 
> Modular C code generation reduces incremental build time massively.
> Before, we suffered from "touch the schema, recompile the world".  If
> Rust would similarly profit, then I'm all for going modular.

Rust compiles by crate rather than file (crate == toplevel module), so 
it would need some benchmarking but yeah I expect that to help.  That 
would mean something like

     use qapi_block::*;

Paolo