[PATCH, PR70955] Tag {ms,sysv}_va_list_type_node with {ms,sysv}_abi attribute
Tom de Vries
Tom_deVries@mentor.com
Thu Aug 25 13:36:00 GMT 2016
On 25/08/16 13:48, Richard Biener wrote:
> On Wed, 24 Aug 2016, Tom de Vries wrote:
>
>> Hi,
>>
>> in PR70955, ix86_canonical_va_list_type fails to recognize a
>> __builtin_ms_va_list that was declared in a TU, because its type doesn't have
>> the same main variant as the ms_va_list_type_node initialized in lto1.
>>
>> This patch fixes the PR by tagging ms_va_list_type_node and
>> sysv_va_list_type_node with ms_abi/sysv_abi attributes.
>>
>> sysv_va_list_type_node is of type array of length one with elemtype record,
>> and I ran into trouble with both adding the attribute to the array type and
>> the record type, so I ended up adding it to the first field type.
>>
>> Bootstrapped and reg-tested on x86_64.
>>
>> OK for trunk, 6 branch?
> How did you build the sysv_abi tagged struct / array that ended up
> not working?
My first try to tag the struct was this:
...
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 2639c8c..f07d9f2 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -10548,6 +10548,9 @@ ix86_build_builtin_va_list_64 (void)
layout_type (record);
+ tree attr = tree_cons (get_identifier ("sysv_abi"), NULL_TREE,
NULL_TREE);
+ record = build_type_attribute_variant (record, attr);
+
/* The correct type is an array type of one element. */
return build_array_type (record, build_index_type (size_zero_node));
}
...
But we immediately run into:
...
<built-in>: warning: ignoring attributes applied to ‘__va_list_tag’
after definition [-Wattributes]
<built-in>: warning: ignoring attributes applied to ‘struct ’ after
definition [-Wattributes]
<built-in>: warning: ignoring attributes applied to ‘struct ’ after
definition [-Wattributes]
...
I tried to work around that by directly assigning to TYPE_ATTRIBUTES, as
implemented in attached patch. But then I run into a libstdc++ build
ICE, in mangle.c:write_type:
...
tree t = TYPE_MAIN_VARIANT (type);
if (TYPE_ATTRIBUTES (t) && !OVERLOAD_TYPE_P (t))
{
tree attrs = NULL_TREE;
if (tx_safe_fn_type_p (type))
attrs = tree_cons (get_identifier ("transaction_safe"),
NULL_TREE, attrs);
t = cp_build_type_attribute_variant (t, attrs);
}
gcc_assert (t != type);
...
> I suspect that in parameter passing the array somehow
> decays to a pointer-to-element type
Yep, as mentioned in more detail at
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70955#c23 . That's why I
didn't try very hard to get tagging the array with the attribute to work.
> so it is important that the
> TYPE_MAIN_VARIANT of the record type already contains the attribute.
AFAIU, the record type is its own TYPE_MAIN_VARIANT, so it contains the
attributes.
Thanks,
- Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: tmp.patch
Type: text/x-patch
Size: 4393 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20160825/1ae9634d/attachment.bin>
More information about the Gcc-patches
mailing list