* undefined reference to `__lshrdi3' error with GCC 4.0 @ 2006-01-17 13:48 Martin Michlmayr 2006-01-17 14:17 ` P. Christeas 0 siblings, 1 reply; 9+ messages in thread From: Martin Michlmayr @ 2006-01-17 13:48 UTC (permalink / raw) To: linux-mips Has anyone else seen the following error when compiling a kernel with GCC 4.0 (GCC 3.3 works) and knows what to do about it? arch/mips/kernel/built-in.o: In function `time_init': : undefined reference to `__lshrdi3' arch/mips/kernel/built-in.o: In function `time_init': : relocation truncated to fit: R_MIPS_26 against `__lshrdi3' This problem is also reported at http://sources.redhat.com/ml/crossgcc/2005-11/msg00194.html but no solution is mentioned. -- Martin Michlmayr http://www.cyrius.com/ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 13:48 undefined reference to `__lshrdi3' error with GCC 4.0 Martin Michlmayr @ 2006-01-17 14:17 ` P. Christeas 2006-01-17 15:14 ` Ralf Baechle 2006-01-17 19:08 ` Ralf Baechle 0 siblings, 2 replies; 9+ messages in thread From: P. Christeas @ 2006-01-17 14:17 UTC (permalink / raw) To: Martin Michlmayr; +Cc: linux-mips [-- Attachment #1: Type: text/plain, Size: 420 bytes --] On Tuesday 17 January 2006 3:48 pm, Martin Michlmayr wrote: > Has anyone else seen the following error when compiling a kernel with GCC > 4.0 (GCC 3.3 works) and knows what to do about it? > > arch/mips/kernel/built-in.o: In function `time_init': > : undefined reference to `__lshrdi3' I think I've solved it by copying the files ashldi3.c ashrdi3.c lshrdi3.c from arch/ppc/lib to arch/mips/lib The patch for 2.6 is: [-- Attachment #2: float.patch --] [-- Type: text/x-diff, Size: 6226 bytes --] diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index cf12caf..dfa0b12 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -7,4 +7,7 @@ lib-y += csum_partial_copy.o memcpy.o pr obj-y += iomap.o +#ugly hack. Why is this needed? +lib-$(CONFIG_MIKROTIK_RB500) += ashldi3.o ashrdi3.o lshrdi3.o + EXTRA_AFLAGS := $(CFLAGS) diff --git a/arch/mips/lib/ashldi3.c b/arch/mips/lib/ashldi3.c new file mode 100644 index 0000000..2f4a3d5 --- /dev/null +++ b/arch/mips/lib/ashldi3.c @@ -0,0 +1,66 @@ +/* ashrdi3.c extracted from gcc-2.95.2/libgcc2.c which is: */ +/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <linux/linkage.h> +#include <linux/module.h> +#define BITS_PER_UNIT 8 + +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef int DItype __attribute__ ((mode (DI))); +typedef int word_type __attribute__ ((mode (__word__))); + +struct DIstruct {SItype high, low;}; + +typedef union +{ + struct DIstruct s; + DItype ll; +} DIunion; + +DItype +__ashldi3 (DItype u, word_type b) +{ + DIunion w; + word_type bm; + DIunion uu; + + if (b == 0) + return u; + + uu.ll = u; + + bm = (sizeof (SItype) * BITS_PER_UNIT) - b; + if (bm <= 0) + { + w.s.low = 0; + w.s.high = (USItype)uu.s.low << -bm; + } + else + { + USItype carries = (USItype)uu.s.low >> bm; + w.s.low = (USItype)uu.s.low << b; + w.s.high = ((USItype)uu.s.high << b) | carries; + } + + return w.ll; +} + +EXPORT_SYMBOL(__ashldi3); diff --git a/arch/mips/lib/ashrdi3.c b/arch/mips/lib/ashrdi3.c new file mode 100644 index 0000000..eb6d47d --- /dev/null +++ b/arch/mips/lib/ashrdi3.c @@ -0,0 +1,68 @@ +/* ashrdi3.c extracted from gcc-2.7.2/libgcc2.c which is: */ +/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <linux/linkage.h> +#include <linux/module.h> + +#define BITS_PER_UNIT 8 + +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef int DItype __attribute__ ((mode (DI))); +typedef int word_type __attribute__ ((mode (__word__))); + +struct DIstruct {SItype high, low;}; + +typedef union +{ + struct DIstruct s; + DItype ll; +} DIunion; + +DItype +__ashrdi3 (DItype u, word_type b) +{ + DIunion w; + word_type bm; + DIunion uu; + + if (b == 0) + return u; + + uu.ll = u; + + bm = (sizeof (SItype) * BITS_PER_UNIT) - b; + if (bm <= 0) + { + /* w.s.high = 1..1 or 0..0 */ + w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1); + w.s.low = uu.s.high >> -bm; + } + else + { + USItype carries = (USItype)uu.s.high << bm; + w.s.high = uu.s.high >> b; + w.s.low = ((USItype)uu.s.low >> b) | carries; + } + + return w.ll; +} +EXPORT_SYMBOL(__ashrdi3); + diff --git a/arch/mips/lib/lshrdi3.c b/arch/mips/lib/lshrdi3.c new file mode 100644 index 0000000..c6a02d5 --- /dev/null +++ b/arch/mips/lib/lshrdi3.c @@ -0,0 +1,68 @@ +/* lshrdi3.c extracted from gcc-2.7.2/libgcc2.c which is: */ +/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <linux/linkage.h> +#include <linux/module.h> + +#define BITS_PER_UNIT 8 + +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef int DItype __attribute__ ((mode (DI))); +typedef int word_type __attribute__ ((mode (__word__))); + +struct DIstruct {SItype high, low;}; + +typedef union +{ + struct DIstruct s; + DItype ll; +} DIunion; + +DItype +__lshrdi3 (DItype u, word_type b) +{ + DIunion w; + word_type bm; + DIunion uu; + + if (b == 0) + return u; + + uu.ll = u; + + bm = (sizeof (SItype) * BITS_PER_UNIT) - b; + if (bm <= 0) + { + w.s.high = 0; + w.s.low = (USItype)uu.s.high >> -bm; + } + else + { + USItype carries = (USItype)uu.s.high << bm; + w.s.high = (USItype)uu.s.high >> b; + w.s.low = ((USItype)uu.s.low >> b) | carries; + } + + return w.ll; +} + +EXPORT_SYMBOL(__lshrdi3); + ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 14:17 ` P. Christeas @ 2006-01-17 15:14 ` Ralf Baechle 2006-01-17 15:50 ` P. Christeas 2006-01-17 19:08 ` Ralf Baechle 1 sibling, 1 reply; 9+ messages in thread From: Ralf Baechle @ 2006-01-17 15:14 UTC (permalink / raw) To: P. Christeas; +Cc: Martin Michlmayr, linux-mips On Tue, Jan 17, 2006 at 04:17:14PM +0200, P. Christeas wrote: > On Tuesday 17 January 2006 3:48 pm, Martin Michlmayr wrote: > > Has anyone else seen the following error when compiling a kernel with GCC > > 4.0 (GCC 3.3 works) and knows what to do about it? > > > > arch/mips/kernel/built-in.o: In function `time_init': > > : undefined reference to `__lshrdi3' > > I think I've solved it by copying the files > ashldi3.c ashrdi3.c lshrdi3.c > from arch/ppc/lib to arch/mips/lib No such files in arch/ppc/lib? Oh well, doesn't matter. > The patch for 2.6 is: struct DIstruct seems broken for little endian. Ralf ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 15:14 ` Ralf Baechle @ 2006-01-17 15:50 ` P. Christeas 2006-01-17 16:21 ` Ralf Baechle 0 siblings, 1 reply; 9+ messages in thread From: P. Christeas @ 2006-01-17 15:50 UTC (permalink / raw) To: Ralf Baechle; +Cc: Martin Michlmayr, linux-mips On Tuesday 17 January 2006 5:14 pm, Ralf Baechle wrote: > On Tue, Jan 17, 2006 at 04:17:14PM +0200, P. Christeas wrote: > > On Tuesday 17 January 2006 3:48 pm, Martin Michlmayr wrote: > > > Has anyone else seen the following error when compiling a kernel with > > > GCC 4.0 (GCC 3.3 works) and knows what to do about it? > > > > > > arch/mips/kernel/built-in.o: In function `time_init': > > > : undefined reference to `__lshrdi3' > > > > I think I've solved it by copying the files > > ashldi3.c ashrdi3.c lshrdi3.c > > from arch/ppc/lib to arch/mips/lib > > No such files in arch/ppc/lib? Oh well, doesn't matter. It was from m68k :S > > > The patch for 2.6 is: > > struct DIstruct seems broken for little endian. What consequences does that have? > > Ralf ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 15:50 ` P. Christeas @ 2006-01-17 16:21 ` Ralf Baechle 0 siblings, 0 replies; 9+ messages in thread From: Ralf Baechle @ 2006-01-17 16:21 UTC (permalink / raw) To: P. Christeas; +Cc: Martin Michlmayr, linux-mips On Tue, Jan 17, 2006 at 05:50:20PM +0200, P. Christeas wrote: > > No such files in arch/ppc/lib? Oh well, doesn't matter. > It was from m68k :S > > > > The patch for 2.6 is: > > > > struct DIstruct seems broken for little endian. > What consequences does that have? Wrong results of 64-bit shift operations when building with -Os. Ralf ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 14:17 ` P. Christeas 2006-01-17 15:14 ` Ralf Baechle @ 2006-01-17 19:08 ` Ralf Baechle 2006-01-17 19:38 ` Jan-Benedict Glaw 2006-02-17 13:57 ` Martin Michlmayr 1 sibling, 2 replies; 9+ messages in thread From: Ralf Baechle @ 2006-01-17 19:08 UTC (permalink / raw) To: P. Christeas; +Cc: Martin Michlmayr, linux-mips On Tue, Jan 17, 2006 at 04:17:14PM +0200, P. Christeas wrote: > On Tuesday 17 January 2006 3:48 pm, Martin Michlmayr wrote: > > Has anyone else seen the following error when compiling a kernel with GCC > > 4.0 (GCC 3.3 works) and knows what to do about it? > > > > arch/mips/kernel/built-in.o: In function `time_init': > > : undefined reference to `__lshrdi3' Thanks to Martin Michlmayr's testing I now know this problem is limited to kernels built with gcc 4.0 and newer when optimizing for size. > I think I've solved it by copying the files > ashldi3.c ashrdi3.c lshrdi3.c > from arch/ppc/lib to arch/mips/lib There is an awful lot of libgcc bits flying around in the kernel and I guess I'd be flamed for submitting even more ;-) so I tried to come up with something to make most if not all unnecessary. Still needs a little polishing but below for testing and commenting. Ralf diff --git a/include/asm-mips/libgcc.h b/include/asm-mips/libgcc.h new file mode 100644 index 0000000..0aef711 include/asm-mips/libgcc.h | 8 ++++++++ include/linux/libgcc.h | 32 ++++++++++++++++++++++++++++++++ lib/Makefile | 1 + lib/ashldi3.c | 32 ++++++++++++++++++++++++++++++++ lib/ashrdi3.c | 36 ++++++++++++++++++++++++++++++++++++ lib/lshrdi3.c | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 143 insertions(+) Index: linux-mips/include/asm-mips/libgcc.h =================================================================== --- /dev/null +++ linux-mips/include/asm-mips/libgcc.h @@ -0,0 +1,8 @@ +#ifndef __ASM_LIBGCC_H +#define __ASM_LIBGCC_H + +#define ARCH_NEEDS_ashldi3 +#define ARCH_NEEDS_ashrdi3 +#define ARCH_NEEDS_lshrdi3 + +#endif /* __ASM_LIBGCC_H */ Index: linux-mips/include/linux/libgcc.h =================================================================== --- /dev/null +++ linux-mips/include/linux/libgcc.h @@ -0,0 +1,32 @@ +#ifndef __LINUX_LIBGCC_H +#define __LINUX_LIBGCC_H + +#include <asm/byteorder.h> +#include <asm/libgcc.h> + +typedef long long DWtype; +typedef int Wtype; +typedef unsigned int UWtype; +typedef int word_type __attribute__ ((mode (__word__))); + +#define BITS_PER_UNIT 8 + +#ifdef __BIG_ENDIAN +struct DWstruct { + Wtype high, low; +}; +#elif defined(__LITTLE_ENDIAN) +struct DWstruct { + Wtype low, high; +}; +#else +#error I feel sick. +#endif + +typedef union +{ + struct DWstruct s; + DWtype ll; +} DWunion; + +#endif /* __LINUX_LIBGCC_H */ Index: linux-mips/lib/Makefile =================================================================== --- linux-mips.orig/lib/Makefile +++ linux-mips/lib/Makefile @@ -8,6 +8,7 @@ lib-y := errno.o ctype.o string.o vsprin sha1.o lib-y += kobject.o kref.o kobject_uevent.o klist.o +lib-y += ashldi3.o ashrdi3.o lshrdi3.o obj-y += sort.o parser.o halfmd4.o Index: linux-mips/lib/ashldi3.c =================================================================== --- /dev/null +++ linux-mips/lib/ashldi3.c @@ -0,0 +1,32 @@ +#include <linux/libgcc.h> +#include <linux/module.h> + +#ifdef ARCH_NEEDS_ashldi3 + +DWtype __ashldi3(DWtype u, word_type b) +{ + DWunion uu, w; + word_type bm; + + if (b == 0) + return u; + + uu.ll = u; + bm = (sizeof(Wtype) * BITS_PER_UNIT) - b; + + if (bm <= 0) { + w.s.low = 0; + w.s.high = (UWtype) uu.s.low << -bm; + } else { + const UWtype carries = (UWtype) uu.s.low >> bm; + + w.s.low = (UWtype) uu.s.low << b; + w.s.high = ((UWtype) uu.s.high << b) | carries; + } + + return w.ll; +} + +EXPORT_SYMBOL(__ashldi3); + +#endif /* ARCH_NEEDS_ashldi3 */ Index: linux-mips/lib/ashrdi3.c =================================================================== --- /dev/null +++ linux-mips/lib/ashrdi3.c @@ -0,0 +1,36 @@ +#include <linux/libgcc.h> +#include <linux/module.h> + +/* Unless shift functions are defined with full ANSI prototypes, + parameter b will be promoted to int if word_type is smaller than an int. */ +#ifdef ARCH_NEEDS_ashrdi3 + +DWtype __ashrdi3(DWtype u, word_type b) +{ + DWunion uu, w; + word_type bm; + + if (b == 0) + return u; + + uu.ll = u; + bm = (sizeof(Wtype) * BITS_PER_UNIT) - b; + + if (bm <= 0) { + /* w.s.high = 1..1 or 0..0 */ + w.s.high = + uu.s.high >> (sizeof(Wtype) * BITS_PER_UNIT - 1); + w.s.low = uu.s.high >> -bm; + } else { + const UWtype carries = (UWtype) uu.s.high << bm; + + w.s.high = uu.s.high >> b; + w.s.low = ((UWtype) uu.s.low >> b) | carries; + } + + return w.ll; +} + +EXPORT_SYMBOL(__ashrdi3); + +#endif /* ARCH_NEEDS_ashrdi3 */ Index: linux-mips/lib/lshrdi3.c =================================================================== --- /dev/null +++ linux-mips/lib/lshrdi3.c @@ -0,0 +1,34 @@ +#include <linux/libgcc.h> +#include <linux/module.h> + +/* Unless shift functions are defined with full ANSI prototypes, + parameter b will be promoted to int if word_type is smaller than an int. */ +#ifdef ARCH_NEEDS_lshrdi3 + +DWtype __lshrdi3(DWtype u, word_type b) +{ + DWunion uu, w; + word_type bm; + + if (b == 0) + return u; + + uu.ll = u; + bm = (sizeof(Wtype) * BITS_PER_UNIT) - b; + + if (bm <= 0) { + w.s.high = 0; + w.s.low = (UWtype) uu.s.high >> -bm; + } else { + const UWtype carries = (UWtype) uu.s.high << bm; + + w.s.high = (UWtype) uu.s.high >> b; + w.s.low = ((UWtype) uu.s.low >> b) | carries; + } + + return w.ll; +} + +EXPORT_SYMBOL(__lshrdi3); + +#endif /* ARCH_NEEDS_lshrdi3 */ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 19:08 ` Ralf Baechle @ 2006-01-17 19:38 ` Jan-Benedict Glaw 2006-01-17 20:11 ` Daniel Jacobowitz 2006-02-17 13:57 ` Martin Michlmayr 1 sibling, 1 reply; 9+ messages in thread From: Jan-Benedict Glaw @ 2006-01-17 19:38 UTC (permalink / raw) To: linux-mips [-- Attachment #1: Type: text/plain, Size: 1089 bytes --] On Tue, 2006-01-17 19:08:59 +0000, Ralf Baechle <ralf@linux-mips.org> wrote: > There is an awful lot of libgcc bits flying around in the kernel and I guess > I'd be flamed for submitting even more ;-) so I tried to come up with > something to make most if not all unnecessary. Still needs a little > polishing but below for testing and commenting. People will love you for that. I also already added libgcc functions:-) > +#ifdef __BIG_ENDIAN > +struct DWstruct { > + Wtype high, low; > +}; > +#elif defined(__LITTLE_ENDIAN) > +struct DWstruct { > + Wtype low, high; > +}; > +#else > +#error I feel sick. > +#endif No, you feel PDP11ish. Though you'd put quotes about the warning message. I'm all for adding this! MfG, JBG -- Jan-Benedict Glaw jbglaw@lug-owl.de . +49-172-7608481 _ O _ "Eine Freie Meinung in einem Freien Kopf | Gegen Zensur | Gegen Krieg _ _ O für einen Freien Staat voll Freier Bürger" | im Internet! | im Irak! O O O ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA)); [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 19:38 ` Jan-Benedict Glaw @ 2006-01-17 20:11 ` Daniel Jacobowitz 0 siblings, 0 replies; 9+ messages in thread From: Daniel Jacobowitz @ 2006-01-17 20:11 UTC (permalink / raw) To: linux-mips On Tue, Jan 17, 2006 at 08:38:36PM +0100, Jan-Benedict Glaw wrote: > > +#else > > +#error I feel sick. > > +#endif > > No, you feel PDP11ish. Though you'd put quotes about the warning > message. No, you wouldn't. drow@nevyn:~% echo '#error A B' | gcc -E - # 1 "<stdin>" # 1 "<built-in>" # 1 "<command line>" # 1 "<stdin>" <stdin>:1:2: error: #error A B drow@nevyn:~% echo '#error "A B"' | gcc -E - # 1 "<stdin>" # 1 "<built-in>" # 1 "<command line>" # 1 "<stdin>" <stdin>:1:2: error: #error "A B" drow@nevyn:~% -- Daniel Jacobowitz CodeSourcery ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: undefined reference to `__lshrdi3' error with GCC 4.0 2006-01-17 19:08 ` Ralf Baechle 2006-01-17 19:38 ` Jan-Benedict Glaw @ 2006-02-17 13:57 ` Martin Michlmayr 1 sibling, 0 replies; 9+ messages in thread From: Martin Michlmayr @ 2006-02-17 13:57 UTC (permalink / raw) To: Ralf Baechle; +Cc: linux-mips * Ralf Baechle <ralf@linux-mips.org> [2006-01-17 19:08]: > > > arch/mips/kernel/built-in.o: In function `time_init': > > > : undefined reference to `__lshrdi3' > > Thanks to Martin Michlmayr's testing I now know this problem is limited > to kernels built with gcc 4.0 and newer when optimizing for size. ... > There is an awful lot of libgcc bits flying around in the kernel and I guess > I'd be flamed for submitting even more ;-) so I tried to come up with > something to make most if not all unnecessary. Still needs a little > polishing but below for testing and commenting. I think you've cleaned it up in the meantime. Can you please send the patch to lkml as a RFC? -- Martin Michlmayr http://www.cyrius.com/ ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2006-02-17 13:51 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-01-17 13:48 undefined reference to `__lshrdi3' error with GCC 4.0 Martin Michlmayr 2006-01-17 14:17 ` P. Christeas 2006-01-17 15:14 ` Ralf Baechle 2006-01-17 15:50 ` P. Christeas 2006-01-17 16:21 ` Ralf Baechle 2006-01-17 19:08 ` Ralf Baechle 2006-01-17 19:38 ` Jan-Benedict Glaw 2006-01-17 20:11 ` Daniel Jacobowitz 2006-02-17 13:57 ` Martin Michlmayr
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox