/* 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 _DBE_STRUCTS_H
#define _DBE_STRUCTS_H

#include "dbe_types.h"
#include "enums.h"

typedef enum
{
  Sp_lang_unknown   = 0,
  Sp_lang_asm       = 1,
  Sp_lang_c         = 2,
  Sp_lang_ansic     = 3,
  Sp_lang_cplusplus = 4,
  Sp_lang_fortran   = 5,
  Sp_lang_pascal    = 6,
  Sp_lang_fortran90 = 7,
  Sp_lang_java      = 8,
  Sp_lang_c99       = 9,
  Sp_lang_gcc       = 16,
  Sp_lang_KAI_KPTS  = 32,
  Sp_lang_KAI_KCC   = 33,
  Sp_lang_KAI_Kcc   = 34
} Sp_lang_code;

struct Value
{
  union
  {
    short s;
    int i;
    float f;
    double d;
    timestruc_t t;
    char *l;                // Label
    unsigned long long ll;  // address
  };
};

// sync enum changes with both AnMetric.java and AnVariable.java
enum ValueTag
{
  VT_SHORT = 1,
  VT_INT,
  VT_LLONG,
  VT_FLOAT,
  VT_DOUBLE,
  VT_HRTIME,
  VT_LABEL,
  VT_ADDRESS,
  VT_OFFSET,
  VT_ULLONG
};

// Tagged numeric value
struct TValue
{
  ValueTag tag;
  bool sign;    // The print result will always begin with a sign (+ or -).
  union
  {
    short s;
    int i;
    float f;
    double d;
    char *l;
    void *p;
    long long ll;
    unsigned long long ull;
  };
  double to_double ();
  int to_int ();
  char *to_str (char *str, size_t strsz);
  size_t get_len ();
  void make_delta (TValue *v1, TValue *v2);
  void make_ratio (TValue *v1, TValue *v2);
  int compare (TValue *v);
};

// XXX MAX_HWCOUNT may need to be managed dynamically, not #defined
#define MAX_HWCOUNT 64

// Experiment collection parameters
struct Collection_params
{
  int profile_mode;     // if clock-profiling is on
  long long ptimer_usec; // Clock profile timer interval (microseconds)
  int lms_magic_id;     // identifies which LMS_* states are live
  int sync_mode;        // if synctrace is on
  int sync_threshold;   // value of synctrace threshold, in microseconds
  int sync_scope;       // value of synctrace scope: Java and/or native

  int heap_mode;        // if heaptrace is on
  int io_mode;          // if iotrace is on
  int race_mode;        // if race-detection is on
  int race_stack;       // setting for stack data collection
  int deadlock_mode;    // if deadlock-detection is on
  int omp_mode;         // if omptrace is on

  int hw_mode;          // if hw-counter profiling is on
  int xhw_mode;    // if extended (true-PC) HW counter profiling for any counter

  char *hw_aux_name[MAX_HWCOUNT];
  char *hw_username[MAX_HWCOUNT];
  int hw_interval[MAX_HWCOUNT];     // nominal interval for count
  int hw_tpc[MAX_HWCOUNT];          // non-zero, if aggressive TPC/VA requested
  int hw_metric_tag[MAX_HWCOUNT];   // tag as used for finding metrics
  int hw_cpu_ver[MAX_HWCOUNT];      // Chip version number for this metric

  int sample_periodic;      // if periodic sampling is on
  int sample_timer;         // Sample timer (sec)
  int limit;                // experiment size limit
  const char *pause_sig;    // Pause/resume signal string
  const char *sample_sig;   // Sampling signal string
  const char *start_delay;  // Data collect start delay string
  const char *terminate;    // Data collection termination time string
  char *linetrace;
};

const hrtime_t ZERO_TIME = (hrtime_t) 0;
const hrtime_t MAX_TIME = (hrtime_t) 0x7fffffffffffffffLL;

#define PCInvlFlag              ((int) 0x8LL)
#define PCLineFlag              ((int) 0x4LL)
#define PCTrgtFlag              ((int) 0x2LL)
#define MAKE_ADDRESS(idx, off)  (((unsigned long long)(idx)<<32) | off)
#define ADDRESS_SEG(x)          ((unsigned int)(((x)>>32) & 0xffffffff))
#define ADDRESS_OFF(x)          ((unsigned int)((x) & 0xffffffff))

//
//	Analyzer info
#define AnalyzerInfoVersion 2

typedef struct
{
  uint64_t text_labelref;
  int32_t entries;
  uint32_t version;
} AnalyzerInfoHdr;      // => header from .__analyzer_info

typedef struct
{
  uint32_t offset;      // offset relative to text_labelref
  uint32_t id;          // profiled instruction identifier
  uint32_t signature;   // signature of profiled instruction
  uint32_t datatype_id; // referenced datatype identifier
} memop_info_t;         // => used for table_type=0,1,2

typedef struct
{
  uint32_t offset;      // offset relative to text_labelref
} target_info_t;        // => used for table_type=3

typedef struct
{
  uint32_t type;
  uint32_t offset;
  union
  {
    memop_info_t *memop;
    target_info_t *target;
  };
} inst_info_t;

class DataObject;

typedef struct
{
  uint32_t datatype_id; // datatype identifier (local)
  uint32_t memop_refs;  // count of referencing memops
  uint32_t event_data;  // count of event data
  DataObject *dobj;     // corresponding dataobject (unique)
} datatype_t;

typedef struct
{
  uint32_t offset;      // entry offset in compilation unit
  uint32_t extent;      // sibling offset
  void *parent;         // container symbol
  void *object;         // resolved object
} symbol_t;

typedef struct
{
  char *old_prefix;
  char *new_prefix;
} pathmap_t;

typedef struct
{
  char *libname;
  enum LibExpand expand;
} lo_expand_t;

typedef struct
{
  int index1;
  int index2;
} int_pair_t;
#endif /* _DBE_STRUCTS_H */
