HACKS revision 1.3
1# $NetBSD: HACKS,v 1.3 2003/04/06 10:12:20 jdc Exp $ 2# 3# This file is intended to document workarounds for currently unsolved 4# (mostly) compiler bugs. 5# 6# Format: 7# hack title 8# cdate creation date 9# mdate mod date 10# who responsible developer 11# port ... 12# affected ports, space separated, if not "all" 13# file affected file : revision : line from : line to 14# affected files and revision and line numbers describing hack 15# multiple lines if necessary. 16# pr NNNN ... 17# problem reports this hack works around, if known. Space 18# separated. 19# regress src/regress/directory/where/test/found 20# regression test directories, if available. 21# descr 22# insert short informal description (multi-line). (Longer ones 23# should be in the PR database. More formal descriptions might 24# be in the regress tree. See above). 25# kcah 26# closing bracket. 27# 28# this is a comment. 29 30hack gcc 2.95/vax cannot handle __builtin_ffs() 31cdate Fri Aug 23 21:31:15 CEST 2002 32who ragge 33port vax 34file sys/lib/libkern/libkern.h : 1.42 35descr 36 __builtin_ffs() is ifdef'd away if __vax__. Matt Thomas has added 37 this feature to GCC 3 so it can be removed when switching. 38kcah 39 40hack gcc 2.95.3 -O2 bug 41cdate Sun Jan 6 23:17:28 UTC 2002 42who lukem 43port alpha 44file sbin/newfs/mkfs.c : (all?) 45pr 15156 46descr 47 newfs built with gcc -O2 dumps core part-way through. 48 using -O1 avoids the problem 49kcah 50 51hack binutil-2.11-sparc64-pltrela 52mdate 14 Aug 2001 53who eeh 54port sparc64 55file libexec/ld.elf_so/reloc.c: 1.41 : 597 : 619 56descr 57 The first for PLT entries are reserved. There is some disagreement 58 whether they should have associated relocation entries. Both the 59 SPARC 32-bit and 64-bit ELF specifications say that they should have 60 relocation entries, but the 32-bit SPARC binutils do not generate 61 them, and now the 64-bit SPARC binutils have stopped generating them 62 too. 63 64 To provide binary compatibility, we will check the first entry, if it 65 is reserved it should not be of the type JMP_SLOT. If it is JMP_SLOT, 66 then the 4 reserved entries were not generated and our index is 4 67 entries too far, so we frob the rela pointer. 68kcah 69 70hack gcc-arm32-schedule 71mdate 04 May 2000 72who is 73file lib/libc/stdlib/strtoull.c : 1.3 : 78 : 81 74file lib/libc/stdlib/strtouq.c : 1.15 : 73 : 76 75pr 9613 76descr 77 strtoull() was returning a wrong result for small numbers with bit 31 78 set. This is a gcc/arm32 compiler bug in gcc < 2.95.2. Adding 79 (void)&acc; works around it. 80kcah 81 82hack gcc-sparc64-memorysize 83mdate 17 Sep 2000 84who mrg 85port sparc64 86file lib/libc/hash/sha1.c : 1.6 : 78 : 129 : 162 : 189 87file sys/lib/libkern/sha1.c : 1.6 : 78 : 129 : 162 : 189 88file usr.sbin/bind/lib/Makefile : 1.14 : 87 : 91 89descr 90 the normal SHA1Transform() function causes the sparc64 compiler to 91 use excessive amounts of memory attempting to optimise this function. 92 using no optimisation allows the function to build. this hack 93 splits the mathematical functions inside SHA1Transform() into 4 94 separate functions, which avoids the optimiser explosion. 95kcah 96 97hack gcc-sparc64-double-arguments 98mdate 18 Sep 2000 99who mrg 100port sparc64 101file xsrc/xc/lib/fonts/Type1/type1.c : 1.2 : 1461 : 1507 : 1702 : 1709 102descr 103 in passing 17 "double" arguments to a function, gcc incorrectly tries 104 to use a register that doesn't exist, causing an internal error. this 105 hack changes the way arguments are passed to the function, such that 106 a pointer to a "double" (really an array) is passed, and the old 107 arguments are assigned within the function. 108kcah 109 110hack gcc-sparc64-gawk 111mdate 28 Oct 2000 112who mrg 113port sparc64 114file gnu/usr.bin/gawk/Makefile : 1.11 : 21 : 24 115descr 116 gcc fails to build gawk properly, due to double floating point bugs. 117 this simple test program will fail to print ``ab'': 118 BEGIN { f = "abc"; print substr(f, 1, 2); exit } 119 the work around is simple: use -msoft-quad-float. 120kcah 121 122hack gcc-sparc64-libgcc 123mdate 01 Dec 2001 124who jmc 125port sparc64 126file gnu/lib/libgcc/Makefile : 1.29 : 24 : 27 127descr 128 gcc fails to do double -> int conversions correctly without 129 soft-quad-float. Add it in there for the internal conversion 130 routines. This appears to be more than likely emulations bugs than 131 compiler bugs as the assembly looks correct on the surface. 132 133kcah 134 135hack gcc-sparc64-iostat-systat 136mdate 04 Feb 2001 137who mrg 138port sparc64 139file usr.sbin/iostat/Makefile : 1.17 : 7 : 10 140file usr.bin/systat/Makefile : 1.23 : 6 : 9 141descr 142 gcc fails to build iostat properly, due to double floating point bugs. 143 results will include "Inf" and other garbage. 144 the work around is simple: use -msoft-quad-float. 145kcah 146 147hack gcc-sparc64-nawk 148mdate 25 Oct 2001 149who martin 150port sparc64 151file usr.bin/awk/Makefile : 1.3 : 13 : 15 152descr 153 Don't use long double on sparc64. 154kcah 155 156hack gcc-sparc64-ntp 157mdate 12 Nov 2000 158who martin 159port sparc64 160file usr.sbin/ntp/Makefile.inc : 1.5 : 17 : 19 161descr 162 gcc fails to build ntpd properly, due to double floating point bugs. 163 Ntpd will fail to decode incoming packets; ntpdc -s will report 164 a delay, offset and dispersion of 0.0000 for all peers. 165 the work around is simple: use -msoft-quad-float. 166kcah 167 168hack gcc-sparc64-x_dhclient 169mdate 27 Dec 2000 170who mrg 171port sparc64 172file distrib/utils/x_dhclient/Makefile : 1.6 : 28 : 30 173descr 174 gcc fails with an ICE while building dhclient's parse.c with -O2 175 and -Os. the work around is simple: don't use -Os. 176kcah 177 178hack lint-no-long-double 179mdate 17 Aug 2001 180who eeh 181port sparc64 182file usr.bin/xlint/lint1/param.h: 1.14 : 183descr 184 Don't use long double on sparc64. 185kcah 186 187hack netstat ieee1394 address printing. 188mdate 14 Nov 2000 189who matt 190file lib/libc/net/getnameinfo.c : 1.32 : 497 : 503 191descr 192 Because the current implementation of IP over IEEE1394, the 193 fw device address contains more than just the IEEE1394 EUI-64. 194 So when printing out IEEE1394 addresses, ignore the extra stuff. 195kcah 196 197hack xterm vs. libterm 198mdate 01 Aug 2000 199who jdc 200file xsrc/xc/programs/xterm/main.c : 1.2 : 3609 : 3614 201pr 10383 202descr 203 In order to extend the termcap string over 1023 bytes, a ZZ entry was 204 introduced to point to a memory location containing the full entry. 205 Without this hack, xterm will export a termcap containing the ZZ 206 entry, which will then be ignored by libterm. As xterm modifies the 207 exported termcap, this would cause those modifications to be ignored. 208kcah 209 210hack gcc-3-libtelnet 211mdate 29 Jan 2002 212who thorpej 213file lib/libtelnet/Makefile : 1.14 : 14 : 17 214descr 215 GCC 3.x issues a spurious warning when compiling a Duff's Device 216 with optimization, even though it compiles the file correctly. 217 GCC PR optimization/5230. kerberos.c contains a Duff's Device 218 in the checksum routine. Hack is to build libtelnet w/o optimization 219 if HAVE_GCC3 is set. 220kcah 221 222hack gcc-sh3-sed 223mdate 23 Apr 2002 224who thorpej 225file usr.bin/sed/Makefile : 1.9 : 9 : 13 226descr 227 The in-tree GCC 2.95.3-based compiler ICEs when building 228 with optimization for SuperH. Hack is to biuld with -O0. 229kcah 230 231hack gcc-unsigned-compare 232cdate 09 Mar 2002 233mdate 18 Mar 2002 234who bjh21 235port arm 236file dist/bind/lib/nameser/ns_parse.c : 1.3 237file dist/dhcp/minires/ns_parse.c : 1.3 238file dist/dhcp/omapip/result.c : 1.2 239file dist/dhcp/server/failover.c : 1.3 240file gnu/dist/gawk/eval.c : 1.4 241file gnu/dist/toolchain/bfd/bfd.c : 1.2 242file gnu/dist/toolchain/bfd/format.c : 1.2 243file gnu/dist/toolchain/gdb/target.c : 1.2 244file sys/kern/vfs_subr.c : 1.172 245descr When checking that a potentially-unsigned enum is >= 0, assign it 246 to an int first. This is necessary to avoid "comparison is always 247 true" warnings with -fshort-enums. Casting to an int really should 248 be enough, but turns out not to be. 249kcah 250 251hack wi-at-big-endian-bus 252cdate 15 Mar 2002 253who martin 254file dev/ic/wireg.h 255descr Add an option to access the underlying bus in big endian byte order 256 to work around deficiencies in bus_space_{read,write}_* macros. 257 Those don't allow the implementation of a proper pcmcia bus space 258 tag. 259kcah 260 261hack gcc 2.95.3 -O2 (-fgcse) bug 262cdate Sun May 5 18:36:04 UTC 2002 263who tsutsui 264port macppc 265file sys/arch/macppc/dev/adb_direct.c: 1.24 : 1895 : 1896 266pr 16678 267descr 268 gcc-2.95.3 does generates wrong code on optimization 269 by gcc -O2 (-fgcse), and adb_read_date_time() returns 270 wrong value on cuda system. 271 A null asm statement has been added to avoid this for workaround. 272kcah 273 274hack gcc-vax-libbz2 275mdate 27 Jun 2002 276who thorpej 277port vax 278file lib/libbz2/Makefile 279descr 280 libbz2 is mis-compiled with optimization with GCC 2.95.3 281 on VAX. -O0 works around this problem. 282kcah 283 284hack egcs-pc532-ip6_mroute 285cdate 09 Jul 2002 286who simonb 287port pc532 288file sys/arch/pc532/conf/Makefile.pc532 : 1.70 289file sys/arch/pc532/conf/files.pc532 : 1.47 290descr 291 egcs 1.1.2 gets an "internal error--insn does not satisfy its 292 constraints" error compiling ip6_mroute.c with -O2 or greater. 293 -O1 works around this problem. 294kcah 295 296hack SuperH SH5 Toolchain Bugs 297cdate 11 Jul 2002 298who scw 299port sh5 300file usr.sbin/ndbootd/ndbootd.c : 1.6 301file usr.sbin/traceroute/traceroute.c : 1.48 302descr 303 The SuperH SH5 toolchain (2.97-sh5-010522) gets an internal 304 compiler error when assigning a bit-wise inverted value 305 under some circumstances. 306 Work around it by splitting the statement into two. 307kcah 308 309hack vax Toolchain bug 310cdate 28 Mar 2003 311who he 312port vax 313file sys/arch/vax/vax/intvec.S : 1.5 314descr 315 Workaround for PR toolchain/20924. The assembler apparently 316 tries to range-check byte offsets when it doesn't have 317 sufficient information to make that decision. 318 Workaround uses `brw' instead of `brb' instruction. 319kcah 320 321hack specific knowledge of colours in curses code 322cdate Sun Apr 6 11:05:24 BST 2003 323who jdc 324port all 325file lib/libcurses/color.c : r1.24 326descr 327 Swap red/blue and yellow/cyan colours for COLOR_OTHER. 328 Fix is to enhance libtermcap to understand terminfo-style % sequences. 329 See also: 330 http://mail-index.netbsd.org/tech-userlevel/2003/04/06/0000.html 331kcah 332