On Mon, 10 Feb 2025 11:04:38 GMT, Andrew Dinn <ad...@openjdk.org> wrote:

>> Vladimir Kozlov has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   Fix Zero and Minimal VM builds
>
> src/hotspot/share/code/codeBlob.cpp line 58:
> 
>> 56: #include <type_traits>
>> 57: 
>> 58: // Virtual methods are not allowed in code blobs to simplify caching 
>> compiled code.
> 
> Is it worth considering generating this code plus also some of the existing 
> code in the header using an iterator template macro? e.g.
> 
>     #define CODEBLOBS_DO(do_codeblob_abstract, do_codeblob_nonleaf, \
>                          do_codeblob_leaf)                          \
>       do_codeblob_abstract(CodeBlob)                                \
>       do_codeblob_leaf(nmethod, Nmethod, nmethod)                   \
>       do_codeblob_abstract(RuntimeBlob)                             \
>       do_codeblob_nonleaf(BufferBlob, Buffer, buffer)               \
>       do_codeblob_leaf(AdapterBlob, Adapter, adapter)               \
>       . . .                                                         \
>       do_codeblob_leaf(RuntimeStub, Runtime_Stub, runtime_stub)     \
>       . . .
> 
> The macro arguments to the templates would themselves be macros:
> 
>     do_codeblob_abstract(classname) // abstract, non-instantiable class
>     do_codeblob_nonleaf(classname, kindname, accessorname) // instantiable, 
> subclassable
>     do_codeblob_leaf(classname, kindname, accessorname) // instantiable, 
> non-subclassable
> 
> Using a template macro like this to generate the code below -- *plus also* 
> some of the code currently declared piecemeal in the header -- would 
> guarantee all cases are covered now and will remain so later so when the 
> macro is updated. I think it would probably also allow case handling code in 
> AOT cache code to be generated.
> 
> So, we would generate the code here as follows
> 
>     #define EMPTY1(classname) 
>     #define EMPTY3(classname, kindname, accessorname)
> 
>     #define assert_nonvirtual_leaf(classname, kindname, accessorname) \
>       static_assert(!std::is_polymorphic<classname>::value,            \
>                     "no virtual methods are allowed in " # classname );
> 
>     CODEBLOBS_DO(empty1, empty3, assert_nonvirtual_leaf)
> 
>     #undef assert_nonvirtual_leaf
> 
> Likewise in codeBlob.hpp we could generate `enum CodeBlobKind` to cover all 
> the non-abstract classes and likewise generate the accessor methods 
> `is_nmethod()`, `is_buffer_blob()` in class `CodeBlob` which allow the kind 
> to be tested.
> 
>     #define codekind_enum_tag(classname, kindname, accessorname) \
>       kindname,
> 
>     enum CodeBlobKind : u1 {
>       None,
>       CODEBLOBS_DO(empty1, codekind_enum_tag, codekind_enum_tag)
>       Number_Of_Kinds
>     };
> 
>     ...

Thank you @adinn for suggestion but no, I don't like macros - hard to debug and 
they add more complexity in this case.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/23533#discussion_r1949483501

Reply via email to