On Mon, 2012-12-03 at 17:07 +0000, Brian Drummond wrote:
> On Mon, 2012-11-12 at 20:57 +0100, Lluís Batlle i Rossell wrote:
> > So, only very simple vhd files build fine for me with -O2.
> > 
> > Regards,
> > Lluís.
> 
> I have started to look at this.

Narrowing this down slowly. 

The patch below gets through the segfault compiling Unisims with -O2.
It bypasses a specific constant folding optimisation returning NULL_TREE when 
the erroneous circumstance arises. This ought to be safe; other erroneous 
conditions 
in the same function already do the same.

Test results from this patch and comments are welcome.




I am not entirely satisfied with it because it is the first change required to 
the 
base GCC source rather than to GHDL. I have traced the origin of this problem 
to 
function Create_Static_Array_Subtype_Bounds in translation.adb.

This creates a record containing a single element, which is passed to 
"fold_nonarray_ctor_reference" in gimple-fold.c. Somehow this element is not 
accompanied by a FIELD_DECL defining its size and location within the record 
(hence "cfield == null" and the segfault accessing cfield)

In fact the single element is itself a record containing the array bounds 
(which may or may not have their own FIELD_DECLs).

And that's as far as I have got. The way I see it:
either Create_Static_Array_Subtype_Bounds wrapping the array bound record in 
another record is not necessary (maybe it was, but this bit of GCC changed in 
2010) 
- or "fold_nonarray_ctor_reference" should unwrap the first record and apply 
the folding optimisation to the record it contains...

But that is just a guess; I don't have the bigger picture here as to why 
Create_Static_Array_Subtype_Bounds is the way it is; without that 
understanding, 
I am wary of messing with it. I don't know if there are regression tests to 
catch 
anything I break here...



As I say, any suggestions or further information would be welcome.


- Brian


------------------------------------------------------------------------

--- /home/brian/Projects/gcc4.7/4.7.2/gcc-4.7.2/gcc/gimple-fold.c
2012-07-19 22:26:17.000000000 +0100
+++ /home/brian/Projects/ghdl/gcc-4.7.2/gcc/gimple-fold.c       2012-12-07
18:07:49.679974119 +0000
@@ -2862,6 +2862,12 @@
   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), cnt, cfield,
                            cval)
     {
+
+      if (cfield == NULL)
+         return NULL_TREE;
+      
       tree byte_offset = DECL_FIELD_OFFSET (cfield);
       tree field_offset = DECL_FIELD_BIT_OFFSET (cfield);
       tree field_size = DECL_SIZE (cfield);


_______________________________________________
Ghdl-discuss mailing list
[email protected]
https://mail.gna.org/listinfo/ghdl-discuss

Reply via email to