Add declaration-only enums to XML reader/writer.

* src/abg-reader.cc (build_enum_type_decl): Detect a
	declaration-only enum and flag it as such.
	(build_type_decl): Support reading the "is-declaration" attribute.
	(build_class_decl): Adjust.
	* src/abg-writer.cc (write_is_declaration_only): Renamed
	write_class_or_union_is_declaration_only into this.
	(write_enum_is_declaration_only): Remove.
	(write_type_decl, write_enum_type_decl)
	(write_class_decl_opening_tag, write_union_decl_opening_tag): Use
	write_is_declaration_only.
	* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Adjust.
	* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.

Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
This commit is contained in:
Giuliano Procida 2020-06-10 12:59:39 +01:00 committed by Dodji Seketeli
parent 9a113ce771
commit 6295ff70ef
3 changed files with 39 additions and 32 deletions

View File

@ -3457,6 +3457,9 @@ build_type_decl(read_context& ctxt,
if (xml_char_sptr s = XML_NODE_GET_ATTRIBUTE(node, "alignment-in-bits"))
alignment_in_bits = atoi(CHAR_STR(s));
bool is_decl_only = false;
read_is_declaration_only(node, is_decl_only);
location loc;
read_location(ctxt, node, loc);
@ -3479,6 +3482,7 @@ build_type_decl(read_context& ctxt,
type_decl_sptr decl(new type_decl(env, name, size_in_bits,
alignment_in_bits, loc));
decl->set_is_anonymous(is_anonymous);
decl->set_is_declaration_only(is_decl_only);
if (ctxt.push_and_key_type_decl(decl, id, add_to_current_scope))
{
ctxt.map_xml_node_to_decl(node, decl);
@ -4161,6 +4165,9 @@ build_enum_type_decl(read_context& ctxt,
location loc;
read_location(ctxt, node, loc);
bool is_decl_only = false;
read_is_declaration_only(node, is_decl_only);
bool is_anonymous = false;
read_is_anonymous(node, is_anonymous);
@ -4221,6 +4228,7 @@ build_enum_type_decl(read_context& ctxt,
enums, linkage_name));
t->set_is_anonymous(is_anonymous);
t->set_is_artificial(is_artificial);
t->set_is_declaration_only(is_decl_only);
if (ctxt.push_and_key_type_decl(t, id, add_to_current_scope))
{
ctxt.map_xml_node_to_decl(node, t);
@ -4487,8 +4495,7 @@ build_class_decl(read_context& ctxt,
if (!def_id.empty())
{
class_decl_sptr d =
dynamic_pointer_cast<class_decl>(ctxt.get_type_decl(def_id));
decl_base_sptr d = is_decl(ctxt.get_type_decl(def_id));
if (d && d->get_is_declaration_only())
{
is_def_of_decl = true;
@ -4506,7 +4513,7 @@ build_class_decl(read_context& ctxt,
// previous_declaration.
//
// Let's link them.
decl->set_earlier_declaration(previous_declaration);
decl->set_earlier_declaration(is_decl(previous_declaration));
for (vector<type_base_sptr>::const_iterator i = types_ptr->begin();
i != types_ptr->end();
++i)

View File

@ -876,8 +876,7 @@ static void write_elf_symbol_binding(elf_symbol::binding, ostream&);
static bool write_elf_symbol_aliases(const elf_symbol&, ostream&);
static bool write_elf_symbol_reference(const elf_symbol&, ostream&);
static bool write_elf_symbol_reference(const elf_symbol_sptr, ostream&);
static void write_class_or_union_is_declaration_only(const class_or_union_sptr&,
ostream&);
static void write_is_declaration_only(const decl_base_sptr&, ostream&);
static void write_is_struct(const class_decl_sptr&, ostream&);
static void write_is_anonymous(const decl_base_sptr&, ostream&);
static void write_naming_typedef(const class_decl_sptr&, write_context&);
@ -1777,18 +1776,16 @@ write_cdtor_const_static(bool is_ctor,
o << " const='yes'";
}
/// Serialize the attribute "is-declaration-only", if the class or
/// union has its 'is_declaration_only property set.
/// Serialize the attribute "is-declaration-only", if the
/// decl_base_sptr has its 'is_declaration_only property set.
///
/// @param t the pointer to instance of @ref class_or_union to
/// consider.
/// @param t the pointer to instance of @ref decl_base to consider.
///
/// @param o the output stream to serialize to.
static void
write_class_or_union_is_declaration_only(const class_or_union_sptr& t,
ostream& o)
write_is_declaration_only(const decl_base_sptr& d, ostream& o)
{
if (t->get_is_declaration_only())
if (d->get_is_declaration_only())
o << " is-declaration-only='yes'";
}
@ -2459,6 +2456,8 @@ write_type_decl(const type_decl_sptr& d, write_context& ctxt, unsigned indent)
write_size_and_alignment(d, o);
write_is_declaration_only(d, o);
write_location(d, ctxt);
o << " id='" << ctxt.get_id_for_type(d) << "'" << "/>";
@ -2938,6 +2937,7 @@ write_enum_type_decl(const enum_type_decl_sptr& decl,
o << " linkage-name='" << decl->get_linkage_name() << "'";
write_location(decl, ctxt);
write_is_declaration_only(decl, o);
string i = id;
if (i.empty())
@ -3475,7 +3475,7 @@ write_class_decl_opening_tag(const class_decl_sptr& decl,
write_location(decl, ctxt);
write_class_or_union_is_declaration_only(decl, o);
write_is_declaration_only(decl, o);
if (decl->get_earlier_declaration())
{
@ -3549,7 +3549,7 @@ write_union_decl_opening_tag(const union_decl_sptr& decl,
write_location(decl, ctxt);
write_class_or_union_is_declaration_only(decl, o);
write_is_declaration_only(decl, o);
string i = id;
if (i.empty())

View File

@ -270,7 +270,7 @@
<type-decl name='long long int' size-in-bits='64' id='type-id-16'/>
<type-decl name='long long unsigned int' size-in-bits='64' id='type-id-17'/>
<type-decl name='sizetype' size-in-bits='64' id='type-id-5'/>
<type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' id='type-id-18'/>
<type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' is-declaration-only='yes' id='type-id-18'/>
<type-decl name='unsigned char' size-in-bits='8' id='type-id-19'/>
<type-decl name='unsigned int' size-in-bits='32' id='type-id-20'/>
<type-decl name='unsigned long int' size-in-bits='64' id='type-id-21'/>
@ -500,7 +500,7 @@
<class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='256' visibility='default' is-declaration-only='yes' id='type-id-87'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-144'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-144'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -969,7 +969,7 @@
</function-decl>
</member-function>
</class-decl>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-165'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-165'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
<typedef-decl name='memory_order' type-id='type-id-165' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/atomic_base.h' line='63' column='1' id='type-id-164'/>
@ -1140,7 +1140,7 @@
<class-decl name='__anonymous_struct__2' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-173'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-173'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -3877,7 +3877,7 @@
<class-decl name='__anonymous_struct__17' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-215'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-215'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -4400,7 +4400,7 @@
<class-decl name='__anonymous_struct__6' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-230'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-230'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -5355,7 +5355,7 @@
<class-decl name='__anonymous_struct__3' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-287'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-287'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -5408,7 +5408,7 @@
<class-decl name='__anonymous_struct__1' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-288'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-288'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -5426,7 +5426,7 @@
<class-decl name='__anonymous_struct__8' is-anonymous='yes' naming-typedef-id='type-id-285' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-289'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-289'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -7102,14 +7102,14 @@
<class-decl name='__anonymous_struct__2' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-351'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-351'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
</class-decl>
</namespace-decl>
<namespace-decl name='FTDCBSONUtil'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-333'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-333'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</namespace-decl>
@ -7271,7 +7271,7 @@
<class-decl name='__anonymous_struct__19' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-352'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-352'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -7455,7 +7455,7 @@
<class-decl name='__anonymous_struct__1' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'/>
</member-type>
</class-decl>
<enum-decl name='__anonymous_enum__1' is-anonymous='yes' id='type-id-375'>
<enum-decl name='__anonymous_enum__1' is-anonymous='yes' is-declaration-only='yes' id='type-id-375'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
<typedef-decl name='streamsize' type-id='type-id-157' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/postypes.h' line='98' column='1' id='type-id-170'/>
@ -7904,7 +7904,7 @@
<class-decl name='__anonymous_struct__' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-381'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-381'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -7985,7 +7985,7 @@
<class-decl name='__anonymous_struct__11' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-382'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-382'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>
@ -8679,7 +8679,7 @@
</function-decl>
</member-function>
</class-decl>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-408'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-408'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
<class-decl name='__anonymous_struct__14' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'/>
@ -8808,7 +8808,7 @@
</function-decl>
</member-function>
</class-decl>
<enum-decl name='__anonymous_enum__1' is-anonymous='yes' id='type-id-409'>
<enum-decl name='__anonymous_enum__1' is-anonymous='yes' is-declaration-only='yes' id='type-id-409'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
<class-decl name='__anonymous_struct__23' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
@ -8863,7 +8863,7 @@
<class-decl name='__anonymous_struct__26' is-anonymous='yes' visibility='default' is-declaration-only='yes' id='type-id-24'>
<member-type access='private'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' id='type-id-410'>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' is-declaration-only='yes' id='type-id-410'>
<underlying-type type-id='type-id-18'/>
</enum-decl>
</member-type>