[GCC-XML] GCC backend upgrade
Alex Leach
beamesleach at gmail.com
Sun Feb 10 13:39:34 EST 2013
Dear Brad / list,
Long story short, I thought I'd have a go at upgrading GCCXML's backend
compiler to GCC4.7.2. I made a fork on github a week ago and have been
working on it since.
I initially thought that there was no chance of me getting it to work, but
I stuck at it and have had some joy, sort of. Parse-able XML output is
being dumped, but there are some errors reported by the backend compiler.
gccxml_cc1plus exits with code 1, and gccxml assumes that it seg-faulted,
so all the ctests currently fail..
The last error I've come across has stumped me.. When looking for a
solution online, I found a thread in this mailing list
(http://public.kitware.com/pipermail/gccxml/2008-April/001100.html), where
you resolved the issue within 24 hours - Kudos for that Brad!
On github, I found the commit to workaround this:
https://github.com/gccxml/gccxml/commit/36c88f006a8e81261e637869b985332308ac99dd
But tbh, I don't have a clue how to implement a similar fix for GCC 4.7.2.
The tracebacks only seem to show include lines and errors within system
headers, which is new to me and makes debugging it a problem...
For example:
In file included from
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:43:0,
from
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40,
from
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40,
from ../GCC_XML/GXFront/gxSystemTools.h:29,
from ../GCC_XML/GXFront/gxConfiguration.h:20,
from ../GCC_XML/Testing/TestUsualInclude.cxx:1:
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:791:5:
error: 'std::ios_base& std::ios_base::operator=(const std::ios_base&)' is
private
In file included from
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:45:0,
from
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40,
from
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40,
from ../GCC_XML/GXFront/gxSystemTools.h:29,
from ../GCC_XML/GXFront/gxConfiguration.h:20,
from ../GCC_XML/Testing/TestUsualInclude.cxx:1:
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/basic_ios.h:64:11:
error: within this context
In file included from
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:41:0,
from ../GCC_XML/GXFront/gxSystemTools.h:29,
from ../GCC_XML/GXFront/gxConfiguration.h:20,
from ../GCC_XML/Testing/TestUsualInclude.cxx:1:
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/istream:
In member function 'std::basic_istream<char>&
std::basic_istream<char>::operator=(const std::basic_istream<char>&)':
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/istream:56:11:
note: synthesized method 'std::basic_ios<char>&
std::basic_ios<char>::operator=(const std::basic_ios<char>&)' first
required here
--------------------------------
There are similar errors with std::basic_ofstream, std::basic_streambuf,
std::locale::facet, std::num_put, and std::ctype. All giving errors about
copy constructors on private members.
I suspect this has to do with a change in the C++03 standard, judging by
this answer on SO: http://stackoverflow.com/a/9123195/566098
If you could suggest on which files I should direct my efforts, I'll do my
best to resolve this. Any help would be really appreciated! Otherwise,
I'll spend some time grep'ing and preprocessing various source files.. Any
ideas?
--------------------------------
Changes I made are in a fork of your repo on github, hosted at
https://github.com/alexleach/gccxml/
The changes are split over a few commits, as changing the GCC code
affected almost 3,000 files, so I dumped that in a single commit and any
manual edits and patches were committed afterwards. Should have probably
started a branch...
Most of the work involved editing the CMake build system files. I saw that
you're a core CMake maintainer, so I apologise if my edits aren't up to
your usual standards!
---------------------------------
Unrelated to these issues, but thinking about moving forward.. Richard
Guenther - one of the lead maintainers of the GCC project - suggested to
me on IRC the other day that I might try and turn it into a plugin...
Plugins seem to be compatible with GCC versions 4.5 and up. I thought it
sounds like a good idea, in that it would hopefully drop the need for a
lot of the support headers; I imagine it should reduce future maintenance;
the binary is much smaller; and obviously compiling a dynamically loaded
plugin is much, much quicker than recompiling a large chunk of GCC.
So after getting the above issues - which I think are totally resolvable -
I started working on patching xml.c to become a plugin. Obviously there's
some issues with the global variables and functions patched into other
modules, like in method.c, decl2.c and diagnostic.c, but the hard part is
already done; you did it years ago!
I should probably create a fork for the plugin, but so far, I've just
created a new sub-project (GCC/gccxml-plugin) in which I'm hacking xml.c
in an attempt to turn it into a plugin. Still quite a lot of work to do;
I'm a noob with C and C++ so progress is slow, but I'm learning a lot!
Would also need to modify the gccxml driver to instead invoke g++, also
passing it different arguments; i.e: '-fplugin=libgccxml_plugin.so
-fplugin-libgccxml_plugin-xml=... -fplugin-libgccxml_plugin-xml_start=...'
---------
Thanks for reading this! I was indenting on submitting a Pull Request at
some point, but I feel like I've made a mess of what was beautiful code
and a clean version history, so maybe it's best left as a separate fork..
If you would be interested in merging any of it back into the main
repository, please let me know and I'll make a Pull Request. I think I
should get it working first, though...
One last thing worth mentioning. I had a look at the other fork, by Andrej
Mitrovic, and incorporated some of his feature additions, like putting C++
attributes into XML tags and detection of Pod, Anon and TypeScoped C++
Types.
Yours sincerely,
Alex
More information about the gccxml
mailing list