/* Header file for GDB compile C-language support.
   Copyright (C) 2014-2021 Free Software Foundation, Inc.

   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 of the License, 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, see <http://www.gnu.org/licenses/>.  */

#ifndef COMPILE_COMPILE_C_H
#define COMPILE_COMPILE_C_H

#include "gdbsupport/enum-flags.h"
#include "gcc-c-plugin.h"

/* enum-flags wrapper.  */

DEF_ENUM_FLAGS_TYPE (enum gcc_qualifiers, gcc_qualifiers_flags);

/* A callback suitable for use as the GCC C symbol oracle.  */

extern gcc_c_oracle_function gcc_convert_symbol;

/* A callback suitable for use as the GCC C address oracle.  */

extern gcc_c_symbol_address_function gcc_symbol_address;

/* A subclass of compile_instance that is specific to the C front
   end.  */

class compile_c_instance : public compile_instance
{
public:
  explicit compile_c_instance (struct gcc_c_context *gcc_c)
    : compile_instance (&gcc_c->base, m_default_cflags),
      m_plugin (gcc_c)
  {
    m_plugin.set_callbacks (gcc_convert_symbol, gcc_symbol_address, this);
  }

  /* Convert a gdb type, TYPE, to a GCC type.

     The new GCC type is returned.  */
  gcc_type convert_type (struct type *type);

  /* Return a handle for the GCC plug-in.  */
  gcc_c_plugin &plugin () { return m_plugin; }

private:
  /* Default compiler flags for C.  */
  static const char *m_default_cflags;

  /* The GCC plug-in.  */
  gcc_c_plugin m_plugin;
};

/* Emit code to compute the address for all the local variables in
   scope at PC in BLOCK.  Returns a malloc'd vector, indexed by gdb
   register number, where each element indicates if the corresponding
   register is needed to compute a local variable.  */

extern std::vector<bool>
  generate_c_for_variable_locations
     (compile_instance *compiler,
      string_file *stream,
      struct gdbarch *gdbarch,
      const struct block *block,
      CORE_ADDR pc);

/* Get the GCC mode attribute value for a given type size.  */

extern const char *c_get_mode_for_size (int size);

/* Given a dynamic property, return an xmallocd name that is used to
   represent its size.  The result must be freed by the caller.  The
   contents of the resulting string will be the same each time for
   each call with the same argument.  */

struct dynamic_prop;
extern std::string c_get_range_decl_name (const struct dynamic_prop *prop);

/* Compute the name of the pointer representing a local symbol's
   address.  */

extern gdb::unique_xmalloc_ptr<char>
  c_symbol_substitution_name (struct symbol *sym);

#endif /* COMPILE_COMPILE_C_H */
