summaryrefslogblamecommitdiffstats
path: root/tester/covoar/ObjdumpProcessor.h
blob: c75755d0318821122bf316ba5e0b6d71a60520c1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15














                                                                       

                        




























































                                                                              
 


                                                           
       
















                                                            

                                                                      
       


                                                

       
                                                           


                                                      


                                                  






                                                              


                                                  


       
                                                                



                                                 
                                                      





                                                               
                                                        































                                                                          
/*! @file ObjdumpProcessor.h
 *  @brief ObjdumpProcessor Specification
 *
 *  This file contains the specification of the ObjdumpProcessor class.
 */

#ifndef __OBJDUMP_PROCESSOR_H__
#define __OBJDUMP_PROCESSOR_H__

#include <list>
#include <string>

#include "ExecutableInfo.h"
#include "TargetBase.h"

#include "rld-process.h"

namespace Coverage {

  /*! @class ObjdumpProcessor
   *
   *  This class implements the functionality which reads the output of
   *  an objdump.  Various information is extracted from the objdump line
   *  to support analysis and report writing.  Analysis of the objdump line
   *  also allows for identification of "nops".  For the purpose of coverage
   *  analysis, nops in the executable may be ignored.  Compilers often
   *  produce nops to align functions on particular alignment boundaries
   *  and the nop between functions can not possibly be executed.
   */
  class ObjdumpProcessor {

  public:

    /*!
     *  This type defines the elements of an objdump line.
     */
    typedef struct {
      /*!
       *  This member variable contains the actual line from the object dump.
       */
      std::string line;

      /*!
       *  This member variable contains the address from the object dump line.
       */
      uint32_t address;

      /*!
       *  This member variable contains an indication of whether the line
       *  is an instruction.
       */
      bool isInstruction;

      /*!
       *  This member variable contains an indication of whether the line
       *  is a nop instruction.
       */
      bool isNop;

      /*!
       *  This member variable contains the size of the nop instruction.
       */
      int nopSize;

      /*!
       *  This member variable contains an indication of whether the line
       *  is a branch instruction.
       */
      bool isBranch;

    } objdumpLine_t;

    /*!
     *  This object defines a list of object dump lines
     *  for a file.
     */
    typedef std::list<objdumpLine_t> objdumpLines_t;


    /*!
     *  This object defines a list of instruction addresses
     *  that will be extracted from the objdump file.
     */
    typedef std::list<uint32_t> objdumpFile_t;

    /*!
     *  This method constructs an ObjdumpProcessor instance.
     */
    ObjdumpProcessor();

    /*!
     *  This method destructs an ObjdumpProcessor instance.
     */
    virtual ~ObjdumpProcessor();

    uint32_t determineLoadAddress(
      ExecutableInfo* theExecutable
    );

    /*!
     *  This method fills a tempfile with the .text section of objdump
     *  for the given file name.
     */
    void getFile( std::string fileName,
                  rld::process::tempfile& dmp,
                  rld::process::tempfile& err );

    /*!
     *  This method fills the objdumpList list with all the
     *  instruction addresses in the object dump file.
     */
    void loadAddressTable (
      ExecutableInfo* const executableInformation,
      rld::process::tempfile& dmp,
      rld::process::tempfile& err
    );

    /*!
     *  This method generates and processes an object dump for
     *  the specified executable.
     */
    void load(
      ExecutableInfo* const executableInformation,
      rld::process::tempfile& dmp,
      rld::process::tempfile& err
    );

    /*!
     *  This method returns the next address in the objdumpList.
     */
    uint32_t getAddressAfter( uint32_t address );

    /*!
     *  This method returns true if the instruction is
     *  an instruction that results in a code branch, otherwise
     *  it returns false.
     */
    bool IsBranch( const char *instruction );

    /*!
     *  This method returns true if the instruction from
     *  the given line in the objdmp file is a branch instruction,
     *  otherwise it returns false.
     */
    bool isBranchLine(
      const char* const line
    );

  private:

    /*!
     *  This variable consists of a list of all instruction addresses
     *  extracted from the obj dump file.
     */
    objdumpFile_t       objdumpList;

    /*!
     *  This method determines whether the specified line is a
     *  nop instruction.
     *
     *  @param[in] line contains the object dump line to check
     *  @param[out] size is set to the size in bytes of the nop
     *
     *  @return Returns TRUE if the instruction is a nop, FALSE otherwise.
     */
    bool isNop(
      const char* const line,
      int&              size
    );

  };
}
#endif