/* Generic plugin context
   Copyright (C) 2020 Free Software Foundation, Inc.

This file is part of GCC.

GCC 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.

GCC 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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef CC1_PLUGIN_CONTEXT_HH
#define CC1_PLUGIN_CONTEXT_HH

#include "system.h"
#include "coretypes.h"
#include "tree.h"

#include "connection.hh"

namespace cc1_plugin
{
  static inline unsigned long long
  convert_out (tree t)
  {
    return (unsigned long long) (uintptr_t) t;
  }

  static inline tree
  convert_in (unsigned long long v)
  {
    return (tree) (uintptr_t) v;
  }

  struct decl_addr_value
  {
    tree decl;
    tree address;
  };

  struct decl_addr_hasher : free_ptr_hash<decl_addr_value>
  {
    static hashval_t hash (const decl_addr_value *e)
    {
      return DECL_UID (e->decl);
    }

    static bool equal (const decl_addr_value *p1,
		       const decl_addr_value *p2)
    {
      return p1->decl == p2->decl;
    }
  };

  struct string_hasher : nofree_ptr_hash<const char>
  {
    static inline hashval_t hash (const char *s)
    {
      return htab_hash_string (s);
    }

    static inline bool equal (const char *p1, const char *p2)
    {
      return strcmp (p1, p2) == 0;
    }
  };

  struct plugin_context : public cc1_plugin::connection
  {
    plugin_context (int fd)
      : cc1_plugin::connection (fd),
	address_map (30),
	preserved (30),
	file_names (30)
    {
    }

    // Map decls to addresses.
    hash_table<decl_addr_hasher> address_map;

    // A collection of trees that are preserved for the GC.
    hash_table< nofree_ptr_hash<tree_node> > preserved;

    // File name cache.
    hash_table<string_hasher> file_names;

    // Perform GC marking.
    void mark ();

    // Preserve a tree during the plugin's operation.
    tree preserve (tree t)
    {
      tree_node **slot = preserved.find_slot (t, INSERT);
      *slot = t;
      return t;
    }

    location_t get_location_t (const char *filename,
			       unsigned int line_number);

  private:

    // Add a file name to FILE_NAMES and return the canonical copy.
    const char *intern_filename (const char *filename);
  };

  extern plugin_context *current_context;

  void generic_plugin_init (struct plugin_name_args *plugin_info,
			    unsigned int version);
}

#endif // CC1_PLUGIN_CONTEXT_HH
