## Introduction

These are some notes on contributing to the gccgo frontend for GCC. For information on contributing to parts of Go other than gccgo, see Contributing to the Go project. For information on building gccgo for yourself, see Setting up and using gccgo. For more of the gritty details on the process of doing development with the gccgo frontend, see the file HACKING in the gofrontend repository.

## Legal Prerequisites

You must follow the Go copyright rules for all changes to the gccgo frontend and the associated libgo library. Code that is part of GCC rather than gccgo must follow the general GCC contribution rules.

## Code

The master sources for the gccgo frontend may be found at https://go.googlesource.com/gofrontend. They are mirrored at https://github.com/golang/gofrontend. The master sources are not buildable by themselves, but only in conjunction with GCC (in the future, other compilers may be supported). Changes made to the gccgo frontend are also applied to the GCC source code repository hosted at `gcc.gnu.org`. In the `gofrontend` repository, the `go` directory is mirrored to the `gcc/go/gofrontend` directory in the GCC repository, and the `gofrontend` `libgo` directory is mirrored to the GCC `libgo` directory. In addition, the `test` directory from the main Go repository is mirrored to the `gcc/testsuite/go.test/test` directory in the GCC repository.

Changes to these directories always flow from the master sources to the GCC repository. The files should never be changed in the GCC repository except by changing them in the master sources and mirroring them.

The gccgo frontend is written in C++. It follows the GNU and GCC coding standards for C++. In writing code for the frontend, follow the formatting of the surrounding code. Almost all GCC-specific code is not in the frontend proper and is instead in the GCC sources in the `gcc/go` directory.

The run-time library for gccgo is mostly the same as the library in the main Go repository. The library code in the Go repository is periodically merged into the `libgo/go` directory of the `gofrontend` and then the GCC repositories, using the shell script `libgo/merge.sh`. Accordingly, most library changes should be made in the main Go repository. The files outside of `libgo/go` are gccgo-specific; that said, some of the files in `libgo/runtime` are based on files in `src/runtime` in the main Go repository.

## Testing

All patches must be tested. A patch that introduces new failures is not acceptable.

To run the gccgo test suite, run `make check-go` in your build directory. This will run various tests under `gcc/testsuite/go.*` and will also run the `libgo` testsuite. This copy of the tests from the main Go repository is run using the DejaGNU script found in `gcc/testsuite/go.test/go-test.exp`.

Most new tests should be submitted to the main Go repository for later mirroring into the GCC repository. If there is a need for specific tests for gccgo, they should go in the `gcc/testsuite/go.go-torture` or `gcc/testsuite/go.dg` directories in the GCC repository.

## Submitting Changes

Changes to the Go frontend should follow the same process as for the main Go repository, only for the `gofrontend` project and the `gofrontend-dev@googlegroups.com` mailing list rather than the `go` project and the `golang-dev@googlegroups.com` mailing list. Those changes will then be merged into the GCC sources.