[applied] reader: Recognize variadic parameter type from abixml
Commit Message
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(-)
@@ -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;
@@ -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
@@ -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.
///
@@ -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);
@@ -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>
@@ -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>
@@ -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>