/* Copyright (C) 2021 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef _MODULE_H
#define _MODULE_H

// A Module object represents a .o file that was used to build up a segement.
//	Its main function is to compute source and disassembly annotations
// Text reordering and/or function outlining imply that a module may
//	not be contiguous.

#include "Histable.h"
#include "Hist_data.h"

#define MOD_FLAG_UNKNOWN 0x01

class LoadObject;
class MetricList;
class ComC;
class Disasm;
class Hist_data;
class Stabs;
class SourceFile;
class DataObject;
class JMethod;
template <class ITEM> class Vector;

class InlinedSubr
{
public:
  InlinedSubr ();
  DbeLine *dbeLine;
  Function *func;
  char *fname;
  uint64_t low_pc;
  uint64_t high_pc;
  int level;

  bool
  contains (InlinedSubr *p)
  {
    return low_pc <= p->low_pc && high_pc >= p->high_pc;
  }

  bool
  contains (uint64_t pc)
  {
    return low_pc <= pc && high_pc > pc;
  }
};

class Module : public HistableFile
{
public:
  // Annotated Source or Disassembly
  enum Anno_Errors
  {
    AE_OK,
    AE_NOTREAD,
    AE_NOSRC,
    AE_NOOBJ,
    AE_NOLOBJ,
    AE_NOSTABS,
    AE_NOSYMTAB,
    AE_TIMESRC,
    AE_TIMEDIS,
    AE_TIMESTABS,
    AE_TIMESTABS_DIFF,
    AE_OTHER
  };

  // The following enums are duplicated in Java
  enum Anno_Types
  {
    AT_LIST = 0,
    AT_SRC,
    AT_SRC_ONLY,
    AT_DIS,
    AT_COM,
    AT_QUOTE,
    AT_FUNC,
    AT_EMPTY,
    AT_DIS_ONLY
  };

  Module ();
  virtual ~Module ();
  virtual int64_t get_size ();
  virtual void set_name (char *str);
  virtual Vector<Histable*> *get_comparable_objs ();
  virtual int readFile ();

  virtual Histable_type
  get_type ()
  {
    return MODULE;
  }

  inline Anno_Errors
  get_status ()
  {
    return status;
  }

  inline void
  set_file_name (char *fnm)
  {
    free (file_name);
    file_name = fnm;
  }

  // get error string
  char *anno_str (char *fnm = NULL);

  // generate annotated source/disassembly data
  Hist_data *get_data (DbeView *dbev, MetricList *mlist,
		       Histable::Type type, TValue *ftotal, SourceFile *srcFile,
		       Function *func, Vector<int> *marks, int threshold,
		       int vis_bits, int src_visible, bool hex_visible,
		       bool func_scope, bool src_only,
		       Vector<int_pair_t> *marks2d = NULL,
		       Vector<int_pair_t> *marks2d_inc = NULL);

  Vector<uint64_t> *getAddrs (Function *func);
  SourceFile *setIncludeFile (char *includeFile);

  SourceFile *
  getIncludeFile ()
  {
    return curr_inc;
  }

  SourceFile *
  getMainSrc ()
  {
    return main_source;
  }

  char *
  getResolvedObjectPath ()
  {
    return stabsPath ? stabsPath : get_name ();
  }

  char *
  getDebugPath ()
  {
    setFile ();
    return stabsPath;
  }

  void read_stabs (bool all = true);
  void dump_dataobjects (FILE *out);
  DataObject *get_dobj (uint32_t dtype_id);
  void reset_datatypes ();
  void read_hwcprof_info ();
  bool is_fortran ();
  SourceFile *findSource (const char *fname, bool create);
  bool openStabs (bool all = true);
  LoadObject *createLoadObject (const char *lo_name);
  JMethod *find_jmethod (const char *nm, const char *sig);

  unsigned int flags;               // flags used for marking traversals
  Sp_lang_code lang_code;           // What is source lang. in module
  char *file_name;                  // Full path to actual source file
  Vector<Function*> *functions;     // Unordered list of functions
  LoadObject *loadobject;           // Parent loadobject
  LoadObject *dot_o_file;           // The .o file with debug information
  unsigned fragmented;              // -xF used when compiling module
  int real_timestamp;               // Linked timestamp from N_OPT stab
  int curr_timestamp;               // Current object timestamp from N_OPT stab
  char *comp_flags;                 // compiler flags used to compile module
  char *comp_dir;                   // directory used to compile module
  char *linkerStabName;             // Name from 'N_UNDF' stab
  Stabs *objStabs;                  // stabs of object file
  bool readStabs;
  bool hasStabs;
  bool hasDwarf;
  uint64_t hdrOffset;               // offset in .debug_info
  unsigned hwcprof;                 // hwcprof info status
  Vector<inst_info_t*> *infoList;   // merged list
  Vector<memop_info_t*> ldMemops;   // load instructions
  Vector<memop_info_t*> stMemops;   // store instructions
  Vector<memop_info_t*> pfMemops;   // prefetch instructions
  Vector<target_info_t*> bTargets;  // branch targets
  Vector<datatype_t*> *datatypes;   // object type descriptors
  Vector<SourceFile*> *includes;
  Module *indexStabsLink;           // correspondent module for the .o file
  InlinedSubr *inlinedSubr;

protected:
  void removeStabsTmp (); // Remove temporary *.o (got from *.a)

  // Check timestamp, warn users if src/dis/stabs later than exp.
  Anno_Errors checkTimeStamp (bool chkDis);

  // Set paths for reading Stabs and Symbols
  bool read_ar (int ar, int obj, char *obj_base);
  bool setFile ();

  // Open appropriate symbol tables, construct set of PC ranges,
  //	and maps to source lines for each PC
  Stabs *openDebugInfo ();

  // Construct PC index table
  bool openDisPC ();

  // Compute data--scan data to compute metrics per-src-line/dis-line
  bool computeMetrics (DbeView *dbev, Function *func, MetricList *mlist,
		       Histable::Type type, bool src_metric,
		       bool func_scope, SourceFile *source);
  void init_line ();
  void init_index (Hist_data *witems, int &wlindex, int &wmsize, int &wmindex);

  void set_src_data (Function *func, int vis_bits, int cmpline_visible,
		     int funcline_visible);
  void set_dis_data (Function *func, int vis_bits, int cmpline_visible,
		     int src_visible, bool hex_vis, bool func_scope,
		     int funcline_visible);
  void set_src (Anno_Types type, DbeLine *dbeline);
  void set_dis (DbeInstr *instr, Anno_Types type, bool nextFile, char *dis_str);
  void set_MPSlave ();
  void set_one (Hist_data::HistItem *org_item, Anno_Types type, const char *text);
  void set_ComCom (int vis_bits);

  virtual char *get_disasm (uint64_t inst_address, uint64_t end_address,
			    uint64_t start_address, uint64_t f_offset,
			    int64_t &inst_size);

  Anno_Errors status;
  Anno_Errors openSourceFlag;
  bool hexVisible;          // show hex code in disasm
  time_t disMTime;          // Creating time for disassembly
  time_t stabsMTime;        // Creating time for stabs
  SourceFile *main_source;
  SourceFile *curr_inc;     // pointer to include file or NULL
  SourceFile *srcContext;
  Vector<ComC*> *comComs;   // table of compiler comments
  Disasm *disasm;
  Hist_data *src_items;
  Hist_data *dis_items;
  Hist_data *data_items;
  DbeView * cur_dbev;
  TValue *total;
  TValue *maximum;
  TValue *maximum_inc;
  TValue *empty;
  int name_idx;         // index of name metric in list for src/dis
  int size_index;       // index of size metric in list for src/dis
  int addr_index;       // index of address metric in list for src/dis

  int curline;          // line# of next source line to be processed
  int cindex, cline;    // index and src line of next compiler-comment
  int sindex, sline;    // index and src line of next item in src_items
  int dindex;
  DbeInstr *daddr;      // pointer to next DbeInstr with metrics
  int mindex;           // MP index and src line of next metric-value
  int mline;            // MP line to be processed by source

  char *disPath;        // path for disassembly
  char *stabsPath;      // path for reading stabs
  char *stabsTmp;       // temporary *.o from *.a
  char *disName;        // library/path for disassembly
  char *stabsName;      // library/path for stabs
};

#endif /* _MODULE_H */
