Fixes 4.6.1 compiler build with gcc 4.7 (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Feb 2013 18:23:21 +0000 (10:23 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Feb 2013 18:23:21 +0000 (10:23 -0800)
Gcc 4.7 can't build 4.6.1.  Check out
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51969 for more info.

All of this takes place in tools/compilers/gcc-glibc/:

- If you want to build gcc with 4.7 and have a dirty working directory,
  rm .i686-ros-gcc-stage1-configure (or whatever) and gcc-4.6.1/, and a
  fresh 'make x86' ought to extract and patch 4.6.1's sources (and test
  the Makefile for new people).

- Alternatively, just patch (-p1) the new patch, or do a make clean.

- If you do nothing, you might have an issue in the future when your
  distro upgrades to 4.7.

tools/compilers/gcc-glibc/Makefile
tools/compilers/gcc-glibc/gcc-4.6.1-compile.patch [new file with mode: 0644]

index 0b1e485..8d14028 100644 (file)
@@ -145,6 +145,7 @@ gcc-$(GCC_VERSION): gcc-$(GCC_VERSION).tar.bz2
        rm -rf gcc-$(GCC_VERSION)
        tar -jxf gcc-$(GCC_VERSION).tar.bz2
        $(MAKE) .gcc-ros-patch
+       patch --no-backup-if-mismatch -p1 < gcc-4.6.1-compile.patch
        patch --no-backup-if-mismatch -p0 < gcc-$(GCC_VERSION)-riscv.patch
 
 .gcc-ros-patch:
diff --git a/tools/compilers/gcc-glibc/gcc-4.6.1-compile.patch b/tools/compilers/gcc-glibc/gcc-4.6.1-compile.patch
new file mode 100644 (file)
index 0000000..9dea910
--- /dev/null
@@ -0,0 +1,19 @@
+diff --git a/gcc-4.6.1/gcc/gengtype.c b/gcc-4.6.1/gcc/gengtype.c
+index abf17f8..550d3bb 100644
+--- a/gcc-4.6.1/gcc/gengtype.c
++++ b/gcc-4.6.1/gcc/gengtype.c
+@@ -3594,13 +3594,13 @@ write_field_root (outf_p f, pair_p v, type_p type, const char *name,
+                 int has_length, struct fileloc *line, const char *if_marked,
+                 bool emit_pch, type_p field_type, const char *field_name)
+ {
++  struct pair newv;
+   /* If the field reference is relative to V, rather than to some
+      subcomponent of V, we can mark any subarrays with a single stride.
+      We're effectively treating the field as a global variable in its
+      own right.  */
+   if (v && type == v->type)
+     {
+-      struct pair newv;
+
+       newv = *v;
+       newv.type = field_type;