defaults.h (TARGET_VTABLE_ENTRY_ALIGN): New.
* defaults.h (TARGET_VTABLE_ENTRY_ALIGN): New. (TARGET_VTABLE_DATA_ENTRY_DISTANCE): New. * doc/tm.texi: Document them. * config/ia64/ia64.h (TARGET_VTABLE_ENTRY_ALIGN): New. (TARGET_VTABLE_DATA_ENTRY_DISTANCE): New. (TARGET_VTABLE_USES_DESCRIPTORS): 4 word descriptors for 32-bit mode. (ASM_OUTPUT_FDESC): Likewise. * class.c (build_vtable): Use TARGET_VTABLE_ENTRY_ALIGN. (build_vtbl_initializer): Honor TARGET_VTABLE_DATA_ENTRY_DISTANCE. (build_vbase_offset_vtbl_entries): Likewise. * rtti.c (build_headof): Likewise. (get_tinfo_decl_dynamic): Likewise. (create_pseudo_type_info): Likewise. * g++.old-deja/g++.abi/vtable2.C (INC_VDATA): New. Define for ia64 ilp32. From-SVN: r54603
This commit is contained in:
parent
3aafa0bbab
commit
a6f5e04831
9 changed files with 131 additions and 25 deletions
|
@ -1,3 +1,13 @@
|
|||
2002-06-13 Jessica Han <jessica@cup.hp.com>
|
||||
|
||||
* defaults.h (TARGET_VTABLE_ENTRY_ALIGN): New.
|
||||
(TARGET_VTABLE_DATA_ENTRY_DISTANCE): New.
|
||||
* doc/tm.texi: Document them.
|
||||
* config/ia64/ia64.h (TARGET_VTABLE_ENTRY_ALIGN): New.
|
||||
(TARGET_VTABLE_DATA_ENTRY_DISTANCE): New.
|
||||
(TARGET_VTABLE_USES_DESCRIPTORS): 4 word descriptors for 32-bit mode.
|
||||
(ASM_OUTPUT_FDESC): Likewise.
|
||||
|
||||
2002-06-13 Eric Christopher <echristo@redhat.com>
|
||||
|
||||
* diagnostic.c (output_format): Fix thinko.
|
||||
|
|
|
@ -342,8 +342,21 @@ while (0)
|
|||
function descriptors instead. The value of this macro says how
|
||||
many words wide the descriptor is (normally 2). It is assumed
|
||||
that the address of a function descriptor may be treated as a
|
||||
pointer to a function. */
|
||||
#define TARGET_VTABLE_USES_DESCRIPTORS 2
|
||||
pointer to a function.
|
||||
|
||||
For reasons known only to HP, the vtable entries (as opposed to
|
||||
normal function descriptors) are 16 bytes wide in 32-bit mode as
|
||||
well, even though the 3rd and 4th words are unused. */
|
||||
#define TARGET_VTABLE_USES_DESCRIPTORS (TARGET_ILP32 ? 4 : 2)
|
||||
|
||||
/* Due to silliness in the HPUX linker, vtable entries must be
|
||||
8-byte aligned even in 32-bit mode. Rather than create multiple
|
||||
ABIs, force this restriction on everyone else too. */
|
||||
#define TARGET_VTABLE_ENTRY_ALIGN 64
|
||||
|
||||
/* Due to the above, we need extra padding for the data entries below 0
|
||||
to retain the alignment of the descriptors. */
|
||||
#define TARGET_VTABLE_DATA_ENTRY_DISTANCE (TARGET_ILP32 ? 2 : 1)
|
||||
|
||||
/* Layout of Source Language Data Types */
|
||||
|
||||
|
@ -1454,9 +1467,14 @@ do { \
|
|||
do { \
|
||||
if ((PART) == 0) \
|
||||
{ \
|
||||
fputs ("\tdata16.ua @iplt(", FILE); \
|
||||
if (TARGET_ILP32) \
|
||||
fputs ("\tdata8.ua @iplt(", FILE); \
|
||||
else \
|
||||
fputs ("\tdata16.ua @iplt(", FILE); \
|
||||
assemble_name (FILE, XSTR (XEXP (DECL_RTL (DECL), 0), 0)); \
|
||||
fputs (")\n", FILE); \
|
||||
if (TARGET_ILP32) \
|
||||
fputs ("\tdata8.ua 0\n", FILE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2002-06-13 Jessica Han <jessica@cup.hp.com>
|
||||
|
||||
* class.c (build_vtable): Use TARGET_VTABLE_ENTRY_ALIGN.
|
||||
(build_vtbl_initializer): Honor TARGET_VTABLE_DATA_ENTRY_DISTANCE.
|
||||
(build_vbase_offset_vtbl_entries): Likewise.
|
||||
* rtti.c (build_headof): Likewise.
|
||||
(get_tinfo_decl_dynamic): Likewise.
|
||||
(create_pseudo_type_info): Likewise.
|
||||
|
||||
2002-06-12 Stan Shebs <shebs@apple.com>
|
||||
|
||||
* mpw-config.in: Remove file, no longer used.
|
||||
|
|
|
@ -510,6 +510,8 @@ build_vtable (class_type, name, vtable_type)
|
|||
TREE_STATIC (decl) = 1;
|
||||
TREE_READONLY (decl) = 1;
|
||||
DECL_VIRTUAL_P (decl) = 1;
|
||||
DECL_ALIGN (decl) = TARGET_VTABLE_ENTRY_ALIGN;
|
||||
|
||||
import_export_vtable (decl, class_type, 0);
|
||||
|
||||
return decl;
|
||||
|
@ -7500,7 +7502,7 @@ build_vtbl_initializer (binfo, orig_binfo, t, rtti_binfo, non_fn_entries_p)
|
|||
vid.primary_vtbl_p = (binfo == TYPE_BINFO (t));
|
||||
vid.ctor_vtbl_p = !same_type_p (BINFO_TYPE (rtti_binfo), t);
|
||||
/* The first vbase or vcall offset is at index -3 in the vtable. */
|
||||
vid.index = ssize_int (-3);
|
||||
vid.index = ssize_int (-3 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
|
||||
|
||||
/* Add entries to the vtable for RTTI. */
|
||||
build_rtti_vtbl_entries (binfo, &vid);
|
||||
|
@ -7518,6 +7520,22 @@ build_vtbl_initializer (binfo, orig_binfo, t, rtti_binfo, non_fn_entries_p)
|
|||
vbase = TREE_CHAIN (vbase))
|
||||
CLEAR_BINFO_VTABLE_PATH_MARKED (TREE_VALUE (vbase));
|
||||
|
||||
/* If the target requires padding between data entries, add that now. */
|
||||
if (TARGET_VTABLE_DATA_ENTRY_DISTANCE > 1)
|
||||
{
|
||||
tree cur, *prev;
|
||||
|
||||
for (prev = &vid.inits; (cur = *prev); prev = &TREE_CHAIN (cur))
|
||||
{
|
||||
tree add = cur;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < TARGET_VTABLE_DATA_ENTRY_DISTANCE; ++i)
|
||||
add = tree_cons (NULL_TREE, null_pointer_node, add);
|
||||
*prev = add;
|
||||
}
|
||||
}
|
||||
|
||||
if (non_fn_entries_p)
|
||||
*non_fn_entries_p = list_length (vid.inits);
|
||||
|
||||
|
@ -7735,7 +7753,8 @@ build_vbase_offset_vtbl_entries (binfo, vid)
|
|||
}
|
||||
|
||||
/* The next vbase will come at a more negative offset. */
|
||||
vid->index = size_binop (MINUS_EXPR, vid->index, ssize_int (1));
|
||||
vid->index = size_binop (MINUS_EXPR, vid->index,
|
||||
ssize_int (TARGET_VTABLE_DATA_ENTRY_DISTANCE));
|
||||
|
||||
/* The initializer is the delta from BINFO to this virtual base.
|
||||
The vbase offsets go in reverse inheritance-graph order, and
|
||||
|
|
|
@ -102,7 +102,7 @@ build_headof (exp)
|
|||
exp = save_expr (exp);
|
||||
|
||||
/* The offset-to-top field is at index -2 from the vptr. */
|
||||
index = build_int_2 (-2, -1);
|
||||
index = build_int_2 (-2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE, -1);
|
||||
|
||||
offset = build_vtbl_ref (build_indirect_ref (exp, NULL), index);
|
||||
|
||||
|
@ -181,7 +181,7 @@ get_tinfo_decl_dynamic (exp)
|
|||
tree index;
|
||||
|
||||
/* The RTTI information is at index -1. */
|
||||
index = integer_minus_one_node;
|
||||
index = build_int_2 (-1 * TARGET_VTABLE_DATA_ENTRY_DISTANCE, -1);
|
||||
t = build_vtbl_ref (exp, index);
|
||||
TREE_TYPE (t) = build_pointer_type (tinfo_decl_type);
|
||||
return t;
|
||||
|
@ -1180,12 +1180,11 @@ create_pseudo_type_info VPARAMS((const char *real_name, int ident, ...))
|
|||
vtable_decl = build_unary_op (ADDR_EXPR, vtable_decl, 0);
|
||||
|
||||
/* We need to point into the middle of the vtable. */
|
||||
vtable_decl = build (PLUS_EXPR,
|
||||
TREE_TYPE (vtable_decl),
|
||||
vtable_decl,
|
||||
size_binop (MULT_EXPR,
|
||||
size_int (2),
|
||||
TYPE_SIZE_UNIT (vtable_entry_type)));
|
||||
vtable_decl
|
||||
= build (PLUS_EXPR, TREE_TYPE (vtable_decl), vtable_decl,
|
||||
size_binop (MULT_EXPR,
|
||||
size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
|
||||
TYPE_SIZE_UNIT (vtable_entry_type)));
|
||||
TREE_CONSTANT (vtable_decl) = 1;
|
||||
|
||||
/* First field is the pseudo type_info base class. */
|
||||
|
|
|
@ -380,6 +380,22 @@ do { ASM_OUTPUT_LABEL(FILE,LABEL_ALTERNATE_NAME (INSN)); } while (0)
|
|||
#define TARGET_VTABLE_USES_DESCRIPTORS 0
|
||||
#endif
|
||||
|
||||
/* By default, the vtable entries are void pointers, the so the alignment
|
||||
is the same as pointer alignment. The value of this macro specifies
|
||||
the alignment of the vtable entry in bits. It should be defined only
|
||||
when special alignment is necessary. */
|
||||
#ifndef TARGET_VTABLE_ENTRY_ALIGN
|
||||
#define TARGET_VTABLE_ENTRY_ALIGN POINTER_SIZE
|
||||
#endif
|
||||
|
||||
/* There are a few non-descriptor entries in the vtable at offsets below
|
||||
zero. If these entries must be padded (say, to preserve the alignment
|
||||
specified by TARGET_VTABLE_ENTRY_ALIGN), set this to the number of
|
||||
words in each data entry. */
|
||||
#ifndef TARGET_VTABLE_DATA_ENTRY_DISTANCE
|
||||
#define TARGET_VTABLE_DATA_ENTRY_DISTANCE 1
|
||||
#endif
|
||||
|
||||
/* Select a format to encode pointers in exception handling data. We
|
||||
prefer those that result in fewer dynamic relocations. Assume no
|
||||
special support here and encode direct references. */
|
||||
|
|
|
@ -1695,6 +1695,20 @@ pointer to which the function's data is relative.
|
|||
|
||||
If vtables are used, the value of this macro should be the number
|
||||
of words that the function descriptor occupies.
|
||||
|
||||
@findex TARGET_VTABLE_ENTRY_ALIGN
|
||||
@item TARGET_VTABLE_ENTRY_ALIGN
|
||||
By default, the vtable entries are void pointers, the so the alignment
|
||||
is the same as pointer alignment. The value of this macro specifies
|
||||
the alignment of the vtable entry in bits. It should be defined only
|
||||
when special alignment is necessary. */
|
||||
|
||||
@findex TARGET_VTABLE_DATA_ENTRY_DISTANCE
|
||||
@item TARGET_VTABLE_DATA_ENTRY_DISTANCE
|
||||
There are a few non-descriptor entries in the vtable at offsets below
|
||||
zero. If these entries must be padded (say, to preserve the alignment
|
||||
specified by @code{TARGET_VTABLE_ENTRY_ALIGN}), set this to the number
|
||||
of words in each data entry.
|
||||
@end table
|
||||
|
||||
@node Escape Sequences
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2002-06-13 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* g++.old-deja/g++.abi/vtable2.C (INC_VDATA): New. Define for
|
||||
ia64 ilp32.
|
||||
|
||||
2002-06-12 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
* g++.dg/template/typename2.C: Update error message.
|
||||
|
|
|
@ -130,10 +130,17 @@ void _ZN2S42s1Ev ();
|
|||
// IA-64 uses function descriptors not function pointers in its vtables.
|
||||
#if defined __ia64__
|
||||
#define CMP_VPTR(A, B) (*(void **)(A) == *(void **)(B))
|
||||
#ifdef _LP64
|
||||
#define INC_VPTR(A) ((A) += 2)
|
||||
#define INC_VDATA(A,N) ((A) += (N))
|
||||
#else
|
||||
#define INC_VPTR(A) ((A) += 4)
|
||||
#define INC_VDATA(A,N) ((A) += 2*(N))
|
||||
#endif
|
||||
#else
|
||||
#define CMP_VPTR(A, B) (*(A) == (ptrdiff_t)(B))
|
||||
#define INC_VPTR(A) ((A) += 1)
|
||||
#define INC_VDATA(A,N) ((A) += (N))
|
||||
#endif
|
||||
|
||||
int main ()
|
||||
|
@ -145,18 +152,22 @@ int main ()
|
|||
// Set vtbl to point at the beginning of S4's primary vtable.
|
||||
vptr = (ptrdiff_t **) &s4;
|
||||
vtbl = *vptr;
|
||||
vtbl -= 5;
|
||||
INC_VDATA (vtbl, -5);
|
||||
|
||||
if (*vtbl++ != ((char*) (S0*) &s4) - (char*) &s4)
|
||||
if (*vtbl != ((char*) (S0*) &s4) - (char*) &s4)
|
||||
return 1;
|
||||
if (*vtbl++ != ((char*) (S1*) &s4) - (char*) &s4)
|
||||
INC_VDATA (vtbl, 1);
|
||||
if (*vtbl != ((char*) (S1*) &s4) - (char*) &s4)
|
||||
return 2;
|
||||
if (*vtbl++ != ((char*) (S2*) &s4) - (char*) &s4)
|
||||
INC_VDATA (vtbl, 1);
|
||||
if (*vtbl != ((char*) (S2*) &s4) - (char*) &s4)
|
||||
return 3;
|
||||
if (*vtbl++ != 0)
|
||||
INC_VDATA (vtbl, 1);
|
||||
if (*vtbl != 0)
|
||||
return 4;
|
||||
INC_VDATA (vtbl, 1);
|
||||
// Skip the RTTI entry.
|
||||
vtbl++;
|
||||
INC_VDATA (vtbl, 1);
|
||||
if (! CMP_VPTR (vtbl, &_ZN2S32s3Ev))
|
||||
return 5;
|
||||
INC_VPTR (vtbl);
|
||||
|
@ -164,21 +175,26 @@ int main ()
|
|||
return 6;
|
||||
INC_VPTR (vtbl);
|
||||
// The S1 vbase offset.
|
||||
if (*vtbl++ != 0)
|
||||
if (*vtbl != 0)
|
||||
return 7;
|
||||
INC_VDATA (vtbl, 1);
|
||||
// The S4::s1 vcall offset is negative; once you convert to S2, you
|
||||
// have to convert to S4 to find the final overrider.
|
||||
if (*vtbl++ != ((char*) &s4 - (char*) (S2*) &s4))
|
||||
if (*vtbl != ((char*) &s4 - (char*) (S2*) &s4))
|
||||
return 8;
|
||||
if (*vtbl++ != 0)
|
||||
INC_VDATA (vtbl, 1);
|
||||
if (*vtbl != 0)
|
||||
return 9;
|
||||
if (*vtbl++ != 0)
|
||||
INC_VDATA (vtbl, 1);
|
||||
if (*vtbl != 0)
|
||||
return 10;
|
||||
INC_VDATA (vtbl, 1);
|
||||
// Now we're at the S2 offset to top entry.
|
||||
if (*vtbl++ != ((char*) &s4 - (char*) (S2*) &s4))
|
||||
if (*vtbl != ((char*) &s4 - (char*) (S2*) &s4))
|
||||
return 11;
|
||||
INC_VDATA (vtbl, 1);
|
||||
// Skip the RTTI entry.
|
||||
vtbl++;
|
||||
INC_VDATA (vtbl, 1);
|
||||
// Skip the remaining virtual functions -- they are thunks.
|
||||
INC_VPTR (vtbl);
|
||||
INC_VPTR (vtbl);
|
||||
|
|
Loading…
Add table
Reference in a new issue