Hi,
this patch makes also the rtti type info for A in the testcase:
struct A
{
virtual void foo(void) {};
virtual void foo2(void) {};
virtual void foo3(void) {};
virtual void foo4(void) {};
virtual void foo5(void) {};
} a;
aligned only to the ABI requirement (8) instead of being bumped up to 16 bytes
by the following code in i386.c:
/* x86-64 ABI requires arrays greater than 16 bytes to be aligned
to 16byte boundary. */
if (TARGET_64BIT)
{
if ((opt ? AGGREGATE_TYPE_P (type) : TREE_CODE (type) == ARRAY_TYPE)
&& TYPE_SIZE (type)
&& TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
&& wi::geu_p (TYPE_SIZE (type), 128)
&& align < 128)
return 128;
}
Here the variable is first run through align_variable and that decides to add
optional alignment. We really want only ABI required alignment here.
Does the following patch look resonable?
* rtti.c: Include tm_p.h
(emit_tinfo_decl): Align type infos only as required by the target ABI.
Index: rtti.c
===================================================================
--- rtti.c (revision 210521)
+++ rtti.c (working copy)
@@ -24,6 +24,7 @@ along with GCC; see the file COPYING3.
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
+#include "tm_p.h"
#include "stringpool.h"
#include "stor-layout.h"
#include "cp-tree.h"
@@ -1596,6 +1597,12 @@ emit_tinfo_decl (tree decl)
DECL_INITIAL (decl) = init;
mark_used (decl);
cp_finish_decl (decl, init, false, NULL_TREE, 0);
+ /* Avoid targets optionally bumping up the alignment to improve
+ vector instruction accesses, tinfo are never accessed this way. */
+#ifdef DATA_ABI_ALIGNMENT
+ DECL_ALIGN (decl) = DATA_ABI_ALIGNMENT (decl, TYPE_ALIGN (TREE_TYPE
(decl)));
+ DECL_USER_ALIGN (decl) = true;
+#endif
return true;
}
else