Thread overview
Re: build gdc with gcc 4.2.2
Nov 16, 2007
Arthur Loiret
Nov 24, 2007
Ingo Oeser
Nov 24, 2007
Arthur Loiret
November 16, 2007
Hi,


I've been able to build gdc with gcc-4.2, it stills segfault sometimes and is unable to build phobos/tango for now, but it's a beginning and can compile short D files.

I've put the patches in: http://people.dunnewind.net/arthur/gdc-4.2/patches/

gdc-4.2-build.dpatch updates gcc/d/Make-lang.in for the new gcc-4.2 objs (pr26885) and gcc/d/d-builtins.c copied from the new c-common.c.

gdc-4.2.dpatch is mostly taked from patch-gcc-4.1.x, adding this:

--- gcc/tree.h  2007-11-15 14:21:01.000000000 +0100
+++ gcc/tree.h  2007-11-15 14:22:05.000000000 +0100
@@ -3535,6 +3535,19 @@

 extern tree build_nt (enum tree_code, ...);

+/* Still required by gdc */
+#if GCC_VERSION >= 3000 || __STDC_VERSION__ >= 199901L
+/* Use preprocessor trickery to map "build" to "buildN" where N is the
+   expected number of arguments.  This is used for both efficiency (no
+   varargs), and checking (verifying number of passed arguments).  */
+#define build(code, ...) \
+  _buildN1(build, _buildC1(__VA_ARGS__))(code, __VA_ARGS__)
+#define _buildN1(BASE, X)       _buildN2(BASE, X)
+#define _buildN2(BASE, X)       BASE##X
+#define _buildC1(...)           _buildC2(__VA_ARGS__,9,8,7,6,5,4,3,2,1,0,0)
+#define _buildC2(x,a1,a2,a3,a4,a5,a6,a7,a8,a9,c,...) c
+#endif
+
 extern tree build0_stat (enum tree_code, tree MEM_STAT_DECL);
 #define build0(c,t) build0_stat (c,t MEM_STAT_INFO)
 extern tree build1_stat (enum tree_code, tree, tree MEM_STAT_DECL);



I'm currently trying to fix ICEs, the problems seems to come from gimple.


Any help would be welcome, there is still a lot of work to get it working. :-)


Arthur.


November 24, 2007
Hi Arthur,

nice to see that happening!

Arthur Loiret wrote:

> I've been able to build gdc with gcc-4.2, it stills segfault sometimes and is unable to build phobos/tango for now, but it's a beginning and can compile short D files.

I've been trying to do the same some months ago.

> --- gcc/tree.h  2007-11-15 14:21:01.000000000 +0100
> +++ gcc/tree.h  2007-11-15 14:22:05.000000000 +0100
> @@ -3535,6 +3535,19 @@
> 
>  extern tree build_nt (enum tree_code, ...);
> 
> +/* Still required by gdc */
> +#if GCC_VERSION >= 3000 || __STDC_VERSION__ >= 199901L
> +/* Use preprocessor trickery to map "build" to "buildN" where N is the
> +   expected number of arguments.  This is used for both efficiency (no
> +   varargs), and checking (verifying number of passed arguments).  */
> +#define build(code, ...) \
> +  _buildN1(build, _buildC1(__VA_ARGS__))(code, __VA_ARGS__)
> +#define _buildN1(BASE, X)       _buildN2(BASE, X)
> +#define _buildN2(BASE, X)       BASE##X
> +#define _buildC1(...)
> _buildC2(__VA_ARGS__,9,8,7,6,5,4,3,2,1,0,0) +#define
> _buildC2(x,a1,a2,a3,a4,a5,a6,a7,a8,a9,c,...) c +#endif
> +
>  extern tree build0_stat (enum tree_code, tree MEM_STAT_DECL);
>  #define build0(c,t) build0_stat (c,t MEM_STAT_INFO)
>  extern tree build1_stat (enum tree_code, tree, tree MEM_STAT_DECL);

That's more (short term) maintainable than my approach. I patched the D glue
layer, fixed up the callers and provided build2() and build3() for compilers
below GCC 4.0.x.

David, would you accept a patch from me, which does ONLY that?

> I'm currently trying to fix ICEs, the problems seems to come from gimple.

Yes, I have seen the same and my vacation was over, so I stopped it.

I have some questions for some parts of that patch. I'll mail them to you.


Best Regards

Ingo Oeser
November 24, 2007
Hi Ingo,


On Sat, Nov 24, 2007 at 03:13:52PM +0100, Ingo Oeser wrote:
> > --- gcc/tree.h  2007-11-15 14:21:01.000000000 +0100
> > +++ gcc/tree.h  2007-11-15 14:22:05.000000000 +0100
> > @@ -3535,6 +3535,19 @@
> > 
> >  extern tree build_nt (enum tree_code, ...);
> > 
> > +/* Still required by gdc */
> > +#if GCC_VERSION >= 3000 || __STDC_VERSION__ >= 199901L
> > +/* Use preprocessor trickery to map "build" to "buildN" where N is the
> > +   expected number of arguments.  This is used for both efficiency (no
> > +   varargs), and checking (verifying number of passed arguments).  */
> > +#define build(code, ...) \
> > +  _buildN1(build, _buildC1(__VA_ARGS__))(code, __VA_ARGS__)
> > +#define _buildN1(BASE, X)       _buildN2(BASE, X)
> > +#define _buildN2(BASE, X)       BASE##X
> > +#define _buildC1(...)
> > _buildC2(__VA_ARGS__,9,8,7,6,5,4,3,2,1,0,0) +#define
> > _buildC2(x,a1,a2,a3,a4,a5,a6,a7,a8,a9,c,...) c +#endif
> > +
> >  extern tree build0_stat (enum tree_code, tree MEM_STAT_DECL);
> >  #define build0(c,t) build0_stat (c,t MEM_STAT_INFO)
> >  extern tree build1_stat (enum tree_code, tree, tree MEM_STAT_DECL);
> 
> That's more (short term) maintainable than my approach. I patched the D glue
> layer, fixed up the callers and provided build2() and build3() for compilers
> below GCC 4.0.x.

You're right. :-)


> > I'm currently trying to fix ICEs, the problems seems to come from gimple.
> 
> Yes, I have seen the same and my vacation was over, so I stopped it.

I made a few other temporary patches to fix ICEs, here is what changed:

diff -ruN gcc/gimplify.c gcc/gimplify.c
--- gcc/gimplify.c      2007-11-19 11:56:50.000000000 +0000
+++ gcc/gimplify.c      2007-11-19 11:58:32.000000000 +0000
@@ -1804,12 +1804,16 @@
              /* Divide the offset by its alignment.  */
              offset = size_binop (EXACT_DIV_EXPR, offset, factor);

-             if (!is_gimple_min_invariant (offset))
-               {
-                 TREE_OPERAND (t, 2) = offset;
-                 tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
-                                       is_gimple_formal_tmp_reg, fb_rvalue);
-                 ret = MIN (ret, tret);
+             /* Would be better to have a look at size_binop ... */
+             if (offset != NULL_TREE)
+               {
+                 if (!is_gimple_min_invariant (offset))
+                   {
+                     TREE_OPERAND (t, 2) = offset;
+                     tret = gimplify_expr (&TREE_OPERAND (t, 2), pre_p, post_p,
+                                           is_gimple_formal_tmp_reg, fb_rvalue);
+                     ret = MIN (ret, tret);
+                   }
                }
            }
        }
diff -ruN gcc/tree-inline.c gcc/tree-inline.c
--- gcc/tree-inline.c   2007-11-19 15:41:33.000000000 +0000
+++ gcc/tree-inline.c   2007-11-19 15:42:24.000000000 +0000
@@ -2636,8 +2636,9 @@
 {
   tree copy, type;

-  gcc_assert (TREE_CODE (decl) == PARM_DECL
-             || TREE_CODE (decl) == RESULT_DECL);
+  if (cfun->naked) /* Not sure this is right ... */
+    gcc_assert (TREE_CODE (decl) == PARM_DECL
+               || TREE_CODE (decl) == RESULT_DECL);

   type = TREE_TYPE (decl);



gdc-4.2 now builds phobos and tango, see [0] and [1].

[0] http://packages.qa.debian.org/g/gdc-4.2.html
[1] http://people.dunnewind.net/arthur/gdc-4.2/

Here is how to test it:

1/ Add this to your /etc/apt/sources.list

deb http://ftp.fr.debian.org/debian experimental main deb-src http://ftp.fr.debian.org/debian experimental main

2/ Run sudo aptitude update && sudo aptitude install gdc-4.2


I've cleanup gdc-4.2-build.dpatch: see: http://people.dunnewind.net/arthur/gdc-4.2/patches/gdc-4.2-build.dpatch

David, could you also have a look at this one?


> I have some questions for some parts of that patch. I'll mail them to you.

Sure, no problem.


Have a nice day,

Arthur.