[PATCH 09/22] covoar: Fix DWARF reading
Chris Johns
chrisj at rtems.org
Tue Mar 2 23:15:58 UTC 2021
On 2/3/21 7:01 am, Alex White wrote:
> There were a couple of issues with the way the DWARF info was being
> read. The first issue was that it inefficiently included all symbols,
> even symbols that were not desired. The second issue is that it did
> not handle inline functions correctly. These have been fixed.
> ---
> rtemstoolkit/rld-dwarf.cpp | 8 ++-
> rtemstoolkit/rld-dwarf.h | 5 ++
The RLD dwarf changes are fine. Should this be a separate patch to the covoar
changes?
Chris
> tester/covoar/ExecutableInfo.cc | 30 ++++++++-
> tester/covoar/covoar.cc | 110 ++++++++++++++++----------------
> 4 files changed, 94 insertions(+), 59 deletions(-)
>
> diff --git a/rtemstoolkit/rld-dwarf.cpp b/rtemstoolkit/rld-dwarf.cpp
> index d9ac6f3..acb4fd4 100644
> --- a/rtemstoolkit/rld-dwarf.cpp
> +++ b/rtemstoolkit/rld-dwarf.cpp
> @@ -884,6 +884,12 @@ namespace rld
> return addr;
> }
>
> + bool
> + function::has_entry_pc () const
> + {
> + return has_entry_pc_;
> + }
> +
> bool
> function::has_machine_code () const
> {
> @@ -1702,7 +1708,7 @@ namespace rld
> if (daddr.is_an_end_sequence ())
> seq_base = 0;
> address addr (daddr, loc);
> - if (loc >= pc_low_ && loc < pc_high_)
> + if (loc >= pc_low_ && loc <= pc_high_)
> {
> pc = loc;
> addr_lines_.push_back (addr);
> diff --git a/rtemstoolkit/rld-dwarf.h b/rtemstoolkit/rld-dwarf.h
> index 45fbab1..1210813 100644
> --- a/rtemstoolkit/rld-dwarf.h
> +++ b/rtemstoolkit/rld-dwarf.h
> @@ -376,6 +376,11 @@ namespace rld
> */
> dwarf_unsigned pc_high () const;
>
> + /**
> + * Does the function have an entry PC?
> + */
> + bool has_entry_pc () const;
> +
> /**
> * Does the function have machine code in the image?
> */
> diff --git a/tester/covoar/ExecutableInfo.cc b/tester/covoar/ExecutableInfo.cc
> index c593e1d..c4257f0 100644
> --- a/tester/covoar/ExecutableInfo.cc
> +++ b/tester/covoar/ExecutableInfo.cc
> @@ -45,10 +45,34 @@ namespace Coverage {
> try {
> for (auto& cu : debug.get_cus()) {
> for (auto& func : cu.get_functions()) {
> - if (func.has_machine_code() && (!func.is_inlined() || func.is_external())) {
> - createCoverageMap (cu.name(), func.name(),
> - func.pc_low(), func.pc_high() - 1);
> + if (!func.has_machine_code()) {
> + continue;
> }
> +
> + if (!SymbolsToAnalyze->isDesired(func.name())) {
> + continue;
> + }
> +
> + if (func.is_inlined()) {
> + if (func.is_external()) {
> + // Flag it
> + std::cerr << "Function is both external and inlined: "
> + << func.name() << std::endl;
> + }
> +
> + if (func.has_entry_pc()) {
> + continue;
> + }
> +
> + // If the low PC address is zero, the symbol does not appear in
> + // this executable.
> + if (func.pc_low() == 0) {
> + continue;
> + }
> + }
> +
> + createCoverageMap (cu.name(), func.name(),
> + func.pc_low(), func.pc_high() - 1);
> }
> }
> } catch (...) {
> diff --git a/tester/covoar/covoar.cc b/tester/covoar/covoar.cc
> index cbb0e4f..84d883a 100644
> --- a/tester/covoar/covoar.cc
> +++ b/tester/covoar/covoar.cc
> @@ -222,6 +222,61 @@ int covoar(
> if ( !projectName )
> throw option_error( "project name -p" );
>
> + //
> + // Find the top of the BSP's build tree and if we have found the top
> + // check the executable is under the same path and BSP.
> + //
> + std::string buildPath;
> + std::string buildTarget;
> + std::string buildBSP;
> + createBuildPath(executablesToAnalyze,
> + buildPath,
> + buildTarget,
> + buildBSP);
> +
> + //
> + // Use a command line target if provided.
> + //
> + if (!target.empty()) {
> + buildTarget = target;
> + }
> +
> + if (Verbose) {
> + if (singleExecutable) {
> + std::cerr << "Processing a single executable and multiple coverage files"
> + << std::endl;
> + } else {
> + std::cerr << "Processing multiple executable/coverage file pairs" << std::endl;
> + }
> + std::cerr << "Coverage Format : " << format << std::endl
> + << "Target : " << buildTarget.c_str() << std::endl
> + << std::endl;
> +
> + // Process each executable/coverage file pair.
> + Executables::iterator eitr = executablesToAnalyze.begin();
> + for (const auto& cname : coverageFileNames) {
> + std::cerr << "Coverage file " << cname
> + << " for executable: " << (*eitr)->getFileName() << std::endl;
> + if (!singleExecutable)
> + eitr++;
> + }
> + }
> +
> + //
> + // Create data to support analysis.
> + //
> +
> + // Create data based on target.
> + TargetInfo = Target::TargetFactory( buildTarget );
> +
> + // Create the set of desired symbols.
> + SymbolsToAnalyze = new Coverage::DesiredSymbols();
> +
> + //
> + // Read symbol configuration file and load needed symbols.
> + //
> + SymbolsToAnalyze->load( symbolSet, buildTarget, buildBSP, Verbose );
> +
> // If a single executable was specified, process the remaining
> // arguments as coverage file names.
> if (singleExecutable) {
> @@ -294,61 +349,6 @@ int covoar(
> if (executablesToAnalyze.size() != coverageFileNames.size())
> throw rld::error( "executables and coverage name size mismatch", "covoar" );
>
> - //
> - // Find the top of the BSP's build tree and if we have found the top
> - // check the executable is under the same path and BSP.
> - //
> - std::string buildPath;
> - std::string buildTarget;
> - std::string buildBSP;
> - createBuildPath(executablesToAnalyze,
> - buildPath,
> - buildTarget,
> - buildBSP);
> -
> - //
> - // Use a command line target if provided.
> - //
> - if (!target.empty()) {
> - buildTarget = target;
> - }
> -
> - if (Verbose) {
> - if (singleExecutable) {
> - std::cerr << "Processing a single executable and multiple coverage files"
> - << std::endl;
> - } else {
> - std::cerr << "Processing multiple executable/coverage file pairs" << std::endl;
> - }
> - std::cerr << "Coverage Format : " << format << std::endl
> - << "Target : " << buildTarget.c_str() << std::endl
> - << std::endl;
> -
> - // Process each executable/coverage file pair.
> - Executables::iterator eitr = executablesToAnalyze.begin();
> - for (const auto& cname : coverageFileNames) {
> - std::cerr << "Coverage file " << cname
> - << " for executable: " << (*eitr)->getFileName() << std::endl;
> - if (!singleExecutable)
> - eitr++;
> - }
> - }
> -
> - //
> - // Create data to support analysis.
> - //
> -
> - // Create data based on target.
> - TargetInfo = Target::TargetFactory( buildTarget );
> -
> - // Create the set of desired symbols.
> - SymbolsToAnalyze = new Coverage::DesiredSymbols();
> -
> - //
> - // Read symbol configuration file and load needed symbols.
> - //
> - SymbolsToAnalyze->load( symbolSet, buildTarget, buildBSP, Verbose );
> -
> if ( Verbose )
> std::cerr << "Analyzing " << SymbolsToAnalyze->set.size()
> << " symbols" << std::endl;
>
More information about the devel
mailing list