//===-- go-c.h ------------------------------------------------------------===//
//
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
//===----------------------------------------------------------------------===//
//
// Header file included by gofrontend; provides definitions for FE routines such
// as 'go_add_search_path', as well as the struct go_create_gogo_args.

#ifndef LLVMGOFRONTEND_GO_C_H
#define LLVMGOFRONTEND_GO_C_H

#define GO_EXTERN_C

class Linemap;
class Backend;

// Struct used to initialize gofrontend. Bridge creates an instance of this
// struct and passes it to gofrontend as part of setup.

struct go_create_gogo_args
{
  int int_type_size;
  int pointer_size;
  const char* pkgpath;
  const char* prefix;
  const char* relative_import_path;
  const char* c_header;
  Backend* backend;
  Linemap* linemap;
  bool check_divide_by_zero;
  bool check_divide_overflow;
  bool compiling_runtime;
  int debug_escape_level;
  const char* debug_escape_hash;
  int64_t nil_check_size_threshold;
};

// These are defined in gofrontend and called from the bridge.
extern bool saw_errors(void);
extern const char *go_localize_identifier(const char *);
extern const char *go_read_export_data (int, off_t, char **, size_t *, int *);
extern int go_enable_dump (const char*);
extern int go_enable_optimize (const char*, int);
extern void go_add_search_path(const char *);
extern void go_create_gogo(const struct go_create_gogo_args *);
extern void go_parse_input_files(const char **, unsigned int,
                                 bool only_check_syntax,
                                 bool require_return_statement);
extern void go_write_globals(void);

// Defined in the bridge; called by gofrontend.
extern void go_imported_unsafe(void);

#endif /* !defined(LLVMGOFRONTEND_GO_C_H) */
