I have used gcc
for more than 10
years, but never met a bug
before. In my mind, the gcc
is one of the stable software in the world, but at yesterday, the myth ended.
I tried to use OpenMP to optimize my program, and all was OK until the taskloop
construct was added:
#pragma omp taskloop
The build flow terminated with the following errors:
xxxxxxx.cpp:142:1: internal compiler error: Segmentation fault
}
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://bugs.archlinux.org/> for instructions.
Whoops! It seemed I got the lucky draw! Since my project uses a lot of compile options:
... -g -O2 -fopenmp -fprofile-arcs -ftest-coverage ...
I must narrow down to find the root cause. Firstly, I only use -fopenmp
, then everything was OK; Secondly, adding -g -O2
, no problem; …. After combination trial, -fopenmp -fprofile-arcs
can cause the problem.
To confirm it, I wrote a simple program:
int main(void) {
#pragma omp taskloop
for (int i = 0; i < 2; i++) {
}
return 0;
}
Compile it:
# gcc -fopenmp -fprofile-arcs parallel.c
parallel.c:6:1: internal compiler error: Segmentation fault
}
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://bugs.archlinux.org/> for instructions.
Yeah, the bug was reproduced! It verified my assumption.
To bypass this issue, I decided to try the newest gcc
. My OS is ArchLinux
,and the gcc
version is 6.3.1
:
# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 6.3.1 20170306 (GCC)
Now ArchLinux
doesn’t provide gcc 7.1
installation package, so I need to download and build it myself:
# wget http://gcc.parentingamerica.com/releases/gcc-7.1.0/gcc-7.1.0.tar.gz
# tar xvf gcc-7.1.0.tar.gz
# cd gcc-7.1.0/
# mkdir build
# cd build
Select the configuration options is a headache task for me, and I decide to copy the current options for 6.3.1
(Please refer the above output from gcc -v
):
# ../configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info .....
Since I don’t need to compile ada
and lto
, I remove these from --enable-languages
:
--enable-languages=c,c++,fortran,go,objc,obj-c++
Besides this, I also need to build and install isl library myself or through ArchLinux
isl package. Once configuration is successful, I can build and install it:
# make
# make install
Check the newest gcc
:
# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/7.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,fortran,go,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 7.1.0 (GCC)
Compile the program again:
# gcc -fopenmp -fprofile-arcs parallel.c
#
This time compilation is successful!
P.S. The gcc
may have other bugs when supporting some new OpenMP
directives, so please pay attention to it.