On 11/09/2017 10:26 AM, Richard Biener wrote:
Moving TYPE_EMPTY_P to finalize_type_size revealed a bug in Cilk+, it was
bogusly (I believe) setting TREE_ADDRESSABLE, so the assert fired.  Since
Cilk+ is being deprecated and the Cilk+ testsuite still passes, I'm not
too worried about this change.

Ah, presumably C++ classes aren't hitting the assert just because they set TREE_ADDRESSABLE after finalize_type_size, so the assert is wrong. Let's drop the assert and the Cilk+ change.

So if you're fine with the DECL_PADDING_P change, all that remains is to
check whether this patch is not changing the ABI for other languages than
C++.  I suppose one way to check that could be to do sth like

   if (strncmp (lang_hooks.name, "GNU C++", 7))
     {FILE *f=fopen("/tmp/A", 
"a");fprintf(f,"%s\n",main_input_filename);fclose(f);}

and compare the assembly of the files it prints?  But there were thousands of
them I think :(.

Shouldn't most of GCCs own object files (and target library object files)
compare 1:1 before and after the patch?  After all it should _only_ affect
parameter passing of empty aggregates (and the files the patch changes
of course)?

That makes sense to me.

@@ -9295,6 +9315,10 @@ ix86_return_in_memory (const_tree type, const_tree 
fntype ATTRIBUTE_UNUSED)
...
+  /* Empty records are never passed in memory.  */
+  if (type && TYPE_EMPTY_P (type))
+    return false;

Since the TYPE_EMPTY_P flag is in target-independent code, let's check it in aggregate_value_p rather than here.

+ix86_warn_parameter_passing_abi (cumulative_args_t cum_v, tree type)
...
+  tree ctx = cum->decl ? DECL_CONTEXT (cum->decl) : NULL_TREE;
+  if (ctx != NULL_TREE
+      && TREE_CODE (ctx) == TRANSLATION_UNIT_DECL
+      && !TRANSLATION_UNIT_WARN_EMPTY_P (ctx))
+    return;

This doesn't handle empty classes within a namespace/class/function. Maybe move get_ultimate_context out of dwarf2out.c and use that?

+/* Used in a FIELD_DECL to indicate that this field is padding for
+   the purpose of determining whether the record this field is a member
+   of is considered empty.  */

I wouldn't mention "empty" here; this indicates that the field is padding, not data. A target might use this information to avoid passing this field even if the class contains data as well.

Jason

Reply via email to