Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 58 additions & 3 deletions src/abg-dwarf-reader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14507,6 +14507,31 @@ read_debug_info_into_corpus(read_context& ctxt)
t.start();
}
// And now walk all the DIEs again to build the libabigail IR.
// Sort the compilation units to improve determinism of output.
struct dwarf_cu_info {
int compare(const dwarf_cu_info& other) const {
int comp_dir_diff = comp_dir.compare(other.comp_dir);
if (comp_dir_diff)
return comp_dir_diff;
int name_diff = name.compare(other.name);
if (name_diff)
return name_diff;
return index - other.index;
}
bool operator<(const dwarf_cu_info& other) const {
return compare(other) < 0;
}
std::string key() const {
return comp_dir + ':' + name;
}
string comp_dir;
string name;
int index;
Dwarf_Half dwarf_version;
Dwarf_Die unit;
uint8_t address_size;
};
std::vector<dwarf_cu_info> cus;
Dwarf_Half dwarf_version = 0;
for (Dwarf_Off offset = 0, next_offset = 0;
(dwarf_next_unit(ctxt.dwarf(), offset, &next_offset, &header_size,
Expand All @@ -14520,14 +14545,44 @@ read_debug_info_into_corpus(read_context& ctxt)
|| dwarf_tag(&unit) != DW_TAG_compile_unit)
continue;

ctxt.dwarf_version(dwarf_version);

address_size *= 8;

dwarf_cu_info info = {
die_string_attribute(&unit, DW_AT_comp_dir),
die_string_attribute(&unit, DW_AT_name),
static_cast<int>(cus.size()),
dwarf_version,
unit,
address_size
};
cus.push_back(info);
}

std::vector<std::string> before;
std::vector<std::string> after;
for (const auto& c : cus) {
before.push_back(c.key());
}
std::sort(cus.begin(), cus.end());
for (const auto& c : cus) {
after.push_back(c.key());
}
std::ostringstream os;
for (size_t i = 0; i < cus.size(); ++i)
if (before[i] != after[i])
os << i << "\t" << before[i] << "\t" << after[i] << "\n";
std::string out = os.str();
if (!out.empty())
std::cerr << "SORT:\n" << out << std::endl;
for (std::vector<dwarf_cu_info>::iterator it = cus.begin(); it != cus.end(); ++it)
{
dwarf_cu_info& info = *it;
ctxt.dwarf_version(info.dwarf_version);

// Build a translation_unit IR node from cu; note that cu must
// be a DW_TAG_compile_unit die.
translation_unit_sptr ir_node =
build_translation_unit_and_add_to_ir(ctxt, &unit, address_size);
build_translation_unit_and_add_to_ir(ctxt, &info.unit, info.address_size);
ABG_ASSERT(ir_node);
}
if (ctxt.do_log())
Expand Down
778 changes: 389 additions & 389 deletions tests/data/test-annotate/libtest23.so.abi

Large diffs are not rendered by default.

812 changes: 406 additions & 406 deletions tests/data/test-annotate/libtest24-drop-fns-2.so.abi

Large diffs are not rendered by default.

812 changes: 406 additions & 406 deletions tests/data/test-annotate/libtest24-drop-fns.so.abi

Large diffs are not rendered by default.

72 changes: 36 additions & 36 deletions tests/data/test-annotate/test-anonymous-members-0.o.abi
Original file line number Diff line number Diff line change
Expand Up @@ -5,137 +5,137 @@
</elf-function-symbols>
<abi-instr address-size='64' path='test-anonymous-members-0.cc' comp-dir-path='/home/dodji/git/libabigail/fixes/tests/data/test-annotate' language='LANG_C_plus_plus'>
<!-- char -->
<type-decl name='char' size-in-bits='8' id='type-id-1'/>
<type-decl name='char' size-in-bits='8' id='a84c031d'/>
<!-- double -->
<type-decl name='double' size-in-bits='64' id='type-id-2'/>
<type-decl name='double' size-in-bits='64' id='a0eb0f08'/>
<!-- int -->
<type-decl name='int' size-in-bits='32' id='type-id-3'/>
<type-decl name='int' size-in-bits='32' id='95e97e5e'/>
<!-- unnamed&#45;enum&#45;underlying&#45;type&#45;32 -->
<type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-4'/>
<type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
<!-- unsigned int -->
<type-decl name='unsigned int' size-in-bits='32' id='type-id-5'/>
<type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/>
<!-- struct S -->
<class-decl name='S' size-in-bits='256' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='1' column='1' id='type-id-6'>
<class-decl name='S' size-in-bits='256' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='1' column='1' id='50d9a3fa'>
<member-type access='public'>
<!-- struct {int m;} -->
<class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='4' column='1' id='type-id-7'>
<class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='4' column='1' id='e7f43f72'>
<data-member access='public' layout-offset-in-bits='0'>
<!-- int m -->
<var-decl name='m' type-id='type-id-3' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='5' column='1'/>
<var-decl name='m' type-id='95e97e5e' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='5' column='1'/>
</data-member>
</class-decl>
</member-type>
<member-type access='public'>
<!-- struct {char bar;} -->
<class-decl name='__anonymous_struct__1' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='9' column='1' id='type-id-8'>
<class-decl name='__anonymous_struct__1' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='9' column='1' id='e7f43f73'>
<data-member access='public' layout-offset-in-bits='0'>
<!-- char bar -->
<var-decl name='bar' type-id='type-id-1' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='10' column='1'/>
<var-decl name='bar' type-id='a84c031d' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='10' column='1'/>
</data-member>
</class-decl>
</member-type>
<member-type access='public'>
<!-- struct {char baz;} -->
<class-decl name='__anonymous_struct__2' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='14' column='1' id='type-id-9'>
<class-decl name='__anonymous_struct__2' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='14' column='1' id='e7f43f74'>
<data-member access='public' layout-offset-in-bits='0'>
<!-- char baz -->
<var-decl name='baz' type-id='type-id-1' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='15' column='1'/>
<var-decl name='baz' type-id='a84c031d' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='15' column='1'/>
</data-member>
</class-decl>
</member-type>
<member-type access='public'>
<!-- enum S::__anonymous_enum__ -->
<enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='18' column='1' id='type-id-10'>
<underlying-type type-id='type-id-4'/>
<enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='18' column='1' id='08f5ca17'>
<underlying-type type-id='9cac1fee'/>
<enumerator name='one' value='0'/>
<enumerator name='two' value='1'/>
</enum-decl>
</member-type>
<member-type access='public'>
<!-- enum S::__anonymous_enum__1 -->
<enum-decl name='__anonymous_enum__1' is-anonymous='yes' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='20' column='1' id='type-id-11'>
<underlying-type type-id='type-id-4'/>
<enum-decl name='__anonymous_enum__1' is-anonymous='yes' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='20' column='1' id='08f5ca18'>
<underlying-type type-id='9cac1fee'/>
<enumerator name='three' value='0'/>
<enumerator name='four' value='1'/>
</enum-decl>
</member-type>
<member-type access='public'>
<!-- enum S::__anonymous_enum__2 -->
<enum-decl name='__anonymous_enum__2' is-anonymous='yes' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='22' column='1' id='type-id-12'>
<underlying-type type-id='type-id-4'/>
<enum-decl name='__anonymous_enum__2' is-anonymous='yes' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='22' column='1' id='08f5ca19'>
<underlying-type type-id='9cac1fee'/>
<enumerator name='five' value='0'/>
<enumerator name='six' value='1'/>
</enum-decl>
</member-type>
<member-type access='public'>
<!-- union {int a; char b;} -->
<union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='24' column='1' id='type-id-13'>
<union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='24' column='1' id='ac5ab595'>
<data-member access='public'>
<!-- int a -->
<var-decl name='a' type-id='type-id-3' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='24' column='1'/>
<var-decl name='a' type-id='95e97e5e' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='24' column='1'/>
</data-member>
<data-member access='public'>
<!-- char b -->
<var-decl name='b' type-id='type-id-1' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='24' column='1'/>
<var-decl name='b' type-id='a84c031d' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='24' column='1'/>
</data-member>
</union-decl>
</member-type>
<member-type access='public'>
<!-- union {unsigned int c; double d;} -->
<union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='26' column='1' id='type-id-14'>
<union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='26' column='1' id='ac5ab596'>
<data-member access='public'>
<!-- unsigned int c -->
<var-decl name='c' type-id='type-id-5' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='26' column='1'/>
<var-decl name='c' type-id='f0981eeb' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='26' column='1'/>
</data-member>
<data-member access='public'>
<!-- double d -->
<var-decl name='d' type-id='type-id-2' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='26' column='1'/>
<var-decl name='d' type-id='a0eb0f08' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='26' column='1'/>
</data-member>
</union-decl>
</member-type>
<data-member access='public' layout-offset-in-bits='0'>
<!-- struct {int m;} -->
<var-decl name='' type-id='type-id-7' visibility='default'/>
<var-decl name='' type-id='e7f43f72' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='32'>
<!-- struct {char bar;} -->
<var-decl name='' type-id='type-id-8' visibility='default'/>
<var-decl name='' type-id='e7f43f73' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='40'>
<!-- struct {char baz;} -->
<var-decl name='' type-id='type-id-9' visibility='default'/>
<var-decl name='' type-id='e7f43f74' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='64'>
<!-- S::__anonymous_enum__ S::e1 -->
<var-decl name='e1' type-id='type-id-10' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='18' column='1'/>
<var-decl name='e1' type-id='08f5ca17' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='18' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='96'>
<!-- S::__anonymous_enum__1 S::e2 -->
<var-decl name='e2' type-id='type-id-11' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='20' column='1'/>
<var-decl name='e2' type-id='08f5ca18' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='20' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='128'>
<!-- S::__anonymous_enum__2 S::e3 -->
<var-decl name='e3' type-id='type-id-12' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='22' column='1'/>
<var-decl name='e3' type-id='08f5ca19' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='22' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='160'>
<!-- union {int a; char b;} -->
<var-decl name='' type-id='type-id-13' visibility='default'/>
<var-decl name='' type-id='ac5ab595' visibility='default'/>
</data-member>
<data-member access='public' layout-offset-in-bits='192'>
<!-- union {unsigned int c; double d;} -->
<var-decl name='' type-id='type-id-14' visibility='default'/>
<var-decl name='' type-id='ac5ab596' visibility='default'/>
</data-member>
</class-decl>
<!-- S& -->
<reference-type-def kind='lvalue' type-id='type-id-6' size-in-bits='64' id='type-id-15'/>
<reference-type-def kind='lvalue' type-id='50d9a3fa' size-in-bits='64' id='f901ef4c'/>
<!-- void foo(S&) -->
<function-decl name='foo' mangled-name='_Z3fooR1S' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-annotate/test-anonymous-members-0.cc' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooR1S'>
<!-- parameter of type 'S&' -->
<parameter type-id='type-id-15'/>
<parameter type-id='f901ef4c'/>
<!-- void -->
<return type-id='type-id-16'/>
<return type-id='48b5725f'/>
</function-decl>
<!-- void -->
<type-decl name='void' id='type-id-16'/>
<type-decl name='void' id='48b5725f'/>
</abi-instr>
</abi-corpus>
Loading