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