Google Summer Of Code
Thank you for your interest in the GNU Compiler Collection as your mentoring organization in Google's Summer of Code (GSoC). GCC has been accepted as a GSoC mentoring organization in 2024. The primary org-admin is Martin Jambor.
If you would like to be a GSoC contributor with GCC, first make sure you read the Before you apply and Application sections on this page and then pick a project, possibly from the list below. After you made your selection or have a project idea of your own, please discuss it as soon as possible (way before the application) via the gcc@gcc.gnu.org mailing list (put "GSoC" somewhere to the subject) and feel free to raise it on IRC. If you are interested in gcc-rust topics, you can also reach out to the gcc-rust community via Zulip.
Contents
Selected Project Ideas
When discussing GSoC project ideas in the community, we have found out we are especially interested in the following few. One of their main advantages, apart from their particular relevance and usefulness this year, is that we are confident we can find mentors for them. We will however also consider other projects and we will be happy to discuss your own ideas with you. Nevertheless, please do consider applying for the following:
Offloading to a separate process on the same host. Code Offloading to devices such as a GPU via OpenACC or OpenMP 'target' requires needlessly complicated set-up when a GPU is not in fact necessary to debug a problem or during development of new features or optimizations. Needless to say, it is also much easier to debug code running on a CPU than on a GPU. This project would therefore implement a mechanism to run the offloaded code in a separate process on a CPU on the same host as the main program.
The project would require adding a host-ISA offloaded code generation mode (in addition to GCN and NVPTX) and implementing a corresponding libgomp plug-in that would talk to the libgomp offloading machinery and manage the new process in which the offloaded code would run.
In their simplest form such virtual "devices" can then behave like a CPU. This would already drastically simplify debugging memory mapping issues or issues with offloading to multiple devices. Additionally, but with considerably more effort, the virtual device can be made to simulate GPU-like parallelism with CPU threads and allow for testing and debugging a much wider set of offloading problems (for illustration, see LLVM "A Virtual GPU as Developer-Friendly OpenMP Offload Target", https://doi.org/10.1145/3458744.3473356, PDF: https://tianshilei.me/wp-content/uploads/2021/12/llpp-2021.pdf)
This project would be mentored by Thomas Schwinge. Required skills include command of C/C++, a conceptual understanding of offloading compilation, and POSIX processes and inter-process communication. The project would be of medium difficulty, its size can be either a 175-hour (medium) or 350-hour (large) depending whether you opt for just offloading to a CPU-like environment or decide to also experiment with simulating a GPU.Extend the static analysis pass GCC has gained an experimental static analysis pass which performs some rudimentary checking of malloc/free and the stdio FILE stream API. There is plenty of scope for extending this pass in ways that may interest a contributor, such as
Extending the analyzer's support for C++. See https://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=97110. In particular, exception-handling support is probably the most important missing feature (but would likely be hard to implement).
Add format-string support to -fanalyzer. We currently have two different implementations of warnings for format strings (e.g. printf) in GCC; gcc/c-family/c-format.cc implements -Wformat in the C/C++ frontends, doing type-checking on format strings against their arguments, and gcc/gimple-ssa-sprintf.cc implements parts of -Wformat_overflow=, -Wformat_truncation=, and -Wrestrict in the middle-end). Now that the analyzer has -Wanalyzer-out-of-bounds, it might be good to refactor and generalize this format-string parsing to share more code, and so that the analyzer can reuse it, and do similar range analysis (but with the analyzer's more precise path-sensitive interprocedural approach; see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107017)
Extend the plugin to add checking for usage of the CPython API (e.g. reference-counting); see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107646
- Add a checker for some API or project of interest to the contributor (e.g. the Linux kernel, a POSIX API that we're not yet checking, or something else), either as a plugin, or as part of the analyzer core for e.g. POSIX.
This project would be mentored by David Malcolm. Required skills include C/C++ and finding a way through a large code-base. The size of the project depends on its agreed scope, i.e. it can be both a 175-hour (medium-sized) or a 350 hour (large) project but it is probably easier to define a large one. Difficulty also depends on scope but is likely to be hard.
One more project idea, co-mentored by Thomas Schwinge:e. add checks for programs using OpenACC (parallel programming model for heterogeneous HPC hardware), for example: extend the analyzer's existing malloc/free-like checks to understand OpenACC host vs. device memory, and OpenACC runtime API memory allocator and mapper routines (acc_malloc vs. acc_create vs. acc_map_data etc.; see also here). Depending on the number of checks to be implemented, this can also be both a 175-hour (medium-sized) or a 350 hour (large) project. As the suggested checks only concern host-side code, having an AMD or Nvidia GPU supported by GCC Offloading is not necessary for this project.
Rust Front-End. a new compiler front-end for Rust is in development please see: https://github.com/Rust-GCC/gccrs. A number of projects are available, you can choose one fo the following. Required skills include C/C++ and finding a way through a large code-base, some knowledge of Rust would of course also be highly beneficial.
Borrow-checking IR location support: Extend the borrow-checker IR (BIR) with information regarding source code location. Update the BIR builder, and use that information for error reporting. Update the testsuite to make use of these new error messages. In the early stages of borrow-checking, this will allow the testsuite to be more precise and ensure that compilation fails for the right reason. In the long run, location information is necessary for the errors to be useful for users. Difficulty: Medium, size: 175 hours (medium). Mentors: Philip Herron, Arthur Cohen.
Inline assembly: Enhance gccrs macro expansion by adding support for all three inline assembly Rust macros: asm!(), llvm_asm!() and global_asm!(). This work will require modifications to multiple parts of our compiler, with the creation of builtin macro expanders, AST nodes, HIR nodes, as well as the development of a Rust inline-assembly parser to then convert it to the GCC inline assembly format. Difficulty: Medium, size: 175 hours (medium). Mentors: Pierre-Emmanuel Patry, Philip Herron, Arthur Cohen.
rustc testsuite adapter: Adapt a copy of the rustc testsuite to make use of the error code framework implemented in gccrs as part of GSoC 2023. You will need to develop a testcase runner similar to rustc's one, in order to match error codes and line numbers to the output of gccrs. Difficulty: Medium, size: 175 hours (medium). Mentors: Pierre-Emmanuel Patry, Philip Herron, Arthur Cohen.
Exploring semantic differences between rustc and gccrs: Explore the differences in the assembly generated by gccrs and rustc and start working on a test harness to ensure semantic equivalence as well as soundness - the goal is to have a test framework ready to verify that on top of supporting only valid Rust, gccrs will only emit assembly that behaves like Rust should. This project is very exploratory and will require more independence. Difficulty: Hard, size: 350 hours (large). Mentors: Philip Herron, Arthur Cohen.
Improve nothrow detection in GCC. In the following testcase, GCC is currently unable to optimize out the call to link_error even though it is dead because test already catches the exception.
#include <cstdio> void link_error (); __attribute__((noinline)) void test (int a) { try { if (!a) throw (0); } catch (int) { printf ("zero\n"); return; } } void bar (int a) { try { test (a); } catch (int) { link_error (); } }
understand the semantics of a __cxa_throw call and do type-sensitive propagation of thrown exceptions. This will allow accurately determining the set of exception types that can be thrown by each function. This project would be mentored by Jan Hubička. Difficulty: Hard, size: 175 hours (medium).
Fortran – DO CONCURRENT – see GFortranStandards for language links (Fortran standard and what's new documents for 2018 and 202x). Project would be mentored by Tobias Burnus. Required skills include C/C++; some knowledge of Fortran helps, but is not needed. Difficulty medium, size: 175 hours (medium)
- BACKGROUND: "DO CONCURRENT" is a special way to write loops. Task is to first permit new syntax and secondly to turn the loops into something which actually runs in parallel/concurrently.
- First task: Implement the locality clauses in "do concurrent" as added in Fortran 2018 (this is essentially just parsing and after resolution ignoring until (c) is implemented.)
- Second task: Fortran F202x's "reduction" support (likewise)
- Third task: Implement real parallelization by supporting -fdo-concurrent=... with possible options: serial (no parallelization), "openmp" (thread-based parallelization), "openmp-target" (OpenMP-based offloading)", "openacc" (OpenACC-based offloading), "parallel" (pthread parallelization similar to (based on?) -ftree-parallelize-loops=n).
For some experiments and results, see also https://arxiv.org/pdf/2110.10151.pdf or experiments by other compiler vendors (search the internet)
Fortran – 2018/202x – Several Fortran 2018 and all Fortran 202x features are unimplemented. See GFortranStandards for language links (Fortran standard and what's new documents for 2018 and 202x).
- Project would be mentored by Tobias Burnus. Required skills include C/C++; some knowledge of Fortran helps, but is not needed.
The size and difficulty of the project depends on its agreed scope, i.e. it can be both a 175-hour (medium-sized) or a 350 hour (large) project, can be both medium difficulty or hard.
Effort depends on which new feature(s) are implemented; requires some research about what's missing and about the effort. If interested, please ask via the fortran@ mailing list, https://gcc.gnu.org/lists.html
- For instance, the "Extracting tokens from string", "Interoperability with C", and "Trig functions changes" documented in "what's new in 202x" document would be a medium sized project.
Fortran – run-time argument checking. – In particular older Fortran code, which does not use modules, but also code which uses implicit-size or explicit-size arrays is prone to argument mismatches. The goal of this item is to add an optional run-time test which works by storing the argument-type/size data before the call in a global variable – and check against it in the callee. (A pointer to the called function is stored alongside to permit calls from uninstrumented code to instrumented code.) This project would be mentored by Tobias Burnus. Required skills include C/C++; some knowledge of Fortran helps, but is not needed. Difficulty medium, size: 175 hours (medium).
Fortran – improved argument compile-time checking – The compiler does check for the arguments in the same file – but it could do better in some cases, i.e. checking better the interface data or updating the expected input better from the use. This project would be mentored by Tobias Burnus. Required skills include C/C++; some knowledge of Fortran helps, but is not needed. Difficulty medium, size: 175 hours (medium).
Enhance OpenACC support. OpenACC is parallel programming model for heterogeneous HPC hardware. GCC currently supports most but not all of OpenACC 2.6. The project idea here is to fill some of the gaps, for example, implement:
OpenACC acc_memcpy_device runtime API routine
OpenACC init, shutdown, set directives
These complement the corresponding acc_init etc. runtime API routines, which are already implemented.
Make the OpenACC cache directive actually do something
- It's currently only parsed, but we're not actually using it for optimization purposes: prefetch data, move data to low-latency memory.
OpenACC bind clause
OpenACC device_type clause
To work on these items, it's definitely very helpful to have available a GNU/Linux system with an AMD or Nvidia GPU supported by GCC Offloading, but it's not strictly necessary. Mentors: Thomas Schwinge, Tobias Burnus. The size and difficulty of the project depends on the agreed number of items to be implemented, i.e. it can be both a 175-hour (medium-sized) or a 350 hour (large) project, can be both medium difficulty or hard.
Notes on OpenACC init, shutdown, set directives:
Certain functionality in OpenACC exists both in a directive variant and a runtime API routine variant. For example, OpenACC 2.6 has 2.16.3. "Wait Directive" (directive variant) and 3.2.11. "acc_wait" etc. (runtime API routine variants). In GCC, the front ends map the directive variant to gcc/omp-builtins.def:BUILT_IN_GOACC_WAIT (see git grep --cached BUILT_IN_GOACC_WAIT\\\|c_finish_oacc_wait -- gcc/). This eventually gets translated to a regular function call to libgomp/oacc-async.c:GOACC_wait, which uses the same building blocks as do acc_wait etc., which are also implemented in libgomp/oacc-async.c. (libgomp is the GCC runtime library for OpenMP originally, but then also OpenACC, implementing both the user-level OpenACC "Runtime Library Routines" and the compiler-used GOACC_[...] etc. routines.) Similar for #pragma acc enter data create(var) vs. acc_create, and others. Some users like to use one of directive vs. runtime API routine variants over the other; generally some prefer using the directive variants instead of C/C++ #include <openacc.h> or Fortran use openacc module. Corresponding to the acc_init, acc_shutdown, acc_set_device_num/acc_set_device_type runtime API routine variants implemented in GCC, in OpenACC 2.5, "New init, shutdown, set directives were added", which are not yet implemented in GCC. Implementation of those is assumed to be very much similar as the OpenACC wait directive is via BUILT_IN_GOACC_WAIT, for example, so would enhance the GCC code along these lines, plus proper testsuite coverage.Implement structured dumping of GENERIC Extend the print-tree.cc machinery to dump in a machine readable format like JSON and provide a translator to HTML. Add -fdump-generic-nodes compiler option to make the pre-gimplification GENERIC visible, add a dump modifier to switch that between the textual and a JSON format. See https://gcc.gnu.org/pipermail/gcc-patches/2024-February/646295.html for an unfinished attempt with a different implementation route. This project would be mentored by Richard Biener. Difficulty medium, size: 175 hours (medium) but could be extended to 350 hours (large) by additional processing, cross-linling and visualization of the data.
The expected outcome of all projects listed above is a series of patch submissions which pass review and are included in the main GCC repository, the GCC-Rust project repository (for Rust-related projects) and/or binutils (e.g. the demangler code is shared between GCC and binutils).
Unless a project above was explicitly marked with a different difficulty, consider it to be hard. Generally speaking, GCC is a production compiler and working on one of those is always hard, especially if you are new. On the other hand, the community of GCC developers is very helpful and goes out of its way to assist newcomers with various difficulties they inevitably encounter.
If the list above was not exhaustive enough for you, you can have a look also at Other Project Ideas section below.
Before you apply
Applicants for a GCC Google Summer of Code project need to have experience coding in C/C++. Furthermore, if you want to work on the actual compiler you must have at least rudimentary theoretical background in the area of compilers and compiler optimizations - at the very least you need to understand the term intermediate representation (IR), sometimes also called intermediate language (IL). It also helps if you know what static single assignment (SSA) form is and why it is useful. This may not be strictly necessary if your project aims to improve a different tool or library that is part of GCC, such as the demangler but even in these cases you need to know about the required algorithms.
Before you apply and even before you even reach out to us make sure that you can check out the GCC source code from its Git repository, build GCC from it and run the testsuite (this is something that would need doing very many times in the course of any project working on GCC) and look around the project a bit.
The following links should help you:
How to checkout our sources using Git is described at https://gcc.gnu.org/git.html.
Steps linked from https://gcc.gnu.org/install/ show you how to configure, build and test GCC (look for --disable-bootstrap, among other things). The Installing GCC page shows an easy way to obtain the libraries required to build GCC which people often find most problematic and other advice related to building and installing GCC for the first time.
Read through David Malcom's guide GCC for New Contributors. David has also presented a talk about this topic at FOSDEM'24, you can watch the recording. You can also check out Getting Started wiki page.
Wiki page DebuggingGCC and the manual page about Developer options are of particular interest. Read through those, compile a simple but non-trivial program with
-O3 -S -fdump-tree-all -fdump-ipa-all -fdump-rtl-all
and look through the generated files. Look at the the source code, especially in the gcc subdirectory and try to set a breakpoint somewhere and hit it. Then look around in gdb.
If you intend to work in the area of Link Time Optimization (LTO), the following two videos may help you understand the required concepts:
If your selected project involves Offloading, you almost certainly want to familiarize yourself with the concept which is described on its own wiki page. You probably want to look at it also if you plan to work in the are of OpenACC or (to a lesser extent) OpenMP.
If you have done all of the above, or at least most of it, and still find it all a little bit intimidating, do not despair. If you are facing any specific technical problem or if you have difficulties figuring out where to start looking for particular things, that is something the mentors and the community at large are willing to help you with. First, the mailing list you keep reading about here has an archive, it is always a good idea to check if some other GSoC applicant has not asked your question recently. If not, send an email describing your situation to the mailing list yourself. We will appreciate if in your email you will make it clear that you have read this section and briefly list the steps above you have managed to carry out successfully.
Legal requirements
Any non-trivial contributions to GCC are accepted only if their author either formally assign their copyright for them to the Free Software Foundation or if the author certifies the "Developer Certificate of Origin" (DCO) by adding the Signed-off-by: tag to their submission. Both processes are described in the official page on Contributing to GCC. Accepted GSoC contributors will be expected to choose one and follow it.
Application
First, you need to select a project. If you have been following GCC development, you might have an idea of your own, otherwise look at the suggested projects above and try to pick one there. In the course of selecting a project or when researching it in order to write your application, do not hesitate to ask questions or request more details from the community by email to the gcc@gcc.gnu.org mailing list with the string "GSoC" in the email subject or on our #gcc IRC channel at irc.oftc.net. Please note that the mailing list does not accept HTML messages, you must set your email client to plain text. If you are interested in gcc-rust topics, you can also reach out to the community via Zulip.
When you have a draft of your proposal ready, send it to the gcc@gcc.gnu.org mailing list as a request for comments. First, it should help you come up with a much better final proposal. Second, when evaluating applicants, we look closely at how they responded to feedback and how they incorporated it in their application document. We are unlikely to accept an application from someone who has not interacted with the community before at all. Please remember to put the string "GSoC" in the email subject of all messages about GSoC or a GSoC project proposal.
Formal application document
GCC does not have any application form or a mandatory application format to follow, but we strongly suggest you include the following in the formal application document that you submit to GSoC:
- Describe the project and clearly define its goals.
- If you chose a project that is not among the "selected project ideas," describe why it is a worthwhile effort.
- Provide an expected time-line. We understand it is likely to change, that is not the point. Instead we want to know that you have a reasonable idea about project milestones. Moreover, org-admins will pay close attention to your plan for the first and second week of the coding period. If you intend to do general research how to "do stuff" only then, it likely means that you do not understand the actual technical issues and that you should do some of the research before applying. On the other hand, researching specific topics is probably fine, some semi-independent researching throughout the project is actually expected.
- Briefly introduce yourself and your skills and/or accomplishments. We would like to be sure you have the knowledge and skills to complete the project - but we will evaluate this also from how you have interacted with us in the preparation phase.
Further tips and guidelines
- Be honest and realistic. We prefer a smaller project with clearly defined goals to a far-reaching but vague proposal (that is likely never going to be finished by the contributor).
- Applicants that have already submitted good patches give a much better impression to reviewers and potential mentors.
Starting with some small patch for the area you are interested in before the proposal submittal period can help (ask for guidance and a simple enough project): It helps you to get the code known and to decide whether you really want to do the project, it shows how the development procedure is, and helps potential mentors to judge the proposal based on actual work. Besides: Also small fixes are good and getting people known by email (or IRC) exchange is nice by itself
And let's stress again that you need to present your project on the gcc@gcc.gnu.org mailing list because there is likely going to be a feedback that you should incorporate. Put "GSoC" somewhere into the email subject.
Other Project Ideas
Note that some of the ideas found below might be fully or partially obsolete. This is another reason why it is always a good idea to discuss the project of interest on the mailing list and/or via IRC before submitting a GSoC proposal.
Link-time and interprocedural optimization improvements
Link-time optimization (LTO) is powerful infrastructure in GCC and there are many areas how to make it better, for example:
- Implement tree level section anchors to improve code generation at ARM/PPC.
Language front-ends and run-time libraries
Fortran front end (please discuss ideas on the Fortran mailing list):
Extend OOP support (possible mentors: Janus Weil, Tobias Burnus) by improving partially-implemented features, such as:
- Associate construct
coarray support for SMP and distributed memory systems (possible mentor: Tobias Burnus)
Coarrays are a PGAS extension, which is part of Fortran 2008.
- There has been some work on this by Thomas/Nicolas König in GIT branch devel/gfortran-caf; unclear status.
Fortran – shared-memory coarrays NOTE: Partial implementation available in devel/coarray_native branch, if interested, ask about remaining tasks in this area – Coarrays are a means of parallelizing code; conceptually, all memory is local memory, except for coarrays which are on multiple processes ("images") and remote can be directly accessed. (Internally: one-sided communication.) GCC/gfortran supports "single" (compiles but does not do any actual parallelization) and "lib" (requires a communication library). The goal of this task is to add a shared-memory implementation – such that parallel coarray programs runs out of the box without additional external libraries. This project would be mentored by Tobias Burnus. This project consists of work mostly on a run-time library written in C but also on the compiler itself written in C/C++. Hence, required skills include C/C++, knowledge about POSIX Threads; some knowledge of Fortran helps, but is not needed.
Possible task: Improving the multi-image support, which uses OpenCoarray communication library
- Implement Fortran 2018 additions (TS18508) additions
- Run-time argument checking: Uninitialized variables, correctness of arguments
- Improve handling of allocatable characters
- Improve parameterized derived types (possible sponsor: Paul Thomas)
- Better IEEE support
Other Unimplemented Fortran 2003, Fortran 2008 features, TS 29113 features
- IO optimization. Currently formatted scalar IO is quite slow and uses lots of stack space.
OpenMP runtime improvements: openmp
- GCC Go escape analysis: in Go, taking the address of something means that it lives on the heap--Go has no such thing as a dangling pointer. It is possible to use escape analysis to determine whether the pointer ever escapes its scope. If it does not, then the object whose address is taken can be allocated on the stack rather than the heap, which is more efficient. A particular example is calls to functions like fmt.Printf, which allocate a slice of the arguments passed in. Escape analysis can allocate that slice on the stack rather than the heap.
Enhance the GimpleFrontEnd with CFG and SSA annotation reconstruction to make writing and extracting unit-tests easier.
New optimization passes
- Implement code motion of stores towards entry (and use this to improve code for int to float conversion on rs6000-based targets)
- Implement a prototype for early instruction selection
- Propagate interprocedural dataflow from GIMPLE to RTL
- Add Factored Use-Def (FUD) chains to RTL
Loop optimizations and automatic parallelization based on Graphite
- Implement a basic-block local scheduling pass to improve SSA name coalescing opportunities at RTL expansion time
Implement a (prototype) addressing mode selection (AMS) pass as a replacement of auto-inc-dec. For more details see PR 56590.
Other projects and project ideas
Make cp-demangle non-recursive. C++ mangled names use a recursive grammar, and naturally led to a recursive demangler in libibiberty (used for __cxa_demangle and other entry points). Very long symbols and malformed inputs can cause deep recursion (even unbounded in the malformed case). Stack overflow is unpredictable and has terrible failure modes, which has led to imposing arbitrary recursion limits in the demangler. The demangler should be converted to use a bespoke heap-allocated data stack for the recursive state, and the implicit recursion removed. Resource allocation failure can be indicated via the existing failure code. The demangler is implemented in C, the project entails turning implicit recursion into an explicit ne driven by a LIFO worklist - clear understanding of what that means and good command of C is required. You will also learn about C++ mangled names. 175 hour (medium-sized) project.
Type Sanitizer. Both LLVM and GCC compilers do share a common sanitizer library called libsanitizer. The library has recently received support of typed-based sanitization (TySan). Goal of the task would be to investigate and prototype usage of type-based aliasing rules information provided by GCC in order to detect violations of strict aliasing rules.
Replace libiberty with gnulib. See http://gcc.gnu.org/ml/gcc-patches/2012-08/msg00362.html Initial work was done in GSoC 2016 (replacelibibertywithgnulib).
Finish the implementation of a stable introspection plugin API (with the possibility of extending it to cover non-introspection cases)
- Modify any GCC optimization decisions externally through plugins (see MILEPOST GCC, for example). -- G. Fursin, 2014.
- Systematize learning of optimal optimization decisions for multiple benchmarks, data sets and architectures (see c-mind.org/repo, for example). -- G. Fursin, 2014.
- Extend GCC plugin framework to enable code instrumentation (insert calls to external function after individual instructions) for dynamic code analysis. We need it to extend our TM/TLS models. -- G. Fursin, 2014.
- Fix -ftrapv so that it works.
- Improve the regression testing system, for example to detect places where the generated code changed (useful for refactoring).
Promote C++ operator new to alloca when pointer does not escape and user allows non-conformance to C++ standard
- Improve loop unrolling heuristics and enable loop unrolling with default optimization
- Analyze and improve inlining, loop unrolling, reassociation and predictive commoning heuristics for PowerPC architecture
- Use TARGET_EXPAND_TO_RTL_HOOK for pipelined divide on PowerPC
- Support AIX XCOFF file format for LTO (David Edelsohn)
Implement something similar to Clang's -ftime-trace feature which generates performance reports that show where the compiler spends compile time. For more information, please check the following blog post. There's also an existing bugzilla entry for this (if this becomes a GSoC project, the assignee will of course change). Required skills include C/C++ and finding a way through a large code-base.
There are several pages with general ideas for GCC, many of which we linked below for easy access. These ideas usually are not just one project but a group of distinct projects.
- This category of projects deals with a range of changes, from simple to challenging. These projects are of great interest to us, because they address some long-standing architectural issues that we want to fix.
Other project ideas can be found in the bug database, look for old bugs which are still open.
Or invent your own project. We're always open to good ideas. But note that we are probably not too interested in projects to add new extensions to the C or C++ languages. We've found over time that these tend to introduce more problems than they solve.
Thanks, and we look forward to your submissions!
Improving GCC Developer Documentation
The rules of the GSoC program do not allow projects to consist of documentation improvements only. Nevertheless, note that writing documentation may be an important part of your project or even an essential one if you introduce user-visible changes and plan your work accordingly.
Accepted GCC Projects
2023
Project |
Student |
Mentors |
Improving user errors & Error Code Support for GCC Rust Frontend |
Muhammad Mahad |
Philip Herron and Arthur Cohen |
Unicode Support for GCC Rust Frontend |
Raiki Tamura |
Philip Herron and Arthur Cohen |
Extending gcc -fanalyzer C++ support for self-analysis |
Benjamin Priour |
David Malcolm |
GCC static analyzer plugin for CPython extension modules |
Eric Feng |
David Malcolm |
Bypass assembler when generating LTO object files |
Rishi Raj |
Martin Jambor and Jan Hubicka |
C++: Implement compiler built-ins for the standard library traits |
Ken Matsui |
Patrick Palka |
2022
Project |
Student |
Mentors |
Faisal Abbas |
Philip Herron |
|
Extend GCCs static analyzer to support checking for POSIX file descriptor APIs |
Immad Mir |
David Malcolm |
Improving Rust debugging experience by enhancing the HIR dump |
Andrew Naguib |
Arthur Cohen and Philip Herron |
Bypass assembler when generating LTO object files |
Nitin Kumar |
Jan Hubička and Martin Jambor |
Tim Lange |
David Malcolm |
|
Accelerating Fortran DOCONCURRENT |
Wileam Phan |
Tobias Burnus and Thomas Schwinge |
2021
Project |
Student |
Mentors |
Ankur Saini |
David Malcolm |
|
Arthur Cohen |
Philip Herron |
|
Wenzhang Yang |
Philip Herron |
|
Make Cp-demangler non recursive |
Vishnu Madhav |
Nathan Sidwell and Martin Jambor |
2020
Project |
Student |
Mentors |
Giuliano Belinassi |
Richard Biener |
|
John Ravi |
Martin Liška and Nathan Sidwell |
|
Implementation of OMPD in GCC and libgomp |
Tony Sim |
Jakub Jelínek and Martin Jambor |
2019
Project |
Student |
Mentors |
On vector<bool> and optimized Standard Algorithms in libstdc++ |
ThePhD |
Thomas Rodgers, Jonathan Wakely and Ville Voutilainen |
Tejas Joshi |
Martin Jambor and Jan Hubička |
|
Shubham Narlawar |
Martin Liška and Andi Kleen |
|
Khurai Kim |
Jakub Jelínek |
|
Make C/C++ not automatically promote memory_order_consume to memory_order_acquire |
akshatg |
Paul E. McKenney and Ramana Radhakrishnan |
Parallelize GCC with Threads (see also ParallelGcc) |
Giuliano Belinassi |
Richard Biener |
2018
Project |
Student |
Mentor |
Hrishikesh Kulkarni |
Martin Liška and Jan Hubička |
2016
Project |
Student |
Mentor |
Ayush Goel |
Manuel Lopez-Ibanez |
|
Prasad Ghangal |
Richard Biener |
|
erikvarga |
Oleg Endo |
2015
Project |
Student |
Mentor |
C++ Library Fundamentals: shared_ptr and polymorphic memory resources |
Fan You |
Tim Shen |
Erik Krisztian Varga |
Oleg Endo |
2014
Project |
Student |
Mentor |
Coarray support in GNU GFortran |
Alessandro Fanfarillo |
Tobias Burnus |
Concepts Separate Checking |
Braden Obrzut |
Andrew Sutton |
Integration of ISL code generator into Graphite |
Roman Gareev |
Tobias Grosser |
Generating folding patterns from meta description |
Prathamesh Kulkarni |
Richard Biener |
GCC Go escape analysis |
Ray Li |
Ian Lance Taylor |
2013
Project |
Student |
Mentor |
Fotis Koutoulakis |
Thomas Schwinge |
|
Martin Liška |
Jan Hubicka |
|
Tim Shen |
Stephen M. Webb |
2012
Project |
Student |
Mentor |
Dimitrios Apostolou |
Andrey Belevantsev |
|
Morgen Matvey |
Benjamin De Kosnik |
|
Gimple FE : Extending the text gimple recognizer to a real front end |
Sandeep Soni |
Diego Novillo |
Sergey Lega |
Benjamin De Kosnik |
2011
Project |
Student |
Mentor |
Extend GFortran's Coarray support with MPI-based paralellization (project page) |
Daniel Carrera |
Tobias Burnus |
GCC Optimisation Final Report, Various Notes: (1) (2) (3) |
Dimitrios Apostolou |
Steven Bosscher |
Integration of transactional memory support into a data-flow extension of OpenMP |
Ismail KURU |
Richard Henderson |
Ketaki |
Diego Novillo |
|
Philip Herron |
Ian Lance Taylor |
|
Piervit |
Basile Starynkevitch |
|
Sho Nakatani (中谷 翔) |
Jakub Jelínek |
2010
The source code for finished projects can be found at Google's code hosting site and their respective SVN branches.
Project |
Student |
Mentor |
Yi-Hong Lu |
H. J. Lu |
|
Sandeep Soni |
Diego Novillo |
|
Artjoms Sinkarovs |
Richard Günther |
|
Philip Herron |
Ian Taylor |
|
Improving the static control part detection mechanism in Graphite |
Vladimir Kargov |
Sebastian Pop |
Ankur Deshwal |
David Edelsohn |
|
ScopLib support for Graphite - Linking Graphite to the huge industrial and research community |
Sebastian Pop |
|
Andreas Simbuerger |
Tobias Grosser |
|
Tobias Burnus |
||
Extending Fortran 2003 and 2008 support for gfortran (esp. Co-Arrays) |
Daniel Kraft |
Tobias Burnus |
2009
The source code for finished projects can be found at Google's code hosting site.
Project |
Student |
Mentor |
Li Feng |
Tobias Grosser |
|
Enable generic function cloning and program instrumentation in GCC to be able to create static binaries adaptable to varying program and system behavior or different architectures at run-time |
Liang Peng |
Grigori Fursin |
gfortran: Procedure Pointer Components & OOP |
Tobias Burnus |
|
Traditional Loop Transformations |
pranav garg |
Sebastian Pop |
Make the OpenCL Platform Layer API and Runtime API for the Cell Processor and CPUs |
phil prattszeliga |
Paolo Bonzini |
Provide fine-grain optimization selection and tuning abilities in GCC to be able to tune default optimization heuristic of the compiler or fine optimizations for a given program on a given architecture entirely automatically using statistical and machine learning techniques from the MILEPOST project. |
Yuanjie Huang |
Grigori Fursin |
2008
The source code for finished projects can be found at Google's code hosting site.
Project |
Student |
Mentor |
Steven Bosscher |
||
Improving Dead Store Elimination |
Jakub Staszak |
|
Extend Fortran 2003 support for gfortran |
Daniel Kraft |
François-Xavier Coudert |
C++0x lambda functions for GCC |
John Freeman |
|
Tobias Grosser |
||
Finish work on propagation aliasing and array dependence information from Tree-SSA to RTL. |
Alexander Monakov |
Diego Novillo |
Tobias Burnus |
2007
The source code for finished projects can be found at Google's code hosting site.
Project |
Student |
Mentor |
Propagating array data dependence information from Tree-SSA to RTL |
Alexander Monakov |
Daniel Berlin |
Manuel López-Ibáñez |
Diego Novillo |
|
Speeding up GCC for fun and profit |
James Webber |
Eric Marshall Christopher |
Steven Bosscher |
||
Open Mutliprogramming Interprocedural Analasis and Optimalizations |
Jakub Staszak |
Daniel Berlin |
Integrating OpenJDK's javac bytecode compiler into gcj |
Dalibor Topic |
Mark J. Wielaard |
New static scheduling heuristic for GCC |
Dmitry Zhurikhin |
Vladimir Makarov |
GCC support for Windows-compatible Structured Exception Handling (SEH) on the i386 platform |
Michele Cicciotti |
Ian Lance Taylor |
2006
Project |
Student |
Mentor |
Code parallelization using polyhedral model |
Plesco Alexandru |
Daniel Berlin |
Paul Biggar |
Daniel Berlin |
|
Laurynas Biveinis |
Daniel Berlin |
|
java.lang.management in Classpath |
Andrew John Hughes |
Mark Wielaard |
Lock free C++ containers |
Phillip Jordan |
Benjamin Kosnik |
Manuel López-Ibáñez |
Ian Lance Taylor |