reader: Recognize variadic parameter type from abixml
authorDodji Seketeli <dodji@redhat.com>
Fri, 21 Apr 2023 12:37:54 +0000 (14:37 +0200)
committerDodji Seketeli <dodji@redhat.com>
Tue, 25 Apr 2023 13:50:26 +0000 (15:50 +0200)
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
src/abg-dwarf-reader.cc
src/abg-ir.cc
src/abg-reader.cc
tests/data/test-read-ctf/test2.so.abi
tests/data/test-read-ctf/test2.so.hash.abi
tests/data/test-read-ctf/test8.o.abi

index 8269e8857460ec43457d3c0da1471988d8b615aa..36b4ac7c5d164a0431573b48200d8c2d61412551 100644 (file)
@@ -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;
 
index ef1d8a4596eb4f2eef41d48b2669c76e474f3675..2942751f2a3b3805e2602a713cd350d50edf6a6d 100644 (file)
@@ -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
index c899f92e2435c441301009afd557b8bb1e2ec9de..8bea0a118de9d052aa20ab7e5526793e1ff77bda 100644 (file)
@@ -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.
 ///
index 1a7ccc7dded6c93179b0f67181c119764e5cc104..f318dbb90eb836359d38b6e3db6984a30ef3bea1 100644 (file)
@@ -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);
index 5731f73dd2363fb60cb2592b5f4f70688205d5fc..18031061d65a8f48444a191b28146f672fa34960 100644 (file)
         <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>
index 7de2522839f775e00307d877d8d995ee9cd7f2a5..15286f42ff39f30061cf8faed60668fcb5cda4de 100644 (file)
         <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>
index cee2b634fa6bed8f53964afb5b423fdcae27cce1..bcd40e2a0b23bbf6c679ce98505b347f23bc0cd7 100644 (file)
@@ -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>