GDC 11.3/12.1 -m32: Illegal instruction (core dumped) [SSE, Pentium III]

kdevel kdevel at vogtner.de
Fri May 13 03:33:24 UTC 2022


After I encountered illegal instruction signals whith 
dmd-generated code [1] I eventually bootstrapped GDC 11.3 and 
12.1. Unfortunately the problem persists. A statically linked 
program receives SIGILL, as gdb says this happens here:

```
(gdb) bt
#0  0x080b7e8a in rt.minfo.ModuleGroup.__ctor() ()
#1  0x080b0095 in _d_dso_registry ()
#2  0x0805dbdc in gdc.dso_ctor ()
#3  0x08103290 in __libc_csu_init ()
#4  0x08102d34 in __libc_start_main ()
#5  0x0804c51d in _start ()
(gdb) disass
Dump of assembler code for function 
_D2rt5minfo11ModuleGroup6__ctorMFNbNcNiAyPS6object10ModuleInfoZSQCkQCkQCh:
    0x080b7e80 <+0>:	mov    0x4(%esp),%eax
    0x080b7e84 <+4>:	movq   0x8(%esp),%xmm0
=> 0x080b7e8a <+10>:	movq   %xmm0,(%eax)
    0x080b7e8e <+14>:	ret
```

I have checked the build log: The D runtime has been compiled 
with `-m32`. According to GCC's documentation [2] the option 
`-m32` means “The -m32 option [...] generates code that runs on 
any i386 system.” Obviously this is not the case:

```
module structtest;

struct MyStruct {
    int [] i;
    this (int [] i)
    {
       this.i = i;
    }
}
```

compiling with `gdc -m32 -O2 -c` and inspecting the generated 
code with `objdump` gives this:

```
[...]
Disassembly of section .text.ref structtest.MyStruct 
structtest.MyStruct.__ctor(int[]):

00000000 <ref structtest.MyStruct 
structtest.MyStruct.__ctor(int[])>:
    0:   8b 44 24 04             mov    0x4(%esp),%eax
    4:   f3 0f 7e 44 24 08       movq   0x8(%esp),%xmm0
    a:   66 0f d6 00             movq   %xmm0,(%eax)
    e:   c3                      ret
[...]
```

Compiling with `gdc -m32 -march=pentium3 -O2 -c` generated the 
expected code:
```
00000080 <ref structtest.MyStruct 
structtest.MyStruct.__ctor(int[])>:
   80:   8b 44 24 04             mov    0x4(%esp),%eax
   84:   8b 54 24 08             mov    0x8(%esp),%edx
   88:   8b 4c 24 0c             mov    0xc(%esp),%ecx
   8c:   89 10                   mov    %edx,(%eax)
   8e:   89 48 04                mov    %ecx,0x4(%eax)
   91:   c3                      ret
```

But this does of course not change the code which is already 
compiled into  libgphobos.a ...

[1] 
http://forum.dlang.org/thread/suwlbzlgqdylfauwgteu@forum.dlang.org
DMD 2.090.1: SIGILL, Illegal instruction on (ahem) intel Pentium 
III
[2] https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html


More information about the Digitalmars-d mailing list