[Bug 99] New: -fsection-anchors broken on ARM

gdc-bugzilla at gdcproject.org gdc-bugzilla at gdcproject.org
Sat Feb 1 02:59:07 PST 2014


http://bugzilla.gdcproject.org/show_bug.cgi?id=99

             Bug #: 99
           Summary: -fsection-anchors broken on ARM
    Classification: Unclassified
           Product: GDC
           Version: development
          Platform: ARM
        OS/Version: Other
            Status: NEW
          Severity: major
          Priority: Normal
         Component: libgdruntime
        AssignedTo: ibuclaw at gdcproject.org
        ReportedBy: slavo5150 at yahoo.com


Created attachment 58
  --> http://bugzilla.gdcproject.org/attachment.cgi?id=58
issue120.patch

This was migrated from
https://bitbucket.org/goshawk/gdc/issue/120/fsection-anchors-broken-on-arm

Johannes Pfau created an issue 2010-12-04
******************************************
When running a program on ARM, the GC immediately enters an infinite loop.
Debugging shows that the entered loop is in gcx.d line 2179:

for (; p < ptop; p += size)
{
     (cast(List *)p).next = *b;
     *b = cast(List *)p;
}

p and ptop are correct, but size is 0. size is set in line 2174:

size_t size = binsize[bin];

binsize is just an array of uints:

immutable uint binsize[B_MAX] = [ 16,32,64,128,256,512,1024,2048,4096 ];

bin was 3 in my tests, a correct index value. Still the array entry lookup
somehow fails. This only happens with optimization turned on though: If
druntime is compiled with -O0 the gc works fine.

Testing with optimization enabled:

I added code to make a copy of binsize and looked at that copy with gdb:

$1 = {0 <repeats 12 times>}

So I looked at the binsize symbol:

readelf -s -w ./hello_d | grep binsize
  5665: 00050c64    48 OBJECT  GLOBAL DEFAULT   14 _D2gc3gcx7binsizeyG12k

lets have a look at section 14:

readelf -S hello_d
There are 41 section headers, starting at offset 0x175464:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf
Al
  [14] .rodata           PROGBITS        00049db8 041db8 0089d0 00   A  0   0 
8

Dump it:

readelf -x 14 hello_d
...
  0x00050c58 00000000 00000000 00000000 10000000 ................
  0x00050c68 20000000 40000000 80000000 00010000  ... at ...........
  0x00050c78 00020000 00040000 00080000 00100000 ................
  0x00050c88 00000000 00000000 00000000 00000000 ................
  0x00050c98 00000000 00000000 00000000 00000000 ................

seems to be correct though.

asm dump of function allocPage:

Dump of assembler code for function _D2gc3gcx3Gcx9allocPageMFhZi:
0x00042c58 <_D2gc3gcx3Gcx9allocPageMFhZi+0>:    push    {r4, r5, r6, r7, r8,
lr}
0x00042c5c <_D2gc3gcx3Gcx9allocPageMFhZi+4>:    ldr    r3, [r0, #80]    ; 0x50
0x00042c60 <_D2gc3gcx3Gcx9allocPageMFhZi+8>:    mov    r5, r0
0x00042c64 <_D2gc3gcx3Gcx9allocPageMFhZi+12>:    cmp    r3, #0
0x00042c68 <_D2gc3gcx3Gcx9allocPageMFhZi+16>:    mov    r7, r1
0x00042c6c <_D2gc3gcx3Gcx9allocPageMFhZi+20>:    beq    0x42d08
<_D2gc3gcx3Gcx9allocPageMFhZi+176>
0x00042c70 <_D2gc3gcx3Gcx9allocPageMFhZi+24>:    mov    r4, #0
0x00042c74 <_D2gc3gcx3Gcx9allocPageMFhZi+28>:    b    0x42c84
<_D2gc3gcx3Gcx9allocPageMFhZi+44>
0x00042c78 <_D2gc3gcx3Gcx9allocPageMFhZi+32>:    ldr    r3, [r5, #80]    ; 0x50
0x00042c7c <_D2gc3gcx3Gcx9allocPageMFhZi+36>:    cmp    r3, r4
0x00042c80 <_D2gc3gcx3Gcx9allocPageMFhZi+40>:    bls    0x42d08
<_D2gc3gcx3Gcx9allocPageMFhZi+176>
0x00042c84 <_D2gc3gcx3Gcx9allocPageMFhZi+44>:    ldr    r3, [r5, #84]    ; 0x54
0x00042c88 <_D2gc3gcx3Gcx9allocPageMFhZi+48>:    mov    r1, #1
0x00042c8c <_D2gc3gcx3Gcx9allocPageMFhZi+52>:    ldr    r6, [r3, r4, lsl #2]
0x00042c90 <_D2gc3gcx3Gcx9allocPageMFhZi+56>:    add    r4, r4, r1
0x00042c94 <_D2gc3gcx3Gcx9allocPageMFhZi+60>:    mov    r0, r6
0x00042c98 <_D2gc3gcx3Gcx9allocPageMFhZi+64>:    bl    0x42bfc
<_D2gc3gcx4Pool10allocPagesMFkZk>
0x00042c9c <_D2gc3gcx3Gcx9allocPageMFhZi+68>:    cmn    r0, #1
0x00042ca0 <_D2gc3gcx3Gcx9allocPageMFhZi+72>:    beq    0x42c78
<_D2gc3gcx3Gcx9allocPageMFhZi+32>
0x00042ca4 <_D2gc3gcx3Gcx9allocPageMFhZi+76>:    ldr    r3, [r6, #88]    ; 0x58
0x00042ca8 <_D2gc3gcx3Gcx9allocPageMFhZi+80>:    ldr    r2, [pc, #96]    ;
0x42d10 <_D2gc3gcx3Gcx9allocPageMFhZi+184>
0x00042cac <_D2gc3gcx3Gcx9allocPageMFhZi+84>:    strb    r7, [r3, r0]
0x00042cb0 <_D2gc3gcx3Gcx9allocPageMFhZi+88>:    ldr    r3, [r6]
0x00042cb4 <_D2gc3gcx3Gcx9allocPageMFhZi+92>:    ldr    r2, [r2, r7, lsl #2]
0x00042cb8 <_D2gc3gcx3Gcx9allocPageMFhZi+96>:    add    r0, r3, r0, lsl #12
0x00042cbc <_D2gc3gcx3Gcx9allocPageMFhZi+100>:    add    r5, r5, #88    ; 0x58
0x00042cc0 <_D2gc3gcx3Gcx9allocPageMFhZi+104>:    add    r12, r0, r2
0x00042cc4 <_D2gc3gcx3Gcx9allocPageMFhZi+108>:    ldr    r4, [r5, r7, lsl #2]
0x00042cc8 <_D2gc3gcx3Gcx9allocPageMFhZi+112>:    add    r6, r0, #4096    ;
0x1000
0x00042ccc <_D2gc3gcx3Gcx9allocPageMFhZi+116>:    add    r7, r5, r7, lsl #2
0x00042cd0 <_D2gc3gcx3Gcx9allocPageMFhZi+120>:    mov    r1, r12
0x00042cd4 <_D2gc3gcx3Gcx9allocPageMFhZi+124>:    b    0x42ce0
<_D2gc3gcx3Gcx9allocPageMFhZi+136>
0x00042cd8 <_D2gc3gcx3Gcx9allocPageMFhZi+128>:    mov    r4, r3
0x00042cdc <_D2gc3gcx3Gcx9allocPageMFhZi+132>:    add    r12, r12, r2
0x00042ce0 <_D2gc3gcx3Gcx9allocPageMFhZi+136>:    add    r1, r1, r2
0x00042ce4 <_D2gc3gcx3Gcx9allocPageMFhZi+140>:    rsb    r3, r2, r1
0x00042ce8 <_D2gc3gcx3Gcx9allocPageMFhZi+144>:    cmp    r6, r3
0x00042cec <_D2gc3gcx3Gcx9allocPageMFhZi+148>:    str    r4, [r0]
0x00042cf0 <_D2gc3gcx3Gcx9allocPageMFhZi+152>:    mov    r3, r0
0x00042cf4 <_D2gc3gcx3Gcx9allocPageMFhZi+156>:    str    r0, [r7]
0x00042cf8 <_D2gc3gcx3Gcx9allocPageMFhZi+160>:    mov    r0, r12
0x00042cfc <_D2gc3gcx3Gcx9allocPageMFhZi+164>:    bhi    0x42cd8
<_D2gc3gcx3Gcx9allocPageMFhZi+128>
0x00042d00 <_D2gc3gcx3Gcx9allocPageMFhZi+168>:    mov    r0, #1
0x00042d04 <_D2gc3gcx3Gcx9allocPageMFhZi+172>:    pop    {r4, r5, r6, r7, r8,
pc}
0x00042d08 <_D2gc3gcx3Gcx9allocPageMFhZi+176>:    mov    r0, #0
0x00042d0c <_D2gc3gcx3Gcx9allocPageMFhZi+180>:    pop    {r4, r5, r6, r7, r8,
pc}
0x00042d10 <_D2gc3gcx3Gcx9allocPageMFhZi+184>:    ldrdeq    r0, [r5], -r4

Testing with -O0

asm dump, compiled with -O0

Dump of assembler code for function _D2gc3gcx3Gcx9allocPageMFhZi:
0x00046eb8 <_D2gc3gcx3Gcx9allocPageMFhZi+0>:    push    {r11, lr}
0x00046ebc <_D2gc3gcx3Gcx9allocPageMFhZi+4>:    add    r11, sp, #4
0x00046ec0 <_D2gc3gcx3Gcx9allocPageMFhZi+8>:    sub    sp, sp, #40    ; 0x28
0x00046ec4 <_D2gc3gcx3Gcx9allocPageMFhZi+12>:    str    r0, [r11, #-40]    ;
0x28
0x00046ec8 <_D2gc3gcx3Gcx9allocPageMFhZi+16>:    mov    r3, r1
0x00046ecc <_D2gc3gcx3Gcx9allocPageMFhZi+20>:    strb    r3, [r11, #-41]    ;
0x29
0x00046ed0 <_D2gc3gcx3Gcx9allocPageMFhZi+24>:    mov    r3, #0
0x00046ed4 <_D2gc3gcx3Gcx9allocPageMFhZi+28>:    str    r3, [r11, #-8]
0x00046ed8 <_D2gc3gcx3Gcx9allocPageMFhZi+32>:    mov    r3, #0
0x00046edc <_D2gc3gcx3Gcx9allocPageMFhZi+36>:    str    r3, [r11, #-12]
0x00046ee0 <_D2gc3gcx3Gcx9allocPageMFhZi+40>:    mov    r3, #0
0x00046ee4 <_D2gc3gcx3Gcx9allocPageMFhZi+44>:    str    r3, [r11, #-16]
0x00046ee8 <_D2gc3gcx3Gcx9allocPageMFhZi+48>:    mov    r3, #0
0x00046eec <_D2gc3gcx3Gcx9allocPageMFhZi+52>:    str    r3, [r11, #-20]
0x00046ef0 <_D2gc3gcx3Gcx9allocPageMFhZi+56>:    mov    r3, #0
0x00046ef4 <_D2gc3gcx3Gcx9allocPageMFhZi+60>:    str    r3, [r11, #-24]
0x00046ef8 <_D2gc3gcx3Gcx9allocPageMFhZi+64>:    mov    r3, #0
0x00046efc <_D2gc3gcx3Gcx9allocPageMFhZi+68>:    str    r3, [r11, #-12]
0x00046f00 <_D2gc3gcx3Gcx9allocPageMFhZi+72>:    ldr    r3, [r11, #-40]    ;
0x28
0x00046f04 <_D2gc3gcx3Gcx9allocPageMFhZi+76>:    ldr    r3, [r3, #80]    ; 0x50
0x00046f08 <_D2gc3gcx3Gcx9allocPageMFhZi+80>:    ldr    r2, [r11, #-12]
0x00046f0c <_D2gc3gcx3Gcx9allocPageMFhZi+84>:    cmp    r2, r3
0x00046f10 <_D2gc3gcx3Gcx9allocPageMFhZi+88>:    movcs    r3, #0
0x00046f14 <_D2gc3gcx3Gcx9allocPageMFhZi+92>:    movcc    r3, #1
0x00046f18 <_D2gc3gcx3Gcx9allocPageMFhZi+96>:    and    r3, r3, #255    ; 0xff
0x00046f1c <_D2gc3gcx3Gcx9allocPageMFhZi+100>:    eor    r3, r3, #1
0x00046f20 <_D2gc3gcx3Gcx9allocPageMFhZi+104>:    and    r3, r3, #255    ; 0xff
0x00046f24 <_D2gc3gcx3Gcx9allocPageMFhZi+108>:    cmp    r3, #0
0x00046f28 <_D2gc3gcx3Gcx9allocPageMFhZi+112>:    bne    0x46f78
<_D2gc3gcx3Gcx9allocPageMFhZi+192>
0x00046f2c <_D2gc3gcx3Gcx9allocPageMFhZi+116>:    ldr    r3, [r11, #-40]    ;
0x28
0x00046f30 <_D2gc3gcx3Gcx9allocPageMFhZi+120>:    ldr    r2, [r3, #84]    ;
0x54
0x00046f34 <_D2gc3gcx3Gcx9allocPageMFhZi+124>:    ldr    r3, [r11, #-12]
0x00046f38 <_D2gc3gcx3Gcx9allocPageMFhZi+128>:    lsl    r3, r3, #2
0x00046f3c <_D2gc3gcx3Gcx9allocPageMFhZi+132>:    add    r3, r2, r3
0x00046f40 <_D2gc3gcx3Gcx9allocPageMFhZi+136>:    ldr    r3, [r3]
0x00046f44 <_D2gc3gcx3Gcx9allocPageMFhZi+140>:    str    r3, [r11, #-8]
0x00046f48 <_D2gc3gcx3Gcx9allocPageMFhZi+144>:    ldr    r0, [r11, #-8]
0x00046f4c <_D2gc3gcx3Gcx9allocPageMFhZi+148>:    mov    r1, #1
0x00046f50 <_D2gc3gcx3Gcx9allocPageMFhZi+152>:    bl    0x4898c
<_D2gc3gcx4Pool10allocPagesMFkZk>
0x00046f54 <_D2gc3gcx3Gcx9allocPageMFhZi+156>:    mov    r3, r0
0x00046f58 <_D2gc3gcx3Gcx9allocPageMFhZi+160>:    str    r3, [r11, #-16]
0x00046f5c <_D2gc3gcx3Gcx9allocPageMFhZi+164>:    ldr    r3, [r11, #-16]
0x00046f60 <_D2gc3gcx3Gcx9allocPageMFhZi+168>:    cmn    r3, #1
0x00046f64 <_D2gc3gcx3Gcx9allocPageMFhZi+172>:    bne    0x46f80
<_D2gc3gcx3Gcx9allocPageMFhZi+200>
0x00046f68 <_D2gc3gcx3Gcx9allocPageMFhZi+176>:    ldr    r3, [r11, #-12]
0x00046f6c <_D2gc3gcx3Gcx9allocPageMFhZi+180>:    add    r3, r3, #1
0x00046f70 <_D2gc3gcx3Gcx9allocPageMFhZi+184>:    str    r3, [r11, #-12]
0x00046f74 <_D2gc3gcx3Gcx9allocPageMFhZi+188>:    b    0x46f00
<_D2gc3gcx3Gcx9allocPageMFhZi+72>
0x00046f78 <_D2gc3gcx3Gcx9allocPageMFhZi+192>:    mov    r3, #0
0x00046f7c <_D2gc3gcx3Gcx9allocPageMFhZi+196>:    b    0x4704c
<_D2gc3gcx3Gcx9allocPageMFhZi+404>
0x00046f80 <_D2gc3gcx3Gcx9allocPageMFhZi+200>:    nop            ; (mov r0, r0)
0x00046f84 <_D2gc3gcx3Gcx9allocPageMFhZi+204>:    ldr    r3, [r11, #-8]
0x00046f88 <_D2gc3gcx3Gcx9allocPageMFhZi+208>:    ldr    r2, [r3, #88]    ;
0x58
0x00046f8c <_D2gc3gcx3Gcx9allocPageMFhZi+212>:    ldr    r3, [r11, #-16]
0x00046f90 <_D2gc3gcx3Gcx9allocPageMFhZi+216>:    add    r3, r2, r3
0x00046f94 <_D2gc3gcx3Gcx9allocPageMFhZi+220>:    ldrb    r2, [r11, #-41]    ;
0x29
0x00046f98 <_D2gc3gcx3Gcx9allocPageMFhZi+224>:    strb    r2, [r3]
0x00046f9c <_D2gc3gcx3Gcx9allocPageMFhZi+228>:    ldrb    r3, [r11, #-41]    ;
0x29
0x00046fa0 <_D2gc3gcx3Gcx9allocPageMFhZi+232>:    lsl    r2, r3, #2
0x00046fa4 <_D2gc3gcx3Gcx9allocPageMFhZi+236>:    ldr    r3, [pc, #172]    ;
0x47058 <_D2gc3gcx3Gcx9allocPageMFhZi+416>
0x00046fa8 <_D2gc3gcx3Gcx9allocPageMFhZi+240>:    add    r3, r2, r3
0x00046fac <_D2gc3gcx3Gcx9allocPageMFhZi+244>:    ldr    r3, [r3]
0x00046fb0 <_D2gc3gcx3Gcx9allocPageMFhZi+248>:    str    r3, [r11, #-28]
0x00046fb4 <_D2gc3gcx3Gcx9allocPageMFhZi+252>:    ldr    r3, [r11, #-40]    ;
0x28
0x00046fb8 <_D2gc3gcx3Gcx9allocPageMFhZi+256>:    add    r2, r3, #88    ; 0x58
0x00046fbc <_D2gc3gcx3Gcx9allocPageMFhZi+260>:    ldrb    r3, [r11, #-41]    ;
0x29
0x00046fc0 <_D2gc3gcx3Gcx9allocPageMFhZi+264>:    lsl    r3, r3, #2
0x00046fc4 <_D2gc3gcx3Gcx9allocPageMFhZi+268>:    add    r3, r2, r3
0x00046fc8 <_D2gc3gcx3Gcx9allocPageMFhZi+272>:    str    r3, [r11, #-32]
0x00046fcc <_D2gc3gcx3Gcx9allocPageMFhZi+276>:    ldr    r3, [r11, #-8]
0x00046fd0 <_D2gc3gcx3Gcx9allocPageMFhZi+280>:    ldr    r2, [r3]
0x00046fd4 <_D2gc3gcx3Gcx9allocPageMFhZi+284>:    ldr    r3, [r11, #-16]
0x00046fd8 <_D2gc3gcx3Gcx9allocPageMFhZi+288>:    lsl    r3, r3, #12
0x00046fdc <_D2gc3gcx3Gcx9allocPageMFhZi+292>:    add    r3, r2, r3
0x00046fe0 <_D2gc3gcx3Gcx9allocPageMFhZi+296>:    str    r3, [r11, #-20]
0x00046fe4 <_D2gc3gcx3Gcx9allocPageMFhZi+300>:    ldr    r3, [r11, #-20]
0x00046fe8 <_D2gc3gcx3Gcx9allocPageMFhZi+304>:    add    r3, r3, #4096    ;
0x1000
0x00046fec <_D2gc3gcx3Gcx9allocPageMFhZi+308>:    str    r3, [r11, #-24]
0x00046ff0 <_D2gc3gcx3Gcx9allocPageMFhZi+312>:    ldr    r2, [r11, #-20]
0x00046ff4 <_D2gc3gcx3Gcx9allocPageMFhZi+316>:    ldr    r3, [r11, #-24]
0x00046ff8 <_D2gc3gcx3Gcx9allocPageMFhZi+320>:    cmp    r2, r3
0x00046ffc <_D2gc3gcx3Gcx9allocPageMFhZi+324>:    movcs    r3, #0
0x00047000 <_D2gc3gcx3Gcx9allocPageMFhZi+328>:    movcc    r3, #1
0x00047004 <_D2gc3gcx3Gcx9allocPageMFhZi+332>:    and    r3, r3, #255    ; 0xff
0x00047008 <_D2gc3gcx3Gcx9allocPageMFhZi+336>:    eor    r3, r3, #1
0x0004700c <_D2gc3gcx3Gcx9allocPageMFhZi+340>:    and    r3, r3, #255    ; 0xff
0x00047010 <_D2gc3gcx3Gcx9allocPageMFhZi+344>:    cmp    r3, #0
0x00047014 <_D2gc3gcx3Gcx9allocPageMFhZi+348>:    bne    0x47048
<_D2gc3gcx3Gcx9allocPageMFhZi+400>
0x00047018 <_D2gc3gcx3Gcx9allocPageMFhZi+352>:    ldr    r3, [r11, #-20]
0x0004701c <_D2gc3gcx3Gcx9allocPageMFhZi+356>:    ldr    r2, [r11, #-32]
0x00047020 <_D2gc3gcx3Gcx9allocPageMFhZi+360>:    ldr    r2, [r2]
0x00047024 <_D2gc3gcx3Gcx9allocPageMFhZi+364>:    str    r2, [r3]
0x00047028 <_D2gc3gcx3Gcx9allocPageMFhZi+368>:    ldr    r2, [r11, #-20]
0x0004702c <_D2gc3gcx3Gcx9allocPageMFhZi+372>:    ldr    r3, [r11, #-32]
0x00047030 <_D2gc3gcx3Gcx9allocPageMFhZi+376>:    str    r2, [r3]
0x00047034 <_D2gc3gcx3Gcx9allocPageMFhZi+380>:    ldr    r3, [r11, #-28]
0x00047038 <_D2gc3gcx3Gcx9allocPageMFhZi+384>:    ldr    r2, [r11, #-20]
0x0004703c <_D2gc3gcx3Gcx9allocPageMFhZi+388>:    add    r3, r2, r3
0x00047040 <_D2gc3gcx3Gcx9allocPageMFhZi+392>:    str    r3, [r11, #-20]
0x00047044 <_D2gc3gcx3Gcx9allocPageMFhZi+396>:    b    0x46ff0
<_D2gc3gcx3Gcx9allocPageMFhZi+312>
0x00047048 <_D2gc3gcx3Gcx9allocPageMFhZi+400>:    mov    r3, #1
0x0004704c <_D2gc3gcx3Gcx9allocPageMFhZi+404>:    mov    r0, r3
0x00047050 <_D2gc3gcx3Gcx9allocPageMFhZi+408>:    sub    sp, r11, #4
0x00047054 <_D2gc3gcx3Gcx9allocPageMFhZi+412>:    pop    {r11, pc}
0x00047058 <_D2gc3gcx3Gcx9allocPageMFhZi+416>:    andeq    r4, r5, r4, lsl #20

I hope this information can help to fix this bug at some time, I don't
understand the asm well enough to figure the problem out by myself.

Johannes Pfau - 2010-12-04
******************************************
edited description


Iain Buclaw - 2010-12-05
******************************************
* changed status to open

Can you backtrace with argument name/values?

I think this is what I was referring to in the NG thread. What you should see
is a parameter with a corrupt/large value.

Also, shot in the dark, but what are your configure flags? Have you tried
building with flags that closely match your ARM board spec?

ie:

--with-arch=armv7-a --with-float=softfp --with-fpu=vfpv3-d16 --with-mode=thumb

Valid arch flags: armv[23456] | armv2a | armv3m | armv4t | armv5t | armv5te |
armv6j | armv6k | armv6z | armv6zk | armv6-m | armv7 | armv7-a | armv7-r |
armv7-m | iwmmxt | ep9312

Valid float flags: soft | hard | softfp

Valid fpu flags: fpa | fpe2 | fpe3 | maverick | vfp | vfp3 | vfpv3 | vfpv3-d16
| neon

Valid mode flags: arm | thumb

If in doubt, probably just use the same flags as what your system gcc was built
with.

Regards


Johannes Pfau - 2010-12-05
******************************************
Is "bt full" with gdb enough? Some values are optimized out, but as the problem
doesn't show with the unoptimized version:
Full Backtrace, optimized version

0  _D2gc3gcx3Gcx9allocPageMFhZi (this=<value optimized out>, 
    bin=<value optimized out>)
    at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:2179
        pn = <value optimized out>
        pool = <value optimized out>
        b = 0x66094
        size = 0
        ptop = 0x40235000 ""
        p = 0x40234000 ""
        n = <value optimized out>
1  0x0004444c in _D2gc3gcx2GC12mallocNoSyncMFkkPkZPv (this=..., size=88, 
    bits=1, alloc_size=<value optimized out>)
    at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:459
        collected = false
        state = 2
        bin = 3 '\003'
        p = <value optimized out>
2  0x000451d4 in _D2gc3gcx2GC6mallocMFkkPkZPv (this=..., size=88, bits=1, 
    alloc_size=0x0) at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:418
        __sync7 = @0x64c0c
3  0x00041d58 in gc_malloc (sz=269656, ba=0)
    at ../../../gcc-4.4.5-build/libphobos/gc/gc.d:188
No locals.
4  0x0003c1f8 in _d_newclass (ci=...)
    at ../../../gcc-4.4.5-build/libphobos/rt/lifetime.d:125
        p = <value optimized out>
5  0x00040c4c in thread_attachThis ()
    at ../../../gcc-4.4.5-build/libphobos/core/thread.d:1813
        thisContext = 0xbee79628
        thisThread = <value optimized out>
6  0x00040da0 in thread_init ()
    at ../../../gcc-4.4.5-build/libphobos/core/thread.d:1792
        sigusr2 = {sa_handler = 0x3fde4 <thread_resumeHandler>, 
          sa_sigaction = 0x3fde4 <thread_resumeHandler>, sa_mask = {__val = {
              2147483647, 4294967294, 4294967295 <repeats 30 times>}}, 
          sa_flags = 0, sa_restorer = 0}
        sigusr1 = {sa_handler = 0x40b94 <thread_suspendHandler>, 
          sa_sigaction = 0x40b94 <thread_suspendHandler>, sa_mask = {__val = {
              2147483647, 4294967294, 4294967295 <repeats 30 times>}}, 
          sa_flags = 268435456, sa_restorer = 0}
7  0x000423ac in gc_init () at ../../../gcc-4.4.5-build/libphobos/gc/gc.d:115
        p = 0x66018
8  0x00045f50 in runAll ()
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:498
No locals.
9  0x00045cec in tryExec (dg=...)
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:438
No locals.
10 0x00045e84 in main (argc=<value optimized out>, argv=0xbee79944)
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:515
        args = {length = 1, ptr = 0x66008}
        result = 0
        trapExceptions = true

Interesting stuff, you are right, in 3 size and ba are wrong, but they are
correct in 2.
Partial backtrace, optimized version, with breakpoints

Breakpoint 1, gc_malloc (sz=88, ba=1)
    at ../../../gcc-4.4.5-build/libphobos/gc/gc.d:188
188    ../../../gcc-4.4.5-build/libphobos/gc/gc.d: No such file or directory.
    in ../../../gcc-4.4.5-build/libphobos/gc/gc.d
Current language:  auto
The current source language is "auto; currently minimal".
(gdb) cont
Continuing.

Breakpoint 2, _D2gc3gcx2GC6mallocMFkkPkZPv (this=..., size=88, bits=1, 
    alloc_size=0x0) at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:406
406    ../../../gcc-4.4.5-build/libphobos/gc/gcx.d: No such file or directory.
    in ../../../gcc-4.4.5-build/libphobos/gc/gcx.d
(gdb) bt
0  _D2gc3gcx2GC6mallocMFkkPkZPv (this=..., size=88, bits=1, alloc_size=0x0)
    at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:406
1  0x00041d58 in gc_malloc (sz=269656, ba=1)
    at ../../../gcc-4.4.5-build/libphobos/gc/gc.d:188
2  0x0003c1f8 in _d_newclass (ci=...)
    at ../../../gcc-4.4.5-build/libphobos/rt/lifetime.d:125
3  0x00040c4c in thread_attachThis ()
    at ../../../gcc-4.4.5-build/libphobos/core/thread.d:1813
4  0x00040da0 in thread_init ()
    at ../../../gcc-4.4.5-build/libphobos/core/thread.d:1792
5  0x000423ac in gc_init () at ../../../gcc-4.4.5-build/libphobos/gc/gc.d:115
6  0x00045f50 in runAll ()
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:498
7  0x00045cec in tryExec (dg=...)
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:438
8  0x00045e84 in main (argc=<value optimized out>, argv=0xbe829944)
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:515

The value is actually correct in the gc_malloc function and it's passed on
correctly, but it's corrupted in the backtrace. Strange. Doesn't happen for the
unoptimized version. Also in the optimized version printf output is corrupted,
maybe this all somehow belongs together.
Full backtrace with -O0

0  _D2gc3gcx3Gcx9allocPageMFhZi (this=..., bin=3 '\003')
    at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:2179
        pn = 0
        pool = 0x6a0f0
        b = 0x6a094
        size = 128
        ptop = 0x40235000 ""
        p = 0x40234000 ""
        n = 0
1  0x00043414 in _D2gc3gcx2GC12mallocNoSyncMFkkPkZPv (this=..., size=88, 
    bits=1, alloc_size=0x0) at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:459
        collected = false
        state = 2
        bin = 3 '\003'
        p = 0x0
2  0x00043298 in _D2gc3gcx2GC6mallocMFkkPkZPv (this=..., size=88, bits=1, 
    alloc_size=0x0) at ../../../gcc-4.4.5-build/libphobos/gc/gcx.d:418
        __sync7 = @0x68c00
3  0x00042014 in gc_malloc (sz=88, ba=1)
    at ../../../gcc-4.4.5-build/libphobos/gc/gc.d:188
No locals.
4  0x0003c1f8 in _d_newclass (ci=...)
    at ../../../gcc-4.4.5-build/libphobos/rt/lifetime.d:125
        p = <value optimized out>
5  0x00040c4c in thread_attachThis ()
    at ../../../gcc-4.4.5-build/libphobos/core/thread.d:1813
        thisContext = 0xbee3c618
        thisThread = <value optimized out>
6  0x00040da0 in thread_init ()
    at ../../../gcc-4.4.5-build/libphobos/core/thread.d:1792
        sigusr2 = {sa_handler = 0x3fde4 <thread_resumeHandler>, 
          sa_sigaction = 0x3fde4 <thread_resumeHandler>, sa_mask = {__val = {
              2147483647, 4294967294, 4294967295 <repeats 30 times>}}, 
          sa_flags = 0, sa_restorer = 0}
        sigusr1 = {sa_handler = 0x40b94 <thread_suspendHandler>, 
          sa_sigaction = 0x40b94 <thread_suspendHandler>, sa_mask = {__val = {
              2147483647, 4294967294, 4294967295 <repeats 30 times>}}, 
          sa_flags = 268435456, sa_restorer = 0}
7  0x00041c58 in gc_init () at ../../../gcc-4.4.5-build/libphobos/gc/gc.d:115
        ci = @0x68c50
        p = 0x6a018
8  0x0004991c in runAll ()
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:498
No locals.
9  0x000496b8 in tryExec (dg=...)
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:438
No locals.
10 0x00049850 in main (argc=<value optimized out>, argv=0xbee3c944)
    at ../../../gcc-4.4.5-build/libphobos/rt/dmain2.d:515
        args = {length = 1, ptr = 0x6a008}
        result = 0
        trapExceptions = true

Configure flags, native GCC

Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-6'
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.4 --enable-shared --enable-multiarch
--enable-linker-build-id --with-system-zlib
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--disable-sjlj-exceptions --enable-checking=release --build=arm-linux-gnueabi
--host=arm-linux-gnueabi --target=arm-linux-gnueabi

Configure flags, cross GDC

Configured with: ../gcc-4.4.5-build/configure --prefix=/usr
--target=arm-linux-gnueabi --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu
--enable-languages=d
--enable-threads --disable-nls --enable-shared --enable-multiarch
--disable-multilib --with-as=/usr/bin/arm-linux-gnueabi-as
--with-ld=/usr/bin/arm-linux-gnueabi-ld
--with-sysroot=/usr/i686-pc-linux-gnu/arm-linux-gnueabi

The board uses a Feroceon 88FR131 rev 1, google says that's armv5te, thumb mode
supported, no hardware floating point, so I should use

--with-arch=armv5te --with-float=softfp --with-mode=thumb

? I will try that later today.

Iain Buclaw - 2010-12-05
******************************************
Hmm, maybe it's all insignificant, but I can't recall why I knew that was there
now. Possibly at the time (I was kindly given an ssh account to login to for
testing) I may have seen that the call for: gc_malloc (sz=269656, ba=0) somehow
messed things up later on. I honestly can't remember am afraid. :)

It's certainly worth a try using using that. As it may have an affect on the
ASM generated by GCC.

Though I can see that at the very least, when I get my C̶h̶r̶i̶s̶t̶m̶a̶s̶
̶p̶r̶e̶s̶e̶n̶t̶ Sheeva plug, will have to build phobos with -O0 and then
debug/slim-down a standalone version of gcx.d


Johannes Pfau - 2010-12-06
******************************************
Ok, I tried to build with those flags, but I hit this error.

/var/abs/local/cross-arm-linux-gnueabi/cross-arm-none-linux-gnueabi-gdc2-hg/src/gcc-build/./gcc/gdc
-B/var/abs/local/cross-arm-linux-gnueabi/cross-arm-none-linux-gnueabi-gdc2-hg/src/gcc-build/./gcc/
-B/usr/arm-linux-gnueabi/bin/ -B/usr/arm-linux-gnueabi/lib/ -isystem
/usr/arm-linux-gnueabi/include -isystem /usr/arm-linux-gnueabi/sys-include -o
std/math.o -Wall -g -frelease -O2 -fversion=GC_Use_Alloc_MMap
-fversion=GC_Use_Stack_GLibC -fversion=GC_Use_Data_Fixed -nostdinc -pipe
-fdeprecated -I ../../../gcc-4.4.5-build/libphobos -I ./arm-linux-gnueabi 
-femit-templates -c ../../../gcc-4.4.5-build/libphobos/std/math.d
{standard input}: Assembler messages:
{standard input}:383: Error: selected processor does not support `mrc
p10,7,r0,cr1,cr0,0'
{standard input}:470: Error: selected processor does not support `mcr
p10,7,r0,cr1,cr0,0'

Interesting, I didn't know gcc can detect this. Seems like software floating
point needs some special handling there. I just commented out the asm blocks
and the compiler built fine. However, the GC problem still remains. Well I'll
just compile without optimization until you get your sheevaplug and this can
hopefully be fixed.

Johannes Pfau - 2011-04-22
******************************************
Update:

With newest hg dmd and the patches from issue 193 and gcc 4.5.2 the infinite
loop is gone and instead a segmentation fault happens. The location where the
segfault occurs according to gdb is just as weird as the gc infinite loop bug.
Again this only occurs with -O >= 1, everything's fine with -O0.

Further investigation showed that the problem is -fsection-anchors. With
-fno-section-anchors even -O3 works fine. Interestingly -fsection-anchors is
enabled by default on ARM, but not on x86. Probably this is not even an ARM
specific bug. I'll recompile phobos with -fsection-anchors on x86 to see what
happens there.

(speculation:) I don't know much about compilers, machine code, etc. but
reading gccs description of -fsection-anchors it seems quite possible that this
optimization has caused all the trouble. The gc problem was caused by a
variable being read as 0 although the static data and everything was correct.
If this data was read from a wrong address that could explain the wrong value
and it also explains the segfaults I'm seeing with a recent gdc.

Johannes Pfau - 2011-04-22
******************************************
x86 doesn't support -fsection-anchors, even if explicitly enabled. So it could
still be a problem on all architectures which support -fsection-anchors but
I've got no hardware to test that.

Iain, would it be possible to "blacklist" -fsection-anchors? Or to add
"-fno-section-anchors" to the default arguments for gdc so that it would just
work on ARM?

Johannes Pfau - 2011-04-22
******************************************
* changed title to -fsection-anchors broken on ARM


Andrew Wiley - 2011-04-23
******************************************
>From my understanding of ARM assembly, I would guess that they want
-fsection-anchors because ARM cannot use full size pointers as immediate values
in instructions, which makes statically computed addresses hard to use. That
said, I'm not sure how much of a performance hit -fno-section-anchors would
cause.

Iain Buclaw - 2011-04-23
******************************************
Further investigation showed that the problem is -fsection-anchors. With
-fno-section-anchors even -O3 works fine. Interestingly -fsection-anchors is
enabled by default on ARM, but not on x86. Probably this is not even an ARM
specific bug. I'll recompile phobos with -fsection-anchors on x86 to see what
happens there.

Right, turning off flag_section_anchors is the workaround. The next step would
be to bastardise the gcx module into a simple program to showcase an example of
what gets affected by -fsection-anchors (assuming it's just the one problem
that propagates the issue).

Johannes Pfau - 2011-09-27
******************************************
I still wasn't able to reduce gcx.d, but I stepped through the asm code and
found the following: The exact error changes a lot depending on the compiler
flags and gdc version. In this case, findBin returned 0 instead of 3, which
caused the memset in mallocNoSync to fail: memset(p + size, 0, binsize[bin] -
size) evaluated to binsize[0] - 88 = 16-88 so it passed a negative size to
memset.

This is the correct address & values for binTable in the findBin function:

(gdb) info address _D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g
Symbol "_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g" is at 0x59110 in a file
compiled without debugging.

(gdb) x/88db  0x59110

0x59110 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g>:    0    0    0    0    0  
 0    0    0
0x59118 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+8>:    0    0    0    0    0
   0    0    0
0x59120 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+16>:    0    1    1    1   
1    1    1    1
0x59128 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+24>:    1    1    1    1   
1    1    1    1
0x59130 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+32>:    1    2    2    2   
2    2    2    2
0x59138 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+40>:    2    2    2    2   
2    2    2    2
0x59140 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+48>:    2    2    2    2   
2    2    2    2
0x59148 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+56>:    2    2    2    2   
2    2    2    2
0x59150 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+64>:    2    3    3    3   
3    3    3    3
0x59158 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+72>:    3    3    3    3   
3    3    3    3
---Type <return> to continue, or q <return> to quit---
0x59160 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+80>:    3    3    3    3   
3    3    3    3

And this is the findBin function:

(gdb) disas _D2gc3gcx3Gcx7findBinFkZh
Dump of assembler code for function _D2gc3gcx3Gcx7findBinFkZh:
   0x0001b904 <+0>:    cmp    r0, #2048    ; 0x800; size <= 2048
   //if size <= 2048 load the word at <_D2gc3gcx3Gcx7findBinFkZh+20> into r3
   0x0001b908 <+4>:    ldrls    r3, [pc, #8]    ; 0x1b918
<_D2gc3gcx3Gcx7findBinFkZh+20>
   //if not, move 8(B_PAGE) into r0(return value register)
   0x0001b90c <+8>:    movhi    r0, #8
   //Load value at address r3+r0 into r0; r0 = binTable[size]
   0x0001b910 <+12>:    ldrbls r0, [r3, r0]
   //return from function
   0x0001b914 <+16>:    bx    lr
   //not an instruction, this is the base address of binTable
   0x0001b918 <+20>:    muleq    r5, r0, r0
End of assembler dump.

Let's have a look at the base address for binTable:

(gdb) x/xw 0x0001b918
0x1b918 <_D2gc3gcx3Gcx7findBinFkZh+20>:    0x00059090

The address is 128 bytes off! And this is where the 0 returned by findBin comes
from:

(gdb) x/88db  0x00059090
0x59090:    0    0    0    0    0    0    0    0
0x59098:    0    0    0    0    0    0    0    0
0x590a0 <_D2gc3gcx10notbinsizeyG12k>:    -16    -1    -1    -1    -32    -1   
-1    -1
0x590a8 <_D2gc3gcx10notbinsizeyG12k+8>:    -64    -1    -1    -1    -128    -1 
  -1    -1
0x590b0 <_D2gc3gcx10notbinsizeyG12k+16>:    0    -1    -1    -1    0-2    -1   
-1
0x590b8 <_D2gc3gcx10notbinsizeyG12k+24>:    0    -4    -1    -1    0-8    -1   
-1
0x590c0 <_D2gc3gcx10notbinsizeyG12k+32>:    0    -16    -1    -1    00    0   
0
0x590c8 <_D2gc3gcx10notbinsizeyG12k+40>:    0    0    0    0    00    0    0
0x590d0:    0    0    0    0    0    0    0    0
0x590d8:    0    0    0    0    0    0    0    0
0x590e0:    0    0    0    0    0    0    0    0

Larger view of the memory at 0x00059090

(gdb) x/216db  0x00059090
0x59090:    0    0    0    0    0    0    0    0
0x59098:    0    0    0    0    0    0    0    0
0x590a0 <_D2gc3gcx10notbinsizeyG12k>:    -16    -1    -1    -1    -32    -1   
-1    -1
0x590a8 <_D2gc3gcx10notbinsizeyG12k+8>:    -64    -1    -1    -1    -128    -1 
  -1    -1
0x590b0 <_D2gc3gcx10notbinsizeyG12k+16>:    0    -1    -1    -1    0 -2    -1  
 -1
0x590b8 <_D2gc3gcx10notbinsizeyG12k+24>:    0    -4    -1    -1    0 -8    -1  
 -1
0x590c0 <_D2gc3gcx10notbinsizeyG12k+32>:    0    -16    -1    -1    0 0    0   
0
0x590c8 <_D2gc3gcx10notbinsizeyG12k+40>:    0    0    0    0    0 0    0    0
0x590d0:    0    0    0    0    0    0    0    0
0x590d8:    0    0    0    0    0    0    0    0
0x590e0:    0    0    0    0    0    0    0    0
0x590e8:    0    0    0    0    0    0    0    0
0x590f0:    0    0    0    0    0    0    0    0
0x590f8:    0    0    0    0    0    0    0    0
0x59100:    0    0    0    0    0    0    0    0
---Type <return> to continue, or q <return> to quit---
0x59108:    0    0    0    0    0    0    0    0
0x59110 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g>:    0    0    0    0 0    0
   0    0
0x59118 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+8>:    0    0    0    0 0   
0    0    0
0x59120 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+16>:    0    1    1    1 1  
 1    1    1
0x59128 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+24>:    1    1    1    1 1  
 1    1    1
0x59130 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+32>:    1    2    2    2 2  
 2    2    2
0x59138 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+40>:    2    2    2    2 2  
 2    2    2
0x59140 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+48>:    2    2    2    2 2  
 2    2    2
0x59148 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+56>:    2    2    2    2 2  
 2    2    2
0x59150 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+64>:    2    3    3    3 3  
 3    3    3
0x59158 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+72>:    3    3    3    3 3  
 3    3    3
---Type <return> to continue, or q <return> to quit---
0x59160 <_D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g+80>:    3    3    3    3 3  
 3    3    3

Let's also have a look how relocation affects this whole thing:

objdump -x
GDC/gdc/dev/gcc-4.6.1/objdir/armv7l-unknown-linux-gnueabi/libphobos/gc/gcx.o
SYMBOL TABLE:
000000e0 g     O .rodata    00000801 _D2gc3gcx3Gcx7findBinFkZh8binTablexG2049g

RELOCATION RECORDS FOR [.text]:
00000c08 R_ARM_ABS32       .rodata

and in gcx.o:

Dump of assembler code for function _D2gc3gcx3Gcx7findBinFkZh:
   0x00000bf4 <+0>:    cmp    r0, #2048    ; 0x800
   0x00000bf8 <+4>:    ldrls    r3, [pc, #8]    ; 0xc08
<_D2gc3gcx3Gcx7findBinFkZh+20>
   0x00000bfc <+8>:    movhi    r0, #8
   0x00000c00 <+12>:    ldrbls    r0, [r3, r0]
   0x00000c04 <+16>:    bx    lr
   0x00000c08 <+20>:    andeq    r0, r0, r0, rrx
End of assembler dump.
(gdb) x/x 0x00000c08
0xc08 <_D2gc3gcx3Gcx7findBinFkZh+20>:    0x00000060

binTable is at offset 0x000000e0 --> 224 The address in the literal pool is
0x00000060 --> 96 So relocation doesn't change anything, the address is already
off by 128 before relocation.

Iain do you have a clue what could cause the wrong address? If not, I'll try to
write a script for dustmite and let dustmite reduce that thing.


Johannes Pfau - 2011-10-04
******************************************
* assigned issue to Iain Buclaw

OK, I think I tracked this thing down, but I'd be very grateful if someone else
could write the gdc patch ;-)

This is the problematic declaration in gcx.d:

immutable uint binsize[B_MAX] = [ 16,32,64,128,256,512,1024,2048,4096 ];

What's special about this declaration? It's incomplete: B_MAX is 12, but the
array literal only has 9 values. AFAICS gdc currently only passes a constructor
with the 9 values to the backend and assumes that gcc adds the additional
zeros. Long story short: it doesn't (correctly) and the zero padding should be
added in the frontend.

But what exactly happens in the backend? This code is from varasm.c function
"output_constructor_regular_field":

    fieldpos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (local->val)), 1)
        * ((tree_low_cst (local->index, 0)
            - tree_low_cst (local->min_index, 0))));

it calculates field positions for array members. tree_low_cst (TYPE_SIZE_UNIT
(TREE_TYPE (local->val)), 1) is the size of the elements, ((tree_low_cst
(local->index, 0) is the index in the array. This works fine for the first 9
entries in our example. But, for some reason, the backend(or maybe the
frontend, I'm not sure where the padding is added) added the 12 bytes final
padding as one tree/element. This means, tree_low_cst (TYPE_SIZE_UNIT
(TREE_TYPE (local->val)), 1) is 12 in this case and the calculation calculates
12*9=108 instead of 4*9=36. GCC detects that there's a gap between the last and
the current offset and fills it with 72 zeros.

AFAICS this should affect all architectures. What makes it catastrophic on ARM
are section anchors: Section anchors refer to the arrays relative to the
.rodata base address. But the section anchor code uses a different code path to
calculate the offset, and ignores the zero padding added earlier. As a result,
data is loaded from wrong offsets. (Although, technically, the offsets are
correct, the .rodata is actually wrong)

What needs to be done in the frontend then is this: For incomplete arrays, add
the zero padding manually, so that the constructor is complete. The padding
must be added as single elements of the array element size. It has to pass the
same tree to the backend as [ 16,32,64,128,256,512,1024,2048,4096, 0, 0, 0 ]
would.

Iain Buclaw - 2011-10-05
******************************************
* attached issue120.patch

Patch should fix the issue. Can you test?

Regards


Johannes Pfau - 2011-10-05
******************************************
Yep, I can confirm this patch is working. The .rodata segment is fine now and
the crash is gone :-)

However, there still is a problem with section anchors, we may have missed a
case somewhere:

...
_moduleinfo_array: 71:0x8ea0c
_moduleinfo_array: 72:0x8e79c
_moduleinfo_array: 73:0x4           <---------------------------------
_moduleinfo_array: 74:0x8e530

That moduleinfo belongs to core.runtime. If core-runtime is compiled with
-fno-section-anchors, a hello world works. It's caused by incorrect relocations
again. I think the issue is caused by this symbol:
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7ClassZ

The length of that entry in the .data section is set to 76, but for some reason
108 bytes are output for this symbol.

_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ:
    .word    _D14TypeInfo_Class6__vtblZ
    .word    0
    .word    4120
    .word   
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__initZ
    .word    49
    .word    .LC1
    .word    8
    .word   
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__vtblZ
    .word    1
    .word   
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ+76
    .word    _D6Object7__ClassZ
    .word   
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__dtorMFZv
    .word    0
    .word    60
    .word    0
    .word    0
    .word    0
    .word   
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__ctorMFZC4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo
    .word    0
    .word    _D6object9Throwable9TraceInfo11__InterfaceZ
    .word    4
    .word   
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ+92
    .word    4116
    .word   
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ+76
    .word    ___t.0.1431
    .word    ___t.1.1432
    .word    ___t.2.1433

It doesn't happen for other ClassZ though. Any idea what could cause this?

-- 
Configure bugmail: http://bugzilla.gdcproject.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching all bug changes.


More information about the D.gnu mailing list