* langhooks.c (add_builtin_type): New function. * langhooks.h (add_builtin_type): Export it. * config/mep/mep.c (mep_init_builtins): Use it. * config/rs6000/rs6000.c (rs6000_init_builtins): Use it. Index: langhooks.c =================================================================== *** langhooks.c (revision 184954) --- langhooks.c (working copy) *************** lhd_builtin_function (tree decl) *** 605,610 **** --- 605,620 ---- return decl; } + /* Create a builtin type. */ + + tree + add_builtin_type (const char *name, tree type) + { + tree id = get_identifier (name); + tree decl = build_decl (BUILTINS_LOCATION, TYPE_DECL, id, type); + return lang_hooks.decls.pushdecl (decl); + } + /* LTO hooks. */ /* Used to save and restore any previously active section. */ Index: langhooks.h =================================================================== *** langhooks.h (revision 184954) --- langhooks.h (working copy) *************** struct lang_hooks *** 479,484 **** --- 479,485 ---- /* Each front end provides its own. */ extern struct lang_hooks lang_hooks; + extern tree add_builtin_function (const char *name, tree type, int function_code, enum built_in_class cl, const char *library_name, *************** extern tree add_builtin_function_ext_sco *** 489,493 **** enum built_in_class cl, const char *library_name, tree attrs); ! #endif /* GCC_LANG_HOOKS_H */ --- 490,495 ---- enum built_in_class cl, const char *library_name, tree attrs); ! extern tree add_builtin_type (const char *name, tree type); ! #endif /* GCC_LANG_HOOKS_H */ Index: config/mep/mep.c =================================================================== *** config/mep/mep.c (revision 184954) --- config/mep/mep.c (working copy) *************** mep_init_builtins (void) *** 6059,6091 **** v4uhi_type_node = build_vector_type (unsigned_intHI_type_node, 4); v2usi_type_node = build_vector_type (unsigned_intSI_type_node, 2); ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_data_bus_int"), ! cp_data_bus_int_type_node)); ! ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_vector"), ! opaque_vector_type_node)); ! ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_v8qi"), ! v8qi_type_node)); ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_v4hi"), ! v4hi_type_node)); ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_v2si"), ! v2si_type_node)); ! ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_v8uqi"), ! v8uqi_type_node)); ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_v4uhi"), ! v4uhi_type_node)); ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("cp_v2usi"), ! v2usi_type_node)); /* Intrinsics like mep_cadd3 are implemented with two groups of instructions, one which uses UNSPECs and one which uses a specific --- 6059,6075 ---- v4uhi_type_node = build_vector_type (unsigned_intHI_type_node, 4); v2usi_type_node = build_vector_type (unsigned_intSI_type_node, 2); ! add_builtin_type ("cp_data_bus_int", cp_data_bus_int_type_node); ! ! add_builtin_type ("cp_vector", opaque_vector_type_node); ! ! add_builtin_type ("cp_v8qi", v8qi_type_node); ! add_builtin_type ("cp_v4hi", v4hi_type_node); ! add_builtin_type ("cp_v2si", v2si_type_node); ! ! add_builtin_type ("cp_v8uqi", v8uqi_type_node); ! add_builtin_type ("cp_v4uhi", v4uhi_type_node); ! add_builtin_type ("cp_v2usi", v2usi_type_node); /* Intrinsics like mep_cadd3 are implemented with two groups of instructions, one which uses UNSPECs and one which uses a specific Index: config/rs6000/rs6000.c =================================================================== *** config/rs6000/rs6000.c (revision 184954) --- config/rs6000/rs6000.c (working copy) *************** rs6000_init_builtins (void) *** 11567,11591 **** builtin_mode_to_type[V16QImode][0] = V16QI_type_node; builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node; ! tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, ! get_identifier ("__bool char"), ! bool_char_type_node); TYPE_NAME (bool_char_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, ! get_identifier ("__bool short"), ! bool_short_type_node); TYPE_NAME (bool_short_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, ! get_identifier ("__bool int"), ! bool_int_type_node); TYPE_NAME (bool_int_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, get_identifier ("__pixel"), ! pixel_type_node); TYPE_NAME (pixel_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16); bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8); --- 11567,11583 ---- builtin_mode_to_type[V16QImode][0] = V16QI_type_node; builtin_mode_to_type[V16QImode][1] = unsigned_V16QI_type_node; ! tdecl = add_builtin_type ("__bool char", bool_char_type_node); TYPE_NAME (bool_char_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__bool short", bool_short_type_node); TYPE_NAME (bool_short_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__bool int", bool_int_type_node); TYPE_NAME (bool_int_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__pixel", pixel_type_node); TYPE_NAME (pixel_type_node) = tdecl; bool_V16QI_type_node = build_vector_type (bool_char_type_node, 16); bool_V8HI_type_node = build_vector_type (bool_short_type_node, 8); *************** rs6000_init_builtins (void) *** 11593,11680 **** bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2); pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8); ! tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, ! get_identifier ("__vector unsigned char"), ! unsigned_V16QI_type_node); TYPE_NAME (unsigned_V16QI_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector signed char"), ! V16QI_type_node); TYPE_NAME (V16QI_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector __bool char"), ! bool_V16QI_type_node); TYPE_NAME ( bool_V16QI_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector unsigned short"), ! unsigned_V8HI_type_node); TYPE_NAME (unsigned_V8HI_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector signed short"), ! V8HI_type_node); TYPE_NAME (V8HI_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, ! get_identifier ("__vector __bool short"), ! bool_V8HI_type_node); TYPE_NAME (bool_V8HI_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, ! get_identifier ("__vector unsigned int"), ! unsigned_V4SI_type_node); TYPE_NAME (unsigned_V4SI_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector signed int"), ! V4SI_type_node); TYPE_NAME (V4SI_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector __bool int"), ! bool_V4SI_type_node); TYPE_NAME (bool_V4SI_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector float"), ! V4SF_type_node); TYPE_NAME (V4SF_type_node) = tdecl; ! (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector __pixel"), ! pixel_V8HI_type_node); TYPE_NAME (pixel_V8HI_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector double"), ! V2DF_type_node); TYPE_NAME (V2DF_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector long"), ! V2DI_type_node); TYPE_NAME (V2DI_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector unsigned long"), ! unsigned_V2DI_type_node); TYPE_NAME (unsigned_V2DI_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); ! tdecl = build_decl (BUILTINS_LOCATION, ! TYPE_DECL, get_identifier ("__vector __bool long"), ! bool_V2DI_type_node); TYPE_NAME (bool_V2DI_type_node) = tdecl; - (*lang_hooks.decls.pushdecl) (tdecl); /* Paired and SPE builtins are only available if you build a compiler with the appropriate options, so only create those builtins with the --- 11585,11634 ---- bool_V2DI_type_node = build_vector_type (bool_long_type_node, 2); pixel_V8HI_type_node = build_vector_type (pixel_type_node, 8); ! tdecl = add_builtin_type ("__vector unsigned char", unsigned_V16QI_type_node); TYPE_NAME (unsigned_V16QI_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__vector signed char", V16QI_type_node); TYPE_NAME (V16QI_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__vector __bool char", bool_V16QI_type_node); TYPE_NAME ( bool_V16QI_type_node) = tdecl; ! tdecl = add_builtin_type ("__vector unsigned short", unsigned_V8HI_type_node); TYPE_NAME (unsigned_V8HI_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__vector signed short", V8HI_type_node); TYPE_NAME (V8HI_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__vector __bool short", bool_V8HI_type_node); TYPE_NAME (bool_V8HI_type_node) = tdecl; ! tdecl = add_builtin_type ("__vector unsigned int", unsigned_V4SI_type_node); TYPE_NAME (unsigned_V4SI_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__vector signed int", V4SI_type_node); TYPE_NAME (V4SI_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__vector __bool int", bool_V4SI_type_node); TYPE_NAME (bool_V4SI_type_node) = tdecl; ! tdecl = add_builtin_type ("__vector float", V4SF_type_node); TYPE_NAME (V4SF_type_node) = tdecl; ! ! tdecl = add_builtin_type ("__vector __pixel", pixel_V8HI_type_node); TYPE_NAME (pixel_V8HI_type_node) = tdecl; ! tdecl = add_builtin_type ("__vector double", V2DF_type_node); TYPE_NAME (V2DF_type_node) = tdecl; ! tdecl = add_builtin_type ("__vector long", V2DI_type_node); TYPE_NAME (V2DI_type_node) = tdecl; ! tdecl = add_builtin_type ("__vector unsigned long", unsigned_V2DI_type_node); TYPE_NAME (unsigned_V2DI_type_node) = tdecl; ! tdecl = add_builtin_type ("__vector __bool long", bool_V2DI_type_node); TYPE_NAME (bool_V2DI_type_node) = tdecl; /* Paired and SPE builtins are only available if you build a compiler with the appropriate options, so only create those builtins with the *************** spe_init_builtins (void) *** 11843,11852 **** signed_char_type_node, NULL_TREE); ! (*lang_hooks.decls.pushdecl) ! (build_decl (BUILTINS_LOCATION, TYPE_DECL, ! get_identifier ("__ev64_opaque__"), ! opaque_V2SI_type_node)); /* Initialize irregular SPE builtins. */ --- 11797,11803 ---- signed_char_type_node, NULL_TREE); ! add_builtin_type ("__ev64_opaque__", opaque_V2SI_type_node); /* Initialize irregular SPE builtins. */