diff mbox series

middle-end/AArch64 Fix bootstrap after vec changes

Message ID patch-14760-tamar@arm.com
State New
Headers show
Series middle-end/AArch64 Fix bootstrap after vec changes | expand

Commit Message

Tamar Christina Aug. 6, 2021, 10:50 a.m. UTC
Hi All,

The build is broken since a3d3e8c362c2 since it's deleted the ability to pass
vec<> by value and now much be past by reference.

However some language hooks used by AArch64 were not updated and breaks the
build on AArch64.  This patch updates these hooks.

However most of the changes are generic... so I'm sending to a cross section
of approvers.

Bootstrapped aarch64-none-linux-gnu and works again.

Ok for master?

Thanks,
Tamar

gcc/c/ChangeLog:

	* c-decl.c (c_simulate_enum_decl): Pass vec<> by pointer.
	* c-tree.h (c_simulate_enum_decl): Likewise.

gcc/ChangeLog:

	* config/aarch64/aarch64-sve-builtins.cc (register_svpattern,
	register_svprfop): Pass vec<> by pointer.
	* langhooks-def.h (lhd_simulate_enum_decl): Likewise.
	* langhooks.c (lhd_simulate_enum_decl): Likewise.
	* langhooks.h (struct lang_hooks_for_types): Likewise.

gcc/cp/ChangeLog:

	* cp-objcp-common.h (cxx_simulate_enum_decl): Pass vec<> by pointer.
	* decl.c (cxx_simulate_enum_decl): Likewise.

--- inline copy of patch -- 
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 234ee16fe4afe5baf3490596d27662c7acee8126..221a67fe57be105dfb88f5053179adb62c9cc47d 100644


--

Comments

Richard Biener Aug. 6, 2021, 11:17 a.m. UTC | #1
On Fri, 6 Aug 2021, Tamar Christina wrote:

> Hi All,
> 
> The build is broken since a3d3e8c362c2 since it's deleted the ability to pass
> vec<> by value and now much be past by reference.
> 
> However some language hooks used by AArch64 were not updated and breaks the
> build on AArch64.  This patch updates these hooks.
> 
> However most of the changes are generic... so I'm sending to a cross section
> of approvers.
> 
> Bootstrapped aarch64-none-linux-gnu and works again.
> 
> Ok for master?

OK.

> Thanks,
> Tamar
> 
> gcc/c/ChangeLog:
> 
> 	* c-decl.c (c_simulate_enum_decl): Pass vec<> by pointer.
> 	* c-tree.h (c_simulate_enum_decl): Likewise.
> 
> gcc/ChangeLog:
> 
> 	* config/aarch64/aarch64-sve-builtins.cc (register_svpattern,
> 	register_svprfop): Pass vec<> by pointer.
> 	* langhooks-def.h (lhd_simulate_enum_decl): Likewise.
> 	* langhooks.c (lhd_simulate_enum_decl): Likewise.
> 	* langhooks.h (struct lang_hooks_for_types): Likewise.
> 
> gcc/cp/ChangeLog:
> 
> 	* cp-objcp-common.h (cxx_simulate_enum_decl): Pass vec<> by pointer.
> 	* decl.c (cxx_simulate_enum_decl): Likewise.
> 
> --- inline copy of patch -- 
> diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
> index 234ee16fe4afe5baf3490596d27662c7acee8126..221a67fe57be105dfb88f5053179adb62c9cc47d 100644
> --- a/gcc/c/c-decl.c
> +++ b/gcc/c/c-decl.c
> @@ -9379,7 +9379,7 @@ build_enumerator (location_t decl_loc, location_t loc,
>  
>  tree
>  c_simulate_enum_decl (location_t loc, const char *name,
> -		      vec<string_int_pair> values)
> +		      vec<string_int_pair> *values_ptr)
>  {
>    location_t saved_loc = input_location;
>    input_location = loc;
> @@ -9389,6 +9389,7 @@ c_simulate_enum_decl (location_t loc, const char *name,
>  
>    tree value_chain = NULL_TREE;
>    string_int_pair *value;
> +  vec<string_int_pair> values = *values_ptr;
>    unsigned int i;
>    FOR_EACH_VEC_ELT (values, i, value)
>      {
> diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
> index ab6db3860f5062d5d73e3ffacf123a992b9c6c48..a8a90eae30d54006e83b20cdcc7aa7a582686c6c 100644
> --- a/gcc/c/c-tree.h
> +++ b/gcc/c/c-tree.h
> @@ -595,7 +595,7 @@ extern void finish_function (location_t = input_location);
>  extern tree finish_struct (location_t, tree, tree, tree,
>  			   class c_struct_parse_info *);
>  extern tree c_simulate_enum_decl (location_t, const char *,
> -				  vec<string_int_pair>);
> +				  vec<string_int_pair> *);
>  extern struct c_arg_info *build_arg_info (void);
>  extern struct c_arg_info *get_parm_info (bool, tree);
>  extern tree grokfield (location_t, struct c_declarator *,
> diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
> index f44f81f13754b2d7f7391086c846ee2f966d54a7..f71b287570e4c8c00149e864db4bf03941382672 100644
> --- a/gcc/config/aarch64/aarch64-sve-builtins.cc
> +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
> @@ -3499,7 +3499,7 @@ register_svpattern ()
>  #undef PUSH
>  
>    acle_svpattern = lang_hooks.types.simulate_enum_decl (input_location,
> -							"svpattern", values);
> +							"svpattern", &values);
>  }
>  
>  /* Register the svprfop enum.  */
> @@ -3513,7 +3513,7 @@ register_svprfop ()
>  #undef PUSH
>  
>    acle_svprfop = lang_hooks.types.simulate_enum_decl (input_location,
> -						      "svprfop", values);
> +						      "svprfop", &values);
>  }
>  
>  /* Implement #pragma GCC aarch64 "arm_sve.h".  */
> diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
> index 53c6e4c2c8859be51b7bbcc87ce688d35c10f602..f1704aad5578c4132bcee5b3f9799dbacb6fd114 100644
> --- a/gcc/cp/cp-objcp-common.h
> +++ b/gcc/cp/cp-objcp-common.h
> @@ -38,7 +38,7 @@ extern bool cp_handle_option (size_t, const char *, HOST_WIDE_INT, int,
>  			      location_t, const struct cl_option_handlers *);
>  extern tree cxx_make_type_hook			(tree_code);
>  extern tree cxx_simulate_enum_decl (location_t, const char *,
> -				    vec<string_int_pair>);
> +				    vec<string_int_pair> *);
>  
>  /* Lang hooks that are shared between C++ and ObjC++ are defined here.  Hooks
>     specific to C++ or ObjC++ go in cp/cp-lang.c and objcp/objcp-lang.c,
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index 6fa6b9adc8778ff641f6a1c6ca9083ee74863331..f626f1e65ee644a494eb57fa5bcb7f1eb05ff667 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -16408,7 +16408,7 @@ lookup_enumerator (tree enumtype, tree name)
>  
>  tree
>  cxx_simulate_enum_decl (location_t loc, const char *name,
> -			vec<string_int_pair> values)
> +			vec<string_int_pair> *values)
>  {
>    location_t saved_loc = input_location;
>    input_location = loc;
> diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
> index 8b744d96fb23af9c16c4860a3ac1c715b292fc24..02b4681dd96e1479cad1d9a233f308c2c1acba9f 100644
> --- a/gcc/langhooks-def.h
> +++ b/gcc/langhooks-def.h
> @@ -55,7 +55,7 @@ extern void lhd_set_decl_assembler_name (tree decl);
>  extern void lhd_overwrite_decl_assembler_name (tree decl, tree name);
>  extern bool lhd_warn_unused_global_decl (const_tree);
>  extern tree lhd_simulate_enum_decl (location_t, const char *,
> -				    vec<string_int_pair>);
> +				    vec<string_int_pair> *);
>  extern tree lhd_type_for_size (unsigned precision, int unsignedp);
>  extern void lhd_incomplete_type_error (location_t, const_tree, const_tree);
>  extern tree lhd_type_promotes_to (tree);
> diff --git a/gcc/langhooks.h b/gcc/langhooks.h
> index 1b417a01a4e08c5c62a969100dbdd81843dfef9e..ffd3e0bf2db588eafae3bcff551327207fa44881 100644
> --- a/gcc/langhooks.h
> +++ b/gcc/langhooks.h
> @@ -66,7 +66,7 @@ struct lang_hooks_for_types
>  
>    /* Make an enum type with the given name and values, associating
>       them all with the given source location.  */
> -  tree (*simulate_enum_decl) (location_t, const char *, vec<string_int_pair>);
> +  tree (*simulate_enum_decl) (location_t, const char *, vec<string_int_pair> *);
>  
>    /* Return what kind of RECORD_TYPE this is, mainly for purposes of
>       debug information.  If not defined, record types are assumed to
> diff --git a/gcc/langhooks.c b/gcc/langhooks.c
> index d753199ffe02c6e5a5c54ad500cdd25012f1e01d..48c723777786e8bb3e3ab3c37ebe1ce296db573a 100644
> --- a/gcc/langhooks.c
> +++ b/gcc/langhooks.c
> @@ -485,7 +485,7 @@ lhd_make_node (enum tree_code code)
>     might be reusable elsewhere.  */
>  tree
>  lhd_simulate_enum_decl (location_t loc, const char *name,
> -			vec<string_int_pair> values)
> +			vec<string_int_pair> *values_ptr)
>  {
>    tree enumtype = lang_hooks.types.make_type (ENUMERAL_TYPE);
>    tree enumdecl = build_decl (loc, TYPE_DECL, get_identifier (name), enumtype);
> @@ -493,6 +493,7 @@ lhd_simulate_enum_decl (location_t loc, const char *name,
>  
>    tree value_chain = NULL_TREE;
>    string_int_pair *value;
> +  vec<string_int_pair> values = *values_ptr;
>    unsigned int i;
>    FOR_EACH_VEC_ELT (values, i, value)
>      {
> 
> 
>
Martin Sebor Aug. 6, 2021, 3:24 p.m. UTC | #2
On 8/6/21 4:50 AM, Tamar Christina wrote:
> Hi All,
> 
> The build is broken since a3d3e8c362c2 since it's deleted the ability to pass
> vec<> by value and now much be past by reference.
> 
> However some language hooks used by AArch64 were not updated and breaks the
> build on AArch64.  This patch updates these hooks.

Thanks.  It occurred to only after I committed the change that I should
have also tested a few other targets.  Sorry about that!

Martin

> 
> However most of the changes are generic... so I'm sending to a cross section
> of approvers.
> 
> Bootstrapped aarch64-none-linux-gnu and works again.
> 
> Ok for master?
> 
> Thanks,
> Tamar
> 
> gcc/c/ChangeLog:
> 
> 	* c-decl.c (c_simulate_enum_decl): Pass vec<> by pointer.
> 	* c-tree.h (c_simulate_enum_decl): Likewise.
> 
> gcc/ChangeLog:
> 
> 	* config/aarch64/aarch64-sve-builtins.cc (register_svpattern,
> 	register_svprfop): Pass vec<> by pointer.
> 	* langhooks-def.h (lhd_simulate_enum_decl): Likewise.
> 	* langhooks.c (lhd_simulate_enum_decl): Likewise.
> 	* langhooks.h (struct lang_hooks_for_types): Likewise.
> 
> gcc/cp/ChangeLog:
> 
> 	* cp-objcp-common.h (cxx_simulate_enum_decl): Pass vec<> by pointer.
> 	* decl.c (cxx_simulate_enum_decl): Likewise.
> 
> --- inline copy of patch --
> diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
> index 234ee16fe4afe5baf3490596d27662c7acee8126..221a67fe57be105dfb88f5053179adb62c9cc47d 100644
> --- a/gcc/c/c-decl.c
> +++ b/gcc/c/c-decl.c
> @@ -9379,7 +9379,7 @@ build_enumerator (location_t decl_loc, location_t loc,
>   
>   tree
>   c_simulate_enum_decl (location_t loc, const char *name,
> -		      vec<string_int_pair> values)
> +		      vec<string_int_pair> *values_ptr)
>   {
>     location_t saved_loc = input_location;
>     input_location = loc;
> @@ -9389,6 +9389,7 @@ c_simulate_enum_decl (location_t loc, const char *name,
>   
>     tree value_chain = NULL_TREE;
>     string_int_pair *value;
> +  vec<string_int_pair> values = *values_ptr;
>     unsigned int i;
>     FOR_EACH_VEC_ELT (values, i, value)
>       {
> diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
> index ab6db3860f5062d5d73e3ffacf123a992b9c6c48..a8a90eae30d54006e83b20cdcc7aa7a582686c6c 100644
> --- a/gcc/c/c-tree.h
> +++ b/gcc/c/c-tree.h
> @@ -595,7 +595,7 @@ extern void finish_function (location_t = input_location);
>   extern tree finish_struct (location_t, tree, tree, tree,
>   			   class c_struct_parse_info *);
>   extern tree c_simulate_enum_decl (location_t, const char *,
> -				  vec<string_int_pair>);
> +				  vec<string_int_pair> *);
>   extern struct c_arg_info *build_arg_info (void);
>   extern struct c_arg_info *get_parm_info (bool, tree);
>   extern tree grokfield (location_t, struct c_declarator *,
> diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
> index f44f81f13754b2d7f7391086c846ee2f966d54a7..f71b287570e4c8c00149e864db4bf03941382672 100644
> --- a/gcc/config/aarch64/aarch64-sve-builtins.cc
> +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
> @@ -3499,7 +3499,7 @@ register_svpattern ()
>   #undef PUSH
>   
>     acle_svpattern = lang_hooks.types.simulate_enum_decl (input_location,
> -							"svpattern", values);
> +							"svpattern", &values);
>   }
>   
>   /* Register the svprfop enum.  */
> @@ -3513,7 +3513,7 @@ register_svprfop ()
>   #undef PUSH
>   
>     acle_svprfop = lang_hooks.types.simulate_enum_decl (input_location,
> -						      "svprfop", values);
> +						      "svprfop", &values);
>   }
>   
>   /* Implement #pragma GCC aarch64 "arm_sve.h".  */
> diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
> index 53c6e4c2c8859be51b7bbcc87ce688d35c10f602..f1704aad5578c4132bcee5b3f9799dbacb6fd114 100644
> --- a/gcc/cp/cp-objcp-common.h
> +++ b/gcc/cp/cp-objcp-common.h
> @@ -38,7 +38,7 @@ extern bool cp_handle_option (size_t, const char *, HOST_WIDE_INT, int,
>   			      location_t, const struct cl_option_handlers *);
>   extern tree cxx_make_type_hook			(tree_code);
>   extern tree cxx_simulate_enum_decl (location_t, const char *,
> -				    vec<string_int_pair>);
> +				    vec<string_int_pair> *);
>   
>   /* Lang hooks that are shared between C++ and ObjC++ are defined here.  Hooks
>      specific to C++ or ObjC++ go in cp/cp-lang.c and objcp/objcp-lang.c,
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index 6fa6b9adc8778ff641f6a1c6ca9083ee74863331..f626f1e65ee644a494eb57fa5bcb7f1eb05ff667 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -16408,7 +16408,7 @@ lookup_enumerator (tree enumtype, tree name)
>   
>   tree
>   cxx_simulate_enum_decl (location_t loc, const char *name,
> -			vec<string_int_pair> values)
> +			vec<string_int_pair> *values)
>   {
>     location_t saved_loc = input_location;
>     input_location = loc;
> diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
> index 8b744d96fb23af9c16c4860a3ac1c715b292fc24..02b4681dd96e1479cad1d9a233f308c2c1acba9f 100644
> --- a/gcc/langhooks-def.h
> +++ b/gcc/langhooks-def.h
> @@ -55,7 +55,7 @@ extern void lhd_set_decl_assembler_name (tree decl);
>   extern void lhd_overwrite_decl_assembler_name (tree decl, tree name);
>   extern bool lhd_warn_unused_global_decl (const_tree);
>   extern tree lhd_simulate_enum_decl (location_t, const char *,
> -				    vec<string_int_pair>);
> +				    vec<string_int_pair> *);
>   extern tree lhd_type_for_size (unsigned precision, int unsignedp);
>   extern void lhd_incomplete_type_error (location_t, const_tree, const_tree);
>   extern tree lhd_type_promotes_to (tree);
> diff --git a/gcc/langhooks.h b/gcc/langhooks.h
> index 1b417a01a4e08c5c62a969100dbdd81843dfef9e..ffd3e0bf2db588eafae3bcff551327207fa44881 100644
> --- a/gcc/langhooks.h
> +++ b/gcc/langhooks.h
> @@ -66,7 +66,7 @@ struct lang_hooks_for_types
>   
>     /* Make an enum type with the given name and values, associating
>        them all with the given source location.  */
> -  tree (*simulate_enum_decl) (location_t, const char *, vec<string_int_pair>);
> +  tree (*simulate_enum_decl) (location_t, const char *, vec<string_int_pair> *);
>   
>     /* Return what kind of RECORD_TYPE this is, mainly for purposes of
>        debug information.  If not defined, record types are assumed to
> diff --git a/gcc/langhooks.c b/gcc/langhooks.c
> index d753199ffe02c6e5a5c54ad500cdd25012f1e01d..48c723777786e8bb3e3ab3c37ebe1ce296db573a 100644
> --- a/gcc/langhooks.c
> +++ b/gcc/langhooks.c
> @@ -485,7 +485,7 @@ lhd_make_node (enum tree_code code)
>      might be reusable elsewhere.  */
>   tree
>   lhd_simulate_enum_decl (location_t loc, const char *name,
> -			vec<string_int_pair> values)
> +			vec<string_int_pair> *values_ptr)
>   {
>     tree enumtype = lang_hooks.types.make_type (ENUMERAL_TYPE);
>     tree enumdecl = build_decl (loc, TYPE_DECL, get_identifier (name), enumtype);
> @@ -493,6 +493,7 @@ lhd_simulate_enum_decl (location_t loc, const char *name,
>   
>     tree value_chain = NULL_TREE;
>     string_int_pair *value;
> +  vec<string_int_pair> values = *values_ptr;
>     unsigned int i;
>     FOR_EACH_VEC_ELT (values, i, value)
>       {
> 
>
diff mbox series

Patch

diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 234ee16fe4afe5baf3490596d27662c7acee8126..221a67fe57be105dfb88f5053179adb62c9cc47d 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -9379,7 +9379,7 @@  build_enumerator (location_t decl_loc, location_t loc,
 
 tree
 c_simulate_enum_decl (location_t loc, const char *name,
-		      vec<string_int_pair> values)
+		      vec<string_int_pair> *values_ptr)
 {
   location_t saved_loc = input_location;
   input_location = loc;
@@ -9389,6 +9389,7 @@  c_simulate_enum_decl (location_t loc, const char *name,
 
   tree value_chain = NULL_TREE;
   string_int_pair *value;
+  vec<string_int_pair> values = *values_ptr;
   unsigned int i;
   FOR_EACH_VEC_ELT (values, i, value)
     {
diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
index ab6db3860f5062d5d73e3ffacf123a992b9c6c48..a8a90eae30d54006e83b20cdcc7aa7a582686c6c 100644
--- a/gcc/c/c-tree.h
+++ b/gcc/c/c-tree.h
@@ -595,7 +595,7 @@  extern void finish_function (location_t = input_location);
 extern tree finish_struct (location_t, tree, tree, tree,
 			   class c_struct_parse_info *);
 extern tree c_simulate_enum_decl (location_t, const char *,
-				  vec<string_int_pair>);
+				  vec<string_int_pair> *);
 extern struct c_arg_info *build_arg_info (void);
 extern struct c_arg_info *get_parm_info (bool, tree);
 extern tree grokfield (location_t, struct c_declarator *,
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
index f44f81f13754b2d7f7391086c846ee2f966d54a7..f71b287570e4c8c00149e864db4bf03941382672 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
@@ -3499,7 +3499,7 @@  register_svpattern ()
 #undef PUSH
 
   acle_svpattern = lang_hooks.types.simulate_enum_decl (input_location,
-							"svpattern", values);
+							"svpattern", &values);
 }
 
 /* Register the svprfop enum.  */
@@ -3513,7 +3513,7 @@  register_svprfop ()
 #undef PUSH
 
   acle_svprfop = lang_hooks.types.simulate_enum_decl (input_location,
-						      "svprfop", values);
+						      "svprfop", &values);
 }
 
 /* Implement #pragma GCC aarch64 "arm_sve.h".  */
diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
index 53c6e4c2c8859be51b7bbcc87ce688d35c10f602..f1704aad5578c4132bcee5b3f9799dbacb6fd114 100644
--- a/gcc/cp/cp-objcp-common.h
+++ b/gcc/cp/cp-objcp-common.h
@@ -38,7 +38,7 @@  extern bool cp_handle_option (size_t, const char *, HOST_WIDE_INT, int,
 			      location_t, const struct cl_option_handlers *);
 extern tree cxx_make_type_hook			(tree_code);
 extern tree cxx_simulate_enum_decl (location_t, const char *,
-				    vec<string_int_pair>);
+				    vec<string_int_pair> *);
 
 /* Lang hooks that are shared between C++ and ObjC++ are defined here.  Hooks
    specific to C++ or ObjC++ go in cp/cp-lang.c and objcp/objcp-lang.c,
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6fa6b9adc8778ff641f6a1c6ca9083ee74863331..f626f1e65ee644a494eb57fa5bcb7f1eb05ff667 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -16408,7 +16408,7 @@  lookup_enumerator (tree enumtype, tree name)
 
 tree
 cxx_simulate_enum_decl (location_t loc, const char *name,
-			vec<string_int_pair> values)
+			vec<string_int_pair> *values)
 {
   location_t saved_loc = input_location;
   input_location = loc;
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 8b744d96fb23af9c16c4860a3ac1c715b292fc24..02b4681dd96e1479cad1d9a233f308c2c1acba9f 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -55,7 +55,7 @@  extern void lhd_set_decl_assembler_name (tree decl);
 extern void lhd_overwrite_decl_assembler_name (tree decl, tree name);
 extern bool lhd_warn_unused_global_decl (const_tree);
 extern tree lhd_simulate_enum_decl (location_t, const char *,
-				    vec<string_int_pair>);
+				    vec<string_int_pair> *);
 extern tree lhd_type_for_size (unsigned precision, int unsignedp);
 extern void lhd_incomplete_type_error (location_t, const_tree, const_tree);
 extern tree lhd_type_promotes_to (tree);
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 1b417a01a4e08c5c62a969100dbdd81843dfef9e..ffd3e0bf2db588eafae3bcff551327207fa44881 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -66,7 +66,7 @@  struct lang_hooks_for_types
 
   /* Make an enum type with the given name and values, associating
      them all with the given source location.  */
-  tree (*simulate_enum_decl) (location_t, const char *, vec<string_int_pair>);
+  tree (*simulate_enum_decl) (location_t, const char *, vec<string_int_pair> *);
 
   /* Return what kind of RECORD_TYPE this is, mainly for purposes of
      debug information.  If not defined, record types are assumed to
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index d753199ffe02c6e5a5c54ad500cdd25012f1e01d..48c723777786e8bb3e3ab3c37ebe1ce296db573a 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -485,7 +485,7 @@  lhd_make_node (enum tree_code code)
    might be reusable elsewhere.  */
 tree
 lhd_simulate_enum_decl (location_t loc, const char *name,
-			vec<string_int_pair> values)
+			vec<string_int_pair> *values_ptr)
 {
   tree enumtype = lang_hooks.types.make_type (ENUMERAL_TYPE);
   tree enumdecl = build_decl (loc, TYPE_DECL, get_identifier (name), enumtype);
@@ -493,6 +493,7 @@  lhd_simulate_enum_decl (location_t loc, const char *name,
 
   tree value_chain = NULL_TREE;
   string_int_pair *value;
+  vec<string_int_pair> values = *values_ptr;
   unsigned int i;
   FOR_EACH_VEC_ELT (values, i, value)
     {