On 8/31/26 11:17 PM, Kito Cheng wrote:
Hi Jason:

Jason Merrill <[email protected]> 於 2026年8月28日週五 上午2:55寫道:

On 8/27/26 4:10 AM, Kito Cheng wrote:
The RISC-V psABI[1] says a function using a standard calling convention variant 
has
to append an extra ABI tag to its mangled name, following the "ABI tags"
rule of the Itanium C++ ABI.  The only variant listed so far is the
fixed-length vector calling convention, whose tag is
riscv_vls_cc_<ABI_VLEN>:

```c
__attribute__((riscv_vls_cc(128))) void foo();
```

now mangles as _Z3fooB16riscv_vls_cc_128v.

The C++ mangler cannot know about target attributes, so we adds a target
hook, TARGET_CXX_IMPLICIT_ABI_TAGS, that hands back extra tags for a decl.

NOTE: I tried to not adding the new hook by attaching abi_tag attribute,
however I tried to doing that on TARGET_INSERT_ATTRIBUTES and
doing some hack way on TARGET_ATTRIBUTE_TABLE during adding calling
convention attribute, but both are no work well.

How did that fail?  Using TARGET_INSERT_ATTRIBUTES sounds promising to me.

It fails for templates. One key issue is template handling.
The ABI tag needs to be added if the `vls_cc` attribute is present.
However, the attribute might dropped by
`splice_template_attributes` / `is_late_template_attribute`, and
`TARGET_INSERT_ATTRIBUTES` is invoked only after that point. Therefore,
`TARGET_INSERT_ATTRIBUTES` cannot add the ABI tag correctly.

The relevant call flow is roughly:

cplus_decl_attributes
|
|- processing_template_decl? -> splice_template_attributes
|                               # VLS CC attribute may dropped here
|
|- decl_attributes
|  |- targetm.insert_attributes
|     # The VLS CC attribute is no longer visible here
|
|- save_template_attributes
    # The VLS CC attribute is restored here

That sounds right for the template itself, but we call decl_attributes again for instantiations (under apply_late_template_attributes). Why doesn't targetm.insert_attributes do the right thing at that point?

Jason

Reply via email to