Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
GCC plugin that embeds CPython inside the compiler
Python C C++ CSS Other
branch: master
Failed to load latest commit information.
docs lxml is a dependency
examples use separate filenames for each function in examples/show-{gimple|ssa…
gcc-c-api Fix gcc_cfg_block_for_each_gimple_phi
gccutils python 3 fixes
libcpychecker Fix source-code locations of return statements
libcpychecker_html python 3 fixes
misc/fedora Python3: makeindex.py: fix print-as-function SyntaxError
tests Fix source-code locations of return statements
.gitignore add print-gcc-version to .gitignore
.travis.yml we use lxml now.
COPYING Add COPYING and COPYING.LESSER, for the LGPLv3
LICENSES.txt fix up references to the moved directory
Makefile python 3 fixes
README.rst docs: add a "Getting Involved" section
configbuilder.py Work-in-progress support for gcc 4.9
contributors.rst add David Narvaez to contributors.rst
cpybuilder.py mass renaming of python symbols to use PyGcc_CamelCase
cpychecker.py Add GPLv3 license headers to all source files
demo.c add example of refcounting bugs to "make demo"
gcc-python-attribute.c Work-in-progress support for gcc 4.9
gcc-python-callbacks.c mass renaming of python symbols to use PyGcc_CamelCase
gcc-python-callgraph.c ensure there is a unique gcc.CallgraphEdge for each underlying edge
gcc-python-cfg.c ensure uniqueness of gcc.Cfg for an underlying gcc_cfg
gcc-python-closure.c mass renaming of python symbols to use PyGcc_CamelCase
gcc-python-closure.h mass renaming of python symbols to use PyGcc_CamelCase
gcc-python-compat.h Compat fix for building against 4.9
gcc-python-diagnostics.c gcc-c-api: add diagnostics hooks; use them in the Python layer
gcc-python-docs fix gcc-python-docs
gcc-python-function.c mass renaming of python symbols to use PyGcc_CamelCase
gcc-python-gimple.c Work-in-progress support for gcc 4.9
gcc-python-location.c implement gcc.Location.__hash__
gcc-python-option.c work-in-progress porting to gcc 4.8
gcc-python-parameter.c mass renaming of python symbols to use PyGcc_CamelCase
gcc-python-pass.c Work-in-progress support for gcc 4.9
gcc-python-plugin.spec python 3 fixes
gcc-python-pretty-printer.c Work-in-progress support for gcc 4.9
gcc-python-rtl.c Further 4.9 porting
gcc-python-tree.c Compat fix for building against 4.9
gcc-python-variable.c mass renaming of python symbols to use PyGcc_CamelCase
gcc-python-version.c mass renaming of python symbols to use PyGcc_CamelCase
gcc-python-wrapper.c gcc_register_root_tab expects a NULL-terminated list of ggc_root_tab
gcc-python-wrappers.h implement gcc.PointerType.__repr__
gcc-python.c Make various things be METH_NOARGS
gcc-python.h Work-in-progress support for gcc 4.9
gcc-with-cpychecker fix mixing tabs and spaces
gcc-with-python allow the use of $CC to override "gcc" in gcc-with-python and gcc-wit…
generate-callgraph-c.py mass renaming of python symbols to use PyGcc_CamelCase
generate-casts-c.py Attempt to fix the build on gcc 4.6
generate-cfg-c.py Ignore exception edges in CFG
generate-config-h.py Work-in-progress support for gcc 4.9
generate-function-c.py mass renaming of python symbols to use PyGcc_CamelCase
generate-gimple-c.py add a "label" attribute to gcc.GimpleLabel
generate-location-c.py Bulletproof Location.file against NULL filename
generate-option-c.py mass renaming of python symbols to use PyGcc_CamelCase
generate-parameter-c.py mass renaming of python symbols to use PyGcc_CamelCase
generate-pass-c.py mass renaming of python symbols to use PyGcc_CamelCase
generate-passes-svg.py Work-in-progress support for gcc 4.9
generate-pretty-printer-c.py mass renaming of python symbols to use PyGcc_CamelCase
generate-rtl-c.py mass renaming of python symbols to use PyGcc_CamelCase
generate-tables-of-passes-rst.py Work-in-progress support for gcc 4.9
generate-tree-c.py Add get attribute TYPE_METHODS to record types
generate-variable-c.py mass renaming of python symbols to use PyGcc_CamelCase
gimple-types.txt.in Generate appropriate gcc.Gimple subclasses for each statement; add so…
maketreetypes.py Initial wrapping of the Register Transfer Language
print-gcc-version.c add print-gcc-version and use it in selftests
rtl-types.txt.in Initial wrapping of the Register Transfer Language
run-test-suite.py Testsuite fixes for building against 4.9
test-builder.py Derive gcc name from $CC, not $GCC
test.c Add GPLv3 license headers to all source files
test.py Add GPLv3 license headers to all source files
testcpybuilder.py
testcpychecker.py Testsuite fixes for building against 4.9
tree-types.txt.in Try a more flexible approach to autogenerating Tree wrapper subclasses
wrapperbuilder.py mass renaming of python symbols to use PyGcc_CamelCase

README.rst

gcc-python

This is a plugin for GCC, which links against libpython, and (I hope) allows you to invoke arbitrary Python scripts from inside the compiler. The aim is to allow you to write GCC plugins in Python.

The plugin is Free Software, licensed under the GPLv3 (or later).

It's still at the "experimental proof-of-concept stage"; expect crashes and tracebacks (I'm new to insides of GCC, and I may have misunderstood things).

It's already possible to use this to add additional compiler errors/warnings, e.g. domain-specific checks, or static analysis. One of my goals for this is to "teach" GCC about the common mistakes people make when writing extensions for CPython, but it could be used e.g. to teach GCC about GTK's reference-counting semantics, or about locking in the Linux kernel, or about signal-safety in APIs.

Other ideas include visualizations of code structure. Given a gcc.CFG instance, gccutils.render_to_dot(cfg) and gccutils.invoke_dot(cfg) will use graphviz and eog to plot a handy visualization of a control flow graph, showing the source code interleaved with GCC's GIMPLE internal representation.

Requirements

  • GCC: 4.6 or later (it uses APIs that weren't exposed to plugins in 4.5)

  • Python: tested with 2.7 and 3.2; it may work with earlier versions

  • "six": The libcpychecker code uses the "six" Python compatibility library to smooth over Python 2 vs Python 3 differences, both at build-time and run-time:

    http://pypi.python.org/pypi/six/

Usage

I use:

make

to build the plugin and run the tests

You can also use:

make demo

to demonstrate the new compiler errors.

All of my coding so far has been on Fedora 15 x86_64, using:

gcc-plugin-devel-4.6.0-0.15.fc15.x86_64

and I don't know to what extent it will be compatible with other versions and architectures.

The code also makes some assumptions about the Python version you have installed (grep for "PyRuntime" in the .py files). I've been using:

python-devel-2.7.1-5.fc15.x86_64
python-debug-2.7.1-5.fc15.x86_64
python3-debug-3.2-0.9.rc1.fc15.x86_64
python3-devel-3.2-0.9.rc1.fc15.x86_64

but you may have to hack up the PyRuntime() invocations in the code to get it to build on other machines. Ultimately I want the plugin to be buildable against multiple python versions, so there could be a python27.so, python27-debug.so, python-32mu.so, python-32-dmu.so, etc (c.f. PEP-3149)

There isn't an installer yet. In theory you should be able to add these arguments to the gcc invocation:

gcc -fplugin=python.so -fplugin-arg-python-script=PATH_TO_SCRIPT.py OTHER_ARGS

and have it run your script as the plugin starts up.

The plugin automatically adds the absolute path to its own directory to the end of its sys.path, so that it can find support modules, such as gccutils.py and libcpychecker.

The exact API is still in flux; you can currently connect to events by registering callbacks e.g. to be called for each function in the source at different passes.

It exposes GCC's various types as Python objects, within a "gcc" module. You can see the API by running:

import gcc
help(gcc)

from within a script.

Overview of the code

This is currently three projects in one:

gcc-python-*: the plugin for GCC. The entrypoint (init_plugin) is in gcc-python.c

libcpychecker and cpychecker.py: a Python library (and a driver script), written for the plugin, in which I'm building new compiler warnings to help people find bugs in CPython extension code.

cpybuilder: a handy module for programatically generating C source code for CPython extensions. I use this both to generate parts of the GCC plugin, and also in the selftests for the cpychecker script. (I initially attempted to use Cython for the former, but wrapping the "tree" type hierarchy required more programatic control)

Coding style: Python and GCC each have their own coding style guide for C. I've chosen to follow Python's (PEP-7), as I prefer it (although my code is admittedly a mess in places).

You'll find API documentation within the "docs" directory, written in the reStructuredText format (as is this file, in fact). If you have Sphinx installed (http://sphinx.pocoo.org/), you can regenerate these docs using:

make html

within the docs directory. Sphinx is the python-sphinx package on a Fedora/RHEL box.

More detailed documentation can be seen within docs/getting-involved.rst

Enjoy! David Malcolm <dmalcolm@redhat.com>

Something went wrong with that request. Please try again.