[applied] reader: Recognize variadic parameter type from abixml

Message ID 87sfcm7rw9.fsf@redhat.com
State New
Headers
Series [applied] reader: Recognize variadic parameter type from abixml |

Commit Message

Dodji Seketeli April 26, 2023, 12:24 p.m. UTC
  Hello,

When reading a variadic parameter type from the ABIXML, the reader
forget to recognize it as THE unique variadic parameter type as
returned by abigail::ir::environment::get_variadic_parameter_type().
That makes abigil::ir::environment::is_variadic_parameter_type() to
fail on the variadic type that is build from ABIXML.

Fixed thus.

	* include/abg-ir.h (environment::get_variadic_parameter_type_name)
	Declare ...
	* src/abg-ir.cc (environment::get_variadic_parameter_type_name):
	... a new static member function.
	(environment::get_variadic_parameter_type): Use
	the new environment::get_variadic_parameter_type_name rather than
	using an open coded constant here.
	* src/abg-dwarf-reader.cc
	(die_return_and_parm_names_from_fn_type_die): Likewise.
	* src/abg-reader.cc (build_type_decl):  For a variadic parameter
	type, return
	abigail::ir::environment::get_variadic_parameter_type() rather
	than building a new type.
	* tests/data/test-read-ctf/test2.so.abi: Adjust.
	* tests/data/test-read-ctf/test2.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test8.o.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 include/abg-ir.h                           |  3 +++
 src/abg-dwarf-reader.cc                    |  2 +-
 src/abg-ir.cc                              | 13 +++++++++++--
 src/abg-reader.cc                          |  8 ++++++--
 tests/data/test-read-ctf/test2.so.abi      | 22 +++++++++++-----------
 tests/data/test-read-ctf/test2.so.hash.abi |  4 ++--
 tests/data/test-read-ctf/test8.o.abi       |  8 ++++----
 7 files changed, 38 insertions(+), 22 deletions(-)
  

Patch

diff --git a/include/abg-ir.h b/include/abg-ir.h
index 8269e885..36b4ac7c 100644
--- a/include/abg-ir.h
+++ b/include/abg-ir.h
@@ -165,6 +165,9 @@  public:
   const type_base_sptr&
   get_variadic_parameter_type() const;
 
+  static string&
+  get_variadic_parameter_type_name();
+
   bool
   canonicalization_is_done() const;
 
diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc
index ef1d8a45..2942751f 100644
--- a/src/abg-dwarf-reader.cc
+++ b/src/abg-dwarf-reader.cc
@@ -9650,7 +9650,7 @@  die_return_and_parm_names_from_fn_type_die(const reader& rdr,
 	else if (child_tag == DW_TAG_unspecified_parameters)
 	  {
 	    // This is a variadic function parameter.
-	    parm_names.push_back("variadic parameter type");
+	    parm_names.push_back(rdr.env().get_variadic_parameter_type_name());
 	    // After a DW_TAG_unspecified_parameters tag, we shouldn't
 	    // keep reading for parameters.  The
 	    // unspecified_parameters TAG should be the last parameter
diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index c899f92e..8bea0a11 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -3539,12 +3539,21 @@  environment::get_variadic_parameter_type() const
 {
   if (!priv_->variadic_marker_type_)
     priv_->variadic_marker_type_.
-      reset(new type_decl(*this,
-			  intern("variadic parameter type"),
+      reset(new type_decl(*this, intern(get_variadic_parameter_type_name()),
 			  0, 0, location()));
   return priv_->variadic_marker_type_;
 }
 
+/// Getter of the name of the variadic parameter type.
+///
+/// @return the name of the variadic parameter type.
+string&
+environment::get_variadic_parameter_type_name()
+{
+  static string variadic_parameter_type_name = "variadic parameter type";
+  return variadic_parameter_type_name;
+}
+
 /// Test if the canonicalization of types created out of the current
 /// environment is done.
 ///
diff --git a/src/abg-reader.cc b/src/abg-reader.cc
index 1a7ccc7d..f318dbb9 100644
--- a/src/abg-reader.cc
+++ b/src/abg-reader.cc
@@ -3753,8 +3753,12 @@  build_type_decl(reader&		rdr,
     }
 
   const environment& env = rdr.get_environment();
-  type_decl_sptr decl(new type_decl(env, name, size_in_bits,
-				    alignment_in_bits, loc));
+  type_decl_sptr decl;
+  if (name == env.get_variadic_parameter_type_name())
+    decl = is_type_decl(env.get_variadic_parameter_type());
+  else
+    decl.reset(new type_decl(env, name, size_in_bits,
+			     alignment_in_bits, loc));
   maybe_set_artificial_location(rdr, node, decl);
   decl->set_is_anonymous(is_anonymous);
   decl->set_is_declaration_only(is_decl_only);
diff --git a/tests/data/test-read-ctf/test2.so.abi b/tests/data/test-read-ctf/test2.so.abi
index 5731f73d..18031061 100644
--- a/tests/data/test-read-ctf/test2.so.abi
+++ b/tests/data/test-read-ctf/test2.so.abi
@@ -17,20 +17,20 @@ 
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <typedef-decl name='POINTER' type-id='type-id-5' id='type-id-4'/>
-    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
-    <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
-    <qualified-type-def type-id='type-id-8' const='yes' id='type-id-9'/>
-    <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
-    <pointer-type-def type-id='type-id-8' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <qualified-type-def type-id='type-id-7' const='yes' id='type-id-8'/>
+    <pointer-type-def type-id='type-id-8' size-in-bits='64' alignment-in-bits='64' id='type-id-9'/>
     <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
-      <parameter type-id='type-id-7'/>
-      <return type-id='type-id-8'/>
+      <parameter type-id='type-id-6'/>
+      <return type-id='type-id-7'/>
     </function-decl>
     <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
-      <parameter type-id='type-id-6'/>
-      <return type-id='type-id-8'/>
+      <parameter type-id='type-id-5'/>
+      <return type-id='type-id-7'/>
     </function-decl>
-    <type-decl name='void' id='type-id-8'/>
+    <typedef-decl name='POINTER' type-id='type-id-9' id='type-id-4'/>
+    <type-decl name='void' id='type-id-7'/>
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test2.so.hash.abi b/tests/data/test-read-ctf/test2.so.hash.abi
index 7de25228..15286f42 100644
--- a/tests/data/test-read-ctf/test2.so.hash.abi
+++ b/tests/data/test-read-ctf/test2.so.hash.abi
@@ -17,12 +17,10 @@ 
         <var-decl name='m0' type-id='8a34a235' visibility='default'/>
       </data-member>
     </class-decl>
-    <typedef-decl name='POINTER' type-id='6e97a70c' id='8a34a235'/>
     <pointer-type-def type-id='109cd6fe' size-in-bits='64' alignment-in-bits='64' id='842ea234'/>
     <pointer-type-def type-id='119cd891' size-in-bits='64' alignment-in-bits='64' id='5e30a4f9'/>
     <qualified-type-def type-id='48b5725f' const='yes' id='8581546e'/>
     <pointer-type-def type-id='8581546e' size-in-bits='64' alignment-in-bits='64' id='6e97a70c'/>
-    <pointer-type-def type-id='48b5725f' size-in-bits='64' alignment-in-bits='64' id='eaa32e2f'/>
     <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='5e30a4f9'/>
       <return type-id='48b5725f'/>
@@ -31,6 +29,8 @@ 
       <parameter type-id='842ea234'/>
       <return type-id='48b5725f'/>
     </function-decl>
+    <typedef-decl name='POINTER' type-id='6e97a70c' id='8a34a235'/>
     <type-decl name='void' id='48b5725f'/>
+    <pointer-type-def type-id='48b5725f' size-in-bits='64' alignment-in-bits='64' id='eaa32e2f'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test8.o.abi b/tests/data/test-read-ctf/test8.o.abi
index cee2b634..bcd40e2a 100644
--- a/tests/data/test-read-ctf/test8.o.abi
+++ b/tests/data/test-read-ctf/test8.o.abi
@@ -3,11 +3,11 @@ 
     <elf-symbol name='bar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
     <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
-      <parameter type-id='type-id-2'/>
-      <return type-id='type-id-1'/>
+      <parameter type-id='type-id-1'/>
+      <return type-id='type-id-2'/>
     </function-decl>
-    <type-decl name='void' id='type-id-1'/>
+    <type-decl name='void' id='type-id-2'/>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-1'/>
   </abi-instr>
 </abi-corpus>