This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Built gcc 4.7.0 on OpenBSD x86_64


Following the recommendations on, I'm reporting my success at building gcc 4.7.0 on amd64-unknown-openbsd4.8 because this platform is not listed in My build is only "mostly" successful; I encountered and worked around several problems which I detail below. Help and suggestions are welcome.

Here's gcc -v:
Using built-in specs.
Target: x86_64-unknown-openbsd4.8
Configured with: ../gcc/configure --program-suffix=-4.7.0 --enable-threads --disable-werror
Thread model: posix
gcc version 4.7.0 (GCC)

I have been unable so far to secure a release from my employer to contribute patches to GCC. So I'll just describe what I did as a reference for others.

I configured with --disable-werror because on earlier releases of GCC I had trouble with the definition of NULL and functions expecting a sentinel. The switch is the easiest workaround, but might not be necessary anymore.

I ran into two problems that have open PRs:

The first problem can be worked around most easily by killing the hung process. I do not have a "good" workaround for the second problem -- I bypassed the ICE by disabling some code in gcc/dwarf2cfi.c, which hobbles my ability to use a debugger. See my diffs below.

On my platform I have an issue building libiberty. In libiberty/stack-limit.c I need to #include <sys/time.h> immediately before <sys/resource.h>. I have also built GDB 7.4, which also uses libiberty, and it needs the identical workaround.

While building GCC this command is eventually executed, and hangs on my system:
./gcj-dbtool -n classmap.db || touch classmap.db
The command itself was a sufficient hint that this is optional. If I kill the hung gcj-dbtool process, everything continues nicely.

Later, I get an error compiling ../../../gcc/boehm-gc/misc.c with a suggestive error message:
In file included from /usr/include/xmmintrin.h:39:0,
from /usr/include/emmintrin.h:34,
from ../../../gcc/libitm/config/x86/target.h:77,
from ../../../gcc/libitm/libitm_i.h:82,
from ../../../gcc/libitm/
/usr/include/mmintrin.h: In function '__m64 _mm_add_si64(__m64, __m64)':
/usr/include/mmintrin.h:312:72: error: cannot convert 'long long int' to '__vector(1) long long int' for argument '1' to '__vector(1) long long int __builtin_ia32_paddq(__vector(1) long long int, __vector(1) long long int)'

Those header files should come from gcc/config/i386, not from /usr/include. If I symlink gcc/config/i386/*intrin.h into the build directory (obj/x86_64-unknown-openbsd4.8/libitm) and retry, it works. This may point to a bug in makefile generation that goes unnoticed on other platforms where the /usr/include headers and the gcc/config/i386 headers match.

The resulting compiler works. The only trouble I've noticed so far is with std::thread. Any attempt to create a std::thread throws a std::system_error. I haven't been able to figure out what's wrong because the debugger doesn't work very well after my edit to gcc/dwarf2cfi.c.

Here are my diffs. I do not warrant that any of these are correct, but they work well enough for me that I can make undebuggable single-threaded programs.

Index: boehm-gc/include/private/gcconfig.h
--- boehm-gc/include/private/gcconfig.h (revision 185724)
+++ boehm-gc/include/private/gcconfig.h (working copy)
@@ -330,6 +330,11 @@
 #   define OPENBSD
 #   define mach_type_known
 # endif
+# if defined(__OpenBSD__) && (defined(__x86_64__))
+#   define X86_64
+#   define OPENBSD
+#   define mach_type_known
+# endif
 # if defined(FREEBSD) && (defined(i386) || defined(__i386__))
 #   define I386
 #   define mach_type_known
@@ -2065,6 +2070,12 @@
        extern char etext[];
 #      define SEARCH_FOR_DATA_START
 #   endif
+#   ifdef OPENBSD
+#      define OS_TYPE "OPENBSD"
+#      define HEURISTIC2
+       extern char etext[];
+#      define DATASTART ((ptr_t)(etext))
+#   endif
 #   ifdef SUNOS5
 #      define ELF_CLASS ELFCLASS64
 #      define OS_TYPE "SUNOS5"
Index: libiberty/stack-limit.c
--- libiberty/stack-limit.c     (revision 185724)
+++ libiberty/stack-limit.c     (working copy)
@@ -39,6 +39,7 @@
 #include <stdint.h>
+#include <sys/time.h>
 #include <sys/resource.h>

Index: libgcc/
--- libgcc/ (revision 185724)
+++ libgcc/ (working copy)
@@ -538,6 +538,8 @@
+ ;;
extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules"
Index: gcc/dwarf2cfi.c
--- gcc/dwarf2cfi.c (revision 185724)
+++ gcc/dwarf2cfi.c (working copy)
@@ -2904,9 +2904,11 @@
create_pseudo_cfg ();

   /* Do the work.  */
   create_cfi_notes ();
   connect_traces ();
   add_cfis_to_fde ();

/* Free all the data we allocated. */
Index: gcc/config.gcc
--- gcc/config.gcc (revision 185724)
+++ gcc/config.gcc (working copy)
@@ -1225,6 +1225,13 @@
+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h"
+ tm_file="${tm_file} openbsd.h openbsd-stdint.h openbsd-libpthread.h i386/openbsdelf.h"
+ extra_options="${extra_options} openbsd.opt"
+ gas=yes
+ gnu_ld=yes
+ ;;
i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu | i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu)
# Intel 80386's running GNU/*
# with ELF format using glibc 2

Kyle Markley

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]