Support for function pointers and references
Ondrej Oprala
ooprala@redhat.com
Thu Jan 1 00:00:00 GMT 2015
On 30.09.2015 09:10, Dodji Seketeli wrote:
> Hello Ondrej,
>
> I have looked at the new revisions of your patches, please find my
> comments below.
>
> The patch:
>
> commit 116a65c65335d731cdae1873cbce9bd338906a90
> Author: Ondrej Oprala <ooprala@redhat.com>
> Date: Wed Sep 9 10:12:03 2015 +0200
>
> Generalize some dwarf-reader functions to generate and return
> instances of type_or_decl_base_stpr to be able to propagate
> types occurring without an accompanying declaration.
>
> * src/abg-dwarf-reader.cc (build_ir_node_from_die): Return
> a type_or_decl_base_sptr instead.
> (get_scope_for_die): Likewise.
> (build_class_type_and_add_to_ir): Typecast the assignment from
> build_ir_node_from_die properly.
> (build_{qualified,reference,array,typedef}_type): Likewise.
> (build_pointer_type_def): Likewise.
> (build_{var,function}_decl): Likewise.
>
> Signed-off-by: Ondrej Oprala <ooprala@redhat.com>
>
> Looks good to me. It's OK to go in.
Cool, thanks!
> For the patch:
>
> commit 18a700ff0751a0c578a8c5c59abc5c87c8143335
> Author: Ondrej Oprala <ooprala@redhat.com>
> Date: Wed Sep 23 08:44:00 2015 +0200
>
> Support pointers and references to functions
>
> I still have a few comments. Please find them below.
>
> diff --git a/src/abg-writer.cc b/src/abg-writer.cc
>
> [...]
>
> +/// A convenience typedef for a map that associates a shared pointer to a type
> +/// to a bool.
>
> There is a little repetition in "to a type to a bool" here.
>
> [...]
>
> @@ -132,6 +138,9 @@ class write_context
> ostream& m_ostream;
> type_ptr_map m_type_id_map;
> unordered_map<string, bool> m_emitted_type_id_map;
>
> [...]
>
> + /// A vector of canonical types of function types that
> + /// pointed or referenced to in the current TU
> + fn_shared_ptr_map m_fntype_to_emit_map;
>
> I would call this member m_referenced_fntypes_map. Also, I would
> rather use the comment:
>
> /// A vector of function types that are referenced by emitted pointers
> /// or reference, i.e, that are pointed-to types of pointers or references
> /// that are emitted.
>
> Then I would rename:
>
> + void
> + record_fntype_to_emit(const function_type_sptr& f)
>
> into:
>
> record_fntype_as_referenced(const function_type_sptr& f)
>
>
> I'd also rename:
> + bool
> + fntype_to_emit(const function_type_sptr& f)
>
> into:
>
> bool
> fntype_is_referenced(const function_type_sptr& f)
>
> So, in write_translation_unit, I'd replace the new:
>
> + for (const_fn_iterator i = t.begin(); i != t.end(); ++i)
> + {
> + if (!ctxt.fntype_to_emit(*i))
> + // This function type wasn't marked as one to be emitted
> + // so skip it.
> + continue;
> + o << "\n";
> + write_function_type(*i, ctxt, indent + c.get_xml_element_indent());
> + }
> +
>
> with:
>
> for (const_fn_iterator i = t.begin(); i != t.end(); ++i)
> {
> if ((ctxt.fntype_is_referenced(*i) && ctxt.type_is_emitted(*i))
> // This function type, referenced by an emitted pointer or
> // reference type, has already been emitted, so skip it.
> continue;
> o << "\n";
> write_function_type(*i, ctxt, indent + c.get_xml_element_indent());
> }
I've followed your renames, but I've made the condition
if (!ctxt.fntype_is_referenced(*i) || ctxt.type_is_emitted(*i))
...and amended the comment accordingly...as otherwise it would let unreferenced fntypes slip through.
I also created a ctxt.clear_referenced_fntypes_map, since it needs to be cleared
along with the emitted_types_map, otherwise we'd get duplicates across TUs.
> The idea is to make the code reflect exactly what we are thinking
> about doing, which is, we want function types that are referenced by
> pointer (or reference) types to be emitted; other function types
> should not be emitted.
>
> [...]
>
> +static bool
> +write_function_type(const shared_ptr<function_type> decl, write_context& ctxt,
> + unsigned indent)
> +{
> [...]
>
> + ctxt.record_fntype_as_emitted(decl);
>
> I'd replace this call by a call to the usual
> ctxt.record_type_as_emitted() that is used throughout the code:
>
> ctxt.record_type_as_emitted(decl)
>
> I'd then remove the new member write_context::record_fntype_as_emitted()
> that you've added.
>
> Also, the new test material (you now, the new test files) need to be
> added to tests/data/Makefile.am, otherwise they are not added to the
> tarball by "make dist"; and "make distcheck" would fail anyhow. As a
> general rule, all patches should pass "make distcheck".
My bad, sorry.
> Thanks!
>
The changes are in the usual place :)
Thanks for your patience!
Ondrej
More information about the Libabigail
mailing list