compiler: move Backend/Linemap creation out of front end.

Push the calls to create Backend and Linemap object out
    of the front end into the back end, and instead pass pointers to
    these objects in the go_create_gogo_args struct. This allows
    for more flexibility in the interfaces used to create the
    objects.
    
    Reviewed-on: https://go-review.googlesource.com/30698

	* go-gcc.h: New file.
	* go-c.h (struct go_create_gogo_args): Add backend and linemap
	fields.
	* go-lang.c: Include "go-gcc.h".
	(go_langhook_init): Set linemap and backend fields of args.
	* go-gcc.cc: Include "go-gcc.h".
	* go-linemap.cc: Include "go-gcc.h".

From-SVN: r240959
This commit is contained in:
Than McIntosh 2016-10-11 00:11:43 +00:00 committed by Ian Lance Taylor
parent abe08b7d90
commit 3c061ac052
10 changed files with 58 additions and 14 deletions

View file

@ -1,3 +1,13 @@
2016-10-10 Than McIntosh <thanm@google.com>
* go-gcc.h: New file.
* go-c.h (struct go_create_gogo_args): Add backend and linemap
fields.
* go-lang.c: Include "go-gcc.h".
(go_langhook_init): Set linemap and backend fields of args.
* go-gcc.cc: Include "go-gcc.h".
* go-linemap.cc: Include "go-gcc.h".
2016-10-10 Than McIntosh <thanm@google.com>
* go-linemap.cc (Gcc_linemap::location_line): New method.

View file

@ -22,6 +22,8 @@ along with GCC; see the file COPYING3. If not see
#define GO_EXTERN_C
class Linemap;
class Backend;
/* Functions defined in the Go frontend proper called by the GCC
interface. */
@ -36,9 +38,11 @@ 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;
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;

View file

@ -43,6 +43,7 @@
#include "builtins.h"
#include "go-c.h"
#include "go-gcc.h"
#include "gogo.h"
#include "backend.h"

33
gcc/go/go-gcc.h Normal file
View file

@ -0,0 +1,33 @@
/* go-gcc.h -- Header file for go backend-specific interfaces.
Copyright (C) 2016 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 GO_GO_GCC_BACKEND_H
#define GO_GO_GCC_BACKEND_H
class Backend;
// Create and return a Backend object for use with the GCC backend.
extern Backend *go_get_backend();
// Create and return a Linemap object for use with the GCC backend.
extern Linemap *go_get_linemap();
#endif // !defined(GO_GCC_BACKEND_H)

View file

@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see
#include <mpfr.h>
#include "go-c.h"
#include "go-gcc.h"
/* Language-dependent contents of a type. */
@ -111,6 +112,8 @@ go_langhook_init (void)
args.check_divide_overflow = go_check_divide_overflow;
args.compiling_runtime = go_compiling_runtime;
args.debug_escape_level = go_debug_escape_level;
args.linemap = go_get_linemap();
args.backend = go_get_backend();
go_create_gogo (&args);
build_common_builtin_nodes ();

View file

@ -6,6 +6,8 @@
#include "go-linemap.h"
#include "go-gcc.h"
// This class implements the Linemap interface defined by the
// frontend.

View file

@ -1,4 +1,4 @@
ecf9b645cefc5c3b4e6339adeb452b2d8642cf3e
a700fa1908aa2a36f05b3ee09932f814fd94a10d
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View file

@ -740,8 +740,4 @@ class Backend
const std::vector<Bvariable*>& variable_decls) = 0;
};
// The backend interface has to define this function.
extern Backend* go_get_backend();
#endif // !defined(GO_BACKEND_H)

View file

@ -149,8 +149,4 @@ class Linemap
}
};
// The backend interface must define this function. It should return
// a fully implemented instance of Linemap.
extern Linemap* go_get_linemap();
#endif // !defined(GO_LINEMAP_H)

View file

@ -24,8 +24,7 @@ void
go_create_gogo(const struct go_create_gogo_args* args)
{
go_assert(::gogo == NULL);
Linemap* linemap = go_get_linemap();
::gogo = new Gogo(go_get_backend(), linemap, args->int_type_size,
::gogo = new Gogo(args->backend, args->linemap, args->int_type_size,
args->pointer_size);
if (args->pkgpath != NULL)