NetBSD Problem Report #47955

From mlelstv@serpens.de  Sun Jun 23 05:42:48 2013
Return-Path: <mlelstv@serpens.de>
Received: from mail.netbsd.org (mail.netbsd.org [149.20.53.66])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(Client CN "mail.NetBSD.org", Issuer "Postmaster NetBSD.org" (verified OK))
	by mollari.NetBSD.org (Postfix) with ESMTPS id D9ABF715B8
	for <gnats-bugs@gnats.NetBSD.org>; Sun, 23 Jun 2013 05:42:48 +0000 (UTC)
Message-Id: <201306230542.r5N5gRpb024762@serpens.de>
Date: Sun, 23 Jun 2013 07:42:28 +0200 (MEST)
From: mlelstv@serpens.de
Reply-To: mlelstv@serpens.de
To: gnats-bugs@NetBSD.org
Subject: toolchain issues with glib2
X-Send-Pr-Version: 3.95

>Number:         47955
>Category:       toolchain
>Synopsis:       toolchain issues with glib2
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    mrg
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Jun 23 05:45:00 +0000 2013
>Closed-Date:    Mon Oct 07 03:40:17 +0000 2013
>Last-Modified:  Mon Oct 07 03:40:17 +0000 2013
>Originator:     Michael van Elst
>Release:        NetBSD 6.99.19
>Organization:

>Environment:


System: NetBSD twitty 6.99.19 NetBSD 6.99.19 (TWITTY) #1: Wed May 22 19:52:07 CEST 2013 mlelstv@pussyfoot:/home/netbsd-current/obj.evbarm/home/netbsd-current/src/sys/arch/evbarm/compile/TWITTY evbarm
Architecture: earm
Machine: evbarm
>Description:
Trying to build the package devel/glib2 on an evbarm EABI system
results in the following error:

|   ld --eh-frame-hdr -X -m armelf_nbsd_eabi -dc -dp -e __start -dynamic-linker /usr/libexec/ld.elf_so -o .libs/gobject-query /usr/lib/crt0.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/pkgwrk/devel/glib2/work.twitty/glib-2.36.3/gobject/.libs -L/usr/pkgwrk/devel/glib2/work.twitty/glib-2.36.3/glib/.libs -L/usr/pkgwrk/devel/glib2/work.twitty/.buildlink/lib -v -R/usr/pkg/lib gobject-query.o -rpath /usr/pkg/lib -lgobject-2.0 -lffi -lglib-2.0 -lpcre -lintl -lgcc -lpthread -lc -lgcc /usr/lib/crtend.o /usr/lib/crtn.o
|  GNU ld (NetBSD Binutils nb1) 2.21.1
|  /usr/pkgwrk/devel/glib2/work.twitty/.buildlink/lib/libffi.so: undefined reference to `__aeabi_unwind_cpp_pr1'

This is caused by libgcc.a not providing the unwind functions. Those are
only in libgcc_eh.a, but the compiler doesn't select it for linking.


The compiler (gcc4.5.4) doesn't select it for linking, because that's
not defined in the spec file. If you look at 'gcc -dumpsepcs' output
you only find:

*libgcc:
-lgcc


The more interesting part however is, that the specs for x86_64 show
the same:

*libgcc:
-lgcc

but somehow building glib2 does not fail for x86_64. The reason probably
is that the unwind functions for x86_64 exist in libgcc and libgcc_eh.

pussyfoot: {47} uname -a
NetBSD pussyfoot 6.99.19 NetBSD 6.99.19 (PUSSYFOOT) #1: Wed May  1 10:30:36 CEST 2013  mlelstv@pussyfoot:/home/netbsd-current/obj.amd64/home/netbsd-current/src/sys/arch/amd64/compile/PUSSYFOOT amd64
pussyfoot: {44} nm /usr/lib/libgcc.a | grep Unwind_Backtrace
00000000000022ae T _Unwind_Backtrace
pussyfoot: {45} nm /usr/lib/libgcc_eh.a | grep Unwind_Backtrace
00000000000022ae T _Unwind_Backtrace


Looking at an older arch/amiga system with gcc4.1.3 you find that
libgcc and libgcc_eh are different, only libgcc_eh provides the
unwind functions.

serpens% uname -a
NetBSD serpens.de 5.0_STABLE NetBSD 5.0_STABLE (SERPENS) #0: Sun Nov  1 23:35:16 CET 2009  spz@aquila:/home/netbsd/src5/src/sys/arch/amiga/compile/obj/SERPENS amiga
serpens% nm /usr/lib/libgcc.a | grep -i Unwind_Backtrace
serpens% nm /usr/lib/libgcc_eh.a | grep -i Unwind_Backtrace
00001644 T _Unwind_Backtrace

But here the specs tell the compiler what to do:

*libgcc:
%{static: -lgcc -lgcc_eh}%{static-libgcc: %{!shared:-lgcc -lgcc_eh}%{shared:-lgc
c_pic -lgcc_eh_pic}}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc 
-lgcc_eh}%{shared-libgcc:-lgcc_s -lgcc}}%{shared:%{shared-libgcc:-lgcc_s} -lgcc_
pic}}}


It could be that gcc4.5.4 dropped the spec-file mechanics and requires
libgcc to include the unwind functions, then we build or libgcc wrong
for some archs.

Or what I find more likely is, that we build bad specs and libgcc
on x86_64 is built wrong to compensate.




>How-To-Repeat:
Try to build devel/glib2 on an evbarm EABI system.
>Fix:


>Release-Note:

>Audit-Trail:

Responsible-Changed-From-To: toolchain-manager->mrg
Responsible-Changed-By: mrg@NetBSD.org
Responsible-Changed-When: Fri, 28 Jun 2013 12:48:14 +0000
Responsible-Changed-Why:
i caused this i believe.


State-Changed-From-To: open->feedback
State-Changed-By: mrg@NetBSD.org
State-Changed-When: Fri, 28 Jun 2013 12:48:14 +0000
State-Changed-Why:
please try with the latest -current.  i *think* i've fixed this, but
i didn't setup a system to test.


From: "matthew green" <mrg@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/47955 CVS commit: src/external/gpl3/gcc
Date: Fri, 28 Jun 2013 12:45:04 +0000

 Module Name:	src
 Committed By:	mrg
 Date:		Fri Jun 28 12:45:03 UTC 2013

 Modified Files:
 	src/external/gpl3/gcc/lib/crtstuff/arch: alpha.mk arm.mk armeb.mk
 	    earm.mk earmeb.mk earmhf.mk earmhfeb.mk hppa.mk i386.mk m68000.mk
 	    m68k.mk mips64eb.mk mips64el.mk mipseb.mk mipsel.mk powerpc.mk
 	    sh3eb.mk sh3el.mk sparc.mk sparc64.mk vax.mk x86_64.mk
 	src/external/gpl3/gcc/lib/libgcc/arch: alpha.mk arm.mk armeb.mk earm.mk
 	    earmeb.mk earmhf.mk earmhfeb.mk hppa.mk i386.mk m68000.mk m68k.mk
 	    mips64eb.mk mips64el.mk mipseb.mk mipsel.mk powerpc.mk sh3eb.mk
 	    sh3el.mk sparc.mk sparc64.mk vax.mk x86_64.mk
 	src/external/gpl3/gcc/lib/libiberty/arch/armeb: config.h
 	src/external/gpl3/gcc/lib/libstdc++-v3/arch/arm: c++config.h config.h
 	src/external/gpl3/gcc/lib/libstdc++-v3/arch/armeb: c++config.h config.h
 	src/external/gpl3/gcc/lib/libstdc++-v3/arch/earm: c++config.h config.h
 	src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmeb: c++config.h
 	    config.h
 	src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmhf: c++config.h
 	    config.h
 	src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmhfeb: c++config.h
 	    config.h
 	src/external/gpl3/gcc/usr.bin/gcc/arch/alpha: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/arm: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/armeb: auto-host.h configargs.h
 	    defs.mk tm.h
 	src/external/gpl3/gcc/usr.bin/gcc/arch/earm: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/earmeb: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/earmhf: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/earmhfeb: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/hppa: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/i386: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/m68000: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/m68k: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/mips64eb: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/mips64el: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/mipseb: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/mipsel: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/powerpc: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/sh3eb: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/sh3el: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/sparc: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/sparc64: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/vax: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/gcc/arch/x86_64: configargs.h defs.mk
 	src/external/gpl3/gcc/usr.bin/libdecnumber/arch/armeb: config.h

 Log Message:
 re-run mknative-gcc.  pickups fixes for ENABLE_SHARED (which
 might want to be pulled up to netbsd-6?), removes the
 entirely wrong -I/usr/include/libelf from various include flags
 and fixes for when NEWCONFIGDIR != NETBSDSRCDIR.

 i should fix PR 47955 but i haven't setup a system to test.


 To generate a diff of this commit:
 cvs rdiff -u -r1.2 -r1.3 src/external/gpl3/gcc/lib/crtstuff/arch/alpha.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/hppa.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/mips64eb.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/mips64el.mk
 cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gcc/lib/crtstuff/arch/arm.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/armeb.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/earmeb.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/earmhf.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/m68000.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/m68k.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/mipseb.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/mipsel.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/powerpc.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/sh3eb.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/sh3el.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/sparc.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/sparc64.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/vax.mk
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/lib/crtstuff/arch/earm.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/i386.mk \
     src/external/gpl3/gcc/lib/crtstuff/arch/x86_64.mk
 cvs rdiff -u -r1.1 -r1.2 src/external/gpl3/gcc/lib/crtstuff/arch/earmhfeb.mk
 cvs rdiff -u -r1.2 -r1.3 src/external/gpl3/gcc/lib/libgcc/arch/alpha.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/earmeb.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/hppa.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/mips64eb.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/mips64el.mk
 cvs rdiff -u -r1.6 -r1.7 src/external/gpl3/gcc/lib/libgcc/arch/arm.mk
 cvs rdiff -u -r1.5 -r1.6 src/external/gpl3/gcc/lib/libgcc/arch/armeb.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/m68000.mk
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/lib/libgcc/arch/earm.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/earmhf.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/powerpc.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/sh3eb.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/sh3el.mk
 cvs rdiff -u -r1.1 -r1.2 src/external/gpl3/gcc/lib/libgcc/arch/earmhfeb.mk
 cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gcc/lib/libgcc/arch/i386.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/m68k.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/mipseb.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/mipsel.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/sparc.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/sparc64.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/vax.mk \
     src/external/gpl3/gcc/lib/libgcc/arch/x86_64.mk
 cvs rdiff -u -r1.1 -r1.2 \
     src/external/gpl3/gcc/lib/libiberty/arch/armeb/config.h
 cvs rdiff -u -r1.8 -r1.9 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/arm/c++config.h
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/arm/config.h
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/armeb/c++config.h
 cvs rdiff -u -r1.6 -r1.7 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/armeb/config.h
 cvs rdiff -u -r1.5 -r1.6 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earm/c++config.h \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earm/config.h
 cvs rdiff -u -r1.3 -r1.4 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmeb/c++config.h \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmeb/config.h
 cvs rdiff -u -r1.3 -r1.4 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmhf/c++config.h \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmhf/config.h
 cvs rdiff -u -r1.1 -r1.2 \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmhfeb/c++config.h \
     src/external/gpl3/gcc/lib/libstdc++-v3/arch/earmhfeb/config.h
 cvs rdiff -u -r1.6 -r1.7 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/alpha/configargs.h
 cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gcc/usr.bin/gcc/arch/alpha/defs.mk
 cvs rdiff -u -r1.8 -r1.9 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/arm/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/arm/defs.mk
 cvs rdiff -u -r1.2 -r1.3 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/armeb/auto-host.h
 cvs rdiff -u -r1.8 -r1.9 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/armeb/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/armeb/defs.mk
 cvs rdiff -u -r1.1 -r1.2 src/external/gpl3/gcc/usr.bin/gcc/arch/armeb/tm.h
 cvs rdiff -u -r1.6 -r1.7 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/earm/configargs.h
 cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gcc/usr.bin/gcc/arch/earm/defs.mk
 cvs rdiff -u -r1.2 -r1.3 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/earmeb/configargs.h \
     src/external/gpl3/gcc/usr.bin/gcc/arch/earmeb/defs.mk
 cvs rdiff -u -r1.3 -r1.4 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/earmhf/configargs.h \
     src/external/gpl3/gcc/usr.bin/gcc/arch/earmhf/defs.mk
 cvs rdiff -u -r1.1 -r1.2 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/earmhfeb/configargs.h \
     src/external/gpl3/gcc/usr.bin/gcc/arch/earmhfeb/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/hppa/configargs.h
 cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gcc/usr.bin/gcc/arch/hppa/defs.mk
 cvs rdiff -u -r1.10 -r1.11 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/i386/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/i386/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/m68000/configargs.h
 cvs rdiff -u -r1.4 -r1.5 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/m68000/defs.mk
 cvs rdiff -u -r1.6 -r1.7 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/m68k/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/m68k/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mips64eb/configargs.h
 cvs rdiff -u -r1.4 -r1.5 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mips64eb/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mips64el/configargs.h
 cvs rdiff -u -r1.4 -r1.5 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mips64el/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mipseb/configargs.h
 cvs rdiff -u -r1.5 -r1.6 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mipseb/defs.mk
 cvs rdiff -u -r1.8 -r1.9 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mipsel/configargs.h
 cvs rdiff -u -r1.5 -r1.6 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/mipsel/defs.mk
 cvs rdiff -u -r1.12 -r1.13 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/powerpc/configargs.h
 cvs rdiff -u -r1.4 -r1.5 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/powerpc/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/sh3eb/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/sh3eb/defs.mk
 cvs rdiff -u -r1.9 -r1.10 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/sh3el/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/sh3el/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/sparc/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/sparc/defs.mk
 cvs rdiff -u -r1.8 -r1.9 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/sparc64/configargs.h
 cvs rdiff -u -r1.4 -r1.5 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/sparc64/defs.mk
 cvs rdiff -u -r1.7 -r1.8 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/vax/configargs.h
 cvs rdiff -u -r1.4 -r1.5 src/external/gpl3/gcc/usr.bin/gcc/arch/vax/defs.mk
 cvs rdiff -u -r1.10 -r1.11 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/x86_64/configargs.h
 cvs rdiff -u -r1.6 -r1.7 \
     src/external/gpl3/gcc/usr.bin/gcc/arch/x86_64/defs.mk
 cvs rdiff -u -r1.1 -r1.2 \
     src/external/gpl3/gcc/usr.bin/libdecnumber/arch/armeb/config.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: Michael van Elst <mlelstv@serpens.de>
To: gnats-bugs@gnats.netbsd.org
Cc: 
Subject: Re: toolchain/47955 toolchain issues with glib2
Date: Mon, 5 Aug 2013 08:10:03 +0200

 With these changes, glib2 builds.
 -- 
                                 Michael van Elst
 Internet: mlelstv@serpens.de
                                 "A potential Snark may lurk in every tree."

State-Changed-From-To: feedback->closed
State-Changed-By: dholland@NetBSD.org
State-Changed-When: Mon, 07 Oct 2013 03:40:17 +0000
State-Changed-Why:
confirmed fixed


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2014 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.