diff options
author | Cary Coutant <ccoutant@google.com> | 2014-06-24 12:17:09 -0700 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2014-06-24 12:17:09 -0700 |
commit | cb818dbff5d914dccffadfdba68e32a324aa4334 (patch) | |
tree | f3b2a45f71da0df0a9ffac5056cfcb539dc4f2d9 /gold/dwp.cc | |
parent | f179cf97a071940bfce6879aa59dbac66ffca391 (diff) | |
download | gdb-cb818dbff5d914dccffadfdba68e32a324aa4334.zip gdb-cb818dbff5d914dccffadfdba68e32a324aa4334.tar.gz gdb-cb818dbff5d914dccffadfdba68e32a324aa4334.tar.bz2 |
Fix dwp to allow intermediate .dwp files with no .debug_types sections.
gold/
* dwp.cc (Dwo_file::read): Allow files with no .debug_types
sections.
(Dwo_file::sized_read_unit_index): Likewise.
Diffstat (limited to 'gold/dwp.cc')
-rw-r--r-- | gold/dwp.cc | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/gold/dwp.cc b/gold/dwp.cc index 6fe5c79..359d4b7 100644 --- a/gold/dwp.cc +++ b/gold/dwp.cc @@ -970,10 +970,13 @@ Dwo_file::read(Dwp_output_file* output_file) this->read_unit_index(debug_cu_index, debug_shndx, output_file, false); if (debug_tu_index > 0) { - if (debug_types.size() != 1) - gold_fatal(_("%s: .dwp file must have exactly one " + if (debug_types.size() > 1) + gold_fatal(_("%s: .dwp file must have no more than one " ".debug_types.dwo section"), this->name_); - debug_shndx[elfcpp::DW_SECT_TYPES] = debug_types[0]; + if (debug_types.size() == 1) + debug_shndx[elfcpp::DW_SECT_TYPES] = debug_types[0]; + else + debug_shndx[elfcpp::DW_SECT_TYPES] = 0; this->read_unit_index(debug_tu_index, debug_shndx, output_file, true); } return; @@ -1154,7 +1157,7 @@ Dwo_file::sized_read_unit_index(unsigned int shndx, : elfcpp::DW_SECT_INFO); unsigned int info_shndx = debug_shndx[info_sect]; - gold_assert(shndx > 0 && info_shndx > 0); + gold_assert(shndx > 0); section_size_type index_len; bool index_is_new; @@ -1180,6 +1183,8 @@ Dwo_file::sized_read_unit_index(unsigned int shndx, if (ncols == 0 || nused == 0) return; + gold_assert(info_shndx > 0); + unsigned int nslots = elfcpp::Swap_unaligned<32, big_endian>::readval(contents + 3 * sizeof(uint32_t)); |