This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch c++]: Fix type_info struct for llp64 targets
Ping
2012/12/21 Kai Tietz <ktietz70@googlemail.com>:
> Hello,
>
> this patch fixes the layout of the info_type-s for llp64 target. We
> used here 'long' type instead
> of pointer-scalar-witdth type. That's an issue for llp64 targets.
> I introduced for that the LONGPTR_T helper-macro, which has either
> scalar-size of 'long' type, or
> of 'long long' type's size, if pointer is larger then scalar-size of
> 'long' type.
>
> ChangeLog
>
> 2012-12-21 Kai Tietz
>
> * rtti.c (LONGPTR_T): New helper-macro.
> (get_pseudo_ti_init): Initialize offset_type by LONGPTR_T
> type instead of 'long' type.
> (create_tinfo_types): Use for offset/flags field LONGPTR_T
> type instead of 'long' type.
>
> Tested for x86_64-w64-mingw32, i686-w64-mingw32, and
> x86_64-unknown-linux-gnu. Ok for apply?
>
> Regards,
> Kai
>
> Index: rtti.c
> ===================================================================
> --- rtti.c (Revision 194660)
> +++ rtti.c (Arbeitskopie)
> @@ -89,6 +89,12 @@ typedef enum tinfo_kind
> /* ... abi::__vmi_type_info<I> */
> } tinfo_kind;
>
> +/* Helper macro to get maximum scalar-width of pointer or of the 'long'-type.
> + This of interest for llp64 targets. */
> +#define LONGPTR_T \
> + integer_types[(POINTER_SIZE <= TYPE_PRECISION (integer_types[itk_long]) \
> + ? itk_long : itk_long_long)]
> +
> /* A vector of all tinfo decls that haven't yet been emitted. */
> vec<tree, va_gc> *unemitted_tinfo_decls;
>
> @@ -1116,7 +1122,7 @@ get_pseudo_ti_init (tree type, unsigned tk_index)
> tree binfo = TYPE_BINFO (type);
> int nbases = BINFO_N_BASE_BINFOS (binfo);
> vec<tree, va_gc> *base_accesses = BINFO_BASE_ACCESSES (binfo);
> - tree offset_type = integer_types[itk_long];
> + tree offset_type = LONGPTR_T;
> tree base_inits = NULL_TREE;
> int ix;
> vec<constructor_elt, va_gc> *init_vec = NULL;
> @@ -1413,14 +1419,15 @@ create_tinfo_types (void)
> /* Base class internal helper. Pointer to base type, offset to base,
> flags. */
> {
> - tree field, fields;
> + tree field, fields, offset_flags_type;
>
> field = build_decl (BUILTINS_LOCATION,
> FIELD_DECL, NULL_TREE, type_info_ptr_type);
> fields = field;
>
> + offset_flags_type = LONGPTR_T;
> field = build_decl (BUILTINS_LOCATION,
> - FIELD_DECL, NULL_TREE, integer_types[itk_long]);
> + FIELD_DECL, NULL_TREE, offset_flags_type);
> DECL_CHAIN (field) = fields;
> fields = field;
--
| (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination