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

## Legal Prerequisites

You must follow the Go copyright rules.

## Code

The source code for the `gccgo` frontend may be found at http://code.google.com/p/gofrontend. Changes made to that project are routinely merged into the source code hosted at `gcc.gnu.org`. The `gofrontend` project includes only the Go frontend proper. These are the files which in the `gcc` sources may be found in the directories `gcc/go` and `libgo`. The `gcc` sources also include a copy of the `test` directory from the main Go repository.

The frontend is written in C++ and as such the GNU coding standards do not entirely apply; in writing code for the frontend, follow the formatting of the surrounding code. Although the frontend is currently closely tied to the rest of the `gcc` codebase, we plan to make it more independent. Any new code that uses other parts of `gcc` should be placed in an appropriate file, such as `gogo-tree.cc`. Eventually all `gcc`-specific code should migrate to a `gcc-interface` subdirectory.

The runtime library for `gccgo` is mostly the same as the library in the main Go repository. The library code in the Go repository is periodically copied into the `gofrontend` and the `gcc` repositories. Accordingly, most library changes should be made in the main Go repository. Changes to the few `gccgo`-specific parts of the library should follow the process described here. The `gccgo`-specific parts of the library are everything in the `libgo` directory except for the `libgo/go` subdirectory.

## Testing

All patches must be tested. There are two test suites. A patch that introduces new failures is not acceptable.

To run the compiler test suite, run `make check-go` in the `gcc` subdirectory of your build directory. This will run various tests underneath `gcc/testsuite/go.*`. This includes a copy of the tests in the main Go repository, which are run using the DejaGNU script found in in `gcc/testsuite/go.test/go-test.exp`. Many of the compiler tests may be run without the Go library, but some do require the library to built first.

To run the library test suite, run `make check-target-libgo` in the top level of your build directory.

Most new tests should be submitted to the main Go repository for copying into the `gccgo` 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.gnu.org` repository.

## Submitting Changes

Changes to the Go frontend should follow the same process as for the main Go repository, only for the `gofrontend` project rather than the `go` project. Those changes will then be merged into the `gcc` sources.