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
30 hack gcc 2.95/vax cannot handle __builtin_ffs()
31 cdate Fri Aug 23 21:31:15 CEST 2002
32 who ragge
33 port vax
34 file sys/lib/libkern/libkern.h : 1.42
35 descr
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.
38 kcah
39
40 hack gcc 2.95.3 -O2 bug
41 cdate Sun Jan 6 23:17:28 UTC 2002
42 who lukem
43 port alpha
44 file sbin/newfs/mkfs.c : (all?)
45 pr 15156
46 descr
47 newfs built with gcc -O2 dumps core part-way through.
48 using -O1 avoids the problem
49 kcah
50
51 hack binutil-2.11-sparc64-pltrela
52 mdate 14 Aug 2001
53 who eeh
54 port sparc64
55 file libexec/ld.elf_so/reloc.c: 1.41 : 597 : 619
56 descr
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.
68 kcah
69
70 hack gcc-arm32-schedule
71 mdate 04 May 2000
72 who is
73 file lib/libc/stdlib/strtoull.c : 1.3 : 78 : 81
74 file lib/libc/stdlib/strtouq.c : 1.15 : 73 : 76
75 pr 9613
76 descr
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.
80 kcah
81
82 hack gcc-sparc64-memorysize
83 mdate 17 Sep 2000
84 who mrg
85 port sparc64
86 file lib/libc/hash/sha1.c : 1.6 : 78 : 129 : 162 : 189
87 file sys/lib/libkern/sha1.c : 1.6 : 78 : 129 : 162 : 189
88 file usr.sbin/bind/lib/Makefile : 1.14 : 87 : 91
89 descr
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.
95 kcah
96
97 hack gcc-sparc64-double-arguments
98 mdate 18 Sep 2000
99 who mrg
100 port sparc64
101 file xsrc/xc/lib/fonts/Type1/type1.c : 1.2 : 1461 : 1507 : 1702 : 1709
102 descr
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.
108 kcah
109
110 hack gcc-sparc64-gawk
111 mdate 28 Oct 2000
112 who mrg
113 port sparc64
114 file gnu/usr.bin/gawk/Makefile : 1.11 : 21 : 24
115 descr
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.
120 kcah
121
122 hack gcc-sparc64-libgcc
123 mdate 01 Dec 2001
124 who jmc
125 port sparc64
126 file gnu/lib/libgcc/Makefile : 1.29 : 24 : 27
127 descr
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
133 kcah
134
135 hack gcc-sparc64-iostat-systat
136 mdate 04 Feb 2001
137 who mrg
138 port sparc64
139 file usr.sbin/iostat/Makefile : 1.17 : 7 : 10
140 file usr.bin/systat/Makefile : 1.23 : 6 : 9
141 descr
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.
145 kcah
146
147 hack gcc-sparc64-nawk
148 mdate 25 Oct 2001
149 who martin
150 port sparc64
151 file usr.bin/awk/Makefile : 1.3 : 13 : 15
152 descr
153 Don't use long double on sparc64.
154 kcah
155
156 hack gcc-sparc64-ntp
157 mdate 12 Nov 2000
158 who martin
159 port sparc64
160 file usr.sbin/ntp/Makefile.inc : 1.5 : 17 : 19
161 descr
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.
166 kcah
167
168 hack gcc-sparc64-x_dhclient
169 mdate 27 Dec 2000
170 who mrg
171 port sparc64
172 file distrib/utils/x_dhclient/Makefile : 1.6 : 28 : 30
173 descr
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.
176 kcah
177
178 hack lint-no-long-double
179 mdate 17 Aug 2001
180 who eeh
181 port sparc64
182 file usr.bin/xlint/lint1/param.h: 1.14 :
183 descr
184 Don't use long double on sparc64.
185 kcah
186
187 hack netstat ieee1394 address printing.
188 mdate 14 Nov 2000
189 who matt
190 file lib/libc/net/getnameinfo.c : 1.32 : 497 : 503
191 descr
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.
195 kcah
196
197 hack xterm vs. libterm
198 mdate 01 Aug 2000
199 who jdc
200 file xsrc/xc/programs/xterm/main.c : 1.2 : 3609 : 3614
201 pr 10383
202 descr
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.
208 kcah
209
210 hack gcc-3-libtelnet
211 mdate 29 Jan 2002
212 who thorpej
213 file lib/libtelnet/Makefile : 1.14 : 14 : 17
214 descr
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.
220 kcah
221
222 hack gcc-sh3-sed
223 mdate 23 Apr 2002
224 who thorpej
225 file usr.bin/sed/Makefile : 1.9 : 9 : 13
226 descr
227 The in-tree GCC 2.95.3-based compiler ICEs when building
228 with optimization for SuperH. Hack is to biuld with -O0.
229 kcah
230
231 hack gcc-unsigned-compare
232 cdate 09 Mar 2002
233 mdate 18 Mar 2002
234 who bjh21
235 port arm
236 file dist/bind/lib/nameser/ns_parse.c : 1.3
237 file dist/dhcp/minires/ns_parse.c : 1.3
238 file dist/dhcp/omapip/result.c : 1.2
239 file dist/dhcp/server/failover.c : 1.3
240 file gnu/dist/gawk/eval.c : 1.4
241 file gnu/dist/toolchain/bfd/bfd.c : 1.2
242 file gnu/dist/toolchain/bfd/format.c : 1.2
243 file gnu/dist/toolchain/gdb/target.c : 1.2
244 file sys/kern/vfs_subr.c : 1.172
245 descr 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.
249 kcah
250
251 hack wi-at-big-endian-bus
252 cdate 15 Mar 2002
253 who martin
254 file dev/ic/wireg.h
255 descr 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.
259 kcah
260
261 hack gcc 2.95.3 -O2 (-fgcse) bug
262 cdate Sun May 5 18:36:04 UTC 2002
263 who tsutsui
264 port macppc
265 file sys/arch/macppc/dev/adb_direct.c: 1.24 : 1895 : 1896
266 pr 16678
267 descr
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.
272 kcah
273
274 hack gcc-vax-libbz2
275 mdate 27 Jun 2002
276 who thorpej
277 port vax
278 file lib/libbz2/Makefile
279 descr
280 libbz2 is mis-compiled with optimization with GCC 2.95.3
281 on VAX. -O0 works around this problem.
282 kcah
283
284 hack egcs-pc532-ip6_mroute
285 cdate 09 Jul 2002
286 who simonb
287 port pc532
288 file sys/arch/pc532/conf/Makefile.pc532 : 1.70
289 file sys/arch/pc532/conf/files.pc532 : 1.47
290 descr
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.
294 kcah
295
296 hack SuperH SH5 Toolchain Bugs
297 cdate 11 Jul 2002
298 who scw
299 port sh5
300 file usr.sbin/ndbootd/ndbootd.c : 1.6
301 file usr.sbin/traceroute/traceroute.c : 1.48
302 descr
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.
307 kcah
308
309 hack vax Toolchain bug
310 cdate 28 Mar 2003
311 who he
312 port vax
313 file sys/arch/vax/vax/intvec.S : 1.5
314 descr
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.
319 kcah
320
321 hack specific knowledge of colours in curses code
322 cdate Sun Apr 6 11:05:24 BST 2003
323 who jdc
324 port all
325 file lib/libcurses/color.c : r1.24
326 descr
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
331 kcah
332