Bug #20447
closedRuby 3.3.1 broken on i686 due to "incompatible pointer type" error
Description
gcc -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -march=i686 -mtune=generic -msse2 -mfpmath=sse -mstackrealign -fasynchronous-unwind-tables -fstack-clash-protection -fPIC -m32 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -fvisibility=hidden -fexcess-precision=standard -DRUBY_EXPORT -I. -I.ext/include/i386-linux -I/builddir/build/BUILD/ruby-3.3.1/include -I/builddir/build/BUILD/ruby-3.3.1 -I/builddir/build/BUILD/ruby-3.3.1/prism -I/builddir/build/BUILD/ruby-3.3.1/enc/unicode/15.0.0 -o time.o -c /builddir/build/BUILD/ruby-3.3.1/time.c
make: Leaving directory '/builddir/build/BUILD/ruby-3.3.1/redhat-linux-build'
/builddir/build/BUILD/ruby-3.3.1/time.c: In function ‘zone_timelocal’:
/builddir/build/BUILD/ruby-3.3.1/time.c:2345:35: error: passing argument 3 of ‘split_second’ from incompatible pointer type [-Wincompatible-pointer-types]
2345 | split_second(tobj->timew, &t, &s);
| ^~
| |
| wideval_t * {aka long long unsigned int *}
/builddir/build/BUILD/ruby-3.3.1/time.c:616:58: note: expected ‘VALUE *’ {aka ‘long unsigned int *’} but argument is of type ‘wideval_t *’ {aka ‘long long unsigned int *’}
616 | split_second(wideval_t timew, wideval_t *timew_p, VALUE *subsecx_p)
| ~~~~~~~^~~~~~~~~
make: *** [Makefile:447: time.o] Error 1
make: *** Waiting for unfinished jobs....
make: Entering directory '/builddir/build/BUILD/ruby-3.3.1/redhat-linux-build'
This is presumably due to #20327 / https://github.com/ruby/ruby/pull/10332. There seems to be medicine in master git|055613fd868a8c94e43893f8c58a00cdd2a81f6d or maybe the whole https://github.com/ruby/ruby/pull/10332, not sure
Updated by vo.x (Vit Ondruch) 7 months ago
- Subject changed from Ruby 3.3.1 broken on i686 to Ruby 3.3.1 broken on i686 due to "incompatible pointer type" error
Updated by hsbt (Hiroshi SHIBATA) 7 months ago
Unfortunately, we no longer test with i686 arch. Because AWS that is our main test infrastructure didn't provide i686 VMs.
Updated by vo.x (Vit Ondruch) 7 months ago
i686 container or just 32bit user space could do the job. @jaruga (Jun Aruga) any chance you would have cycles to look at that?
Updated by jaruga (Jun Aruga) 7 months ago
I tried several ways to reproduce this issue on Fedora rawhide i686 environment.
Containers¶
First, I don't find the Fedora rawhide i686 container. I couldn't find the i686 container image on the following Fedora's container registries.
- https://registry.fedoraproject.org/repo/fedora/tags/
- https://quay.io/repository/fedora/fedora?tab=tags
- https://hub.docker.com/_/fedora/tags
The following command showing the CPU architecture meta data doesn't include i686 container.
$ skopeo inspect --raw docker://registry.fedoraproject.org/fedora:rawhide | jq
Mock¶
I tried the mock, Fedora's building software.
https://rpm-software-management.github.io/mock/Release-Notes-3.5
The following command to emulate the i686 environment on QEMU didn't work.
$ mock -r fedora-rawhide-i386 --forcearch=i386 *.rpm
setarch¶
I tried setarch i686
on Fedora rawhide x86_64 environment.
$ cat /etc/fedora-release
Fedora release 41 (Rawhide)
$ rpm -q gcc
gcc-14.0.1-0.15.fc41.x86_64
$ gcc --version
gcc (GCC) 14.0.1 20240411 (Red Hat 14.0.1-0)
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
I tried the following commands. But I got the errors. I am not sure why the errors happened.
$ git checkout v3_3_1
$ setarch i686 ./autogen.sh
$ setarch i686 ./configure warnflags="-Wall -Wincompatible-pointer-types"
...
* arch: i686-linux
...
* with coroutine: x86
...
* warnflags: -Wall -Wincompatible-pointer-types
$ setarch i686 make 2>&1 | tee make.log
...
coroutine/x86/Context.S: Assembler messages:
coroutine/x86/Context.S:17: Error: invalid instruction suffix for `push'
coroutine/x86/Context.S:18: Error: invalid instruction suffix for `push'
coroutine/x86/Context.S:19: Error: invalid instruction suffix for `push'
coroutine/x86/Context.S:20: Error: invalid instruction suffix for `push'
coroutine/x86/Context.S:29: Error: invalid instruction suffix for `pop'
coroutine/x86/Context.S:30: Error: invalid instruction suffix for `pop'
coroutine/x86/Context.S:31: Error: invalid instruction suffix for `pop'
coroutine/x86/Context.S:32: Error: invalid instruction suffix for `pop'
make: *** [Makefile:452: coroutine/x86/Context.o] Error 1
Updated by vo.x (Vit Ondruch) 7 months ago
jaruga (Jun Aruga) wrote in #note-4:
Mock¶
I tried the mock, Fedora's building software.
https://rpm-software-management.github.io/mock/Release-Notes-3.5The following command to emulate the i686 environment on QEMU didn't work.
$ mock -r fedora-rawhide-i386 --forcearch=i386 *.rpm
No emulation is needed. $ mock -r fedora-rawhide-i386 *.rpm
is enough.
Updated by vo.x (Vit Ondruch) 7 months ago
And it should also be reproducible on local environment, having 32bit user space libraries installed. And the same applies for container. Having x86_64 container with 32bit userspace libraries should be fine. You just need to use ./configure --target=i686
I believe (but I'm not expert).
Updated by satadru (Satadru Pramanik) 6 months ago
This is presumably due to #20327 / https://github.com/ruby/ruby/pull/10332. There seems to be medicine in master git|055613fd868a8c94e43893f8c58a00cdd2a81f6d or maybe the whole https://github.com/ruby/ruby/pull/10332, not sure
For what it is worth, applying https://github.com/ruby/ruby/pull/10332.patch to Ruby 3.3.2 appears to fix building Ruby 3.3.2 on the 32-bit armv7l and i686 architectures...
Updated by k0kubun (Takashi Kokubun) 6 months ago · Edited
- Status changed from Open to Closed
- Backport changed from 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN to 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: REQUIRED
If you want to fix something in Ruby 3.3, i.e. backport something from master to ruby_3_3, please consider filing a ticket as a backport request. It’s documented here https://github.com/ruby/ruby/wiki/How-To-Request-Backport#backport-custom-field. You need to set Backport 3.3: REQUIRED
to make it to our backport task list. Ideally you should also close the ticket to signal that it has been already fixed in master and ready for backports.
Anyway, I’ll see if I can backport PR 10332.
Updated by k0kubun (Takashi Kokubun) 6 months ago
- Backport changed from 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: REQUIRED to 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: DONE
Updated by k0kubun (Takashi Kokubun) 6 months ago
Can you test ruby_3_3
branch (at b13cf49036f0a454063cde25807785adc00f8995) now?
Updated by vo.x (Vit Ondruch) 5 months ago
k0kubun (Takashi Kokubun) wrote in #note-10:
Can you test
ruby_3_3
branch (at b13cf49036f0a454063cde25807785adc00f8995) now?
Sorry, you probably wanted earlier feedback. But I can confirm that 3.3.4 build just fine on Fedora i686:
https://src.fedoraproject.org/rpms/ruby/pull-request/178
https://koji.fedoraproject.org/koji/buildinfo?buildID=2484934