HACKS revision 1.8
1# $NetBSD: HACKS,v 1.8 2003/09/19 08:43:14 mrg 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-sh3-sed
211mdate	23 Apr 2002
212who	thorpej
213file	usr.bin/sed/Makefile	: 1.9 : 9 : 13
214descr
215	The in-tree GCC 2.95.3-based compiler ICEs when building
216	with optimization for SuperH.  Hack is to biuld with -O0.
217kcah
218
219hack	gcc-unsigned-compare
220cdate	09 Mar 2002
221mdate	18 Mar 2002
222who	bjh21
223port	arm
224file	dist/bind/lib/nameser/ns_parse.c : 1.3
225file	dist/dhcp/minires/ns_parse.c : 1.3
226file	dist/dhcp/omapip/result.c : 1.2
227file	dist/dhcp/server/failover.c : 1.3
228file	gnu/dist/gawk/eval.c : 1.4
229file	gnu/dist/toolchain/bfd/bfd.c : 1.2
230file	gnu/dist/toolchain/bfd/format.c : 1.2
231file	gnu/dist/toolchain/gdb/target.c : 1.2
232file	sys/kern/vfs_subr.c : 1.172
233descr	When checking that a potentially-unsigned enum is >= 0, assign it
234	to an int first.  This is necessary to avoid "comparison is always
235	true" warnings with -fshort-enums.  Casting to an int really should
236	be enough, but turns out not to be.
237kcah
238
239hack	wi-at-big-endian-bus
240cdate	15 Mar 2002
241who	martin
242file	dev/ic/wireg.h
243descr	Add an option to access the underlying bus in big endian byte order
244	to work around deficiencies in bus_space_{read,write}_* macros.
245	Those don't allow the implementation of a proper pcmcia bus space
246	tag.
247kcah
248
249hack	gcc 2.95.3 -O2 (-fgcse) bug
250cdate	Sun May  5 18:36:04 UTC 2002
251who	tsutsui
252port	macppc
253file	sys/arch/macppc/dev/adb_direct.c:	1.24 : 1895 : 1896
254pr	16678
255descr
256	gcc-2.95.3 does generates wrong code on optimization
257	by gcc -O2 (-fgcse), and adb_read_date_time() returns
258	wrong value on cuda system.
259	A null asm statement has been added to avoid this for workaround.
260kcah
261
262hack	gcc-vax-libbz2
263mdate	27 Jun 2002
264who	thorpej
265port	vax
266file	lib/libbz2/Makefile
267descr
268	libbz2 is mis-compiled with optimization with GCC 2.95.3
269	on VAX.  -O0 works around this problem.
270kcah
271
272hack	egcs-pc532-ip6_mroute
273cdate	09 Jul 2002
274who	simonb
275port	pc532
276file	sys/arch/pc532/conf/Makefile.pc532 : 1.70
277file	sys/arch/pc532/conf/files.pc532 : 1.47
278descr
279	egcs 1.1.2 gets an "internal error--insn does not satisfy its
280	constraints" error compiling ip6_mroute.c with -O2 or greater.
281	-O1 works around this problem.
282kcah
283
284hack	SuperH SH5 Toolchain Bugs
285cdate	11 Jul 2002
286who	scw
287port	sh5
288file	usr.sbin/ndbootd/ndbootd.c : 1.6
289file	usr.sbin/traceroute/traceroute.c : 1.48
290descr
291	The SuperH SH5 toolchain (2.97-sh5-010522) gets an internal
292	compiler error when assigning a bit-wise inverted value
293	under some circumstances.
294	Work around it by splitting the statement into two.
295kcah
296
297hack	vax Toolchain bug
298cdate	28 Mar 2003
299who	he
300port	vax
301file	sys/arch/vax/vax/intvec.S : 1.5
302descr
303	Workaround for PR toolchain/20924.  The assembler apparently
304	tries to range-check byte offsets when it doesn't have
305	sufficient information to make that decision.
306	Workaround uses `brw' instead of `brb' instruction.
307kcah
308
309hack	specific knowledge of colours in curses code
310cdate	Sun Apr  6 11:05:24 BST 2003
311who	jdc
312port	all
313file	lib/libcurses/color.c : r1.24
314descr
315	Swap red/blue and yellow/cyan colours for COLOR_OTHER.
316	Fix is to enhance libtermcap to understand terminfo-style % sequences.
317	See also:
318	    http://mail-index.NetBSD.org/tech-userlevel/2003/04/06/0000.html
319kcah
320
321hack	SuperH SH5 Toolchain Bugs
322cdate	17 May 2003
323who	scw
324port	sh5
325file	lib/libpthread/pthread_lock.c : 1.7
326descr
327	The SuperH SH5 toolchain generates incorrect PIC code when faced
328	with a symbol which is declared extern, but has local scope due
329	to being defined within an asm() statement (without being declared
330	.globl in that statement). Work around it by adding the .globl.
331kcah
332
333hack	Compensation for differing types of LINUX_USRSTACK and USRSTACK
334cdate	21 Aug 2003
335who	he
336file	sys/miscfs/procfs/procfs_linux.c : 1.14
337descr
338	Not all ports have LINUX_USRSTACK and/or USRSTACK defined as
339	literals/constants, but refer to variables of a type which is
340	not "unsigned long", causing compilation of procfs_linux.c to
341	fail with "makes integer from pointer without a cast".  This
342	is observed on e.g. the sun3 port.  Ideally the "types" for
343	symbols should be consistent across all ports.
344kcah
345
346hack	i386 / sparc default debugging type in GCC 3.3.1
347cdate	19 Sept 2003
348who	mrg
349file	gnu/dist/gcc/gcc/config/{i386,sparc}/netbsd-elf.h
350descr
351	Until i386 & sparc* switch to GDB 5.3, the default debugging
352	format needs to be stabs not DWARF.
353kcah
354