diff options
author | Alex White <alex.white@oarcorp.com> | 2021-02-24 15:58:08 -0600 |
---|---|---|
committer | Joel Sherrill <joel@rtems.org> | 2021-03-30 13:15:58 -0500 |
commit | 2845f6c0dad734d27d57bd4f565fb4126f806be7 (patch) | |
tree | d101afa149151d54112511328bd5db1c553a7226 | |
parent | covoar/Target_arm: Add THUMB branch instructions (diff) | |
download | rtems-tools-2845f6c0dad734d27d57bd4f565fb4126f806be7.tar.bz2 |
covoar/CoverageReaderQEMU: Fix infinite loop
There was a potential that the branch info loop never terminated.
This has been fixed by adding a more reliable termination condition
and logging an error if it cannot find the branch target.
-rw-r--r-- | tester/covoar/CoverageReaderQEMU.cc | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/tester/covoar/CoverageReaderQEMU.cc b/tester/covoar/CoverageReaderQEMU.cc index 7c344e4..d3c6abe 100644 --- a/tester/covoar/CoverageReaderQEMU.cc +++ b/tester/covoar/CoverageReaderQEMU.cc @@ -118,8 +118,15 @@ namespace Coverage { // Determine if additional branch information is available. if ( (entry->op & branchInfo) != 0 ) { uint32_t a = entry->pc + entry->size - 1; - while (!aCoverageMap->isStartOfInstruction(a)) + while (a > entry->pc && !aCoverageMap->isStartOfInstruction(a)) a--; + if (a == entry->pc && !aCoverageMap->isStartOfInstruction(a)) { + // Something went wrong parsing the objdump. + std::ostringstream what; + what << "Reached beginning of range in " << file + << " at " << entry->pc << " with no start of instruction."; + throw rld::error( what, "CoverageReaderQEMU::processFile" ); + } if (entry->op & taken) { aCoverageMap->setWasTaken( a ); } else if (entry->op & notTaken) { |