Brig front-end
authorPekka Jääskeläinen <pekka@parmance.com>
Tue, 24 Jan 2017 12:45:56 +0000 (12:45 +0000)
committerMartin Jambor <jamborm@gcc.gnu.org>
Tue, 24 Jan 2017 12:45:56 +0000 (13:45 +0100)
2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
    Martin Jambor  <mjambor@suse.cz>

* Makefile.def (target_modules): Added libhsail-rt.
(languages): Added language brig.
* Makefile.in: Regenerated.
* configure.ac (TOPLEVEL_CONFIGURE_ARGUMENTS): Added
tgarget-libhsail-rt.  Make brig unsupported on untested architectures.
* configure: Regenerated.

gcc/
* brig-builtins.def: New file.
* builtins.def (DEF_HSAIL_BUILTIN): New macro.
(DEF_HSAIL_ATOMIC_BUILTIN): Likewise.
(DEF_HSAIL_SAT_BUILTIN): Likewise.
(DEF_HSAIL_INTR_BUILTIN): Likewise.
(DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN): Likewise.
* builtin-types.def (BT_INT8): New.
(BT_INT16): Likewise.
(BT_UINT8): Likewise.
(BT_UINT16): Likewise.
(BT_FN_ULONG): Likewise.
(BT_FN_UINT_INT): Likewise.
(BT_FN_UINT_ULONG): Likewise.
(BT_FN_UINT_LONG): Likewise.
(BT_FN_UINT_PTR): Likewise.
(BT_FN_ULONG_PTR): Likewise.
(BT_FN_INT8_FLOAT): Likewise.
(BT_FN_INT16_FLOAT): Likewise.
(BT_FN_UINT32_FLOAT): Likewise.
(BT_FN_UINT16_FLOAT): Likewise.
(BT_FN_UINT8_FLOAT): Likewise.
(BT_FN_UINT64_FLOAT): Likewise.
(BT_FN_UINT16_UINT32): Likewise.
(BT_FN_UINT32_UINT16): Likewise.
(BT_FN_UINT16_UINT16_UINT16): Likewise.
(BT_FN_INT_PTR_INT): Likewise.
(BT_FN_UINT_PTR_UINT): Likewise.
(BT_FN_LONG_PTR_LONG): Likewise.
(BT_FN_ULONG_PTR_ULONG): Likewise.
(BT_FN_VOID_UINT64_UINT64): Likewise.
(BT_FN_UINT8_UINT8_UINT8): Likewise.
(BT_FN_INT8_INT8_INT8): Likewise.
(BT_FN_INT16_INT16_INT16): Likewise.
(BT_FN_INT_INT_INT): Likewise.
(BT_FN_UINT_FLOAT_UINT): Likewise.
(BT_FN_FLOAT_UINT_UINT): Likewise.
(BT_FN_ULONG_UINT_UINT): Likewise.
(BT_FN_ULONG_UINT_PTR): Likewise.
(BT_FN_ULONG_ULONG_ULONG): Likewise.
(BT_FN_UINT_UINT_UINT): Likewise.
(BT_FN_VOID_UINT_PTR): Likewise.
(BT_FN_UINT_UINT_PTR: Likewise.
(BT_FN_UINT32_UINT64_PTR): Likewise.
(BT_FN_INT_INT_UINT_UINT): Likewise.
(BT_FN_UINT_UINT_UINT_UINT): Likewise.
(BT_FN_UINT_UINT_UINT_PTR): Likewise.
(BT_FN_UINT_ULONG_ULONG_UINT): Likewise.
(BT_FN_ULONG_ULONG_ULONG_ULONG): Likewise.
(BT_FN_LONG_LONG_UINT_UINT): Likewise.
(BT_FN_ULONG_ULONG_UINT_UINT): Likewise.
(BT_FN_VOID_UINT32_UINT64_PTR): Likewise.
(BT_FN_VOID_UINT32_UINT32_PTR): Likewise.
(BT_FN_UINT_UINT_UINT_UINT_UINT): Likewise.
(BT_FN_UINT_FLOAT_FLOAT_FLOAT_FLOAT): Likewise.
(BT_FN_ULONG_ULONG_ULONG_UINT_UINT): Likewise.
* doc/frontends.texi: List BRIG FE.
* doc/install.texi (Testing): Add BRIG tesring requirements.
* doc/invoke.texi (Overall Options): Mention BRIG.
* doc/standards.texi (Standards): Doucment BRIG HSA version.

gcc/brig/

* Make-lang.in: New file.
* brig-builtins.h: Likewise.
* brig-c.h: Likewise.
* brig-lang.c: Likewise.
* brigspec.c: Likewise.
* config-lang.in: Likewise.
* lang-specs.h: Likewise.
* lang.opt: Likewise.
* brigfrontend/brig-arg-block-handler.cc: Likewise.
* brigfrontend/brig-atomic-inst-handler.cc: Likewise.
* brigfrontend/brig-basic-inst-handler.cc: Likewise.
* brigfrontend/brig-branch-inst-handler.cc: Likewise.
* brigfrontend/brig-cmp-inst-handler.cc: Likewise.
* brigfrontend/brig-code-entry-handler.cc: Likewise.
* brigfrontend/brig-code-entry-handler.h: Likewise.
* brigfrontend/brig-comment-handler.cc: Likewise.
* brigfrontend/brig-control-handler.cc: Likewise.
* brigfrontend/brig-copy-move-inst-handler.cc: Likewise.
* brigfrontend/brig-cvt-inst-handler.cc: Likewise.
* brigfrontend/brig-fbarrier-handler.cc: Likewise.
* brigfrontend/brig-function-handler.cc: Likewise.
* brigfrontend/brig-function.cc: Likewise.
* brigfrontend/brig-function.h: Likewise.
* brigfrontend/brig-inst-mod-handler.cc: Likewise.
* brigfrontend/brig-label-handler.cc: Likewise.
* brigfrontend/brig-lane-inst-handler.cc: Likewise.
* brigfrontend/brig-machine.c: Likewise.
* brigfrontend/brig-machine.h: Likewise.
* brigfrontend/brig-mem-inst-handler.cc: Likewise.
* brigfrontend/brig-module-handler.cc: Likewise.
* brigfrontend/brig-queue-inst-handler.cc: Likewise.
* brigfrontend/brig-seg-inst-handler.cc: Likewise.
* brigfrontend/brig-signal-inst-handler.cc: Likewise.
* brigfrontend/brig-to-generic.cc: Likewise.
* brigfrontend/brig-to-generic.h: Likewise.
* brigfrontend/brig-util.cc: Likewise.
* brigfrontend/brig-util.h: Likewise.
* brigfrontend/brig-variable-handler.cc: Likewise.
* brigfrontend/phsa.h: Likewise.

gcc/testsuite/

* lib/brig-dg.exp: New file.
* lib/brig.exp: Likewise.
* brig.dg/README: Likewise.
* brig.dg/dg.exp: Likewise.
* brig.dg/test/gimple/alloca.hsail: Likewise.
* brig.dg/test/gimple/atomics.hsail: Likewise.
* brig.dg/test/gimple/branches.hsail: Likewise.
* brig.dg/test/gimple/fbarrier.hsail: Likewise.
* brig.dg/test/gimple/function_calls.hsail: Likewise.
* brig.dg/test/gimple/kernarg.hsail: Likewise.
* brig.dg/test/gimple/mem.hsail: Likewise.
* brig.dg/test/gimple/mulhi.hsail: Likewise.
* brig.dg/test/gimple/packed.hsail: Likewise.
* brig.dg/test/gimple/smoke_test.hsail: Likewise.
* brig.dg/test/gimple/variables.hsail: Likewise.
* brig.dg/test/gimple/vector.hsail: Likewise.

include/

* hsa.h: Moved here from libgomp/plugin/hsa.h.

libgomp/

* plugin/hsa.h: Moved to top level include.
* plugin/plugin-hsa.c: Chanfgd include of hsa.h accordingly.

libhsail-rt/

* Makefile.am: New file.
* target-config.h.in: Likewise.
* configure.ac: Likewise.
* configure: Likewise.
* config.h.in: Likewise.
* aclocal.m4: Likewise.
* README: Likewise.
* Makefile.in: Likewise.
* include/internal/fibers.h: Likewise.
* include/internal/phsa-queue-interface.h: Likewise.
* include/internal/phsa-rt.h: Likewise.
* include/internal/workitems.h: Likewise.
* rt/arithmetic.c: Likewise.
* rt/atomics.c: Likewise.
* rt/bitstring.c: Likewise.
* rt/fbarrier.c: Likewise.
* rt/fibers.c: Likewise.
* rt/fp16.c: Likewise.
* rt/misc.c: Likewise.
* rt/multimedia.c: Likewise.
* rt/queue.c: Likewise.
* rt/sat_arithmetic.c: Likewise.
* rt/segment.c: Likewise.
* rt/workitems.c: Likewise.

Co-Authored-By: Martin Jambor <mjambor@suse.cz>
From-SVN: r244867

100 files changed:
ChangeLog
Makefile.def
Makefile.in
configure
configure.ac
gcc/ChangeLog
gcc/brig-builtins.def [new file with mode: 0644]
gcc/brig/ChangeLog [new file with mode: 0644]
gcc/brig/Make-lang.in [new file with mode: 0644]
gcc/brig/brig-builtins.h [new file with mode: 0644]
gcc/brig/brig-c.h [new file with mode: 0644]
gcc/brig/brig-lang.c [new file with mode: 0644]
gcc/brig/brigfrontend/brig-arg-block-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-atomic-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-basic-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-branch-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-cmp-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-code-entry-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-code-entry-handler.h [new file with mode: 0644]
gcc/brig/brigfrontend/brig-comment-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-control-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-copy-move-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-cvt-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-fbarrier-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-function-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-function.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-function.h [new file with mode: 0644]
gcc/brig/brigfrontend/brig-inst-mod-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-label-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-lane-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-machine.c [new file with mode: 0644]
gcc/brig/brigfrontend/brig-machine.h [new file with mode: 0644]
gcc/brig/brigfrontend/brig-mem-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-module-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-queue-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-seg-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-signal-inst-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-to-generic.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-to-generic.h [new file with mode: 0644]
gcc/brig/brigfrontend/brig-util.cc [new file with mode: 0644]
gcc/brig/brigfrontend/brig-util.h [new file with mode: 0644]
gcc/brig/brigfrontend/brig-variable-handler.cc [new file with mode: 0644]
gcc/brig/brigfrontend/phsa.h [new file with mode: 0644]
gcc/brig/brigspec.c [new file with mode: 0644]
gcc/brig/config-lang.in [new file with mode: 0644]
gcc/brig/lang-specs.h [new file with mode: 0644]
gcc/brig/lang.opt [new file with mode: 0644]
gcc/builtin-types.def
gcc/builtins.def
gcc/doc/frontends.texi
gcc/doc/install.texi
gcc/doc/invoke.texi
gcc/doc/standards.texi
gcc/testsuite/ChangeLog
gcc/testsuite/brig.dg/README [new file with mode: 0644]
gcc/testsuite/brig.dg/dg.exp [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/alloca.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/atomics.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/branches.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/fbarrier.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/function_calls.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/kernarg.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/mem.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/mulhi.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/packed.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/smoke_test.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/variables.hsail [new file with mode: 0644]
gcc/testsuite/brig.dg/test/gimple/vector.hsail [new file with mode: 0644]
gcc/testsuite/lib/brig-dg.exp [new file with mode: 0644]
gcc/testsuite/lib/brig.exp [new file with mode: 0644]
include/ChangeLog
include/hsa.h [new file with mode: 0644]
libgomp/ChangeLog
libgomp/plugin/hsa.h [deleted file]
libgomp/plugin/plugin-hsa.c
libhsail-rt/ChangeLog [new file with mode: 0644]
libhsail-rt/Makefile.am [new file with mode: 0644]
libhsail-rt/Makefile.in [new file with mode: 0644]
libhsail-rt/README [new file with mode: 0644]
libhsail-rt/aclocal.m4 [new file with mode: 0644]
libhsail-rt/config.h.in [new file with mode: 0644]
libhsail-rt/configure [new file with mode: 0644]
libhsail-rt/configure.ac [new file with mode: 0644]
libhsail-rt/include/internal/fibers.h [new file with mode: 0644]
libhsail-rt/include/internal/phsa-queue-interface.h [new file with mode: 0644]
libhsail-rt/include/internal/phsa-rt.h [new file with mode: 0644]
libhsail-rt/include/internal/workitems.h [new file with mode: 0644]
libhsail-rt/rt/arithmetic.c [new file with mode: 0644]
libhsail-rt/rt/atomics.c [new file with mode: 0644]
libhsail-rt/rt/bitstring.c [new file with mode: 0644]
libhsail-rt/rt/fbarrier.c [new file with mode: 0644]
libhsail-rt/rt/fibers.c [new file with mode: 0644]
libhsail-rt/rt/fp16.c [new file with mode: 0644]
libhsail-rt/rt/misc.c [new file with mode: 0644]
libhsail-rt/rt/multimedia.c [new file with mode: 0644]
libhsail-rt/rt/queue.c [new file with mode: 0644]
libhsail-rt/rt/sat_arithmetic.c [new file with mode: 0644]
libhsail-rt/rt/segment.c [new file with mode: 0644]
libhsail-rt/rt/workitems.c [new file with mode: 0644]
libhsail-rt/target-config.h.in [new file with mode: 0644]

index a95d6516871a6cc85bef47684269d123e39a001d..9695f9d85d14c0b46b007660781048dcba2b25b6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
+           Martin Jambor  <mjambor@suse.cz>
+
+
+       * Makefile.def (target_modules): Added libhsail-rt.
+       (languages): Added language brig.
+       * Makefile.in: Regenerated.
+       * configure.ac (TOPLEVEL_CONFIGURE_ARGUMENTS): Added
+       tgarget-libhsail-rt.  Make brig unsupported on untested architectures.
+       * configure: Regenerated.
+
 2017-01-19  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/78478
index 7aa4cb33ae3b751e65f1e2f7daa5841b35c1c14b..799b7ca5283678b13a4f86aa63c4fdcc540422ce 100644 (file)
@@ -157,6 +157,7 @@ target_modules = { module= libquadmath; };
 target_modules = { module= libgfortran; };
 target_modules = { module= libobjc; };
 target_modules = { module= libgo; };
+target_modules = { module= libhsail-rt; };
 target_modules = { module= libtermcap; no_check=true;
                    missing=mostlyclean;
                    missing=clean;
@@ -601,6 +602,8 @@ languages = { language=objc;        gcc-check-target=check-objc;
 languages = { language=obj-c++;        gcc-check-target=check-obj-c++; };
 languages = { language=go;     gcc-check-target=check-go;
                                lib-check-target=check-target-libgo; };
+languages = { language=brig;   gcc-check-target=check-brig;
+                               lib-check-target=check-target-libhsail-rt; };
 
 // Toplevel bootstrap
 bootstrap_stage = { id=1 ; };
index 66f6c68b167f8ba515dacfe90a86d9fda8afca59..1c0b9e7cdda9d72087d7d4b7ecc97261b83b2a80 100644 (file)
@@ -993,6 +993,7 @@ configure-target:  \
     maybe-configure-target-libgfortran \
     maybe-configure-target-libobjc \
     maybe-configure-target-libgo \
+    maybe-configure-target-libhsail-rt \
     maybe-configure-target-libtermcap \
     maybe-configure-target-winsup \
     maybe-configure-target-libgloss \
@@ -1158,6 +1159,7 @@ all-target: maybe-all-target-libquadmath
 all-target: maybe-all-target-libgfortran
 all-target: maybe-all-target-libobjc
 all-target: maybe-all-target-libgo
+all-target: maybe-all-target-libhsail-rt
 all-target: maybe-all-target-libtermcap
 all-target: maybe-all-target-winsup
 all-target: maybe-all-target-libgloss
@@ -1250,6 +1252,7 @@ info-target: maybe-info-target-libquadmath
 info-target: maybe-info-target-libgfortran
 info-target: maybe-info-target-libobjc
 info-target: maybe-info-target-libgo
+info-target: maybe-info-target-libhsail-rt
 info-target: maybe-info-target-libtermcap
 info-target: maybe-info-target-winsup
 info-target: maybe-info-target-libgloss
@@ -1335,6 +1338,7 @@ dvi-target: maybe-dvi-target-libquadmath
 dvi-target: maybe-dvi-target-libgfortran
 dvi-target: maybe-dvi-target-libobjc
 dvi-target: maybe-dvi-target-libgo
+dvi-target: maybe-dvi-target-libhsail-rt
 dvi-target: maybe-dvi-target-libtermcap
 dvi-target: maybe-dvi-target-winsup
 dvi-target: maybe-dvi-target-libgloss
@@ -1420,6 +1424,7 @@ pdf-target: maybe-pdf-target-libquadmath
 pdf-target: maybe-pdf-target-libgfortran
 pdf-target: maybe-pdf-target-libobjc
 pdf-target: maybe-pdf-target-libgo
+pdf-target: maybe-pdf-target-libhsail-rt
 pdf-target: maybe-pdf-target-libtermcap
 pdf-target: maybe-pdf-target-winsup
 pdf-target: maybe-pdf-target-libgloss
@@ -1505,6 +1510,7 @@ html-target: maybe-html-target-libquadmath
 html-target: maybe-html-target-libgfortran
 html-target: maybe-html-target-libobjc
 html-target: maybe-html-target-libgo
+html-target: maybe-html-target-libhsail-rt
 html-target: maybe-html-target-libtermcap
 html-target: maybe-html-target-winsup
 html-target: maybe-html-target-libgloss
@@ -1590,6 +1596,7 @@ TAGS-target: maybe-TAGS-target-libquadmath
 TAGS-target: maybe-TAGS-target-libgfortran
 TAGS-target: maybe-TAGS-target-libobjc
 TAGS-target: maybe-TAGS-target-libgo
+TAGS-target: maybe-TAGS-target-libhsail-rt
 TAGS-target: maybe-TAGS-target-libtermcap
 TAGS-target: maybe-TAGS-target-winsup
 TAGS-target: maybe-TAGS-target-libgloss
@@ -1675,6 +1682,7 @@ install-info-target: maybe-install-info-target-libquadmath
 install-info-target: maybe-install-info-target-libgfortran
 install-info-target: maybe-install-info-target-libobjc
 install-info-target: maybe-install-info-target-libgo
+install-info-target: maybe-install-info-target-libhsail-rt
 install-info-target: maybe-install-info-target-libtermcap
 install-info-target: maybe-install-info-target-winsup
 install-info-target: maybe-install-info-target-libgloss
@@ -1760,6 +1768,7 @@ install-pdf-target: maybe-install-pdf-target-libquadmath
 install-pdf-target: maybe-install-pdf-target-libgfortran
 install-pdf-target: maybe-install-pdf-target-libobjc
 install-pdf-target: maybe-install-pdf-target-libgo
+install-pdf-target: maybe-install-pdf-target-libhsail-rt
 install-pdf-target: maybe-install-pdf-target-libtermcap
 install-pdf-target: maybe-install-pdf-target-winsup
 install-pdf-target: maybe-install-pdf-target-libgloss
@@ -1845,6 +1854,7 @@ install-html-target: maybe-install-html-target-libquadmath
 install-html-target: maybe-install-html-target-libgfortran
 install-html-target: maybe-install-html-target-libobjc
 install-html-target: maybe-install-html-target-libgo
+install-html-target: maybe-install-html-target-libhsail-rt
 install-html-target: maybe-install-html-target-libtermcap
 install-html-target: maybe-install-html-target-winsup
 install-html-target: maybe-install-html-target-libgloss
@@ -1930,6 +1940,7 @@ installcheck-target: maybe-installcheck-target-libquadmath
 installcheck-target: maybe-installcheck-target-libgfortran
 installcheck-target: maybe-installcheck-target-libobjc
 installcheck-target: maybe-installcheck-target-libgo
+installcheck-target: maybe-installcheck-target-libhsail-rt
 installcheck-target: maybe-installcheck-target-libtermcap
 installcheck-target: maybe-installcheck-target-winsup
 installcheck-target: maybe-installcheck-target-libgloss
@@ -2015,6 +2026,7 @@ mostlyclean-target: maybe-mostlyclean-target-libquadmath
 mostlyclean-target: maybe-mostlyclean-target-libgfortran
 mostlyclean-target: maybe-mostlyclean-target-libobjc
 mostlyclean-target: maybe-mostlyclean-target-libgo
+mostlyclean-target: maybe-mostlyclean-target-libhsail-rt
 mostlyclean-target: maybe-mostlyclean-target-libtermcap
 mostlyclean-target: maybe-mostlyclean-target-winsup
 mostlyclean-target: maybe-mostlyclean-target-libgloss
@@ -2100,6 +2112,7 @@ clean-target: maybe-clean-target-libquadmath
 clean-target: maybe-clean-target-libgfortran
 clean-target: maybe-clean-target-libobjc
 clean-target: maybe-clean-target-libgo
+clean-target: maybe-clean-target-libhsail-rt
 clean-target: maybe-clean-target-libtermcap
 clean-target: maybe-clean-target-winsup
 clean-target: maybe-clean-target-libgloss
@@ -2185,6 +2198,7 @@ distclean-target: maybe-distclean-target-libquadmath
 distclean-target: maybe-distclean-target-libgfortran
 distclean-target: maybe-distclean-target-libobjc
 distclean-target: maybe-distclean-target-libgo
+distclean-target: maybe-distclean-target-libhsail-rt
 distclean-target: maybe-distclean-target-libtermcap
 distclean-target: maybe-distclean-target-winsup
 distclean-target: maybe-distclean-target-libgloss
@@ -2270,6 +2284,7 @@ maintainer-clean-target: maybe-maintainer-clean-target-libquadmath
 maintainer-clean-target: maybe-maintainer-clean-target-libgfortran
 maintainer-clean-target: maybe-maintainer-clean-target-libobjc
 maintainer-clean-target: maybe-maintainer-clean-target-libgo
+maintainer-clean-target: maybe-maintainer-clean-target-libhsail-rt
 maintainer-clean-target: maybe-maintainer-clean-target-libtermcap
 maintainer-clean-target: maybe-maintainer-clean-target-winsup
 maintainer-clean-target: maybe-maintainer-clean-target-libgloss
@@ -2411,6 +2426,7 @@ check-target:  \
     maybe-check-target-libgfortran \
     maybe-check-target-libobjc \
     maybe-check-target-libgo \
+    maybe-check-target-libhsail-rt \
     maybe-check-target-libtermcap \
     maybe-check-target-winsup \
     maybe-check-target-libgloss \
@@ -2592,6 +2608,7 @@ install-target:  \
     maybe-install-target-libgfortran \
     maybe-install-target-libobjc \
     maybe-install-target-libgo \
+    maybe-install-target-libhsail-rt \
     maybe-install-target-libtermcap \
     maybe-install-target-winsup \
     maybe-install-target-libgloss \
@@ -2697,6 +2714,7 @@ install-strip-target:  \
     maybe-install-strip-target-libgfortran \
     maybe-install-strip-target-libobjc \
     maybe-install-strip-target-libgo \
+    maybe-install-strip-target-libhsail-rt \
     maybe-install-strip-target-libtermcap \
     maybe-install-strip-target-winsup \
     maybe-install-strip-target-libgloss \
@@ -46096,6 +46114,464 @@ maintainer-clean-target-libgo:
 
 
 
+.PHONY: configure-target-libhsail-rt maybe-configure-target-libhsail-rt
+maybe-configure-target-libhsail-rt:
+@if gcc-bootstrap
+configure-target-libhsail-rt: stage_current
+@endif gcc-bootstrap
+@if target-libhsail-rt
+maybe-configure-target-libhsail-rt: configure-target-libhsail-rt
+configure-target-libhsail-rt: 
+       @: $(MAKE); $(unstage)
+       @r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       echo "Checking multilib configuration for libhsail-rt..."; \
+       $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libhsail-rt; \
+       $(CC_FOR_TARGET) --print-multi-lib > $(TARGET_SUBDIR)/libhsail-rt/multilib.tmp 2> /dev/null; \
+       if test -r $(TARGET_SUBDIR)/libhsail-rt/multilib.out; then \
+         if cmp -s $(TARGET_SUBDIR)/libhsail-rt/multilib.tmp $(TARGET_SUBDIR)/libhsail-rt/multilib.out; then \
+           rm -f $(TARGET_SUBDIR)/libhsail-rt/multilib.tmp; \
+         else \
+           rm -f $(TARGET_SUBDIR)/libhsail-rt/Makefile; \
+           mv $(TARGET_SUBDIR)/libhsail-rt/multilib.tmp $(TARGET_SUBDIR)/libhsail-rt/multilib.out; \
+         fi; \
+       else \
+         mv $(TARGET_SUBDIR)/libhsail-rt/multilib.tmp $(TARGET_SUBDIR)/libhsail-rt/multilib.out; \
+       fi; \
+       test ! -f $(TARGET_SUBDIR)/libhsail-rt/Makefile || exit 0; \
+       $(SHELL) $(srcdir)/mkinstalldirs $(TARGET_SUBDIR)/libhsail-rt; \
+       $(NORMAL_TARGET_EXPORTS)  \
+       echo Configuring in $(TARGET_SUBDIR)/libhsail-rt; \
+       cd "$(TARGET_SUBDIR)/libhsail-rt" || exit 1; \
+       case $(srcdir) in \
+         /* | [A-Za-z]:[\\/]*) topdir=$(srcdir) ;; \
+         *) topdir=`echo $(TARGET_SUBDIR)/libhsail-rt/ | \
+               sed -e 's,\./,,g' -e 's,[^/]*/,../,g' `$(srcdir) ;; \
+       esac; \
+       module_srcdir=libhsail-rt; \
+       rm -f no-such-file || : ; \
+       CONFIG_SITE=no-such-file $(SHELL) \
+         $$s/$$module_srcdir/configure \
+         --srcdir=$${topdir}/$$module_srcdir \
+         $(TARGET_CONFIGARGS) --build=${build_alias} --host=${target_alias} \
+         --target=${target_alias}  \
+         || exit 1
+@endif target-libhsail-rt
+
+
+
+
+
+.PHONY: all-target-libhsail-rt maybe-all-target-libhsail-rt
+maybe-all-target-libhsail-rt:
+@if gcc-bootstrap
+all-target-libhsail-rt: stage_current
+@endif gcc-bootstrap
+@if target-libhsail-rt
+TARGET-target-libhsail-rt=all
+maybe-all-target-libhsail-rt: all-target-libhsail-rt
+all-target-libhsail-rt: configure-target-libhsail-rt
+       @: $(MAKE); $(unstage)
+       @r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS)  \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS)   \
+               $(TARGET-target-libhsail-rt))
+@endif target-libhsail-rt
+
+
+
+
+
+.PHONY: check-target-libhsail-rt maybe-check-target-libhsail-rt
+maybe-check-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-check-target-libhsail-rt: check-target-libhsail-rt
+
+check-target-libhsail-rt:
+       @: $(MAKE); $(unstage)
+       @r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(TARGET_FLAGS_TO_PASS)   check)
+
+@endif target-libhsail-rt
+
+.PHONY: install-target-libhsail-rt maybe-install-target-libhsail-rt
+maybe-install-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-install-target-libhsail-rt: install-target-libhsail-rt
+
+install-target-libhsail-rt: installdirs
+       @: $(MAKE); $(unstage)
+       @r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(TARGET_FLAGS_TO_PASS)  install)
+
+@endif target-libhsail-rt
+
+.PHONY: install-strip-target-libhsail-rt maybe-install-strip-target-libhsail-rt
+maybe-install-strip-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-install-strip-target-libhsail-rt: install-strip-target-libhsail-rt
+
+install-strip-target-libhsail-rt: installdirs
+       @: $(MAKE); $(unstage)
+       @r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(TARGET_FLAGS_TO_PASS)  install-strip)
+
+@endif target-libhsail-rt
+
+# Other targets (info, dvi, pdf, etc.)
+
+.PHONY: maybe-info-target-libhsail-rt info-target-libhsail-rt
+maybe-info-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-info-target-libhsail-rt: info-target-libhsail-rt
+
+info-target-libhsail-rt: \
+    configure-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing info in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  info) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-dvi-target-libhsail-rt dvi-target-libhsail-rt
+maybe-dvi-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-dvi-target-libhsail-rt: dvi-target-libhsail-rt
+
+dvi-target-libhsail-rt: \
+    configure-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing dvi in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  dvi) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-pdf-target-libhsail-rt pdf-target-libhsail-rt
+maybe-pdf-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-pdf-target-libhsail-rt: pdf-target-libhsail-rt
+
+pdf-target-libhsail-rt: \
+    configure-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing pdf in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  pdf) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-html-target-libhsail-rt html-target-libhsail-rt
+maybe-html-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-html-target-libhsail-rt: html-target-libhsail-rt
+
+html-target-libhsail-rt: \
+    configure-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing html in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  html) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-TAGS-target-libhsail-rt TAGS-target-libhsail-rt
+maybe-TAGS-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-TAGS-target-libhsail-rt: TAGS-target-libhsail-rt
+
+TAGS-target-libhsail-rt: \
+    configure-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing TAGS in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  TAGS) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-install-info-target-libhsail-rt install-info-target-libhsail-rt
+maybe-install-info-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-install-info-target-libhsail-rt: install-info-target-libhsail-rt
+
+install-info-target-libhsail-rt: \
+    configure-target-libhsail-rt \
+    info-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing install-info in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  install-info) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-install-pdf-target-libhsail-rt install-pdf-target-libhsail-rt
+maybe-install-pdf-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-install-pdf-target-libhsail-rt: install-pdf-target-libhsail-rt
+
+install-pdf-target-libhsail-rt: \
+    configure-target-libhsail-rt \
+    pdf-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing install-pdf in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  install-pdf) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-install-html-target-libhsail-rt install-html-target-libhsail-rt
+maybe-install-html-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-install-html-target-libhsail-rt: install-html-target-libhsail-rt
+
+install-html-target-libhsail-rt: \
+    configure-target-libhsail-rt \
+    html-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing install-html in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  install-html) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-installcheck-target-libhsail-rt installcheck-target-libhsail-rt
+maybe-installcheck-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-installcheck-target-libhsail-rt: installcheck-target-libhsail-rt
+
+installcheck-target-libhsail-rt: \
+    configure-target-libhsail-rt 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing installcheck in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  installcheck) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-mostlyclean-target-libhsail-rt mostlyclean-target-libhsail-rt
+maybe-mostlyclean-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-mostlyclean-target-libhsail-rt: mostlyclean-target-libhsail-rt
+
+mostlyclean-target-libhsail-rt: 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing mostlyclean in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  mostlyclean) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-clean-target-libhsail-rt clean-target-libhsail-rt
+maybe-clean-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-clean-target-libhsail-rt: clean-target-libhsail-rt
+
+clean-target-libhsail-rt: 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing clean in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  clean) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-distclean-target-libhsail-rt distclean-target-libhsail-rt
+maybe-distclean-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-distclean-target-libhsail-rt: distclean-target-libhsail-rt
+
+distclean-target-libhsail-rt: 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing distclean in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  distclean) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+.PHONY: maybe-maintainer-clean-target-libhsail-rt maintainer-clean-target-libhsail-rt
+maybe-maintainer-clean-target-libhsail-rt:
+@if target-libhsail-rt
+maybe-maintainer-clean-target-libhsail-rt: maintainer-clean-target-libhsail-rt
+
+maintainer-clean-target-libhsail-rt: 
+       @: $(MAKE); $(unstage)
+       @[ -f $(TARGET_SUBDIR)/libhsail-rt/Makefile ] || exit 0; \
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(NORMAL_TARGET_EXPORTS) \
+       echo "Doing maintainer-clean in $(TARGET_SUBDIR)/libhsail-rt"; \
+       for flag in $(EXTRA_TARGET_FLAGS); do \
+         eval `echo "$$flag" | sed -e "s|^\([^=]*\)=\(.*\)|\1='\2'; export \1|"`; \
+       done; \
+       (cd $(TARGET_SUBDIR)/libhsail-rt && \
+         $(MAKE) $(BASE_FLAGS_TO_PASS) "AR=$${AR}" "AS=$${AS}" \
+                 "CC=$${CC}" "CXX=$${CXX}" "LD=$${LD}" "NM=$${NM}" \
+                 "RANLIB=$${RANLIB}" \
+                 "DLLTOOL=$${DLLTOOL}" "WINDRES=$${WINDRES}" "WINDMC=$${WINDMC}" \
+                  maintainer-clean) \
+         || exit 1
+
+@endif target-libhsail-rt
+
+
+
+
+
 .PHONY: configure-target-libtermcap maybe-configure-target-libtermcap
 maybe-configure-target-libtermcap:
 @if gcc-bootstrap
@@ -51382,6 +51858,14 @@ check-gcc-go:
        (cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-go);
 check-go: check-gcc-go check-target-libgo
 
+.PHONY: check-gcc-brig check-brig
+check-gcc-brig:
+       r=`${PWD_COMMAND}`; export r; \
+       s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+       $(HOST_EXPORTS) \
+       (cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-brig);
+check-brig: check-gcc-brig check-target-libhsail-rt
+
 
 # The gcc part of install-no-fixedincludes, which relies on an intimate
 # knowledge of how a number of gcc internal targets (inter)operate.  Delegate.
@@ -54259,6 +54743,7 @@ configure-target-libquadmath: stage_last
 configure-target-libgfortran: stage_last
 configure-target-libobjc: stage_last
 configure-target-libgo: stage_last
+configure-target-libhsail-rt: stage_last
 configure-target-libtermcap: stage_last
 configure-target-winsup: stage_last
 configure-target-libgloss: stage_last
@@ -54293,6 +54778,7 @@ configure-target-libquadmath: maybe-all-gcc
 configure-target-libgfortran: maybe-all-gcc
 configure-target-libobjc: maybe-all-gcc
 configure-target-libgo: maybe-all-gcc
+configure-target-libhsail-rt: maybe-all-gcc
 configure-target-libtermcap: maybe-all-gcc
 configure-target-winsup: maybe-all-gcc
 configure-target-libgloss: maybe-all-gcc
@@ -55445,6 +55931,7 @@ configure-target-libquadmath: maybe-all-target-libgcc
 configure-target-libgfortran: maybe-all-target-libgcc
 configure-target-libobjc: maybe-all-target-libgcc
 configure-target-libgo: maybe-all-target-libgcc
+configure-target-libhsail-rt: maybe-all-target-libgcc
 configure-target-libtermcap: maybe-all-target-libgcc
 configure-target-winsup: maybe-all-target-libgcc
 configure-target-libgloss: maybe-all-target-libgcc
@@ -55486,6 +55973,8 @@ configure-target-libobjc: maybe-all-target-newlib maybe-all-target-libgloss
 
 configure-target-libgo: maybe-all-target-newlib maybe-all-target-libgloss
 
+configure-target-libhsail-rt: maybe-all-target-newlib maybe-all-target-libgloss
+
 configure-target-libtermcap: maybe-all-target-newlib maybe-all-target-libgloss
 
 configure-target-winsup: maybe-all-target-newlib maybe-all-target-libgloss
index 60532fe4c1bca97e6ce77c95678fa07fa8313b1b..d7573690383d50b802cb99d95d0e7983ec785c32 100755 (executable)
--- a/configure
+++ b/configure
@@ -2754,6 +2754,7 @@ target_libraries="target-libgcc \
                target-libgomp \
                target-libcilkrts \
                target-liboffloadmic \
+               target-libhsail-rt \
                target-libatomic \
                target-libitm \
                target-libstdc++-v3 \
@@ -3482,6 +3483,19 @@ if test x$enable_libgo = x; then
     esac
 fi
 
+# Disable the BRIG frontend and libhsail-rt on untested or known
+# broken systems. Currently it has been tested only on x86_64 Linux
+# of the upstream gcc targets. More targets shall be added after testing.
+case "${target}" in
+  x86_64-*-linux*)
+    ;;
+    *)
+    unsupported_languages="$unsupported_languages brig"
+    # This implicitly disables also target-libhsail-rt as it won't
+    # get added to the build without BRIG FE.
+    ;;
+esac
+
 # Default libgloss CPU subdirectory.
 libgloss_dir="$target_cpu"
 
index 0d6efcfe3a28e8b49dffe9d4e4042652c39c72b7..5818332c7fc8de49395206493edfba1e85a56091 100644 (file)
@@ -152,6 +152,7 @@ target_libraries="target-libgcc \
                target-libgomp \
                target-libcilkrts \
                target-liboffloadmic \
+               target-libhsail-rt \
                target-libatomic \
                target-libitm \
                target-libstdc++-v3 \
@@ -812,6 +813,19 @@ if test x$enable_libgo = x; then
     esac
 fi
 
+# Disable the BRIG frontend and libhsail-rt on untested or known
+# broken systems. Currently it has been tested only on x86_64 Linux
+# of the upstream gcc targets. More targets shall be added after testing.
+case "${target}" in
+  x86_64-*-linux*)
+    ;;
+    *)
+    unsupported_languages="$unsupported_languages brig"
+    # This implicitly disables also target-libhsail-rt as it won't
+    # get added to the build without BRIG FE.
+    ;;
+esac
+
 # Default libgloss CPU subdirectory.
 libgloss_dir="$target_cpu"
 
index 016f7039141658bc448eb84ea17fa09aaab75708..f638e952fee26369f20c9c24848ccc7498d44d66 100644 (file)
@@ -1,3 +1,66 @@
+2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
+           Martin Jambor  <mjambor@suse.cz>
+
+       * brig-builtins.def: New file.
+       * builtins.def (DEF_HSAIL_BUILTIN): New macro.
+       (DEF_HSAIL_ATOMIC_BUILTIN): Likewise.
+       (DEF_HSAIL_SAT_BUILTIN): Likewise.
+       (DEF_HSAIL_INTR_BUILTIN): Likewise.
+       (DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN): Likewise.
+       * builtin-types.def (BT_INT8): New.
+       (BT_INT16): Likewise.
+       (BT_UINT8): Likewise.
+       (BT_UINT16): Likewise.
+       (BT_FN_ULONG): Likewise.
+       (BT_FN_UINT_INT): Likewise.
+       (BT_FN_UINT_ULONG): Likewise.
+       (BT_FN_UINT_LONG): Likewise.
+       (BT_FN_UINT_PTR): Likewise.
+       (BT_FN_ULONG_PTR): Likewise.
+       (BT_FN_INT8_FLOAT): Likewise.
+       (BT_FN_INT16_FLOAT): Likewise.
+       (BT_FN_UINT32_FLOAT): Likewise.
+       (BT_FN_UINT16_FLOAT): Likewise.
+       (BT_FN_UINT8_FLOAT): Likewise.
+       (BT_FN_UINT64_FLOAT): Likewise.
+       (BT_FN_UINT16_UINT32): Likewise.
+       (BT_FN_UINT32_UINT16): Likewise.
+       (BT_FN_UINT16_UINT16_UINT16): Likewise.
+       (BT_FN_INT_PTR_INT): Likewise.
+       (BT_FN_UINT_PTR_UINT): Likewise.
+       (BT_FN_LONG_PTR_LONG): Likewise.
+       (BT_FN_ULONG_PTR_ULONG): Likewise.
+       (BT_FN_VOID_UINT64_UINT64): Likewise.
+       (BT_FN_UINT8_UINT8_UINT8): Likewise.
+       (BT_FN_INT8_INT8_INT8): Likewise.
+       (BT_FN_INT16_INT16_INT16): Likewise.
+       (BT_FN_INT_INT_INT): Likewise.
+       (BT_FN_UINT_FLOAT_UINT): Likewise.
+       (BT_FN_FLOAT_UINT_UINT): Likewise.
+       (BT_FN_ULONG_UINT_UINT): Likewise.
+       (BT_FN_ULONG_UINT_PTR): Likewise.
+       (BT_FN_ULONG_ULONG_ULONG): Likewise.
+       (BT_FN_UINT_UINT_UINT): Likewise.
+       (BT_FN_VOID_UINT_PTR): Likewise.
+       (BT_FN_UINT_UINT_PTR: Likewise.
+       (BT_FN_UINT32_UINT64_PTR): Likewise.
+       (BT_FN_INT_INT_UINT_UINT): Likewise.
+       (BT_FN_UINT_UINT_UINT_UINT): Likewise.
+       (BT_FN_UINT_UINT_UINT_PTR): Likewise.
+       (BT_FN_UINT_ULONG_ULONG_UINT): Likewise.
+       (BT_FN_ULONG_ULONG_ULONG_ULONG): Likewise.
+       (BT_FN_LONG_LONG_UINT_UINT): Likewise.
+       (BT_FN_ULONG_ULONG_UINT_UINT): Likewise.
+       (BT_FN_VOID_UINT32_UINT64_PTR): Likewise.
+       (BT_FN_VOID_UINT32_UINT32_PTR): Likewise.
+       (BT_FN_UINT_UINT_UINT_UINT_UINT): Likewise.
+       (BT_FN_UINT_FLOAT_FLOAT_FLOAT_FLOAT): Likewise.
+       (BT_FN_ULONG_ULONG_ULONG_UINT_UINT): Likewise.
+       * doc/frontends.texi: List BRIG FE.
+       * doc/install.texi (Testing): Add BRIG tesring requirements.
+       * doc/invoke.texi (Overall Options): Mention BRIG.
+       * doc/standards.texi (Standards): Doucment BRIG HSA version.
+
 2017-01-24  Richard Biener  <rguenther@suse.de>
 
        PR translation/79208
diff --git a/gcc/brig-builtins.def b/gcc/brig-builtins.def
new file mode 100644 (file)
index 0000000..329c88e
--- /dev/null
@@ -0,0 +1,659 @@
+/* This file contains the definitions and documentation for the
+   HSAIL builtins used in the GNU compiler.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+/* Following builtins are used by the BRIG (the binary representation of
+   HSAIL) frontend.  Software implementations are available in libhsail-rt.
+   Use leading double underscore in the name to avoid name space clashes
+   with kernel program symbols in case the builtin is implemented as
+   a function call.  */
+
+/* Work-item ID related builtins are not constant in the work-group function
+   mode (each WI has a different return value).  */
+
+#ifndef DEF_HSAIL_BUILTIN
+#define DEF_HSAIL_BUILTIN(ENUM, HSAIL_OPCODE, HSAIL_TYPE,      \
+                         NAME, TYPE, ATTRS)
+#endif
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKITEMABSID, BRIG_OPCODE_WORKITEMABSID,
+                 BRIG_TYPE_U32, "__hsail_workitemabsid", BT_FN_UINT_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_GRIDSIZE, BRIG_OPCODE_GRIDSIZE,
+                 BRIG_TYPE_U32, "__hsail_gridsize", BT_FN_UINT_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKITEMFLATABSID_U32,
+                 BRIG_OPCODE_WORKITEMFLATABSID, BRIG_TYPE_U32,
+                 "__hsail_workitemflatabsid_u32", BT_FN_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKITEMFLATABSID_U64,
+                 BRIG_OPCODE_WORKITEMFLATABSID, BRIG_TYPE_U64,
+                 "__hsail_workitemflatabsid_u64", BT_FN_ULONG_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKITEMFLATID, BRIG_OPCODE_WORKITEMFLATID,
+                 BRIG_TYPE_U32, "__hsail_workitemflatid", BT_FN_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKITEMID, BRIG_OPCODE_WORKITEMID,
+                 BRIG_TYPE_U32, "__hsail_workitemid", BT_FN_UINT_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKGROUPID, BRIG_OPCODE_WORKGROUPID,
+                 BRIG_TYPE_U32, "__hsail_workgroupid", BT_FN_UINT_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CURRENTWORKITEMFLATID,
+                 BRIG_OPCODE_CURRENTWORKITEMFLATID,
+                 BRIG_TYPE_U32, "__hsail_currentworkitemflatid",
+                 BT_FN_UINT_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKITEMABSID_U64, BRIG_OPCODE_WORKITEMABSID,
+                 BRIG_TYPE_U64, "__hsail_workitemabsid_u64",
+                 BT_FN_ULONG_UINT_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_PACKETID, BRIG_OPCODE_PACKETID,
+                 BRIG_TYPE_U64, "__hsail_packetid", BT_FN_ULONG_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_PACKETCOMPLETIONSIG_SIG64,
+                 BRIG_OPCODE_PACKETCOMPLETIONSIG, BRIG_TYPE_SIG64,
+                 "__hsail_packetcompletionsig_sig64", BT_FN_ULONG_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_PACKETCOMPLETIONSIG_SIG32,
+                 BRIG_OPCODE_PACKETCOMPLETIONSIG, BRIG_TYPE_SIG32,
+                 "__hsail_packetcompletionsig_sig32", BT_FN_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CURRENTWORKGROUPSIZE,
+                 BRIG_OPCODE_CURRENTWORKGROUPSIZE, BRIG_TYPE_U32,
+                 "__hsail_currentworkgroupsize", BT_FN_UINT_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WORKGROUPSIZE, BRIG_OPCODE_WORKGROUPSIZE,
+                 BRIG_TYPE_U32, "__hsail_workgroupsize", BT_FN_UINT_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_DIM, BRIG_OPCODE_DIM,
+                 BRIG_TYPE_U32, "__hsail_dim", BT_FN_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_GRIDGROUPS, BRIG_OPCODE_GRIDGROUPS,
+                 BRIG_TYPE_U32, "__hsail_gridgroups", BT_FN_UINT_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITEXTRACT_S32, BRIG_OPCODE_BITEXTRACT,
+                 BRIG_TYPE_S32, "__hsail_bitextract_s32",
+                 BT_FN_INT_INT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITEXTRACT_U32, BRIG_OPCODE_BITEXTRACT,
+                 BRIG_TYPE_U32, "__hsail_bitextract_u32",
+                 BT_FN_UINT_UINT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITEXTRACT_S64, BRIG_OPCODE_BITEXTRACT,
+                 BRIG_TYPE_S64, "__hsail_bitextract_s64",
+                 BT_FN_LONG_LONG_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITEXTRACT_U64, BRIG_OPCODE_BITEXTRACT,
+                 BRIG_TYPE_U64, "__hsail_bitextract_u64",
+                 BT_FN_ULONG_ULONG_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITINSERT_U32, BRIG_OPCODE_BITINSERT,
+                 BRIG_TYPE_U32, "__hsail_bitinsert_u32",
+                 BT_FN_UINT_UINT_UINT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITINSERT_U64, BRIG_OPCODE_BITINSERT,
+                 BRIG_TYPE_U64, "__hsail_bitinsert_u64",
+                 BT_FN_ULONG_ULONG_ULONG_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITMASK_B32, BRIG_OPCODE_BITMASK,
+                 BRIG_TYPE_B32, "__hsail_bitmask_u32", BT_FN_UINT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITMASK_B64, BRIG_OPCODE_BITMASK,
+                 BRIG_TYPE_B64, "__hsail_bitmask_u64", BT_FN_ULONG_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITREV_B32, BRIG_OPCODE_BITREV,
+                 BRIG_TYPE_B32, "__hsail_bitrev_u32", BT_FN_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITREV_B64, BRIG_OPCODE_BITREV,
+                 BRIG_TYPE_B64, "__hsail_bitrev_u64", BT_FN_ULONG_ULONG,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITSELECT_B32, BRIG_OPCODE_BITSELECT,
+                 BRIG_TYPE_B32, "__hsail_bitselect_u32",
+                 BT_FN_UINT_UINT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITSELECT_U64, BRIG_OPCODE_BITSELECT,
+                 BRIG_TYPE_B64, "__hsail_bitselect_u64",
+                 BT_FN_ULONG_ULONG_ULONG_ULONG, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_FIRSTBIT_U32, BRIG_OPCODE_FIRSTBIT,
+                 BRIG_TYPE_U32, "__hsail_firstbit_u32", BT_FN_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_FIRSTBIT_S32, BRIG_OPCODE_FIRSTBIT,
+                 BRIG_TYPE_S32, "__hsail_firstbit_s32", BT_FN_UINT_INT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_FIRSTBIT_U64, BRIG_OPCODE_FIRSTBIT,
+                 BRIG_TYPE_U64, "__hsail_firstbit_u64", BT_FN_UINT_ULONG,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_FIRSTBIT_S64, BRIG_OPCODE_FIRSTBIT,
+                 BRIG_TYPE_S64, "__hsail_firstbit_s64", BT_FN_UINT_LONG,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_LASTBIT_U32, BRIG_OPCODE_LASTBIT,
+                 BRIG_TYPE_U32, "__hsail_lastbit_u32", BT_FN_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_LASTBIT_U64, BRIG_OPCODE_LASTBIT,
+                 BRIG_TYPE_U64, "__hsail_lastbit_u64", BT_FN_UINT_ULONG,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BORROW_U32, BRIG_OPCODE_BORROW,
+                 BRIG_TYPE_U32, "__hsail_borrow_u32", BT_FN_UINT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BORROW_U64, BRIG_OPCODE_BORROW,
+                 BRIG_TYPE_U64, "__hsail_borrow_u64", BT_FN_ULONG_ULONG_ULONG,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CARRY_U32, BRIG_OPCODE_CARRY,
+                 BRIG_TYPE_U32, "__hsail_carry_u32", BT_FN_UINT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CARRY_U64, BRIG_OPCODE_CARRY,
+                 BRIG_TYPE_U64, "__hsail_carry_u64", BT_FN_ULONG_ULONG_ULONG,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_REM_S32, BRIG_OPCODE_REM,
+                 BRIG_TYPE_S32, "__hsail_rem_s32", BT_FN_INT_INT_INT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_REM_S64, BRIG_OPCODE_REM,
+                 BRIG_TYPE_S64, "__hsail_rem_s64", BT_FN_LONG_LONG_LONG,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_MIN_F32, BRIG_OPCODE_MIN,
+                 BRIG_TYPE_F32, "__hsail_min_f32", BT_FN_FLOAT_FLOAT_FLOAT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_MAX_F32, BRIG_OPCODE_MAX,
+                 BRIG_TYPE_F32, "__hsail_max_f32", BT_FN_FLOAT_FLOAT_FLOAT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_MIN_F64, BRIG_OPCODE_MIN,
+                 BRIG_TYPE_F64, "__hsail_min_f64", BT_FN_DOUBLE_DOUBLE_DOUBLE,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_MAX_F64, BRIG_OPCODE_MAX,
+                 BRIG_TYPE_F64, "__hsail_max_f64", BT_FN_DOUBLE_DOUBLE_DOUBLE,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CLASS_F32, BRIG_OPCODE_CLASS,
+                 BRIG_TYPE_F32, "__hsail_class_f32", BT_FN_UINT_FLOAT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CLASS_F32_F16, BRIG_OPCODE_CLASS,
+                 BRIG_TYPE_F16, "__hsail_class_f32_f16", BT_FN_UINT_FLOAT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_FRACT_F32, BRIG_OPCODE_FRACT,
+                 BRIG_TYPE_F32, "__hsail_fract_f32", BT_FN_FLOAT_FLOAT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_FRACT_F64, BRIG_OPCODE_FRACT,
+                 BRIG_TYPE_F64, "__hsail_fract_f64", BT_FN_DOUBLE_DOUBLE,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BARRIER, BRIG_OPCODE_BARRIER,
+                 BRIG_TYPE_NONE, "__hsail_barrier", BT_FN_VOID_PTR,
+                 ATTR_NOTHROW_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_INITFBAR, BRIG_OPCODE_INITFBAR,
+                 BRIG_TYPE_NONE, "__hsail_initfbar", BT_FN_VOID_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_JOINFBAR, BRIG_OPCODE_JOINFBAR,
+                 BRIG_TYPE_NONE, "__hsail_joinfbar", BT_FN_VOID_UINT_PTR,
+                 ATTR_NOTHROW_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_WAITFBAR, BRIG_OPCODE_WAITFBAR,
+                 BRIG_TYPE_NONE, "__hsail_waitfbar", BT_FN_VOID_UINT_PTR,
+                 ATTR_NOTHROW_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_ARRIVEFBAR, BRIG_OPCODE_ARRIVEFBAR,
+                 BRIG_TYPE_NONE, "__hsail_arrivefbar", BT_FN_VOID_UINT_PTR,
+                 ATTR_NOTHROW_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_LEAVEFBAR, BRIG_OPCODE_LEAVEFBAR,
+                 BRIG_TYPE_NONE, "__hsail_leavefbar", BT_FN_VOID_UINT_PTR,
+                 ATTR_NOTHROW_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_RELEASEFBAR, BRIG_OPCODE_RELEASEFBAR,
+                 BRIG_TYPE_NONE, "__hsail_releasefbar", BT_FN_VOID_UINT_PTR,
+                 ATTR_NOTHROW_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BITALIGN, BRIG_OPCODE_BITALIGN,
+                 BRIG_TYPE_B32, "__hsail_bitalign",
+                 BT_FN_UINT_ULONG_ULONG_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_BYTEALIGN, BRIG_OPCODE_BYTEALIGN,
+                 BRIG_TYPE_B32, "__hsail_bytealign",
+                 BT_FN_UINT_ULONG_ULONG_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_LERP, BRIG_OPCODE_LERP,
+                 BRIG_TYPE_U8X4, "__hsail_lerp", BT_FN_UINT_UINT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_PACKCVT, BRIG_OPCODE_PACKCVT,
+                 BRIG_TYPE_U8X4, "__hsail_packcvt",
+                 BT_FN_UINT_FLOAT_FLOAT_FLOAT_FLOAT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_UNPACKCVT, BRIG_OPCODE_UNPACKCVT,
+                 BRIG_TYPE_F32, "__hsail_unpackcvt", BT_FN_FLOAT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_SAD_U16X2, BRIG_OPCODE_SAD,
+                 BRIG_TYPE_U16X2, "__hsail_sad_u16x2",
+                 BT_FN_UINT_UINT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_SAD_U32, BRIG_OPCODE_SAD,
+                 BRIG_TYPE_U32, "__hsail_sad_u32", BT_FN_UINT_UINT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_SAD_U8X4, BRIG_OPCODE_SAD,
+                 BRIG_TYPE_U8X4, "__hsail_sad_u8x4", BT_FN_UINT_UINT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_SADHI_U8X4, BRIG_OPCODE_SADHI,
+                 BRIG_TYPE_U16X2, "__hsail_sadhi_u16x2_u8x4",
+                 BT_FN_UINT_UINT_UINT_UINT,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CLOCK, BRIG_OPCODE_CLOCK,
+                 BRIG_TYPE_U64, "__hsail_clock", BT_FN_ULONG,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CUID, BRIG_OPCODE_CUID,
+                 BRIG_TYPE_U32, "__hsail_cuid", BT_FN_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_MAXCUID, BRIG_OPCODE_MAXCUID,
+                 BRIG_TYPE_U32, "__hsail_maxcuid", BT_FN_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_DEBUGTRAP, BRIG_OPCODE_DEBUGTRAP,
+                 BRIG_TYPE_U32, "__hsail_debugtrap", BT_FN_VOID_UINT_PTR,
+                 ATTR_NORETURN_NOTHROW_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_GROUPBASEPTR, BRIG_OPCODE_GROUPBASEPTR,
+                 BRIG_TYPE_U32, "__hsail_groupbaseptr", BT_FN_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_KERNARGBASEPTR_U64,
+                 BRIG_OPCODE_KERNARGBASEPTR, BRIG_TYPE_U64,
+                 "__hsail_kernargbaseptr_u64", BT_FN_ULONG_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_KERNARGBASEPTR_U32,
+                 BRIG_OPCODE_KERNARGBASEPTR, BRIG_TYPE_U32,
+                 "__hsail_kernargbaseptr_u32", BT_FN_UINT_PTR,
+                 ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_ALLOCA, BRIG_OPCODE_ALLOCA,
+                 BRIG_TYPE_U32, "__hsail_alloca", BT_FN_UINT_UINT_UINT_PTR,
+                 ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_LDQUEUEWRITEINDEX,
+                 BRIG_OPCODE_LDQUEUEWRITEINDEX,
+                 BRIG_TYPE_U64, "__hsail_ldqueuewriteindex",
+                 BT_FN_ULONG_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_LDQUEUEREADINDEX,
+                 BRIG_OPCODE_LDQUEUEREADINDEX,
+                 BRIG_TYPE_U64, "__hsail_ldqueuereadindex",
+                 BT_FN_ULONG_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_STQUEUEWRITEINDEX,
+                 BRIG_OPCODE_STQUEUEWRITEINDEX,
+                 BRIG_TYPE_U64, "__hsail_stqueuewriteindex",
+                 BT_FN_VOID_UINT64_UINT64, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_STQUEUEREADINDEX,
+                 BRIG_OPCODE_STQUEUEREADINDEX,
+                 BRIG_TYPE_U64, "__hsail_stqueuereadindex",
+                 BT_FN_VOID_UINT64_UINT64, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_ADDQUEUEWRITEINDEX,
+                 BRIG_OPCODE_ADDQUEUEWRITEINDEX,
+                 BRIG_TYPE_U64, "__hsail_addqueuewriteindex",
+                 BT_FN_ULONG_ULONG_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_CASQUEUEWRITEINDEX,
+                 BRIG_OPCODE_CASQUEUEWRITEINDEX,
+                 BRIG_TYPE_U64, "__hsail_casqueuewriteindex",
+                 BT_FN_ULONG_ULONG_ULONG_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_SEGMENTP_GLOBAL,
+                 BRIG_OPCODE_SEGMENTP,
+                 BRIG_TYPE_U32, "__hsail_segmentp_global",
+                 BT_FN_UINT32_UINT64_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_SEGMENTP_GROUP,
+                 BRIG_OPCODE_SEGMENTP,
+                 BRIG_TYPE_U32, "__hsail_segmentp_group",
+                 BT_FN_UINT32_UINT64_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_BUILTIN (BUILT_IN_HSAIL_SEGMENTP_PRIVATE,
+                 BRIG_OPCODE_SEGMENTP,
+                 BRIG_TYPE_U32, "__hsail_segmentp_private",
+                 BT_FN_UINT32_UINT64_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+#ifndef DEF_HSAIL_ATOMIC_BUILTIN
+#define DEF_HSAIL_ATOMIC_BUILTIN(ENUM, ATOMIC_OPCODE, HSAIL_TYPE,      \
+                                NAME, TYPE, ATTRS)
+#endif
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MIN_S32, BRIG_ATOMIC_MIN,
+                        BRIG_TYPE_S32, "__hsail_atomic_min_s32",
+                        BT_FN_INT_PTR_INT, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MIN_S64, BRIG_ATOMIC_MIN,
+                        BRIG_TYPE_S64, "__hsail_atomic_min_s64",
+                        BT_FN_LONG_PTR_LONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MIN_U32, BRIG_ATOMIC_MIN,
+                        BRIG_TYPE_U32, "__hsail_atomic_min_u32",
+                        BT_FN_UINT_PTR_UINT, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MIN_U64, BRIG_ATOMIC_MIN,
+                        BRIG_TYPE_U64, "__hsail_atomic_min_u64",
+                        BT_FN_ULONG_PTR_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MAX_S32, BRIG_ATOMIC_MAX,
+                        BRIG_TYPE_S32, "__hsail_atomic_max_s32",
+                        BT_FN_INT_PTR_INT, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MAX_S64, BRIG_ATOMIC_MAX,
+                        BRIG_TYPE_S64, "__hsail_atomic_max_s64",
+                        BT_FN_LONG_PTR_LONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MAX_U32, BRIG_ATOMIC_MAX,
+                        BRIG_TYPE_U32, "__hsail_atomic_max_u32",
+                        BT_FN_UINT_PTR_UINT, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_MAX_U64, BRIG_ATOMIC_MAX,
+                        BRIG_TYPE_U64, "__hsail_atomic_max_u64",
+                        BT_FN_ULONG_PTR_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_WRAPDEC_U32,
+                        BRIG_ATOMIC_WRAPDEC, BRIG_TYPE_U32,
+                        "__hsail_atomic_wrapdec_u32",
+                        BT_FN_UINT_PTR_UINT, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_WRAPDEC_U64,
+                        BRIG_ATOMIC_WRAPDEC, BRIG_TYPE_U64,
+                        "__hsail_atomic_wrapdec_u64",
+                        BT_FN_ULONG_PTR_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_WRAPINC_U32,
+                        BRIG_ATOMIC_WRAPINC, BRIG_TYPE_U32,
+                        "__hsail_atomic_wrapinc_u32",
+                        BT_FN_UINT_PTR_UINT, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_ATOMIC_BUILTIN (BUILT_IN_HSAIL_ATOMIC_WRAPINC_U64,
+                        BRIG_ATOMIC_WRAPINC, BRIG_TYPE_U64,
+                        "__hsail_atomic_wrapinc_u64",
+                        BT_FN_ULONG_PTR_ULONG, ATTR_NOTHROW_LEAF_LIST)
+
+#ifndef DEF_HSAIL_SAT_BUILTIN
+#define DEF_HSAIL_SAT_BUILTIN(ENUM, HSAIL_OPCODE, HSAIL_TYPE,  \
+                             NAME, TYPE, ATTRS)
+#endif
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_U64, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_U64, "__hsail_sat_add_u64",
+                     BT_FN_ULONG_ULONG_ULONG, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_S64, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_S64, "__hsail_sat_add_s64",
+                     BT_FN_LONG_LONG_LONG, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_U32, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_U32, "__hsail_sat_add_u32",
+                     BT_FN_UINT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_S32, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_S32, "__hsail_sat_add_s32",
+                     BT_FN_INT_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_U16, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_U16, "__hsail_sat_add_u16",
+                     BT_FN_UINT16_UINT16_UINT16, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_S16, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_S16, "__hsail_sat_add_s16",
+                     BT_FN_INT16_INT16_INT16, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_U8, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_U8, "__hsail_sat_add_u8",
+                     BT_FN_UINT8_UINT8_UINT8, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_ADD_S8, BRIG_OPCODE_ADD,
+                     BRIG_TYPE_S8, "__hsail_sat_add_s8",
+                     BT_FN_INT8_INT8_INT8, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_U64, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_U64, "__hsail_sat_sub_u64",
+                     BT_FN_ULONG_ULONG_ULONG, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_S64, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_S64, "__hsail_sat_sub_s64",
+                     BT_FN_LONG_LONG_LONG, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_U32, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_U32, "__hsail_sat_sub_u32",
+                     BT_FN_UINT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_S32, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_S32, "__hsail_sat_sub_s32",
+                     BT_FN_INT_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_U16, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_U16, "__hsail_sat_sub_u16",
+                     BT_FN_UINT16_UINT16_UINT16, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_S16, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_S16, "__hsail_sat_sub_s16",
+                     BT_FN_INT16_INT16_INT16, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_U8, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_U8, "__hsail_sat_sub_u8",
+                     BT_FN_UINT8_UINT8_UINT8, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_SUB_S8, BRIG_OPCODE_SUB,
+                     BRIG_TYPE_S8, "__hsail_sat_sub_s8",
+                     BT_FN_INT8_INT8_INT8, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_U64, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_U64, "__hsail_sat_mul_u64",
+                     BT_FN_ULONG_ULONG_ULONG, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_S64, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_S64, "__hsail_sat_mul_s64",
+                     BT_FN_LONG_LONG_LONG, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_U32, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_U32, "__hsail_sat_mul_u32",
+                     BT_FN_UINT_UINT_UINT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_S32, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_S32, "__hsail_sat_mul_s32",
+                     BT_FN_INT_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_U16, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_U16, "__hsail_sat_mul_u16",
+                     BT_FN_UINT16_UINT16_UINT16, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_S16, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_S16, "__hsail_sat_mul_s16",
+                     BT_FN_INT16_INT16_INT16, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_U8, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_U8, "__hsail_sat_mul_u8",
+                     BT_FN_UINT8_UINT8_UINT8, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_SAT_BUILTIN (BUILT_IN_HSAIL_SAT_MUL_S8, BRIG_OPCODE_MUL,
+                     BRIG_TYPE_S8, "__hsail_sat_mul_s8",
+                     BT_FN_INT8_INT8_INT8, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+#ifndef DEF_HSAIL_INTR_BUILTIN
+#define DEF_HSAIL_INTR_BUILTIN(ENUM, NAME, TYPE, ATTRS)
+#endif
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_FTZ_F32_F16, "__hsail_ftz_f32_f16",
+                      BT_FN_FLOAT_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_FTZ_F32, "__hsail_ftz_f32",
+                      BT_FN_FLOAT_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_FTZ_F64, "__hsail_ftz_f64",
+                      BT_FN_DOUBLE_DOUBLE, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_PUSH_FRAME, "__hsail_alloca_push_frame",
+                      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_POP_FRAME, "__hsail_alloca_pop_frame",
+                      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_SETWORKITEMID, "__hsail_setworkitemid",
+                      BT_FN_VOID_UINT32_UINT32_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_LAUNCH_WG_FUNC,
+                      "__hsail_launch_wg_function",
+                      BT_FN_VOID_PTR_PTR_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_LAUNCH_KERNEL,
+                      "__hsail_launch_kernel",
+                      BT_FN_VOID_PTR_PTR_PTR, ATTR_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_F32_TO_F16, "__hsail_f32_to_f16",
+                      BT_FN_UINT16_UINT32, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_INTR_BUILTIN (BUILT_IN_HSAIL_F16_TO_F32, "__hsail_f16_to_f32",
+                      BT_FN_UINT32_UINT16, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+#ifndef DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN
+#define DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN(ENUM, HSAIL_DEST_TYPE, HSAIL_SRC_TYPE, \
+       NAME, TYPE, ATTRS)
+#endif
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U8_F32,
+                               BRIG_TYPE_U8, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_u8_f32",
+                               BT_FN_UINT8_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S8_F32,
+                               BRIG_TYPE_S8, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_s8_f32",
+                               BT_FN_INT8_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U16_F32,
+                               BRIG_TYPE_U16, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_u16_f32",
+                               BT_FN_UINT16_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S16_F32,
+                               BRIG_TYPE_S16, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_s16_f32",
+                               BT_FN_INT16_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U32_F32,
+                               BRIG_TYPE_U32, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_u32_f32",
+                               BT_FN_UINT32_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S32_F32,
+                               BRIG_TYPE_S32, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_s32_f32",
+                               BT_FN_INT_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U64_F32,
+                               BRIG_TYPE_U64, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_u64_f32",
+                               BT_FN_UINT64_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S64_F32,
+                               BRIG_TYPE_S64, BRIG_TYPE_F32,
+                               "__hsail_cvt_zeroi_sat_s64_f32",
+                               BT_FN_LONG_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U8_F64,
+                               BRIG_TYPE_U8, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_u8_f64",
+                               BT_FN_UINT8_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S8_F64,
+                               BRIG_TYPE_S8, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_s8_f64",
+                               BT_FN_INT8_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U16_F64,
+                               BRIG_TYPE_U16, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_u16_f64",
+                               BT_FN_UINT16_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S16_F64,
+                               BRIG_TYPE_S16, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_s16_f64",
+                               BT_FN_INT16_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U32_F64,
+                               BRIG_TYPE_U32, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_u32_f64",
+                               BT_FN_UINT32_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S32_F64,
+                               BRIG_TYPE_S32, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_s32_f64",
+                               BT_FN_INT_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_U64_F64,
+                               BRIG_TYPE_U64, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_u64_f64",
+                               BT_FN_UINT64_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
+
+DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN (BUILT_IN_HSAIL_CVT_ZEROI_SAT_S64_F64,
+                               BRIG_TYPE_S64, BRIG_TYPE_F64,
+                               "__hsail_cvt_zeroi_sat_s64_f64",
+                               BT_FN_LONG_FLOAT, ATTR_PURE_NOTHROW_LEAF_LIST)
diff --git a/gcc/brig/ChangeLog b/gcc/brig/ChangeLog
new file mode 100644 (file)
index 0000000..dcea9d3
--- /dev/null
@@ -0,0 +1,42 @@
+2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
+           Martin Jambor  <mjambor@suse.cz>
+
+       * Make-lang.in: New file.
+       * brig-builtins.h: Likewise.
+       * brig-c.h: Likewise.
+       * brig-lang.c: Likewise.
+       * brigspec.c: Likewise.
+       * config-lang.in: Likewise.
+       * lang-specs.h: Likewise.
+       * lang.opt: Likewise.
+       * brigfrontend/brig-arg-block-handler.cc: Likewise.
+       * brigfrontend/brig-atomic-inst-handler.cc: Likewise.
+       * brigfrontend/brig-basic-inst-handler.cc: Likewise.
+       * brigfrontend/brig-branch-inst-handler.cc: Likewise.
+       * brigfrontend/brig-cmp-inst-handler.cc: Likewise.
+       * brigfrontend/brig-code-entry-handler.cc: Likewise.
+       * brigfrontend/brig-code-entry-handler.h: Likewise.
+       * brigfrontend/brig-comment-handler.cc: Likewise.
+       * brigfrontend/brig-control-handler.cc: Likewise.
+       * brigfrontend/brig-copy-move-inst-handler.cc: Likewise.
+       * brigfrontend/brig-cvt-inst-handler.cc: Likewise.
+       * brigfrontend/brig-fbarrier-handler.cc: Likewise.
+       * brigfrontend/brig-function-handler.cc: Likewise.
+       * brigfrontend/brig-function.cc: Likewise.
+       * brigfrontend/brig-function.h: Likewise.
+       * brigfrontend/brig-inst-mod-handler.cc: Likewise.
+       * brigfrontend/brig-label-handler.cc: Likewise.
+       * brigfrontend/brig-lane-inst-handler.cc: Likewise.
+       * brigfrontend/brig-machine.c: Likewise.
+       * brigfrontend/brig-machine.h: Likewise.
+       * brigfrontend/brig-mem-inst-handler.cc: Likewise.
+       * brigfrontend/brig-module-handler.cc: Likewise.
+       * brigfrontend/brig-queue-inst-handler.cc: Likewise.
+       * brigfrontend/brig-seg-inst-handler.cc: Likewise.
+       * brigfrontend/brig-signal-inst-handler.cc: Likewise.
+       * brigfrontend/brig-to-generic.cc: Likewise.
+       * brigfrontend/brig-to-generic.h: Likewise.
+       * brigfrontend/brig-util.cc: Likewise.
+       * brigfrontend/brig-util.h: Likewise.
+       * brigfrontend/brig-variable-handler.cc: Likewise.
+       * brigfrontend/phsa.h: Likewise.
diff --git a/gcc/brig/Make-lang.in b/gcc/brig/Make-lang.in
new file mode 100644 (file)
index 0000000..b85b1b0
--- /dev/null
@@ -0,0 +1,247 @@
+# Make-lang.in -- Top level -*- makefile -*- fragment for gcc BRIG (HSAIL)
+# frontend.
+
+# Copyright (C) 2015 Free Software Foundation, Inc.
+
+# This file is part of GCC.
+
+# GCC 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 3, or (at your option)
+# any later version.
+
+# GCC 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# This file provides the language dependent support in the main Makefile.
+
+# Installation name.
+
+GCCBRIG_INSTALL_NAME := $(shell echo gccbrig|sed '$(program_transform_name)')
+GCCBRIG_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gccbrig|sed \
+       '$(program_transform_name)')
+
+# The name for selecting brig in LANGUAGES.
+brig: brig1$(exeext)
+
+.PHONY: brig
+
+CFLAGS-brig/brigspec.o += $(DRIVER_DEFINES)
+
+GCCBRIG_OBJS = $(GCC_OBJS) brig/brigspec.o
+gccbrig$(exeext): $(GCCBRIG_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \
+       $(LIBDEPS)
+       +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
+         $(GCCBRIG_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \
+         $(EXTRA_GCC_LIBS) $(LIBS)
+
+# The cross-compiler version.  This is built mainly as a signal to the
+# brig.install-common target.  If this executable exists, it means that
+# brig.all.cross was run.
+gccbrig-cross$(exeext): gccbrig$(exeext)
+       -rm -f gccbrig-cross$(exeext)
+       cp gccbrig$(exeext) gccbrig-cross$(exeext)
+
+# Use strict warnings.
+brig-warn = $(STRICT_WARN)
+
+BRIG_OBJS = \
+       brig/brig-lang.o \
+       brig/brig-code-entry-handler.o \
+       brig/brig-function-handler.o \
+       brig/brig-variable-handler.o \
+       brig/brig-fbarrier-handler.o \
+       brig/brig-label-handler.o \
+       brig/brig-comment-handler.o \
+       brig/brig-basic-inst-handler.o \
+       brig/brig-cvt-inst-handler.o \
+       brig/brig-seg-inst-handler.o \
+       brig/brig-lane-inst-handler.o \
+       brig/brig-queue-inst-handler.o \
+       brig/brig-copy-move-inst-handler.o \
+       brig/brig-signal-inst-handler.o \
+       brig/brig-atomic-inst-handler.o \
+       brig/brig-arg-block-handler.o \
+       brig/brig-control-handler.o \
+       brig/brig-cmp-inst-handler.o \
+       brig/brig-branch-inst-handler.o \
+       brig/brig-mem-inst-handler.o \
+       brig/brig-module-handler.o \
+       brig/brig-inst-mod-handler.o \
+       brig/brig-function.o \
+       brig/brig-to-generic.o \
+       brig/brig-machine.o \
+       brig/brig-util.o
+
+brig_OBJS = $(BRIG_OBJS) brig/brigspec.o
+
+# brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+#      +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
+#            $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
+
+
+brig1$(exeext): $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+       +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
+             $(BRIG_OBJS) attribs.o $(BACKEND) $(LIBS) \
+                 $(BACKENDLIBS)
+
+# Documentation.
+
+GO_TEXI_FILES = \
+       brig/gccbrig.texi \
+       $(gcc_docdir)/include/fdl.texi \
+       $(gcc_docdir)/include/gpl_v3.texi \
+       $(gcc_docdir)/include/gcc-common.texi \
+       gcc-vers.texi
+
+# doc/gccbrig.info: $(BRIG_TEXI_FILES)
+#      if test "x$(BUILD_INFO)" = xinfo; then \
+#        rm -f doc/gccbrig.info*; \
+#        $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \
+#              -I $(gcc_docdir)/include -o $@ $<; \
+#      else true; fi
+
+# doc/gccbrig.dvi: $(BRIG_TEXI_FILES)
+#      $(TEXI2DVI) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $<
+
+# doc/gccbrig.pdf: $(BRIG_TEXI_FILES)
+#      $(TEXI2PDF) -I $(abs_docdir) -I $(abs_docdir)/include -o $@ $<
+
+$(build_htmldir)/brig/index.html: $(BRIG_TEXI_FILES)
+       $(mkinstalldirs) $(@D)
+       rm -f $(@D)/*
+       $(TEXI2HTML) -I $(gcc_docdir) -I $(gcc_docdir)/include \
+               -I $(srcdir)/brig -o $(@D) $<
+
+# Build hooks.
+
+brig.all.cross: gccbrig-cross$(exeext)
+brig.start.encap: gccbrig$(exeext)
+brig.rest.encap:
+#brig.info: doc/gccbrig.info
+brig.info:
+brig.dvi: doc/gccbrig.dvi
+brig.pdf: doc/gccbrig.pdf
+brig.html: $(build_htmldir)/brig/index.html
+brig.srcinfo: #doc/gccbrig.info
+#      -cp -p $^ $(srcdir)/doc
+
+brig.srcextra:
+brig.tags: force
+       cd $(srcdir)/brig; \
+       etags -o TAGS.sub *.c *.h; \
+       etags --include TAGS.sub --include ../TAGS.sub
+brig.man:
+
+#brig.srcman: doc/gccbrig.1
+#      -cp -p $^ $(srcdir)/doc
+
+lang_checks += check-brig
+
+# Install hooks.
+
+brig.install-common: installdirs
+       -rm -f $(DESTDIR)$(bindir)/$(GCCBRIG_INSTALL_NAME)$(exeext)
+       $(INSTALL_PROGRAM) gccbrig$(exeext) \
+       $(DESTDIR)$(bindir)/$(GCCBRIG_INSTALL_NAME)$(exeext)
+       -if test -f brig1$(exeext); then \
+         if test -f gccbrig-cross$(exeext); then \
+           :; \
+         else \
+           rm -f $(DESTDIR)$(bindir)/$(GCCBRIG_TARGET_INSTALL_NAME)$(exeext); \
+           ( cd $(DESTDIR)$(bindir) && \
+             $(LN) $(GCCBRIG_INSTALL_NAME)$(exeext) \
+             $(GCCBRIG_TARGET_INSTALL_NAME)$(exeext) ); \
+         fi; \
+       fi
+
+brig.install-plugin:
+
+brig.install-info: #$(DESTDIR)$(infodir)/gccbrig.info
+
+brig.install-pdf: doc/gccbrig.pdf
+       @$(NORMAL_INSTALL)
+       test -z "$(pdfdir)" || $(mkinstalldirs) "$(DESTDIR)$(pdfdir)/gcc"
+       @for p in doc/gccbrig.pdf; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         f=$(pdf__strip_dir) \
+         echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/gcc/$$f'"; \
+         $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/gcc/$$f"; \
+       done
+
+brig.install-html: $(build_htmldir)/brig
+       @$(NORMAL_INSTALL)
+       test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)"
+       @for p in $(build_htmldir)/brig; do \
+         if test -f "$$p" || test -d "$$p"; then d=""; else d="$(srcdir)/"; \
+         fi; \
+         f=$(html__strip_dir) \
+         if test -d "$$d$$p"; then \
+           echo " $(mkinstalldirs) '$(DESTDIR)$(htmldir)/$$f'"; \
+           $(mkinstalldirs) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+           echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+           $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \
+         else \
+           echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \
+           $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \
+         fi; \
+       done
+
+brig.install-man: #$(DESTDIR)$(man1dir)/$(GCCBRIG_INSTALL_NAME)$(man1ext)
+
+#$(DESTDIR)$(man1dir)/$(GCCBRIG_INSTALL_NAME)$(man1ext): doc/gccbrig.1 \
+#      installdirs
+#      -rm -f $@
+#      -$(INSTALL_DATA) $< $@
+#      -chmod a-x $@
+
+brig.uninstall:
+       rm -rf $(DESTDIR)$(bindir)/$(GCCBRIG_INSTALL_NAME)$(exeext)
+       rm -rf $(DESTDIR)$(man1dir)/$(GCCBRIG_INSTALL_NAME)$(man1ext)
+       rm -rf $(DESTDIR)$(bindir)/$(GCCBRIG_TARGET_INSTALL_NAME)$(exeext)
+       rm -rf $(DESTDIR)$(infodir)/gccbrig.info*
+
+# Clean hooks.
+
+brig.mostlyclean:
+       -rm -f brig/*$(objext)
+       -rm -f brig/*$(coverageexts)
+brig.clean:
+brig.distclean:
+brig.maintainer-clean:
+       -rm -f $(docobjdir)/gccbrig.1
+
+# Stage hooks.
+
+brig.stage1: stage1-start
+       -mv brig/*$(objext) stage1/brig
+brig.stage2: stage2-start
+       -mv brig/*$(objext) stage2/brig
+brig.stage3: stage3-start
+       -mv brig/*$(objext) stage3/brig
+brig.stage4: stage4-start
+       -mv brig/*$(objext) stage4/brig
+brig.stageprofile: stageprofile-start
+       -mv brig/*$(objext) stageprofile/brig
+brig.stagefeedback: stagefeedback-start
+       -mv brig/*$(objext) stagefeedback/brig
+
+CFLAGS-brig/brig-lang.o += -DDEFAULT_TARGET_VERSION=\"$(version)\" \
+       -DDEFAULT_TARGET_MACHINE=\"$(target_noncanonical)\"
+
+BRIGINCLUDES = -I $(srcdir)/brig -I ${HOME}/local/include \
+       -I $(srcdir)/brig/brigfrontend
+
+brig/brig-machine.o: brig/brigfrontend/brig-machine.c
+       $(COMPILE) $(BRIGINCLUDES) $<
+       $(POSTCOMPILE)
+
+brig/%.o: brig/brigfrontend/%.cc
+       $(COMPILE) $(BRIGINCLUDES) $<
+       $(POSTCOMPILE)
diff --git a/gcc/brig/brig-builtins.h b/gcc/brig/brig-builtins.h
new file mode 100644 (file)
index 0000000..ef9d11f
--- /dev/null
@@ -0,0 +1,99 @@
+/* brig-builtins.h -- brig builtin definitions
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+enum built_in_attribute
+{
+#define DEF_ATTR_NULL_TREE(ENUM) ENUM,
+#define DEF_ATTR_INT(ENUM, VALUE) ENUM,
+#define DEF_ATTR_STRING(ENUM, VALUE) ENUM,
+#define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
+#define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
+#include "builtin-attrs.def"
+#undef DEF_ATTR_NULL_TREE
+#undef DEF_ATTR_INT
+#undef DEF_ATTR_STRING
+#undef DEF_ATTR_IDENT
+#undef DEF_ATTR_TREE_LIST
+  ATTR_LAST
+};
+
+/* Builtin types.  */
+
+enum brig_builtin_type
+{
+#define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
+#define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
+#define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
+#define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
+#define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
+#define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
+#define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
+#define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6) NAME,
+#define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6, ARG7) NAME,
+#define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6, ARG7, ARG8) NAME,
+#define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6, ARG7, ARG8, ARG9) NAME,
+#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10) NAME,
+#define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME,
+#define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
+#define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
+#define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
+#define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
+#define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
+#define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG6) \
+                               NAME,
+#define DEF_FUNCTION_TYPE_VAR_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                                ARG6) NAME,
+#define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                               ARG6, ARG7) NAME,
+#define DEF_POINTER_TYPE(NAME, TYPE) NAME,
+#include "builtin-types.def"
+#undef DEF_PRIMITIVE_TYPE
+#undef DEF_FUNCTION_TYPE_0
+#undef DEF_FUNCTION_TYPE_1
+#undef DEF_FUNCTION_TYPE_2
+#undef DEF_FUNCTION_TYPE_3
+#undef DEF_FUNCTION_TYPE_4
+#undef DEF_FUNCTION_TYPE_5
+#undef DEF_FUNCTION_TYPE_6
+#undef DEF_FUNCTION_TYPE_7
+#undef DEF_FUNCTION_TYPE_8
+#undef DEF_FUNCTION_TYPE_9
+#undef DEF_FUNCTION_TYPE_10
+#undef DEF_FUNCTION_TYPE_11
+#undef DEF_FUNCTION_TYPE_VAR_0
+#undef DEF_FUNCTION_TYPE_VAR_1
+#undef DEF_FUNCTION_TYPE_VAR_2
+#undef DEF_FUNCTION_TYPE_VAR_3
+#undef DEF_FUNCTION_TYPE_VAR_4
+#undef DEF_FUNCTION_TYPE_VAR_5
+#undef DEF_FUNCTION_TYPE_VAR_6
+#undef DEF_FUNCTION_TYPE_VAR_7
+#undef DEF_POINTER_TYPE
+  BT_LAST
+};
+
+typedef enum brig_builtin_type builtin_type;
diff --git a/gcc/brig/brig-c.h b/gcc/brig/brig-c.h
new file mode 100644 (file)
index 0000000..c4e2f2d
--- /dev/null
@@ -0,0 +1,66 @@
+/* brig-c.h -- Header file for brig input's gcc C interface.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef BRIG_BRIG_C_H
+#define BRIG_BRIG_C_H
+
+#define BRIG_EXTERN_C
+
+#include "machmode.h"
+
+/* Functions defined in the Brig frontend proper called by the GCC
+   interface.  */
+
+extern int brig_enable_dump (const char *);
+extern int brig_enable_optimize (const char *);
+
+extern void brig_add_search_path (const char *);
+
+extern void brig_create_brigbrig (int int_type_size, int pointer_size,
+                                 const char *pkgpath, const char *prefix,
+                                 const char *relative_import_path);
+
+extern void brig_parse_input_files (const char **, unsigned int,
+                                   bool only_check_syntax,
+                                   bool require_return_statement);
+extern void brig_write_globals (void);
+
+extern tree brig_type_for_size (unsigned int bits, int unsignedp);
+extern tree brig_type_for_mode (enum machine_mode, int unsignedp);
+
+/* Functions defined in the GCC interface called by the Brig frontend
+   proper.  */
+
+extern void brig_preserve_from_gc (tree);
+
+extern const char *brig_localize_identifier (const char *);
+
+extern unsigned int brig_field_alignment (tree);
+
+extern void brig_trampoline_info (unsigned int *size, unsigned int *alignment);
+
+extern void brig_imported_unsafe (void);
+
+extern void brig_write_export_data (const char *, unsigned int);
+
+extern const char *brig_read_export_data (int, off_t, char **, size_t *, int *);
+
+#endif /* !defined (BRIG_BRIG_C_H) */
diff --git a/gcc/brig/brig-lang.c b/gcc/brig/brig-lang.c
new file mode 100644 (file)
index 0000000..1642a95
--- /dev/null
@@ -0,0 +1,807 @@
+/* brig-lang.c -- brig (HSAIL) input gcc interface.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "ansidecl.h"
+#include "coretypes.h"
+#include "opts.h"
+#include "tree.h"
+#include "tree-iterator.h"
+#include "print-tree.h"
+#include "stringpool.h"
+#include "basic-block.h"
+#include "gimple-expr.h"
+#include "gimplify.h"
+#include "dumpfile.h"
+#include "stor-layout.h"
+#include "toplev.h"
+#include "debug.h"
+#include "options.h"
+#include "flags.h"
+#include "convert.h"
+#include "diagnostic.h"
+#include "langhooks.h"
+#include "langhooks-def.h"
+#include "target.h"
+#include "vec.h"
+#include "brigfrontend/brig-to-generic.h"
+#include "machmode.h"
+#include "fold-const.h"
+#include "common/common-target.h"
+#include <mpfr.h>
+#include "brig-c.h"
+#include "brig-builtins.h"
+
+/* This file is based on Go frontent'd go-lang.c and gogo-tree.cc.  */
+
+/* If -v set.  */
+
+int gccbrig_verbose = 0;
+
+/* Language-dependent contents of a type.  */
+
+struct GTY (()) lang_type
+{
+  char dummy;
+};
+
+/* Language-dependent contents of a decl.  */
+
+struct GTY ((variable_size)) lang_decl
+{
+  char dummy;
+};
+
+/* Language-dependent contents of an identifier.  This must include a
+   tree_identifier.  */
+
+struct GTY (()) lang_identifier
+{
+  struct tree_identifier common;
+};
+
+/* The resulting tree type.  */
+
+union GTY ((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
+           chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), "
+                       "TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN "
+                       "(&%h.generic)) : NULL"))) lang_tree_node
+{
+  union tree_node GTY ((tag ("0"), desc ("tree_node_structure (&%h)"))) generic;
+  struct lang_identifier GTY ((tag ("1"))) identifier;
+};
+
+/* We don't use language_function.  */
+
+struct GTY (()) language_function
+{
+  int dummy;
+};
+
+
+/* The option mask.  */
+
+static unsigned int
+brig_langhook_option_lang_mask (void)
+{
+  return CL_BRIG;
+}
+
+/* Initialize the options structure.  */
+
+static void
+brig_langhook_init_options_struct (struct gcc_options *opts)
+{
+  /* Signed overflow is precisely defined.  */
+  opts->x_flag_wrapv = 1;
+
+  /* If we set this to one, the whole program optimizations internalize
+     all global variables, making them invisible to the dyn loader (and
+     thus the HSA runtime implementation).  */
+  opts->x_flag_whole_program = 0;
+
+  /* The builtin math functions should not set errno.  */
+  opts->x_flag_errno_math = 0;
+  opts->frontend_set_flag_errno_math = false;
+
+  opts->x_flag_exceptions = 0;
+  opts->x_flag_non_call_exceptions = 0;
+
+  opts->x_flag_finite_math_only = 0;
+  opts->x_flag_signed_zeros = 1;
+}
+
+/* Handle Brig specific options.  Return 0 if we didn't do anything.  */
+
+static bool
+brig_langhook_handle_option
+  (size_t scode, const char *arg ATTRIBUTE_UNUSED,
+  int value ATTRIBUTE_UNUSED, int kind ATTRIBUTE_UNUSED,
+  location_t loc ATTRIBUTE_UNUSED,
+  const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
+{
+  enum opt_code code = (enum opt_code) scode;
+  switch (code)
+    {
+    case OPT_v:
+      gccbrig_verbose = 1;
+      break;
+    default:
+      break;
+    }
+  return 1;
+}
+
+/* Run after parsing options.  */
+
+static bool
+brig_langhook_post_options (const char **pfilename ATTRIBUTE_UNUSED)
+{
+  if (flag_excess_precision_cmdline == EXCESS_PRECISION_DEFAULT)
+    flag_excess_precision_cmdline = EXCESS_PRECISION_STANDARD;
+
+  /* gccbrig casts pointers around like crazy, TBAA produces
+          broken code if not force disabling it.  */
+  flag_strict_aliasing = 0;
+
+  /* Returning false means that the backend should be used.  */
+  return false;
+}
+
+static size_t
+get_file_size (FILE *file)
+{
+  size_t size;
+  fseek (file, 0, SEEK_END);
+  size = (size_t) ftell (file);
+  fseek (file, 0, SEEK_SET);
+  return size;
+}
+
+static void
+brig_langhook_parse_file (void)
+{
+  brig_to_generic brig_to_gen;
+
+  for (unsigned int i = 0; i < num_in_fnames; ++i)
+    {
+
+      FILE *f;
+      f = fopen (in_fnames[i], "r");
+      size_t fsize = get_file_size (f);
+      char *brig_blob = new char[fsize];
+      if (fread (brig_blob, 1, fsize, f) != fsize)
+       {
+         error ("could not read the BRIG file");
+         exit (1);
+       }
+      brig_to_gen.parse (brig_blob);
+      fclose (f);
+    }
+
+  brig_to_gen.write_globals ();
+}
+
+static tree
+brig_langhook_type_for_size (unsigned int bits,
+                            int unsignedp)
+{
+  /* Copied from go-lang.c  */
+  tree type;
+  if (unsignedp)
+    {
+      if (bits == INT_TYPE_SIZE)
+        type = unsigned_type_node;
+      else if (bits == CHAR_TYPE_SIZE)
+        type = unsigned_char_type_node;
+      else if (bits == SHORT_TYPE_SIZE)
+        type = short_unsigned_type_node;
+      else if (bits == LONG_TYPE_SIZE)
+        type = long_unsigned_type_node;
+      else if (bits == LONG_LONG_TYPE_SIZE)
+        type = long_long_unsigned_type_node;
+      else
+        type = make_unsigned_type(bits);
+    }
+  else
+    {
+      if (bits == INT_TYPE_SIZE)
+        type = integer_type_node;
+      else if (bits == CHAR_TYPE_SIZE)
+        type = signed_char_type_node;
+      else if (bits == SHORT_TYPE_SIZE)
+        type = short_integer_type_node;
+      else if (bits == LONG_TYPE_SIZE)
+        type = long_integer_type_node;
+      else if (bits == LONG_LONG_TYPE_SIZE)
+        type = long_long_integer_type_node;
+      else
+        type = make_signed_type(bits);
+    }
+  return type;
+}
+
+static tree
+brig_langhook_type_for_mode (enum machine_mode mode, int unsignedp)
+{
+  if (mode == TYPE_MODE (void_type_node))
+    return void_type_node;
+
+  if (VECTOR_MODE_P (mode))
+    {
+      tree inner;
+
+      inner = brig_langhook_type_for_mode (GET_MODE_INNER (mode), unsignedp);
+      if (inner != NULL_TREE)
+       return build_vector_type_for_mode (inner, mode);
+      gcc_unreachable ();
+      return NULL_TREE;
+    }
+
+  enum mode_class mc = GET_MODE_CLASS (mode);
+  if (mc == MODE_FLOAT)
+    {
+      switch (GET_MODE_BITSIZE (mode))
+       {
+       case 32:
+         return float_type_node;
+       case 64:
+         return double_type_node;
+       default:
+         /* We have to check for long double in order to support
+            i386 excess precision.  */
+         if (mode == TYPE_MODE (long_double_type_node))
+           return long_double_type_node;
+
+         gcc_unreachable ();
+         return NULL_TREE;
+       }
+    }
+  else if (mc == MODE_INT)
+    return brig_langhook_type_for_size(GET_MODE_BITSIZE(mode), unsignedp);
+  else
+    {
+      /* E.g., build_common_builtin_nodes () asks for modes/builtins
+              we do not generate or need.  Just ignore them silently for now.
+      */
+      return NULL_TREE;
+    }
+  return NULL_TREE;
+}
+
+static tree
+brig_langhook_builtin_function (tree decl)
+{
+  return decl;
+}
+
+static GTY(()) tree registered_builtin_types;
+
+static void
+brig_langhook_register_builtin_type (tree type, const char *name)
+{
+  tree decl;
+
+  if (!TYPE_NAME (type))
+    {
+      decl = build_decl (UNKNOWN_LOCATION, TYPE_DECL,
+                        get_identifier (name), type);
+      DECL_ARTIFICIAL (decl) = 1;
+      TYPE_NAME (type) = decl;
+    }
+
+  registered_builtin_types = tree_cons (0, type, registered_builtin_types);
+}
+
+
+/* Return true if we are in the global binding level.  */
+
+static bool
+brig_langhook_global_bindings_p (void)
+{
+  return current_function_decl == NULL_TREE;
+}
+
+/* Push a declaration into the current binding level.  From Go: We can't
+   usefully implement this since we don't want to convert from tree
+   back to one of our internal data structures.  I think the only way
+   this is used is to record a decl which is to be returned by
+   getdecls, and we could implement it for that purpose if
+   necessary.  */
+
+static tree
+brig_langhook_pushdecl (tree decl ATTRIBUTE_UNUSED)
+{
+  gcc_unreachable ();
+}
+
+/* This hook is used to get the current list of declarations as trees.
+   From Go: We don't support that; instead we use the write_globals hook.
+   This can't simply crash because it is called by -gstabs.  */
+
+static tree
+brig_langhook_getdecls (void)
+{
+  return NULL;
+}
+
+static int
+brig_langhook_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED,
+                            gimple_seq *post_p ATTRIBUTE_UNUSED)
+{
+
+  /* Strip off the static chain info that appears to function
+     calls for some strange reason even though we don't add
+     nested functions.  Maybe something wrong with the function
+     declaration contexts? */
+  if (TREE_CODE (*expr_p) == CALL_EXPR
+      && CALL_EXPR_STATIC_CHAIN (*expr_p) != NULL_TREE)
+    CALL_EXPR_STATIC_CHAIN (*expr_p) = NULL_TREE;
+  return GS_UNHANDLED;
+}
+
+static tree
+brig_langhook_eh_personality (void)
+{
+  gcc_unreachable ();
+}
+
+/* Functions called directly by the generic backend.
+   Adapted from go-lang.c.  */
+
+tree
+convert (tree type, tree expr)
+{
+  if (type == error_mark_node || expr == error_mark_node
+      || TREE_TYPE (expr) == error_mark_node)
+    return error_mark_node;
+
+  if (type == TREE_TYPE (expr))
+    return expr;
+
+  if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (expr)))
+    return fold_convert (type, expr);
+
+  switch (TREE_CODE (type))
+    {
+    case VOID_TYPE:
+    case BOOLEAN_TYPE:
+      return fold_convert (type, expr);
+    case INTEGER_TYPE:
+      return fold (convert_to_integer (type, expr));
+    case REAL_TYPE:
+      return fold (convert_to_real (type, expr));
+    case VECTOR_TYPE:
+      return fold (convert_to_vector (type, expr));
+    case POINTER_TYPE:
+      return build1 (VIEW_CONVERT_EXPR, type, convert (size_type_node, expr));
+    default:
+      break;
+    }
+
+  gcc_unreachable ();
+}
+
+static GTY (()) tree brig_gc_root;
+
+/* Preserve trees that we create from the garbage collector.  */
+
+void
+brig_preserve_from_gc (tree t)
+{
+  brig_gc_root = tree_cons (NULL_TREE, t, brig_gc_root);
+}
+
+/* Convert an identifier for use in an error message.  */
+
+const char *
+brig_localize_identifier (const char *ident)
+{
+  return identifier_to_locale (ident);
+}
+
+/* Built-in initialization code cribbed from lto-lang.c which cribbed it
+   from c-common.c.  */
+
+
+static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
+
+
+static GTY(()) tree builtin_types[(int) BT_LAST + 1];
+
+static GTY(()) tree string_type_node;
+static GTY(()) tree const_string_type_node;
+static GTY(()) tree wint_type_node;
+static GTY(()) tree intmax_type_node;
+static GTY(()) tree uintmax_type_node;
+static GTY(()) tree signed_size_type_node;
+
+/* Flags needed to process builtins.def.  */
+int flag_isoc94;
+int flag_isoc99;
+int flag_isoc11;
+
+static void
+def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
+{
+  tree t;
+  tree *args = XALLOCAVEC (tree, n);
+  va_list list;
+  int i;
+  bool err = false;
+
+  va_start (list, n);
+  for (i = 0; i < n; ++i)
+    {
+      builtin_type a = (builtin_type) va_arg (list, int);
+      t = builtin_types[a];
+      if (t == error_mark_node)
+       err = true;
+      args[i] = t;
+    }
+  va_end (list);
+
+  t = builtin_types[ret];
+  if (err)
+    t = error_mark_node;
+  if (t == error_mark_node)
+    ;
+  else if (var)
+    t = build_varargs_function_type_array (t, n, args);
+  else
+    t = build_function_type_array (t, n, args);
+
+  builtin_types[def] = t;
+}
+
+/* Used to help initialize the builtin-types.def table.  When a type of
+   the correct size doesn't exist, use error_mark_node instead of NULL.
+   The later results in segfaults even when a decl using the type doesn't
+   get invoked.  */
+
+static tree
+builtin_type_for_size (int size, bool unsignedp)
+{
+  tree type = brig_langhook_type_for_size (size, unsignedp);
+  return type ? type : error_mark_node;
+}
+
+/* Support for DEF_BUILTIN.  */
+
+static void
+def_builtin_1 (enum built_in_function fncode, const char *name,
+              enum built_in_class fnclass, tree fntype, tree libtype,
+              bool both_p, bool fallback_p, bool nonansi_p,
+              tree fnattrs, bool implicit_p)
+{
+  tree decl;
+  const char *libname;
+
+  if (fntype == error_mark_node)
+    return;
+
+  libname = name + strlen ("__builtin_");
+  decl = add_builtin_function (name, fntype, fncode, fnclass,
+                              (fallback_p ? libname : NULL),
+                              fnattrs);
+
+  if (both_p
+      && !flag_no_builtin
+      && !(nonansi_p && flag_no_nonansi_builtin))
+    add_builtin_function (libname, libtype, fncode, fnclass,
+                         NULL, fnattrs);
+
+  set_builtin_decl (fncode, decl, implicit_p);
+}
+
+
+/* Initialize the attribute table for all the supported builtins.  */
+
+static void
+brig_init_attributes (void)
+{
+  /* Fill in the built_in_attributes array.  */
+#define DEF_ATTR_NULL_TREE(ENUM)                               \
+  built_in_attributes[(int) ENUM] = NULL_TREE;
+#define DEF_ATTR_INT(ENUM, VALUE)                              \
+  built_in_attributes[(int) ENUM] = build_int_cst (NULL_TREE, VALUE);
+#define DEF_ATTR_STRING(ENUM, VALUE)                           \
+  built_in_attributes[(int) ENUM] = build_string (strlen (VALUE), VALUE);
+#define DEF_ATTR_IDENT(ENUM, STRING)                           \
+  built_in_attributes[(int) ENUM] = get_identifier (STRING);
+#define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN)        \
+  built_in_attributes[(int) ENUM]                      \
+    = tree_cons (built_in_attributes[(int) PURPOSE],   \
+                built_in_attributes[(int) VALUE],      \
+                built_in_attributes[(int) CHAIN]);
+#include "builtin-attrs.def"
+#undef DEF_ATTR_NULL_TREE
+#undef DEF_ATTR_INT
+#undef DEF_ATTR_STRING
+#undef DEF_ATTR_IDENT
+#undef DEF_ATTR_TREE_LIST
+}
+
+/* Create builtin types and functions.  VA_LIST_REF_TYPE_NODE and
+   VA_LIST_ARG_TYPE_NODE are used in builtin-types.def.  */
+
+static void
+brig_define_builtins (tree va_list_ref_type_node ATTRIBUTE_UNUSED,
+                    tree va_list_arg_type_node ATTRIBUTE_UNUSED)
+{
+#define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
+  builtin_types[ENUM] = VALUE;
+#define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
+  def_fn_type (ENUM, RETURN, 0, 0);
+#define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
+  def_fn_type (ENUM, RETURN, 0, 1, ARG1);
+#define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
+  def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
+#define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
+  def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
+#define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
+  def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4);
+#define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5)        \
+  def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
+#define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6)                                       \
+  def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
+#define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6, ARG7)                                 \
+  def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
+#define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6, ARG7, ARG8)                           \
+  def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
+              ARG7, ARG8);
+#define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                           ARG6, ARG7, ARG8, ARG9)                     \
+  def_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
+              ARG7, ARG8, ARG9);
+#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10)              \
+  def_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,         \
+              ARG7, ARG8, ARG9, ARG10);
+#define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10, ARG11)       \
+  def_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,         \
+              ARG7, ARG8, ARG9, ARG10, ARG11);
+#define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
+  def_fn_type (ENUM, RETURN, 1, 0);
+#define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
+  def_fn_type (ENUM, RETURN, 1, 1, ARG1);
+#define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
+  def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
+#define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
+  def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
+#define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
+  def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4);
+#define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
+  def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
+#define DEF_FUNCTION_TYPE_VAR_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                                ARG6)  \
+  def_fn_type (ENUM, RETURN, 1, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
+#define DEF_FUNCTION_TYPE_VAR_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                               ARG6, ARG7)                             \
+  def_fn_type (ENUM, RETURN, 1, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
+#define DEF_POINTER_TYPE(ENUM, TYPE) \
+  builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]);
+
+#include "builtin-types.def"
+
+#undef DEF_PRIMITIVE_TYPE
+#undef DEF_FUNCTION_TYPE_0
+#undef DEF_FUNCTION_TYPE_1
+#undef DEF_FUNCTION_TYPE_2
+#undef DEF_FUNCTION_TYPE_3
+#undef DEF_FUNCTION_TYPE_4
+#undef DEF_FUNCTION_TYPE_5
+#undef DEF_FUNCTION_TYPE_6
+#undef DEF_FUNCTION_TYPE_7
+#undef DEF_FUNCTION_TYPE_8
+#undef DEF_FUNCTION_TYPE_9
+#undef DEF_FUNCTION_TYPE_10
+#undef DEF_FUNCTION_TYPE_11
+#undef DEF_FUNCTION_TYPE_VAR_0
+#undef DEF_FUNCTION_TYPE_VAR_1
+#undef DEF_FUNCTION_TYPE_VAR_2
+#undef DEF_FUNCTION_TYPE_VAR_3
+#undef DEF_FUNCTION_TYPE_VAR_4
+#undef DEF_FUNCTION_TYPE_VAR_5
+#undef DEF_FUNCTION_TYPE_VAR_6
+#undef DEF_FUNCTION_TYPE_VAR_7
+#undef DEF_POINTER_TYPE
+  builtin_types[(int) BT_LAST] = NULL_TREE;
+
+  brig_init_attributes ();
+
+#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P,\
+                   NONANSI_P, ATTRS, IMPLICIT, COND)                   \
+    if (NAME && COND)                                                  \
+      def_builtin_1 (ENUM, NAME, CLASS, builtin_types[(int) TYPE],     \
+                    builtin_types[(int) LIBTYPE], BOTH_P, FALLBACK_P,  \
+                    NONANSI_P, built_in_attributes[(int) ATTRS], IMPLICIT);
+
+#undef DEF_HSAIL_BUILTIN
+#define DEF_HSAIL_BUILTIN(ENUM, HSAIL_OPCODE, HSAIL_TYPE, NAME, TYPE, ATTRS) \
+  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
+              false, true, true, ATTRS, false, true)
+
+/* HSAIL atomic builtins do not have separate identifying opcodes.  */
+
+#undef DEF_HSAIL_ATOMIC_BUILTIN
+#define DEF_HSAIL_ATOMIC_BUILTIN(ENUM, ATOMIC_OPCODE, HSAIL_TYPE, NAME, \
+       TYPE, ATTRS) \
+  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
+              false, true, true, ATTRS, false, true)
+
+/* HSAIL saturating arithmetics builtins.  */
+
+#undef DEF_HSAIL_SAT_BUILTIN
+#define DEF_HSAIL_SAT_BUILTIN(ENUM, BRIG_OPCODE, HSAIL_TYPE, NAME, \
+       TYPE, ATTRS) \
+  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
+              false, true, true, ATTRS, false, true)
+
+/* HSAIL builtins used internally by the frontend.  */
+
+#undef DEF_HSAIL_INTR_BUILTIN
+#define DEF_HSAIL_INTR_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
+  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
+              false, true, true, ATTRS, false, true)
+
+/* HSAIL saturated conversions.  */
+
+#undef DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN
+#define DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN(ENUM, HSAIL_DEST_TYPE, HSAIL_SRC_TYPE, \
+  NAME, TYPE, ATTRS) \
+  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
+              false, true, true, ATTRS, false, true)
+
+#include "builtins.def"
+}
+
+/* Build nodes that would have be created by the C front-end; necessary
+   for including builtin-types.def and ultimately builtins.def.  Borrowed
+   from lto-lang.c.  */
+
+static void
+brig_build_c_type_nodes (void)
+{
+  gcc_assert (void_type_node);
+
+  void_list_node = build_tree_list (NULL_TREE, void_type_node);
+  string_type_node = build_pointer_type (char_type_node);
+  const_string_type_node
+    = build_pointer_type (build_qualified_type (char_type_node,
+                                               TYPE_QUAL_CONST));
+
+  if (strcmp (SIZE_TYPE, "unsigned int") == 0)
+    {
+      intmax_type_node = integer_type_node;
+      uintmax_type_node = unsigned_type_node;
+      signed_size_type_node = integer_type_node;
+    }
+  else if (strcmp (SIZE_TYPE, "long unsigned int") == 0)
+    {
+      intmax_type_node = long_integer_type_node;
+      uintmax_type_node = long_unsigned_type_node;
+      signed_size_type_node = long_integer_type_node;
+    }
+  else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0)
+    {
+      intmax_type_node = long_long_integer_type_node;
+      uintmax_type_node = long_long_unsigned_type_node;
+      signed_size_type_node = long_long_integer_type_node;
+    }
+  else
+    {
+      int i;
+
+      signed_size_type_node = NULL_TREE;
+      for (i = 0; i < NUM_INT_N_ENTS; i++)
+       if (int_n_enabled_p[i])
+         {
+           char name[50];
+           sprintf (name, "__int%d unsigned", int_n_data[i].bitsize);
+
+           if (strcmp (name, SIZE_TYPE) == 0)
+             {
+               intmax_type_node = int_n_trees[i].signed_type;
+               uintmax_type_node = int_n_trees[i].unsigned_type;
+               signed_size_type_node = int_n_trees[i].signed_type;
+             }
+         }
+      if (signed_size_type_node == NULL_TREE)
+       gcc_unreachable ();
+    }
+
+  wint_type_node = unsigned_type_node;
+  pid_type_node = integer_type_node;
+}
+
+
+static bool
+brig_langhook_init (void)
+{
+  build_common_tree_nodes (false);
+
+  /* Builtin initialization related code borrowed from lto-lang.c.  */
+  void_list_node = build_tree_list (NULL_TREE, void_type_node);
+
+  brig_build_c_type_nodes ();
+
+  if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
+    {
+      tree x = build_pointer_type (TREE_TYPE (va_list_type_node));
+      brig_define_builtins (x, x);
+    }
+  else
+    {
+      brig_define_builtins (build_reference_type (va_list_type_node),
+                           va_list_type_node);
+    }
+
+  targetm.init_builtins ();
+  build_common_builtin_nodes ();
+
+  return true;
+}
+
+#undef LANG_HOOKS_NAME
+#undef LANG_HOOKS_INIT
+#undef LANG_HOOKS_OPTION_LANG_MASK
+#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
+#undef LANG_HOOKS_HANDLE_OPTION
+#undef LANG_HOOKS_POST_OPTIONS
+#undef LANG_HOOKS_PARSE_FILE
+#undef LANG_HOOKS_TYPE_FOR_MODE
+#undef LANG_HOOKS_TYPE_FOR_SIZE
+#undef LANG_HOOKS_REGISTER_BUILTIN_TYPE
+#undef LANG_HOOKS_BUILTIN_FUNCTION
+#undef LANG_HOOKS_GLOBAL_BINDINGS_P
+#undef LANG_HOOKS_PUSHDECL
+#undef LANG_HOOKS_GETDECLS
+#undef LANG_HOOKS_WRITE_GLOBALS
+#undef LANG_HOOKS_GIMPLIFY_EXPR
+#undef LANG_HOOKS_EH_PERSONALITY
+
+#define LANG_HOOKS_NAME "GNU Brig"
+#define LANG_HOOKS_INIT brig_langhook_init
+#define LANG_HOOKS_OPTION_LANG_MASK brig_langhook_option_lang_mask
+#define LANG_HOOKS_INIT_OPTIONS_STRUCT brig_langhook_init_options_struct
+#define LANG_HOOKS_HANDLE_OPTION brig_langhook_handle_option
+#define LANG_HOOKS_POST_OPTIONS brig_langhook_post_options
+#define LANG_HOOKS_PARSE_FILE brig_langhook_parse_file
+#define LANG_HOOKS_TYPE_FOR_MODE brig_langhook_type_for_mode
+#define LANG_HOOKS_TYPE_FOR_SIZE brig_langhook_type_for_size
+#define LANG_HOOKS_REGISTER_BUILTIN_TYPE brig_langhook_register_builtin_type
+#define LANG_HOOKS_BUILTIN_FUNCTION brig_langhook_builtin_function
+#define LANG_HOOKS_GLOBAL_BINDINGS_P brig_langhook_global_bindings_p
+#define LANG_HOOKS_PUSHDECL brig_langhook_pushdecl
+#define LANG_HOOKS_GETDECLS brig_langhook_getdecls
+#define LANG_HOOKS_GIMPLIFY_EXPR brig_langhook_gimplify_expr
+#define LANG_HOOKS_EH_PERSONALITY brig_langhook_eh_personality
+
+struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
+
+#include "gt-brig-brig-lang.h"
+#include "gtype-brig.h"
diff --git a/gcc/brig/brigfrontend/brig-arg-block-handler.cc b/gcc/brig/brigfrontend/brig-arg-block-handler.cc
new file mode 100644 (file)
index 0000000..99945ee
--- /dev/null
@@ -0,0 +1,66 @@
+/* brig-arg-block-handler.cc -- brig arg block start/end directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+#include "tree-iterator.h"
+#include "system.h"
+#include "errors.h"
+
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+
+size_t
+brig_directive_arg_block_handler::operator () (const BrigBase *base)
+{
+  if (base->kind == BRIG_KIND_DIRECTIVE_ARG_BLOCK_START)
+    {
+      /* Initiate a new code block for the call site.  */
+      tree stmt_list = alloc_stmt_list ();
+      tree bind_expr
+       = build3 (BIND_EXPR, void_type_node, NULL, stmt_list, NULL);
+      tree block = make_node (BLOCK);
+      BIND_EXPR_BLOCK (bind_expr) = block;
+      static int block_id = 0;
+      BLOCK_NUMBER (block) = block_id++;
+      TREE_USED (block) = 1;
+      tree m_parentblock = DECL_INITIAL (m_parent.m_cf->m_func_decl);
+      BLOCK_SUPERCONTEXT (block) = m_parentblock;
+
+      chainon (BLOCK_SUBBLOCKS (m_parentblock), block);
+
+      m_parent.m_cf->m_current_bind_expr = bind_expr;
+      m_parent.m_cf->m_generating_arg_block = true;
+    }
+  else if (base->kind == BRIG_KIND_DIRECTIVE_ARG_BLOCK_END)
+    {
+      /* Restore the used bind expression back to the function
+        scope.  */
+      tree new_bind_expr = m_parent.m_cf->m_current_bind_expr;
+      m_parent.m_cf->m_current_bind_expr
+       = DECL_SAVED_TREE (m_parent.m_cf->m_func_decl);
+      m_parent.m_cf->append_statement (new_bind_expr);
+      m_parent.m_cf->m_generating_arg_block = false;
+    }
+  else
+    gcc_unreachable ();
+
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-atomic-inst-handler.cc b/gcc/brig/brigfrontend/brig-atomic-inst-handler.cc
new file mode 100644 (file)
index 0000000..87abab8
--- /dev/null
@@ -0,0 +1,265 @@
+/* brig-atomic-inst-handler.cc -- brig atomic instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+
+#include "brig-code-entry-handler.h"
+#include "brig-util.h"
+#include "fold-const.h"
+#include "diagnostic.h"
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+#include "convert.h"
+#include "langhooks.h"
+#include "gimple-expr.h"
+#include "stringpool.h"
+#include "brig-builtins.h"
+
+brig_atomic_inst_handler::brig_atomic_inst_handler (brig_to_generic &parent)
+  : brig_code_entry_handler (parent)
+{
+}
+
+size_t
+brig_atomic_inst_handler::generate_tree (const BrigInstBase &inst,
+                                        BrigAtomicOperation8_t atomic_opcode)
+{
+  tree_stl_vec operands = build_operands (inst);
+  const int first_input
+    = gccbrig_hsa_opcode_op_output_p (inst.opcode, 0) ? 1 : 0;
+
+  tree instr_type = gccbrig_tree_type_for_hsa_type (inst.type);
+
+  /* Utilize the atomic data types (from C++11 support) for implementing
+     atomic operations.  */
+
+  tree atomic_type = build_qualified_type (instr_type, TYPE_QUAL_ATOMIC);
+
+  gcc_assert (atomic_type != NULL_TREE);
+
+  tree signal_handle = operands[first_input];
+  tree atomic_ptype = build_pointer_type (atomic_type);
+  tree casted_to_ptr = convert_to_pointer (atomic_ptype, signal_handle);
+
+  tree src0 = NULL_TREE;
+  if (atomic_opcode != BRIG_ATOMIC_LD)
+    src0 = operands[first_input + 1];
+
+  tree instr_expr = NULL_TREE;
+
+  tree ptype = build_pointer_type (instr_type);
+  tree ptr = convert_to_pointer (ptype, operands[first_input]);
+
+  if (atomic_opcode == BRIG_ATOMIC_ST)
+    {
+      tree mem_ref = build2 (MEM_REF, atomic_type, casted_to_ptr,
+                            build_int_cst (atomic_ptype, 0));
+      instr_expr = build2 (MODIFY_EXPR, atomic_type, mem_ref, src0);
+    }
+  else if (atomic_opcode == BRIG_ATOMIC_LD
+          || (atomic_opcode >= BRIG_ATOMIC_WAIT_EQ
+              && atomic_opcode <= BRIG_ATOMIC_WAITTIMEOUT_GTE))
+    {
+      tree mem_ref = build2 (MEM_REF, atomic_type, casted_to_ptr,
+                            build_int_cst (atomic_ptype, 0));
+      /* signal_wait* instructions can return spuriously before the
+        condition becomes true.  Therefore it's legal to return
+        right away.  TODO: builtin calls which can be
+        implemented with a power efficient sleep-wait.  */
+      instr_expr = mem_ref;
+    }
+  else if (atomic_opcode == BRIG_ATOMIC_CAS)
+    {
+      /* Special case for CAS due to the two args.  */
+      tree built_in = NULL_TREE;
+      switch (gccbrig_hsa_type_bit_size (inst.type))
+       {
+       case 32:
+         built_in
+           = builtin_decl_explicit (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4);
+         break;
+       case 64:
+         built_in
+           = builtin_decl_explicit (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8);
+         break;
+       default:
+         gcc_unreachable ();
+       }
+
+      tree src1 = operands[first_input + 2];
+
+      tree src0_type
+       = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (built_in))));
+
+      tree src1_type = TREE_VALUE
+       (TREE_CHAIN (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (built_in)))));
+
+      instr_expr = call_builtin (built_in, 3, instr_type, ptype, ptr,
+                                src0_type, src0, src1_type, src1);
+    }
+  else
+    {
+      tree built_in = NULL_TREE;
+      /* The rest of the builtins have the same number of parameters.
+        Generate a big if..else that finds the correct builtin
+        automagically from the def file.  */
+#undef DEF_HSAIL_SAT_BUILTIN
+#undef DEF_HSAIL_BUILTIN
+#undef DEF_HSAIL_ATOMIC_BUILTIN
+#undef DEF_HSAIL_INTR_BUILTIN
+#undef DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN
+
+#define DEF_HSAIL_ATOMIC_BUILTIN(ENUM, ATOMIC_OPCODE, HSAIL_TYPE,      \
+                                NAME, TYPE, ATTRS)                     \
+      if (atomic_opcode == ATOMIC_OPCODE && inst.type == HSAIL_TYPE)   \
+       built_in = builtin_decl_explicit (ENUM);                        \
+      else
+#include "brig-builtins.def"
+      switch (atomic_opcode)
+       {
+       case BRIG_ATOMIC_ADD:
+         switch (gccbrig_hsa_type_bit_size (inst.type))
+           {
+           case 32:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_ADD_4);
+             break;
+           case 64:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_ADD_8);
+             break;
+           default:
+             gcc_unreachable ();
+           }
+         break;
+       case BRIG_ATOMIC_SUB:
+         switch (gccbrig_hsa_type_bit_size (inst.type))
+           {
+           case 32:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_SUB_4);
+             break;
+           case 64:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_SUB_8);
+             break;
+           default:
+             gcc_unreachable ();
+           }
+         break;
+       case BRIG_ATOMIC_AND:
+         switch (gccbrig_hsa_type_bit_size (inst.type))
+           {
+           case 32:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_AND_4);
+             break;
+           case 64:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_AND_8);
+             break;
+           default:
+             gcc_unreachable ();
+           }
+         break;
+       case BRIG_ATOMIC_XOR:
+         switch (gccbrig_hsa_type_bit_size (inst.type))
+           {
+           case 32:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_XOR_4);
+             break;
+           case 64:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_XOR_8);
+             break;
+           default:
+             gcc_unreachable ();
+           }
+         break;
+       case BRIG_ATOMIC_OR:
+         switch (gccbrig_hsa_type_bit_size (inst.type))
+           {
+           case 32:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_OR_4);
+             break;
+           case 64:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_FETCH_AND_OR_8);
+             break;
+           default:
+             gcc_unreachable ();
+           }
+         break;
+       case BRIG_ATOMIC_EXCH:
+         switch (gccbrig_hsa_type_bit_size (inst.type))
+           {
+           case 32:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_LOCK_TEST_AND_SET_4);
+             break;
+           case 64:
+             built_in
+               = builtin_decl_explicit (BUILT_IN_SYNC_LOCK_TEST_AND_SET_8);
+             break;
+           default:
+             gcc_unreachable ();
+           }
+         break;
+       default:
+         gcc_unreachable ();
+       };
+
+      gcc_assert (built_in != NULL_TREE);
+      tree arg0_type
+       = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (built_in))));
+
+      instr_expr = call_builtin (built_in, 2, instr_type, ptr_type_node,
+                                ptr, arg0_type, src0);
+
+      /* We need a temp variable for the result, because otherwise
+        the gimplifier drops a necessary (unsigned to signed) cast in
+        the output assignment and fails a check later.  */
+      tree tmp_var = create_tmp_var (arg0_type, "builtin_out");
+      tree tmp_assign
+       = build2 (MODIFY_EXPR, TREE_TYPE (tmp_var), tmp_var, instr_expr);
+      m_parent.m_cf->append_statement (tmp_assign);
+      instr_expr = tmp_var;
+    }
+
+  if (first_input > 0)
+    build_output_assignment (inst, operands[0], instr_expr);
+  else
+    m_parent.m_cf->append_statement (instr_expr);
+
+  return inst.base.byteCount;
+}
+
+size_t
+brig_atomic_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstAtomic *inst = (const BrigInstAtomic *) base;
+  BrigAtomicOperation8_t atomic_opcode;
+  atomic_opcode = inst->atomicOperation;
+
+  return generate_tree (inst->base, atomic_opcode);
+}
diff --git a/gcc/brig/brigfrontend/brig-basic-inst-handler.cc b/gcc/brig/brigfrontend/brig-basic-inst-handler.cc
new file mode 100644 (file)
index 0000000..638f818
--- /dev/null
@@ -0,0 +1,865 @@
+/* brig-basic-inst-handler.cc -- brig basic instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+
+#include "brig-code-entry-handler.h"
+#include "brig-util.h"
+
+#include "errors.h"
+#include "gimple-expr.h"
+#include "convert.h"
+#include "print-tree.h"
+#include "tree-pretty-print.h"
+#include "langhooks.h"
+#include "stor-layout.h"
+#include "diagnostic-core.h"
+#include "brig-builtins.h"
+
+brig_basic_inst_handler::brig_basic_inst_handler (brig_to_generic &parent)
+  : brig_code_entry_handler (parent)
+{
+}
+
+class scalarized_sat_arithmetics : public tree_element_binary_visitor
+{
+public:
+  scalarized_sat_arithmetics (const BrigInstBase &brig_inst)
+    : m_brig_inst (brig_inst)
+  {
+    BrigType16_t element_type = brig_inst.type & BRIG_TYPE_BASE_MASK;
+
+#undef DEF_HSAIL_SAT_BUILTIN
+#undef DEF_HSAIL_BUILTIN
+#undef DEF_HSAIL_ATOMIC_BUILTIN
+#undef DEF_HSAIL_INTR_BUILTIN
+#undef DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN
+
+#define DEF_HSAIL_SAT_BUILTIN(ENUM, BRIG_OPCODE, HSAIL_TYPE,           \
+                             NAME, TYPE, ATTRS)                        \
+    if (brig_inst.opcode == BRIG_OPCODE && element_type == HSAIL_TYPE) \
+      m_builtin = builtin_decl_explicit (ENUM);                                \
+    else
+#include "brig-builtins.def"
+      gcc_unreachable ();
+  }
+
+  virtual tree
+  visit_element (brig_code_entry_handler &, tree operand0, tree operand1)
+  {
+    /* Implement saturating arithmetics with scalar built-ins for now.
+       TODO: emit GENERIC nodes for the simplest cases or at least
+       emit vector built-ins.  */
+    return call_builtin (m_builtin, 2, TREE_TYPE (operand0),
+                        TREE_TYPE (operand0), operand0,
+                        TREE_TYPE (operand1), operand1);
+  }
+  const BrigInstBase &m_brig_inst;
+  tree m_builtin;
+};
+
+/* Implements a vector shuffle.  ARITH_TYPE is the type of the vector,
+   OPERANDS[0] is the first vector, OPERAND[1] the second vector and
+   OPERANDS[2] the shuffle mask in HSAIL format.  The output is a VEC_PERM_EXPR
+   that implements the shuffle as a GENERIC expression.  */
+
+tree
+brig_basic_inst_handler::build_shuffle (tree arith_type,
+                                       tree_stl_vec &operands)
+{
+  tree element_type
+    = get_unsigned_int_type (TREE_TYPE (TREE_TYPE (operands[0])));
+
+  /* Offsets to add to the mask values to convert from the
+     HSAIL mask to VEC_PERM_EXPR masks.  VEC_PERM_EXPR mask
+     assumes an index spanning from 0 to 2 times the vec
+     width while HSAIL refers separately to two different
+     input vectors, thus is not a "full shuffle" where all
+     output elements can originate from any input element.  */
+  vec<constructor_elt, va_gc> *mask_offset_vals = NULL;
+
+  vec<constructor_elt, va_gc> *input_mask_vals = NULL;
+  size_t input_mask_element_size
+    = exact_log2 (TYPE_VECTOR_SUBPARTS (arith_type));
+
+  /* Unpack the tightly packed mask elements to BIT_FIELD_REFs
+     from which to construct the mask vector as understood by
+     VEC_PERM_EXPR.  */
+  tree mask_operand = add_temp_var ("shuffle_mask", operands[2]);
+
+  tree mask_element_type
+    = build_nonstandard_integer_type (input_mask_element_size, true);
+
+  for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)
+    {
+      tree mask_element
+       = build3 (BIT_FIELD_REF, mask_element_type, mask_operand,
+                 build_int_cst (unsigned_char_type_node,
+                                input_mask_element_size),
+                 build_int_cst (unsigned_char_type_node,
+                                i * input_mask_element_size));
+
+      mask_element = convert (element_type, mask_element);
+
+      tree offset;
+      if (i < TYPE_VECTOR_SUBPARTS (arith_type) / 2)
+       offset = build_int_cst (element_type, 0);
+      else
+       offset
+         = build_int_cst (element_type, TYPE_VECTOR_SUBPARTS (arith_type));
+
+      CONSTRUCTOR_APPEND_ELT (mask_offset_vals, NULL_TREE, offset);
+      CONSTRUCTOR_APPEND_ELT (input_mask_vals, NULL_TREE, mask_element);
+    }
+  tree mask_vec_type
+    = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type));
+
+  tree mask_vec = build_constructor (mask_vec_type, input_mask_vals);
+  tree offset_vec = build_constructor (mask_vec_type, mask_offset_vals);
+
+  tree mask = build2 (PLUS_EXPR, mask_vec_type, mask_vec, offset_vec);
+
+  tree perm = build3 (VEC_PERM_EXPR, TREE_TYPE (operands[0]), operands[0],
+                     operands[1], mask);
+  return perm;
+}
+
+/* Unpacks (extracts) a scalar element with an index in OPERANDS[1]
+   from the vector expression in OPERANDS[0].  */
+
+tree
+brig_basic_inst_handler::build_unpack (tree_stl_vec &operands)
+{
+  /* Implement the unpack with a shuffle that stores the unpacked
+     element to the lowest bit positions in the dest.  After that
+     a bitwise AND is used to clear the uppermost bits.  */
+  tree src_element_type = TREE_TYPE (TREE_TYPE (operands[0]));
+
+  /* Perform the operations with a raw (unsigned int type) type.  */
+  tree element_type = get_unsigned_int_type (src_element_type);
+
+  vec<constructor_elt, va_gc> *input_mask_vals = NULL;
+  vec<constructor_elt, va_gc> *and_mask_vals = NULL;
+
+  size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0]));
+  tree vec_type = build_vector_type (element_type, element_count);
+
+  for (size_t i = 0; i < element_count; ++i)
+    {
+      tree mask_element;
+      if (i == 0)
+       mask_element = convert (element_type, operands[1]);
+      else
+       mask_element = build_int_cst (element_type, 0);
+
+      CONSTRUCTOR_APPEND_ELT (input_mask_vals, NULL_TREE, mask_element);
+
+      tree and_mask_element;
+      if (i == 0)
+       and_mask_element = build_int_cst (element_type, -1);
+      else
+       and_mask_element = build_int_cst (element_type, 0);
+      CONSTRUCTOR_APPEND_ELT (and_mask_vals, NULL_TREE, and_mask_element);
+    }
+
+  tree mask_vec = build_constructor (vec_type, input_mask_vals);
+
+  tree and_mask_vec = build_constructor (vec_type, and_mask_vals);
+
+  tree perm = build3 (VEC_PERM_EXPR, vec_type,
+                     build_reinterpret_cast (vec_type, operands[0]),
+                     build_reinterpret_cast (vec_type, operands[0]), mask_vec);
+
+  tree cleared = build2 (BIT_AND_EXPR, vec_type, perm, and_mask_vec);
+
+  size_t s = int_size_in_bytes (TREE_TYPE (cleared)) * BITS_PER_UNIT;
+  tree raw_type = build_nonstandard_integer_type (s, true);
+
+  tree as_int = build_reinterpret_cast (raw_type, cleared);
+
+  if (int_size_in_bytes (src_element_type) < 4)
+    {
+      if (INTEGRAL_TYPE_P (src_element_type))
+       return extend_int (as_int, uint32_type_node, src_element_type);
+    }
+  return as_int;
+}
+
+/* Packs (inserts) a scalar element in OPERANDS[1]
+   to the vector in OPERANDS[0] at element position defined by
+   OPERANDS[2].  */
+
+tree
+brig_basic_inst_handler::build_pack (tree_stl_vec &operands)
+{
+  /* Implement using a bit level insertion.
+     TODO: Reuse this for implementing 'bitinsert'
+     without a builtin call.  */
+
+  size_t ecount = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0]));
+  size_t vecsize = int_size_in_bytes (TREE_TYPE (operands[0])) * BITS_PER_UNIT;
+  tree wide_type = build_nonstandard_integer_type (vecsize, 1);
+
+  tree src_vect = build_reinterpret_cast (wide_type, operands[0]);
+  src_vect = add_temp_var ("src_vect", src_vect);
+
+  tree scalar = operands[1];
+  scalar = add_temp_var ("scalar", convert_to_integer (wide_type, scalar));
+
+  tree pos = operands[2];
+
+  /* The upper bits of the position can contain garbage.
+     Zero them for well-defined semantics.  */
+  tree t = build2 (BIT_AND_EXPR, TREE_TYPE (pos), operands[2],
+                  build_int_cstu (TREE_TYPE (pos), ecount - 1));
+  pos = add_temp_var ("pos", convert (wide_type, t));
+
+  tree element_type = TREE_TYPE (TREE_TYPE (operands[0]));
+  size_t element_width = int_size_in_bytes (element_type) * BITS_PER_UNIT;
+  tree ewidth = build_int_cstu (wide_type, element_width);
+
+  tree bitoffset = build2 (MULT_EXPR, wide_type, ewidth, pos);
+  bitoffset = add_temp_var ("offset", bitoffset);
+
+  uint64_t mask_int
+    = element_width == 64 ? (uint64_t) -1 : ((uint64_t) 1 << element_width) - 1;
+
+  tree mask = build_int_cstu (wide_type, mask_int);
+
+  mask = add_temp_var ("mask", convert_to_integer (wide_type, mask));
+
+  tree clearing_mask
+    = build1 (BIT_NOT_EXPR, wide_type,
+             build2 (LSHIFT_EXPR, wide_type, mask, bitoffset));
+
+  tree zeroed_element
+    = build2 (BIT_AND_EXPR, wide_type, src_vect, clearing_mask);
+
+  /* TODO: Is the AND necessary: does HSA define what
+     happens if the upper bits in the inserted element are not
+     zero? */
+  tree element_in_position
+    = build2 (LSHIFT_EXPR, wide_type,
+             build2 (BIT_AND_EXPR, wide_type, scalar, mask), bitoffset);
+
+  tree inserted
+    = build2 (BIT_IOR_EXPR, wide_type, zeroed_element, element_in_position);
+  return inserted;
+}
+
+/* Implement the unpack{lo,hi}.  BRIG_OPCODE should tell which one and
+   ARITH_TYPE describe the type of the vector arithmetics.
+   OPERANDS[0] and OPERANDS[1] are the input vectors.  */
+
+tree
+brig_basic_inst_handler::build_unpack_lo_or_hi (BrigOpcode16_t brig_opcode,
+                                               tree arith_type,
+                                               tree_stl_vec &operands)
+{
+  tree element_type = get_unsigned_int_type (TREE_TYPE (arith_type));
+  tree mask_vec_type
+    = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type));
+
+  size_t element_count = TYPE_VECTOR_SUBPARTS (arith_type);
+  vec<constructor_elt, va_gc> *input_mask_vals = NULL;
+
+  size_t offset = (brig_opcode == BRIG_OPCODE_UNPACKLO) ? 0 : element_count / 2;
+
+  for (size_t i = 0; i < element_count / 2; ++i)
+    {
+      CONSTRUCTOR_APPEND_ELT (input_mask_vals, NULL_TREE,
+                             build_int_cst (element_type, offset + i));
+      CONSTRUCTOR_APPEND_ELT (input_mask_vals, NULL_TREE,
+                             build_int_cst (element_type,
+                                            offset + i + element_count));
+    }
+
+  tree mask_vec = build_constructor (mask_vec_type, input_mask_vals);
+
+  tree perm = build3 (VEC_PERM_EXPR, TREE_TYPE (operands[0]), operands[0],
+                     operands[1], mask_vec);
+  return perm;
+}
+
+/* Builds a basic instruction expression from a BRIG instruction.  BRIG_OPCODE
+   is the opcode, BRIG_TYPE the brig type of the instruction, ARITH_TYPE the
+   desired tree type for the instruction, and OPERANDS the instruction's
+   input operands already converted to tree nodes.  */
+
+tree
+brig_basic_inst_handler::build_inst_expr (BrigOpcode16_t brig_opcode,
+                                         BrigType16_t brig_type,
+                                         tree arith_type,
+                                         tree_stl_vec &operands)
+{
+  tree_code opcode = get_tree_code_for_hsa_opcode (brig_opcode, brig_type);
+
+  BrigType16_t inner_type = brig_type & BRIG_TYPE_BASE_MASK;
+
+  tree instr_inner_type
+    = VECTOR_TYPE_P (arith_type) ? TREE_TYPE (arith_type) : arith_type;
+
+  if (opcode == RSHIFT_EXPR || opcode == LSHIFT_EXPR)
+    {
+      /* HSA defines modulo/clipping behavior for shift amounts larger
+        than the bit width, while tree.def leaves it undefined.
+        We need to mask the upper bits to ensure the defined behavior.  */
+      tree scalar_mask
+       = build_int_cst (instr_inner_type,
+                        gccbrig_hsa_type_bit_size (inner_type) - 1);
+
+      tree mask = VECTOR_TYPE_P (arith_type)
+                   ? build_vector_from_val (arith_type, scalar_mask)
+                   : scalar_mask;
+
+      /* The shift amount is a scalar, broadcast it to produce
+        a vector shift.  */
+      if (VECTOR_TYPE_P (arith_type))
+       operands[1] = build_vector_from_val (arith_type, operands[1]);
+      operands[1] = build2 (BIT_AND_EXPR, arith_type, operands[1], mask);
+    }
+
+  size_t input_count = operands.size ();
+  size_t output_count = gccbrig_hsa_opcode_op_output_p (brig_opcode, 0) ?
+    1 : 0;
+
+  if (opcode == TREE_LIST)
+    {
+      /* There was no direct GENERIC opcode for the instruction;
+        try to emulate it with a chain of GENERIC nodes.  */
+      if (brig_opcode == BRIG_OPCODE_MAD || brig_opcode == BRIG_OPCODE_MAD24)
+       {
+         /* There doesn't seem to be a "standard" MAD built-in in gcc so let's
+            use a chain of multiply + add for now (double rounding method).
+            It should be easier for optimizers than a custom built-in call
+            WIDEN_MULT_EXPR is close, but requires a double size result
+            type.  */
+         tree mult_res
+           = build2 (MULT_EXPR, arith_type, operands[0], operands[1]);
+         return build2 (PLUS_EXPR, arith_type, mult_res, operands[2]);
+       }
+      else if (brig_opcode == BRIG_OPCODE_MAD24HI)
+       {
+         tree mult_res
+           = build2 (MULT_HIGHPART_EXPR, arith_type, operands[0], operands[1]);
+         return build2 (PLUS_EXPR, arith_type, mult_res, operands[2]);
+       }
+      else if (brig_opcode == BRIG_OPCODE_SHUFFLE)
+       {
+         return build_shuffle (arith_type, operands);
+       }
+      else if (brig_opcode == BRIG_OPCODE_UNPACKLO
+              || brig_opcode == BRIG_OPCODE_UNPACKHI)
+       {
+         return build_unpack_lo_or_hi (brig_opcode, arith_type, operands);
+       }
+      else if (brig_opcode == BRIG_OPCODE_UNPACK)
+       {
+         return build_unpack (operands);
+       }
+      else if (brig_opcode == BRIG_OPCODE_PACK)
+       {
+         return build_pack (operands);
+       }
+      else if (brig_opcode == BRIG_OPCODE_NRSQRT)
+       {
+         /* Implement as 1.0/sqrt (x) and assume gcc instruction selects to
+            native ISA other than a division, if available.
+            TODO: this will happen only with unsafe math optimizations
+            on which cannot be used in general to remain HSAIL compliant.
+            Perhaps a builtin call would be better option here.  */
+         return build2 (RDIV_EXPR, arith_type, build_one_cst (arith_type),
+                        expand_or_call_builtin (BRIG_OPCODE_SQRT, brig_type,
+                                                arith_type, operands));
+       }
+      else if (brig_opcode == BRIG_OPCODE_NRCP)
+       {
+         /* Implement as 1.0/x and assume gcc instruction selects to
+            native ISA other than a division, if available.  */
+         return build2 (RDIV_EXPR, arith_type, build_one_cst (arith_type),
+                        operands[0]);
+       }
+      else if (brig_opcode == BRIG_OPCODE_LANEID
+              || brig_opcode == BRIG_OPCODE_MAXWAVEID
+              || brig_opcode == BRIG_OPCODE_WAVEID)
+       {
+         /* Assuming WAVESIZE 1 (for now), therefore LANEID, WAVEID and
+            MAXWAVEID always return 0.  */
+         return build_zero_cst (arith_type);
+       }
+      else
+       gcc_unreachable ();
+    }
+  else if (opcode == CALL_EXPR)
+    return expand_or_call_builtin (brig_opcode, brig_type, arith_type,
+                                  operands);
+  else if (output_count == 1)
+    {
+      if (input_count == 1)
+       {
+         if (opcode == MODIFY_EXPR)
+           return operands[0];
+         else
+           return build1 (opcode, arith_type, operands[0]);
+       }
+      else if (input_count == 2)
+       return build2 (opcode, arith_type, operands[0], operands[1]);
+      else if (input_count == 3)
+       return build3 (opcode, arith_type, operands[0], operands[1],
+                      operands[2]);
+      else
+       gcc_unreachable ();
+    }
+  else
+    gcc_unreachable ();
+
+  return NULL_TREE;
+}
+
+/* Handles the basic instructions, including packed instructions. Deals
+   with the different packing modes by unpacking/packing the wanted
+   elements.  Delegates most of the instruction cases to build_inst_expr(). */
+
+size_t
+brig_basic_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstBase *brig_inst = (const BrigInstBase *) base;
+
+  tree_stl_vec operands = build_operands (*brig_inst);
+
+  size_t output_count
+    = gccbrig_hsa_opcode_op_output_p (brig_inst->opcode, 0) ? 1 : 0;
+  size_t input_count
+    = operands.size () == 0 ? 0 : (operands.size () - output_count);
+
+  gcc_assert (output_count == 0 || output_count == 1);
+
+  tree_stl_vec::iterator first_input_i = operands.begin ();
+  if (output_count > 0 && operands.size () > 0)
+    ++first_input_i;
+
+  tree_stl_vec in_operands;
+  in_operands.assign (first_input_i, operands.end ());
+
+  BrigType16_t brig_inst_type = brig_inst->type;
+
+  if (brig_inst->opcode == BRIG_OPCODE_NOP)
+    return base->byteCount;
+  else if (brig_inst->opcode == BRIG_OPCODE_FIRSTBIT
+          || brig_inst->opcode == BRIG_OPCODE_LASTBIT
+          || brig_inst->opcode == BRIG_OPCODE_SAD)
+    /* These instructions are reported to be always 32b in HSAIL, but we want
+       to treat them according to their input argument's type to select the
+       correct instruction/builtin.  */
+    brig_inst_type
+      = gccbrig_tree_type_to_hsa_type (TREE_TYPE (in_operands[0]));
+
+  tree instr_type = gccbrig_tree_type_for_hsa_type (brig_inst_type);
+
+  if (!instr_type)
+    {
+      gcc_unreachable ();
+      return base->byteCount;
+    }
+
+  bool is_vec_instr = hsa_type_packed_p (brig_inst_type);
+
+  size_t element_size_bits;
+  size_t element_count;
+
+  if (is_vec_instr)
+    {
+      BrigType16_t brig_element_type = brig_inst_type & BRIG_TYPE_BASE_MASK;
+      element_size_bits = gccbrig_hsa_type_bit_size (brig_element_type);
+      element_count = gccbrig_hsa_type_bit_size (brig_inst_type)
+       / gccbrig_hsa_type_bit_size (brig_element_type);
+    }
+  else
+    {
+      element_size_bits = gccbrig_hsa_type_bit_size (brig_inst_type);
+      element_count = 1;
+    }
+
+  /* The actual arithmetics type that should be performed with the
+     operation.  This is not always the same as the original BRIG
+     opcode's type due to implicit conversions of storage-only f16.  */
+  tree arith_type = gccbrig_is_bit_operation (brig_inst->opcode)
+                     ? gccbrig_tree_type_for_hsa_type (brig_inst_type)
+                     : get_tree_expr_type_for_hsa_type (brig_inst_type);
+
+  tree instr_expr = NULL_TREE;
+
+  BrigPack8_t p = BRIG_PACK_NONE;
+  if (brig_inst->base.kind == BRIG_KIND_INST_MOD)
+    p = ((const BrigInstMod *) brig_inst)->pack;
+  else if (brig_inst->base.kind == BRIG_KIND_INST_CMP)
+    p = ((const BrigInstCmp *) brig_inst)->pack;
+
+  if (p == BRIG_PACK_PS || p == BRIG_PACK_PSSAT)
+    in_operands[1] = build_lower_element_broadcast (in_operands[1]);
+  else if (p == BRIG_PACK_SP || p == BRIG_PACK_SPSAT)
+    in_operands[0] = build_lower_element_broadcast (in_operands[0]);
+
+  tree_code opcode
+    = get_tree_code_for_hsa_opcode (brig_inst->opcode, brig_inst_type);
+
+  if (p >= BRIG_PACK_PPSAT && p <= BRIG_PACK_PSAT)
+    {
+      scalarized_sat_arithmetics sat_arith (*brig_inst);
+      gcc_assert (input_count == 2);
+      instr_expr = sat_arith (*this, in_operands[0], in_operands[1]);
+    }
+  else if (opcode == RETURN_EXPR)
+    {
+      if (m_parent.m_cf->m_is_kernel)
+       {
+         tree goto_stmt
+           = build1 (GOTO_EXPR, void_type_node, m_parent.m_cf->m_exit_label);
+         m_parent.m_cf->append_statement (goto_stmt);
+         return base->byteCount;
+       }
+      else
+       {
+         m_parent.m_cf->append_return_stmt ();
+         return base->byteCount;
+       }
+    }
+  else if (opcode == MULT_HIGHPART_EXPR &&
+          is_vec_instr && element_size_bits < 64)
+    {
+      /* MULT_HIGHPART_EXPR works only on target dependent vector sizes and
+        even the scalars do not seem to work at least for char elements.
+
+        Let's fall back to scalarization and promotion of the vector elements
+        to larger types with the MULHI computed as a regular MUL.
+        MULHI for 2x64b seems to work with the Intel CPUs I've tested so
+        that is passed on for vector processing so there is no need for
+        128b scalar arithmetics.
+
+        This is not modular as these type of things do not belong to the
+        frontend, there should be a legalization phase before the backend
+        that figures out the best way to compute the MULHI for any
+        integer vector datatype.
+
+        TODO: promote to larger vector types instead.  For example
+        MULT_HIGHPART_EXPR with s8x8 doesn't work, but s16x8 seems to at least
+        with my x86-64.
+      */
+      tree_stl_vec operand0_elements;
+      if (input_count > 0)
+       unpack (in_operands[0], operand0_elements);
+
+      tree_stl_vec operand1_elements;
+      if (input_count > 1)
+       unpack (in_operands[1], operand1_elements);
+
+      tree_stl_vec result_elements;
+
+      tree scalar_type = TREE_TYPE (arith_type);
+      BrigType16_t element_type = brig_inst_type & BRIG_TYPE_BASE_MASK;
+      tree promoted_type = short_integer_type_node;
+      switch (element_type)
+       {
+       case BRIG_TYPE_S8:
+         promoted_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_S16);
+         break;
+       case BRIG_TYPE_U8:
+         promoted_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U16);
+         break;
+       case BRIG_TYPE_S16:
+         promoted_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_S32);
+         break;
+       case BRIG_TYPE_U16:
+         promoted_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U32);
+         break;
+       case BRIG_TYPE_S32:
+         promoted_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_S64);
+         break;
+       case BRIG_TYPE_U32:
+         promoted_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U64);
+         break;
+       default:
+         gcc_unreachable ();
+       }
+
+      size_t promoted_type_size = int_size_in_bytes (promoted_type) * 8;
+
+      for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)
+       {
+         tree operand0 = convert (promoted_type, operand0_elements.at (i));
+         tree operand1 = convert (promoted_type, operand1_elements.at (i));
+
+         tree scalar_expr
+           = build2 (MULT_EXPR, promoted_type, operand0, operand1);
+
+         scalar_expr
+           = build2 (RSHIFT_EXPR, promoted_type, scalar_expr,
+                     build_int_cstu (promoted_type, promoted_type_size / 2));
+
+         result_elements.push_back (convert (scalar_type, scalar_expr));
+       }
+      instr_expr = pack (result_elements);
+    }
+  else
+    {
+      /* 'class' is always of b1 type, let's consider it by its
+        float type when building the instruction to find the
+        correct builtin.  */
+      if (brig_inst->opcode == BRIG_OPCODE_CLASS)
+       brig_inst_type = ((const BrigInstSourceType *) base)->sourceType;
+      instr_expr = build_inst_expr (brig_inst->opcode, brig_inst_type,
+                                    arith_type, in_operands);
+    }
+
+  if (instr_expr == NULL_TREE)
+    {
+      gcc_unreachable ();
+      return base->byteCount;
+    }
+
+  if (p == BRIG_PACK_SS || p == BRIG_PACK_S || p == BRIG_PACK_SSSAT
+      || p == BRIG_PACK_SSAT)
+    {
+      /* In case of _s_ or _ss_, select only the lowest element
+        from the new input to the output.  We could extract
+        the element and use a scalar operation, but try
+        to keep data in vector registers as much as possible
+        to avoid copies between scalar and vector datapaths.  */
+      tree old_value;
+      tree half_storage_type = gccbrig_tree_type_for_hsa_type (brig_inst_type);
+      bool is_fp16_operation
+       = (brig_inst_type & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_F16
+       && !gccbrig_is_bit_operation (brig_inst->opcode);
+
+      if (is_fp16_operation)
+       old_value = build_h2f_conversion
+         (build_reinterpret_cast (half_storage_type, operands[0]));
+      else
+       old_value
+         = build_reinterpret_cast (TREE_TYPE (instr_expr), operands[0]);
+
+      size_t esize = is_fp16_operation ? 32 : element_size_bits;
+
+      /* Construct a permutation mask where other elements than the lowest one
+        is picked from the old_value.  */
+      tree mask_inner_type = build_nonstandard_integer_type (esize, 1);
+      vec<constructor_elt, va_gc> *constructor_vals = NULL;
+      for (size_t i = 0; i < element_count; ++i)
+       {
+         tree cst;
+
+         if (i == 0)
+           cst = build_int_cstu (mask_inner_type, element_count);
+         else
+           cst = build_int_cstu (mask_inner_type, i);
+         CONSTRUCTOR_APPEND_ELT (constructor_vals, NULL_TREE, cst);
+       }
+      tree mask_vec_type = build_vector_type (mask_inner_type, element_count);
+      tree mask = build_vector_from_ctor (mask_vec_type, constructor_vals);
+
+      tree new_value = create_tmp_var (TREE_TYPE (instr_expr), "new_output");
+      tree assign
+       = build2 (MODIFY_EXPR, TREE_TYPE (instr_expr), new_value, instr_expr);
+      m_parent.m_cf->append_statement (assign);
+
+      instr_expr
+       = build3 (VEC_PERM_EXPR, arith_type, old_value, new_value, mask);
+
+      tree lower_output = create_tmp_var (TREE_TYPE (instr_expr), "s_output");
+      tree assign_lower = build2 (MODIFY_EXPR, TREE_TYPE (instr_expr),
+                                 lower_output, instr_expr);
+      m_parent.m_cf->append_statement (assign_lower);
+      instr_expr = lower_output;
+    }
+
+  if (output_count == 1)
+    build_output_assignment (*brig_inst, operands[0], instr_expr);
+  else
+    m_parent.m_cf->append_statement (instr_expr);
+  return base->byteCount;
+}
+
+/* Create an expression that broadcasts the lowest element of the
+   vector in VEC_OPERAND to all elements of the returned vector.  */
+
+tree
+brig_basic_inst_handler::build_lower_element_broadcast (tree vec_operand)
+{
+  /* Build the broadcast using shuffle because there's no
+     direct broadcast in GENERIC and this way there's no need for
+     a separate extract of the lowest element.  */
+  tree element_type = TREE_TYPE (TREE_TYPE (vec_operand));
+  size_t esize = 8 * int_size_in_bytes (element_type);
+
+  size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (vec_operand));
+  tree mask_inner_type = build_nonstandard_integer_type (esize, 1);
+  vec<constructor_elt, va_gc> *constructor_vals = NULL;
+
+  /* Construct the mask.  */
+  for (size_t i = 0; i < element_count; ++i)
+    {
+      tree cst = build_int_cstu (mask_inner_type, element_count);
+      CONSTRUCTOR_APPEND_ELT (constructor_vals, NULL_TREE, cst);
+    }
+  tree mask_vec_type = build_vector_type (mask_inner_type, element_count);
+  tree mask = build_vector_from_ctor (mask_vec_type, constructor_vals);
+
+  return build3 (VEC_PERM_EXPR, TREE_TYPE (vec_operand), vec_operand,
+                vec_operand, mask);
+}
+
+/* Returns the tree code that should be used to implement the given
+   HSA instruction opcode (BRIG_OPCODE) for the given type of instruction
+   (BRIG_TYPE).  In case the opcode cannot be mapped to a TREE node directly,
+   returns TREE_LIST (if it can be emulated with a simple chain of tree
+   nodes) or CALL_EXPR if the opcode should be implemented using a builtin
+   call.  */
+
+tree_code
+brig_basic_inst_handler::get_tree_code_for_hsa_opcode
+  (BrigOpcode16_t brig_opcode, BrigType16_t brig_type) const
+{
+  BrigType16_t brig_inner_type = brig_type & BRIG_TYPE_BASE_MASK;
+  switch (brig_opcode)
+    {
+    case BRIG_OPCODE_NOP:
+      return NOP_EXPR;
+    case BRIG_OPCODE_ADD:
+      return PLUS_EXPR;
+    case BRIG_OPCODE_CMOV:
+      if (brig_inner_type == brig_type)
+       return COND_EXPR;
+      else
+       return VEC_COND_EXPR;
+    case BRIG_OPCODE_SUB:
+      return MINUS_EXPR;
+    case BRIG_OPCODE_MUL:
+    case BRIG_OPCODE_MUL24:
+      return MULT_EXPR;
+    case BRIG_OPCODE_MULHI:
+    case BRIG_OPCODE_MUL24HI:
+      return MULT_HIGHPART_EXPR;
+    case BRIG_OPCODE_DIV:
+      if (gccbrig_is_float_type (brig_inner_type))
+       return RDIV_EXPR;
+      else
+       return TRUNC_DIV_EXPR;
+    case BRIG_OPCODE_NEG:
+      return NEGATE_EXPR;
+    case BRIG_OPCODE_MIN:
+      if (gccbrig_is_float_type (brig_inner_type))
+       return CALL_EXPR;
+      else
+       return MIN_EXPR;
+    case BRIG_OPCODE_MAX:
+      if (gccbrig_is_float_type (brig_inner_type))
+       return CALL_EXPR;
+      else
+       return MAX_EXPR;
+    case BRIG_OPCODE_FMA:
+      return FMA_EXPR;
+    case BRIG_OPCODE_ABS:
+      return ABS_EXPR;
+    case BRIG_OPCODE_SHL:
+      return LSHIFT_EXPR;
+    case BRIG_OPCODE_SHR:
+      return RSHIFT_EXPR;
+    case BRIG_OPCODE_OR:
+      return BIT_IOR_EXPR;
+    case BRIG_OPCODE_XOR:
+      return BIT_XOR_EXPR;
+    case BRIG_OPCODE_AND:
+      return BIT_AND_EXPR;
+    case BRIG_OPCODE_NOT:
+      return BIT_NOT_EXPR;
+    case BRIG_OPCODE_RET:
+      return RETURN_EXPR;
+    case BRIG_OPCODE_MOV:
+    case BRIG_OPCODE_LDF:
+      return MODIFY_EXPR;
+    case BRIG_OPCODE_LD:
+    case BRIG_OPCODE_ST:
+      return MEM_REF;
+    case BRIG_OPCODE_BR:
+      return GOTO_EXPR;
+    case BRIG_OPCODE_REM:
+      if (brig_type == BRIG_TYPE_U64 || brig_type == BRIG_TYPE_U32)
+       return TRUNC_MOD_EXPR;
+      else
+       return CALL_EXPR;
+    case BRIG_OPCODE_NRCP:
+    case BRIG_OPCODE_NRSQRT:
+      /* Implement as 1/f (x).  gcc should pattern detect that and
+        use a native instruction, if available, for it.  */
+      return TREE_LIST;
+    case BRIG_OPCODE_FLOOR:
+    case BRIG_OPCODE_CEIL:
+    case BRIG_OPCODE_SQRT:
+    case BRIG_OPCODE_NSQRT:
+    case BRIG_OPCODE_RINT:
+    case BRIG_OPCODE_TRUNC:
+    case BRIG_OPCODE_POPCOUNT:
+    case BRIG_OPCODE_COPYSIGN:
+    case BRIG_OPCODE_NCOS:
+    case BRIG_OPCODE_NSIN:
+    case BRIG_OPCODE_NLOG2:
+    case BRIG_OPCODE_NEXP2:
+    case BRIG_OPCODE_NFMA:
+      /* Class has type B1 regardless of the float type, thus
+        the below builtin map search cannot find it.  */
+    case BRIG_OPCODE_CLASS:
+    case BRIG_OPCODE_WORKITEMABSID:
+      return CALL_EXPR;
+    default:
+
+      /* Some BRIG opcodes can use the same builtins for unsigned and
+        signed types.  Force these cases to unsigned types.
+      */
+
+      if (brig_opcode == BRIG_OPCODE_BORROW
+         || brig_opcode == BRIG_OPCODE_CARRY
+         || brig_opcode == BRIG_OPCODE_LASTBIT
+         || brig_opcode == BRIG_OPCODE_BITINSERT)
+       {
+         if (brig_type == BRIG_TYPE_S32)
+           brig_type = BRIG_TYPE_U32;
+         else if (brig_type == BRIG_TYPE_S64)
+           brig_type = BRIG_TYPE_U64;
+       }
+
+
+      builtin_map::const_iterator i
+       = s_custom_builtins.find (std::make_pair (brig_opcode, brig_type));
+      if (i != s_custom_builtins.end ())
+       return CALL_EXPR;
+      else if (s_custom_builtins.find
+              (std::make_pair (brig_opcode, brig_inner_type))
+              != s_custom_builtins.end ())
+       return CALL_EXPR;
+      if (brig_inner_type == BRIG_TYPE_F16
+         && s_custom_builtins.find
+         (std::make_pair (brig_opcode, BRIG_TYPE_F32))
+         != s_custom_builtins.end ())
+       return CALL_EXPR;
+      break;
+    }
+  return TREE_LIST; /* Emulate using a chain of nodes.  */
+}
diff --git a/gcc/brig/brigfrontend/brig-branch-inst-handler.cc b/gcc/brig/brigfrontend/brig-branch-inst-handler.cc
new file mode 100644 (file)
index 0000000..040ae5d
--- /dev/null
@@ -0,0 +1,221 @@
+/* brig-branch-inst-handler.cc -- brig branch instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+#include "errors.h"
+#include "brig-util.h"
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+#include "vec.h"
+#include "fold-const.h"
+
+size_t
+brig_branch_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstBase *brig_inst
+    = (const BrigInstBase *) &((const BrigInstBasic *) base)->base;
+
+  if (brig_inst->opcode == BRIG_OPCODE_CALL)
+    {
+      const BrigData *operand_entries
+       = m_parent.get_brig_data_entry (brig_inst->operands);
+      tree func_ref = NULL_TREE;
+      vec<tree, va_gc> *out_args;
+      vec_alloc (out_args, 1);
+      vec<tree, va_gc> *in_args;
+      vec_alloc (in_args, 4);
+
+      size_t operand_count = operand_entries->byteCount / 4;
+      gcc_assert (operand_count < 4);
+
+      for (size_t i = 0; i < operand_count; ++i)
+       {
+         uint32_t operand_offset
+           = ((const uint32_t *) &operand_entries->bytes)[i];
+         const BrigBase *operand_data
+           = m_parent.get_brig_operand_entry (operand_offset);
+         if (i == 1)
+           {
+             gcc_assert (operand_data->kind == BRIG_KIND_OPERAND_CODE_REF);
+             func_ref = build_tree_operand (*brig_inst, *operand_data);
+             continue;
+           }
+         gcc_assert (operand_data->kind == BRIG_KIND_OPERAND_CODE_LIST);
+         const BrigOperandCodeList *codelist
+           = (const BrigOperandCodeList *) operand_data;
+         const BrigData *data
+           = m_parent.get_brig_data_entry (codelist->elements);
+
+         size_t bytes = data->byteCount;
+         const BrigOperandOffset32_t *operand_ptr
+           = (const BrigOperandOffset32_t *) data->bytes;
+
+         vec<tree, va_gc> *args = i == 0 ? out_args : in_args;
+
+         while (bytes > 0)
+           {
+             BrigOperandOffset32_t offset = *operand_ptr;
+             const BrigBase *code_element
+               = m_parent.get_brig_code_entry (offset);
+             gcc_assert (code_element->kind == BRIG_KIND_DIRECTIVE_VARIABLE);
+             const BrigDirectiveVariable *brig_var
+               = (const BrigDirectiveVariable *) code_element;
+             tree var = m_parent.m_cf->arg_variable (brig_var);
+
+             if (brig_var->type & BRIG_TYPE_ARRAY)
+               {
+                 /* Array return values are passed as the first argument.  */
+                 args = in_args;
+                 /* Pass pointer to the element zero and use its element zero
+                    as the base address.  */
+                 tree etype = TREE_TYPE (TREE_TYPE (var));
+                 tree ptype = build_pointer_type (etype);
+                 tree element_zero
+                   = build4 (ARRAY_REF, etype, var, integer_zero_node,
+                             NULL_TREE, NULL_TREE);
+                 var = build1 (ADDR_EXPR, ptype, element_zero);
+               }
+
+             gcc_assert (var != NULL_TREE);
+             vec_safe_push (args, var);
+             ++operand_ptr;
+             bytes -= 4;
+           }
+       }
+
+      gcc_assert (func_ref != NULL_TREE);
+      gcc_assert (out_args->length () == 0 || out_args->length () == 1);
+
+      tree ret_val_type = void_type_node;
+      tree ret_val = NULL_TREE;
+      if (out_args->length () == 1)
+       {
+         ret_val = (*out_args)[0];
+         ret_val_type = TREE_TYPE (ret_val);
+       }
+
+      /* Pass the hidden kernel arguments along to the called functions as
+        they might call builtins that need them or access group/private
+        memory.  */
+
+      vec_safe_push (in_args, m_parent.m_cf->m_context_arg);
+      vec_safe_push (in_args, m_parent.m_cf->m_group_base_arg);
+      vec_safe_push (in_args, m_parent.m_cf->m_private_base_arg);
+
+      tree call = build_call_vec (ret_val_type, build_fold_addr_expr (func_ref),
+                                 in_args);
+      TREE_NOTHROW (func_ref) = 1;
+      TREE_NOTHROW (call) = 1;
+
+      if (ret_val != NULL_TREE)
+       {
+         TREE_ADDRESSABLE (ret_val) = 1;
+         tree result_assign
+           = build2 (MODIFY_EXPR, TREE_TYPE (ret_val), ret_val, call);
+         m_parent.m_cf->append_statement (result_assign);
+       }
+      else
+       {
+         m_parent.m_cf->append_statement (call);
+       }
+
+      m_parent.m_cf->m_has_unexpanded_dp_builtins = false;
+      m_parent.m_cf->m_called_functions.push_back (func_ref);
+
+      return base->byteCount;
+    }
+
+  tree instr_type = gccbrig_tree_type_for_hsa_type (brig_inst->type);
+  tree_stl_vec operands = build_operands (*brig_inst);
+
+  if (brig_inst->opcode == BRIG_OPCODE_BR)
+    {
+      tree goto_stmt = build1 (GOTO_EXPR, instr_type, operands[0]);
+      m_parent.m_cf->append_statement (goto_stmt);
+    }
+  else if (brig_inst->opcode == BRIG_OPCODE_SBR)
+    {
+      tree select = operands[0];
+      tree cases = operands[1];
+
+      tree switch_expr = build3 (SWITCH_EXPR, TREE_TYPE (select), select,
+                                NULL_TREE, NULL_TREE);
+
+      tree default_case
+       = build_case_label (NULL_TREE, NULL_TREE,
+                           create_artificial_label (UNKNOWN_LOCATION));
+      append_to_statement_list (default_case, &SWITCH_BODY (switch_expr));
+
+      tree default_jump
+       = build1 (GOTO_EXPR, void_type_node, TREE_VEC_ELT (cases, 0));
+      append_to_statement_list (default_jump, &SWITCH_BODY (switch_expr));
+
+      for (int c = 0; c < TREE_VEC_LENGTH (cases); ++c)
+       {
+         tree case_label
+           = build_case_label (build_int_cst (integer_type_node, c), NULL_TREE,
+                               create_artificial_label (UNKNOWN_LOCATION));
+
+         append_to_statement_list (case_label, &SWITCH_BODY (switch_expr));
+
+         tree jump
+           = build1 (GOTO_EXPR, void_type_node, TREE_VEC_ELT (cases, c));
+         append_to_statement_list (jump, &SWITCH_BODY (switch_expr));
+       }
+      m_parent.m_cf->append_statement (switch_expr);
+    }
+  else if (brig_inst->opcode == BRIG_OPCODE_CBR)
+    {
+      tree condition = operands[0];
+      tree target_goto = build1 (GOTO_EXPR, void_type_node, operands[1]);
+      /* Represents the if..else as (condition)?(goto foo):(goto bar).  */
+      tree if_stmt
+       = build3 (COND_EXPR, void_type_node, condition, target_goto, NULL_TREE);
+      m_parent.m_cf->append_statement (if_stmt);
+    }
+  else if (brig_inst->opcode == BRIG_OPCODE_WAVEBARRIER)
+    {
+      /* WAVEBARRIER is a NOP when WAVESIZE = 1.  */
+    }
+  else if (brig_inst->opcode == BRIG_OPCODE_BARRIER)
+    {
+      m_parent.m_cf->m_has_barriers = true;
+      tree_stl_vec call_operands;
+      /* FIXME.  We should add attributes (are there suitable ones in gcc?) that
+        ensure the barrier won't be duplicated or moved out of loops etc.
+        Like the 'noduplicate' of LLVM.  Same goes for fbarriers.  */
+      m_parent.m_cf->append_statement
+       (expand_or_call_builtin (brig_inst->opcode, BRIG_TYPE_NONE, NULL_TREE,
+                                call_operands));
+    }
+  else if (brig_inst->opcode >= BRIG_OPCODE_ARRIVEFBAR
+          && brig_inst->opcode <= BRIG_OPCODE_WAITFBAR)
+    {
+      m_parent.m_cf->m_has_barriers = true;
+      m_parent.m_cf->append_statement
+       (expand_or_call_builtin (brig_inst->opcode, BRIG_TYPE_NONE,
+                                uint32_type_node, operands));
+    }
+  else
+    gcc_unreachable ();
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-cmp-inst-handler.cc b/gcc/brig/brigfrontend/brig-cmp-inst-handler.cc
new file mode 100644 (file)
index 0000000..f455d1e
--- /dev/null
@@ -0,0 +1,198 @@
+/* brig-cmp-inst-handler.cc -- brig cmp instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+#include "diagnostic.h"
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+#include "brig-util.h"
+#include "convert.h"
+
+size_t
+brig_cmp_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstBase *inst_base = (const BrigInstBase *) base;
+  const BrigInstCmp *inst = (const BrigInstCmp *) base;
+
+  tree cmp_type = get_tree_expr_type_for_hsa_type (inst->sourceType);
+
+  /* The destination type to convert the comparison result to.  */
+  tree dest_type = gccbrig_tree_type_for_hsa_type (inst_base->type);
+
+  const bool is_fp16_dest
+    = (inst_base->type & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_F16;
+  const bool is_boolean_dest
+    = (inst_base->type & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_B1;
+
+  bool is_int_cmp = VECTOR_TYPE_P (cmp_type)
+                     ? INTEGRAL_TYPE_P (TREE_TYPE (cmp_type))
+                     : INTEGRAL_TYPE_P (cmp_type);
+
+  /* The type for the GENERIC comparison.  It should match the
+     input operand width for vector comparisons, a boolean
+     otherwise.  */
+  tree result_type = get_comparison_result_type (cmp_type);
+
+  /* Save the result as a boolean and extend/convert it to the
+     wanted destination type.  */
+  tree expr = NULL_TREE;
+
+  std::vector<tree> operands = build_operands (*inst_base);
+
+  switch (inst->compare)
+    {
+    case BRIG_COMPARE_SEQ:
+    case BRIG_COMPARE_EQ:
+      expr = build2 (EQ_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SNE:
+    case BRIG_COMPARE_NE:
+      expr = build2 (NE_EXPR, result_type, operands[1], operands[2]);
+
+      if (!is_int_cmp)
+       expr = build2 (BIT_AND_EXPR, TREE_TYPE (expr),
+                      expr,
+                      build2 (ORDERED_EXPR, result_type, operands[1],
+                              operands[2]));
+      break;
+    case BRIG_COMPARE_SLT:
+    case BRIG_COMPARE_LT:
+      expr = build2 (LT_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SLE:
+    case BRIG_COMPARE_LE:
+      expr = build2 (LE_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SGT:
+    case BRIG_COMPARE_GT:
+      expr = build2 (GT_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SGE:
+    case BRIG_COMPARE_GE:
+      expr = build2 (GE_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SEQU:
+    case BRIG_COMPARE_EQU:
+      expr = build2 (UNEQ_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SNEU:
+    case BRIG_COMPARE_NEU:
+      expr = build2 (NE_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SLTU:
+    case BRIG_COMPARE_LTU:
+      expr = build2 (UNLT_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SLEU:
+    case BRIG_COMPARE_LEU:
+      expr = build2 (UNLE_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SGTU:
+    case BRIG_COMPARE_GTU:
+      expr = build2 (UNGT_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SGEU:
+    case BRIG_COMPARE_GEU:
+      expr = build2 (UNGE_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SNUM:
+    case BRIG_COMPARE_NUM:
+      expr = build2 (ORDERED_EXPR, result_type, operands[1], operands[2]);
+      break;
+    case BRIG_COMPARE_SNAN:
+    case BRIG_COMPARE_NAN:
+      expr = build2 (UNORDERED_EXPR, result_type, operands[1], operands[2]);
+      break;
+    default:
+      break;
+    }
+
+  if (expr == NULL_TREE)
+    gcc_unreachable ();
+
+  if (is_fp16_dest)
+    {
+      expr = convert_to_real (brig_to_generic::s_fp32_type, expr);
+    }
+  else if (VECTOR_TYPE_P (dest_type) && ANY_INTEGRAL_TYPE_P (dest_type)
+          && !is_boolean_dest
+          && (inst->sourceType & BRIG_TYPE_BASE_MASK) != BRIG_TYPE_F16)
+    {
+      /* In later gcc versions, the output of comparison is not
+        all ones for vectors like still in 4.9.1.  We need to use
+        an additional VEC_COND_EXPR to produce the all ones 'true' value
+        required by HSA.
+        VEC_COND_EXPR <a == b, { -1, -1, -1, -1 }, { 0, 0, 0, 0 }>; */
+
+      tree all_ones
+       = build_vector_from_val (dest_type,
+                              build_minus_one_cst (TREE_TYPE (dest_type)));
+      tree all_zeroes
+       = build_vector_from_val (dest_type,
+                              build_zero_cst (TREE_TYPE (dest_type)));
+      expr = build3 (VEC_COND_EXPR, dest_type, expr, all_ones, all_zeroes);
+    }
+  else if (INTEGRAL_TYPE_P (dest_type) && !is_boolean_dest)
+    {
+      /* We need to produce the all-ones pattern for the width of the whole
+        resulting integer type.  Use back and forth shifts for propagating
+        the lower 1.  */
+      tree signed_type = signed_type_for (dest_type);
+      tree signed_result = convert_to_integer (signed_type, expr);
+
+      size_t result_width = int_size_in_bytes (dest_type) * BITS_PER_UNIT;
+
+      tree shift_amount_cst
+       = build_int_cstu (signed_type, result_width - 1);
+
+      tree shift_left_result
+       = build2 (LSHIFT_EXPR, signed_type, signed_result, shift_amount_cst);
+
+      expr = build2 (RSHIFT_EXPR, signed_type, shift_left_result,
+                    shift_amount_cst);
+    }
+  else if (SCALAR_FLOAT_TYPE_P (dest_type))
+    {
+      expr = convert_to_real (dest_type, expr);
+    }
+  else if (VECTOR_TYPE_P (dest_type)
+          && (inst->sourceType & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_F16)
+    {
+      /* Because F16 comparison is emulated as an F32 comparison with S32
+        results, we must now truncate the result vector to S16s so it
+        fits to the destination register.  We can build the target vector
+        type from the f16 storage type (unsigned ints).  */
+      expr = add_temp_var ("wide_cmp_result", expr);
+      tree_stl_vec wide_elements;
+      tree_stl_vec shrunk_elements;
+      unpack (expr, wide_elements);
+      for (size_t i = 0; i < wide_elements.size (); ++i)
+       {
+         tree wide = wide_elements.at (i);
+         shrunk_elements.push_back
+           (convert_to_integer (short_integer_type_node, wide));
+       }
+      expr = pack (shrunk_elements);
+    }
+  build_output_assignment (*inst_base, operands[0], expr);
+
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-code-entry-handler.cc b/gcc/brig/brigfrontend/brig-code-entry-handler.cc
new file mode 100644 (file)
index 0000000..5fe2012
--- /dev/null
@@ -0,0 +1,1716 @@
+/* brig-code-entry-handler.cc -- a gccbrig base class
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+#include "stringpool.h"
+#include "tree-iterator.h"
+#include "toplev.h"
+#include "diagnostic.h"
+#include "brig-machine.h"
+#include "brig-util.h"
+#include "errors.h"
+#include "real.h"
+#include "print-tree.h"
+#include "tree-pretty-print.h"
+#include "target.h"
+#include "langhooks.h"
+#include "gimple-expr.h"
+#include "convert.h"
+#include "brig-util.h"
+#include "builtins.h"
+#include "phsa.h"
+#include "brig-builtins.h"
+#include "fold-const.h"
+
+brig_code_entry_handler::builtin_map brig_code_entry_handler::s_custom_builtins;
+
+brig_code_entry_handler::brig_code_entry_handler (brig_to_generic &parent)
+  : brig_entry_handler (parent)
+{
+  if (s_custom_builtins.size () > 0) return;
+
+  /* Populate the builtin index.  */
+#undef DEF_HSAIL_ATOMIC_BUILTIN
+#undef DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN
+#undef DEF_HSAIL_INTR_BUILTIN
+#undef DEF_HSAIL_SAT_BUILTIN
+#undef DEF_HSAIL_BUILTIN
+#define DEF_HSAIL_BUILTIN(ENUM, HSAIL_OPCODE, HSAIL_TYPE, NAME, TYPE, ATTRS) \
+  s_custom_builtins[std::make_pair (HSAIL_OPCODE, HSAIL_TYPE)]         \
+    = builtin_decl_explicit (ENUM);
+
+#include "brig-builtins.def"
+}
+
+/* Build a tree operand which is a reference to a piece of code.  REF is the
+   original reference as a BRIG object.  */
+
+tree
+brig_code_entry_handler::build_code_ref (const BrigBase &ref)
+{
+  if (ref.kind == BRIG_KIND_DIRECTIVE_LABEL)
+    {
+      const BrigDirectiveLabel *brig_label = (const BrigDirectiveLabel *) &ref;
+
+      const BrigData *label_name
+       = m_parent.get_brig_data_entry (brig_label->name);
+
+      std::string label_str ((const char *) (label_name->bytes),
+                            label_name->byteCount);
+      return m_parent.m_cf->label (label_str);
+    }
+  else if (ref.kind == BRIG_KIND_DIRECTIVE_FUNCTION)
+    {
+      const BrigDirectiveExecutable *func
+       = (const BrigDirectiveExecutable *) &ref;
+      return m_parent.function_decl (m_parent.get_mangled_name (func));
+    }
+  else if (ref.kind == BRIG_KIND_DIRECTIVE_FBARRIER)
+    {
+      const BrigDirectiveFbarrier* fbar = (const BrigDirectiveFbarrier*)&ref;
+
+      uint64_t offset = m_parent.group_variable_segment_offset
+       (m_parent.get_mangled_name (fbar));
+
+      return build_int_cst (uint32_type_node, offset);
+    }
+  else
+    gcc_unreachable ();
+}
+
+/* Produce a tree operand for the given BRIG_INST and its OPERAND.
+   OPERAND_TYPE should be the operand type in case it should not
+   be dictated by the BrigBase.  IS_INPUT indicates if the operand
+   is an input operand or a result.  */
+
+tree
+brig_code_entry_handler::build_tree_operand (const BrigInstBase &brig_inst,
+                                            const BrigBase &operand,
+                                            tree operand_type, bool is_input)
+{
+  switch (operand.kind)
+    {
+    case BRIG_KIND_OPERAND_OPERAND_LIST:
+      {
+       vec<constructor_elt, va_gc> *constructor_vals = NULL;
+       const BrigOperandOperandList &oplist
+         = (const BrigOperandOperandList &) operand;
+       const BrigData *data = m_parent.get_brig_data_entry (oplist.elements);
+       size_t bytes = data->byteCount;
+       const BrigOperandOffset32_t *operand_ptr
+         = (const BrigOperandOffset32_t *) data->bytes;
+       while (bytes > 0)
+         {
+           BrigOperandOffset32_t offset = *operand_ptr;
+           const BrigBase *operand_element
+             = m_parent.get_brig_operand_entry (offset);
+           tree element
+             = build_tree_operand (brig_inst, *operand_element, operand_type);
+
+           /* In case a vector is used an input, cast the elements to
+              correct size here so we don't need a separate unpack/pack for it.
+              fp16-fp32 conversion is done in build_operands ().  */
+           if (is_input && TREE_TYPE (element) != operand_type)
+             {
+               if (int_size_in_bytes (TREE_TYPE (element))
+                   == int_size_in_bytes (operand_type)
+                   && !INTEGRAL_TYPE_P (operand_type))
+                 element = build1 (VIEW_CONVERT_EXPR, operand_type, element);
+               else
+                 element = convert (operand_type, element);
+             }
+
+           CONSTRUCTOR_APPEND_ELT (constructor_vals, NULL_TREE, element);
+           ++operand_ptr;
+           bytes -= 4;
+         }
+       size_t element_count = data->byteCount / 4;
+       tree vec_type = build_vector_type (operand_type, element_count);
+
+       return build_constructor (vec_type, constructor_vals);
+      }
+    case BRIG_KIND_OPERAND_CODE_LIST:
+      {
+       /* Build a TREE_VEC of code expressions.  */
+
+       const BrigOperandCodeList &oplist
+         = (const BrigOperandCodeList &) operand;
+       const BrigData *data = m_parent.get_brig_data_entry (oplist.elements);
+       size_t bytes = data->byteCount;
+       const BrigOperandOffset32_t *operand_ptr
+         = (const BrigOperandOffset32_t *) data->bytes;
+
+       size_t case_index = 0;
+       size_t element_count = data->byteCount / 4;
+
+       /* Create a TREE_VEC out of the labels in the list.  */
+       tree vec = make_tree_vec (element_count);
+
+       while (bytes > 0)
+         {
+           BrigOperandOffset32_t offset = *operand_ptr;
+           const BrigBase *ref = m_parent.get_brig_code_entry (offset);
+           tree element = build_code_ref (*ref);
+
+           gcc_assert (case_index < element_count);
+           TREE_VEC_ELT (vec, case_index) = element;
+           case_index++;
+
+           ++operand_ptr;
+           bytes -= 4;
+         }
+       return vec;
+      }
+    case BRIG_KIND_OPERAND_REGISTER:
+      {
+       const BrigOperandRegister *brig_reg
+         = (const BrigOperandRegister *) &operand;
+       return m_parent.m_cf->get_m_var_declfor_reg (brig_reg);
+      }
+    case BRIG_KIND_OPERAND_CONSTANT_BYTES:
+      {
+       const BrigOperandConstantBytes *brigConst
+         = (const BrigOperandConstantBytes *) &operand;
+       /* The constants can be of different type than the instruction
+          and are implicitly casted to the input operand.  */
+       return get_tree_cst_for_hsa_operand (brigConst, NULL_TREE);
+      }
+    case BRIG_KIND_OPERAND_WAVESIZE:
+      {
+       if (!INTEGRAL_TYPE_P (operand_type))
+         {
+           gcc_unreachable ();
+           return NULL_TREE;
+         }
+       return build_int_cstu (operand_type, gccbrig_get_target_wavesize ());
+      }
+    case BRIG_KIND_OPERAND_CODE_REF:
+      {
+       const BrigOperandCodeRef *brig_code_ref
+         = (const BrigOperandCodeRef *) &operand;
+
+       const BrigBase *ref = m_parent.get_brig_code_entry (brig_code_ref->ref);
+
+       return build_code_ref (*ref);
+      }
+    case BRIG_KIND_OPERAND_ADDRESS:
+      {
+       return build_address_operand (brig_inst,
+                                     (const BrigOperandAddress &) operand);
+      }
+    default:
+      gcc_unreachable ();
+    }
+}
+
+/* Build a tree node representing an address reference from a BRIG_INST and its
+   ADDR_OPERAND.  */
+
+tree
+brig_code_entry_handler::build_address_operand
+  (const BrigInstBase &brig_inst, const BrigOperandAddress &addr_operand)
+{
+  tree instr_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+
+  BrigSegment8_t segment = BRIG_SEGMENT_GLOBAL;
+  if (brig_inst.opcode == BRIG_OPCODE_LDA)
+    segment = ((const BrigInstAddr &) brig_inst).segment;
+  else if (brig_inst.base.kind == BRIG_KIND_INST_MEM)
+    segment = ((const BrigInstMem &) brig_inst).segment;
+  else if (brig_inst.base.kind == BRIG_KIND_INST_ATOMIC)
+    segment = ((const BrigInstAtomic &) brig_inst).segment;
+
+  tree var_offset = NULL_TREE;
+  tree const_offset = NULL_TREE;
+  tree symbol_base = NULL_TREE;
+
+  if (addr_operand.symbol != 0)
+    {
+      const BrigDirectiveVariable *arg_symbol
+       = (const BrigDirectiveVariable *) m_parent.get_brig_code_entry
+       (addr_operand.symbol);
+
+      std::string var_name = m_parent.get_mangled_name (arg_symbol);
+
+      if (segment == BRIG_SEGMENT_KERNARG)
+       {
+         /* Find the offset to the kernarg buffer for the given
+            kernel argument variable.  */
+         tree func = m_parent.m_cf->m_func_decl;
+         /* __args is the first parameter in kernel functions.  */
+         symbol_base = DECL_ARGUMENTS (func);
+         uint64_t offset = m_parent.m_cf->kernel_arg_offset (arg_symbol);
+         if (offset > 0)
+           const_offset = build_int_cst (size_type_node, offset);
+       }
+      else if (segment == BRIG_SEGMENT_GROUP)
+       {
+
+         uint64_t offset = m_parent.group_variable_segment_offset (var_name);
+         const_offset = build_int_cst (size_type_node, offset);
+       }
+      else if (segment == BRIG_SEGMENT_PRIVATE || segment == BRIG_SEGMENT_SPILL)
+       {
+         uint32_t offset = m_parent.private_variable_segment_offset (var_name);
+
+         /* Compute the offset to the work item's copy:
+
+            single-wi-offset * local_size + wiflatid * varsize
+
+            This way the work items have the same variable in
+            successive elements to each other in the segment,
+            helping to achieve autovectorization of loads/stores
+            with stride 1.  */
+
+         tree_stl_vec uint32_0
+           = tree_stl_vec (1, build_int_cst (uint32_type_node, 0));
+
+         tree_stl_vec uint32_1
+           = tree_stl_vec (1, build_int_cst (uint32_type_node, 1));
+
+         tree_stl_vec uint32_2
+           = tree_stl_vec (1, build_int_cst (uint32_type_node, 2));
+
+         tree local_size
+           = build2 (MULT_EXPR, uint32_type_node,
+                     expand_or_call_builtin (BRIG_OPCODE_WORKGROUPSIZE,
+                                             BRIG_TYPE_U32,
+                                             uint32_type_node, uint32_0),
+                     expand_or_call_builtin (BRIG_OPCODE_WORKGROUPSIZE,
+                                             BRIG_TYPE_U32,
+                                             uint32_type_node, uint32_1));
+
+         local_size
+           = build2 (MULT_EXPR, uint32_type_node,
+                     expand_or_call_builtin (BRIG_OPCODE_WORKGROUPSIZE,
+                                             BRIG_TYPE_U32,
+                                             uint32_type_node, uint32_2),
+                     local_size);
+
+         tree var_region
+           = build2 (MULT_EXPR, uint32_type_node,
+                     build_int_cst (uint32_type_node, offset), local_size);
+
+         tree_stl_vec operands;
+         tree pos
+           = build2 (MULT_EXPR, uint32_type_node,
+                     build_int_cst (uint32_type_node,
+                                    m_parent.private_variable_size (var_name)),
+                     expand_or_call_builtin (BRIG_OPCODE_WORKITEMFLATID,
+                                             BRIG_TYPE_U32,
+                                             uint32_type_node, operands));
+
+         tree var_offset
+           = build2 (PLUS_EXPR, uint32_type_node, var_region, pos);
+
+         /* In case of LDA this is returned directly as an integer value.
+            For other mem-related instructions, we will convert this segment
+            offset to a flat address by adding it as an offset to a (private
+            or group) base pointer later on.  Same applies to group_var_offset.  */
+         symbol_base
+           = add_temp_var ("priv_var_offset",
+                           convert (size_type_node, var_offset));
+       }
+      else if (segment == BRIG_SEGMENT_ARG)
+       {
+         tree arg_var_decl;
+         if (m_parent.m_cf->m_ret_value_brig_var == arg_symbol)
+           arg_var_decl = m_parent.m_cf->m_ret_temp;
+         else
+           arg_var_decl = m_parent.m_cf->arg_variable (arg_symbol);
+
+         gcc_assert (arg_var_decl != NULL_TREE);
+
+         tree ptype = build_pointer_type (instr_type);
+
+         if (arg_symbol->type & BRIG_TYPE_ARRAY)
+           {
+
+             /* Two different type of array references in case of arguments
+                depending where they are referred at.  In the caller (argument
+                segment), the reference is to an array object and
+                in the callee, the array object has been passed as a pointer
+                to the array object.  */
+
+             if (POINTER_TYPE_P (TREE_TYPE (arg_var_decl)))
+               symbol_base = build_reinterpret_cast (ptype, arg_var_decl);
+             else
+               {
+                 /* In case we are referring to an array (the argument in
+                    call site), use its element zero as the base address.  */
+                 tree element_zero
+                   = build4 (ARRAY_REF, TREE_TYPE (TREE_TYPE (arg_var_decl)),
+                             arg_var_decl, integer_zero_node, NULL_TREE,
+                             NULL_TREE);
+                 symbol_base = build1 (ADDR_EXPR, ptype, element_zero);
+               }
+           }
+         else
+           symbol_base = build1 (ADDR_EXPR, ptype, arg_var_decl);
+       }
+      else
+       {
+         tree global_var_decl = m_parent.global_variable (var_name);
+
+         /* In case the global variable hasn't been defined (yet),
+            use the host def indirection ptr variable.  */
+         if (global_var_decl == NULL_TREE)
+           {
+             std::string host_ptr_name
+               = std::string (PHSA_HOST_DEF_PTR_PREFIX) + var_name;
+             tree host_defined_ptr = m_parent.global_variable (host_ptr_name);
+             gcc_assert (host_defined_ptr != NULL_TREE);
+             symbol_base = host_defined_ptr;
+           }
+         else
+           {
+             gcc_assert (global_var_decl != NULL_TREE);
+
+             tree ptype = build_pointer_type (instr_type);
+             symbol_base = build1 (ADDR_EXPR, ptype, global_var_decl);
+           }
+       }
+    }
+
+  if (brig_inst.opcode != BRIG_OPCODE_LDA)
+    {
+      /* In case of lda_* we want to return the segment address because it's
+        used as a value, perhaps in address computation and later converted
+        explicitly to a flat address.
+
+        In case of other instructions with memory operands we produce the flat
+        address directly here (assuming the target does not have a separate
+        address space for group/private segments for now).  */
+      if (segment == BRIG_SEGMENT_GROUP)
+       symbol_base = m_parent.m_cf->m_group_base_arg;
+      else if (segment == BRIG_SEGMENT_PRIVATE
+              || segment == BRIG_SEGMENT_SPILL)
+       {
+         if (symbol_base != NULL_TREE)
+           symbol_base = build2 (POINTER_PLUS_EXPR, ptr_type_node,
+                                 m_parent.m_cf->m_private_base_arg,
+                                 symbol_base);
+         else
+           symbol_base = m_parent.m_cf->m_private_base_arg;
+       }
+    }
+
+  if (addr_operand.reg != 0)
+    {
+      const BrigOperandRegister *mem_base_reg
+       = (const BrigOperandRegister *) m_parent.get_brig_operand_entry
+       (addr_operand.reg);
+      tree base_reg_var = m_parent.m_cf->get_m_var_declfor_reg (mem_base_reg);
+      var_offset = convert_to_pointer (ptr_type_node, base_reg_var);
+
+      gcc_assert (var_offset != NULL_TREE);
+    }
+  /* The pointer type we use to access the memory.  Should be of the
+     width of the load/store instruction, not the target/data
+     register.  */
+  tree ptype = build_pointer_type (instr_type);
+
+  gcc_assert (ptype != NULL_TREE);
+
+  tree addr = NULL_TREE;
+  if (symbol_base != NULL_TREE && var_offset != NULL_TREE)
+    /* The most complex addressing mode: symbol + reg [+ const offset].  */
+    addr = build2 (POINTER_PLUS_EXPR, ptr_type_node,
+                  convert (ptr_type_node, symbol_base),
+                  convert (size_type_node, var_offset));
+  else if (var_offset != NULL)
+    addr = var_offset;
+  else if (symbol_base != NULL)
+    addr = symbol_base;
+
+  if (const_offset != NULL_TREE)
+    {
+      if (addr == NULL_TREE)
+       /* At least direct module-scope global group symbol access with LDA
+          has only the const_offset.  Group base ptr is not added as LDA should
+          return the segment address, not the flattened one.  */
+       addr = const_offset;
+      else
+       addr = build2 (POINTER_PLUS_EXPR, ptr_type_node,
+                      addr, convert (size_type_node, const_offset));
+    }
+
+  /* We might have two const offsets in case of group or private arrays
+     which have the first offset to the incoming group/private pointer
+     arg, and the second one an offset to it.  */
+  uint64_t offs = gccbrig_to_uint64_t (addr_operand.offset);
+  if (offs > 0)
+    {
+      tree const_offset_2 = build_int_cst (size_type_node, offs);
+      if (addr == NULL_TREE)
+       addr = const_offset_2;
+      else
+       addr = build2 (POINTER_PLUS_EXPR, ptr_type_node,
+                      addr, convert (size_type_node, const_offset_2));
+
+    }
+
+  gcc_assert (addr != NULL_TREE);
+  return convert_to_pointer (ptype, addr);
+}
+
+/* Builds a tree operand with the given OPERAND_INDEX for the given
+   BRIG_INST with the desired tree OPERAND_TYPE.  OPERAND_TYPE can
+   be NULL in case the type is forced by the BRIG_INST type.  */
+
+tree
+brig_code_entry_handler::build_tree_operand_from_brig
+  (const BrigInstBase *brig_inst, tree operand_type, size_t operand_index)
+{
+  const BrigData *operand_entries
+    = m_parent.get_brig_data_entry (brig_inst->operands);
+
+  uint32_t operand_offset
+    = ((const uint32_t *) &operand_entries->bytes)[operand_index];
+  const BrigBase *operand_data
+    = m_parent.get_brig_operand_entry (operand_offset);
+  return build_tree_operand (*brig_inst, *operand_data, operand_type);
+}
+
+/* Builds a single (scalar) constant initialized element of type
+   ELEMENT_TYPE from the buffer pointed to by NEXT_DATA.  */
+
+tree
+brig_code_entry_handler::build_tree_cst_element
+  (BrigType16_t element_type, const unsigned char *next_data) const
+{
+
+  tree tree_element_type = gccbrig_tree_type_for_hsa_type (element_type);
+
+  tree cst;
+  switch (element_type)
+    {
+    case BRIG_TYPE_F16:
+      {
+       HOST_WIDE_INT low = *(const uint16_t *) next_data;
+       cst = build_int_cst (uint16_type_node, low);
+       break;
+      }
+    case BRIG_TYPE_F32:
+      {
+       REAL_VALUE_TYPE val;
+       ieee_single_format.decode (&ieee_single_format, &val,
+                                  (const long *) next_data);
+       cst = build_real (tree_element_type, val);
+       break;
+      }
+    case BRIG_TYPE_F64:
+      {
+       long data[2];
+       data[0] = *(const uint32_t *) next_data;
+       data[1] = *(const uint32_t *) (next_data + 4);
+       REAL_VALUE_TYPE val;
+       ieee_double_format.decode (&ieee_double_format, &val, data);
+       cst = build_real (tree_element_type, val);
+       break;
+      }
+    case BRIG_TYPE_S8:
+    case BRIG_TYPE_S16:
+    case BRIG_TYPE_S32:
+    case BRIG_TYPE_S64:
+      {
+       HOST_WIDE_INT low = *(const int64_t *) next_data;
+       cst = build_int_cst (tree_element_type, low);
+       break;
+      }
+    case BRIG_TYPE_U8:
+    case BRIG_TYPE_U16:
+    case BRIG_TYPE_U32:
+    case BRIG_TYPE_U64:
+      {
+       unsigned HOST_WIDE_INT low = *(const uint64_t *) next_data;
+       cst = build_int_cstu (tree_element_type, low);
+       break;
+      }
+    case BRIG_TYPE_SIG64:
+      {
+       unsigned HOST_WIDE_INT low = *(const uint64_t *) next_data;
+       cst = build_int_cstu (uint64_type_node, low);
+       break;
+      }
+    case BRIG_TYPE_SIG32:
+      {
+       unsigned HOST_WIDE_INT low = *(const uint64_t *) next_data;
+       cst = build_int_cstu (uint32_type_node, low);
+       break;
+      }
+    default:
+      gcc_unreachable ();
+      return NULL_TREE;
+    }
+  return cst;
+}
+
+/* Produce a tree constant type for the given BRIG constant (BRIG_CONST).
+   TYPE should be the forced instruction type, otherwise the type is
+   dictated by the BRIG_CONST.  */
+
+tree
+brig_code_entry_handler::get_tree_cst_for_hsa_operand
+  (const BrigOperandConstantBytes *brig_const, tree type) const
+{
+  const BrigData *data = m_parent.get_brig_data_entry (brig_const->bytes);
+
+  tree cst = NULL_TREE;
+
+  if (type == NULL_TREE)
+    type = gccbrig_tree_type_for_hsa_type (brig_const->type);
+
+  /* The type of a single (scalar) element inside an array,
+     vector or an array of vectors.  */
+  BrigType16_t scalar_element_type
+    = brig_const->type & BRIG_TYPE_BASE_MASK;
+  tree tree_element_type = type;
+
+  vec<constructor_elt, va_gc> *constructor_vals = NULL;
+
+  if (TREE_CODE (type) == ARRAY_TYPE)
+    tree_element_type = TREE_TYPE (type);
+
+  size_t bytes_left = data->byteCount;
+  const unsigned char *next_data = data->bytes;
+  size_t scalar_element_size
+    = gccbrig_hsa_type_bit_size (scalar_element_type) / BITS_PER_UNIT;
+
+  while (bytes_left > 0)
+    {
+      if (VECTOR_TYPE_P (tree_element_type))
+       {
+         /* In case of vector type elements (or sole vectors),
+            create a vector ctor.  */
+         size_t element_count = TYPE_VECTOR_SUBPARTS (tree_element_type);
+         if (bytes_left < scalar_element_size * element_count)
+           fatal_error (UNKNOWN_LOCATION,
+                        "Not enough bytes left for the initializer "
+                        "(%lu need %lu).",
+                        bytes_left, scalar_element_size * element_count);
+
+         vec<constructor_elt, va_gc> *vec_els = NULL;
+         for (size_t i = 0; i < element_count; ++i)
+           {
+             tree element
+               = build_tree_cst_element (scalar_element_type, next_data);
+             CONSTRUCTOR_APPEND_ELT (vec_els, NULL_TREE, element);
+             bytes_left -= scalar_element_size;
+             next_data += scalar_element_size;
+           }
+         cst = build_vector_from_ctor (tree_element_type, vec_els);
+       }
+      else
+       {
+         if (bytes_left < scalar_element_size)
+           fatal_error (UNKNOWN_LOCATION,
+                        "Not enough bytes left for the initializer "
+                        "(%lu need %lu).",
+                        bytes_left, scalar_element_size);
+         cst = build_tree_cst_element (scalar_element_type, next_data);
+         bytes_left -= scalar_element_size;
+         next_data += scalar_element_size;
+       }
+      CONSTRUCTOR_APPEND_ELT (constructor_vals, NULL_TREE, cst);
+    }
+
+  if (TREE_CODE (type) == ARRAY_TYPE)
+    return build_constructor (type, constructor_vals);
+  else
+    return cst;
+}
+
+/* Return the matching tree instruction arithmetics type for the
+   given BRIG_TYPE.  The aritmethics type is the one with which
+   computation is done (in contrast to the storage type).  F16
+   arithmetics type is emulated using F32 for now.  */
+
+tree
+brig_code_entry_handler::get_tree_expr_type_for_hsa_type
+  (BrigType16_t brig_type) const
+{
+  BrigType16_t brig_inner_type = brig_type & BRIG_TYPE_BASE_MASK;
+  if (brig_inner_type == BRIG_TYPE_F16)
+    {
+      if (brig_inner_type == brig_type)
+       return m_parent.s_fp32_type;
+      size_t element_count = gccbrig_hsa_type_bit_size (brig_type) / 16;
+      return build_vector_type (m_parent.s_fp32_type, element_count);
+    }
+  else
+    return gccbrig_tree_type_for_hsa_type (brig_type);
+}
+
+/* In case the HSA instruction must be implemented using a builtin,
+   this function is called to get the correct builtin function.
+   TYPE is the instruction tree type, BRIG_OPCODE the opcode of the
+   brig instruction and BRIG_TYPE the brig instruction's type.  */
+
+tree
+brig_code_entry_handler::get_builtin_for_hsa_opcode
+  (tree type, BrigOpcode16_t brig_opcode, BrigType16_t brig_type) const
+{
+  tree builtin = NULL_TREE;
+  tree builtin_type = type;
+
+  /* For vector types, first find the scalar version of the builtin.  */
+  if (type != NULL_TREE && VECTOR_TYPE_P (type))
+    builtin_type = TREE_TYPE (type);
+  BrigType16_t brig_inner_type = brig_type & BRIG_TYPE_BASE_MASK;
+
+  /* Some BRIG opcodes can use the same builtins for unsigned and
+     signed types.  Force these cases to unsigned types.  */
+
+  if (brig_opcode == BRIG_OPCODE_BORROW
+      || brig_opcode == BRIG_OPCODE_CARRY
+      || brig_opcode == BRIG_OPCODE_LASTBIT
+      || brig_opcode == BRIG_OPCODE_BITINSERT)
+    {
+      if (brig_type == BRIG_TYPE_S32)
+       brig_type = BRIG_TYPE_U32;
+      else if (brig_type == BRIG_TYPE_S64)
+       brig_type = BRIG_TYPE_U64;
+    }
+
+  switch (brig_opcode)
+    {
+    case BRIG_OPCODE_FLOOR:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_FLOOR);
+      break;
+    case BRIG_OPCODE_CEIL:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_CEIL);
+      break;
+    case BRIG_OPCODE_SQRT:
+    case BRIG_OPCODE_NSQRT:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_SQRT);
+      break;
+    case BRIG_OPCODE_RINT:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_RINT);
+      break;
+    case BRIG_OPCODE_TRUNC:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_TRUNC);
+      break;
+    case BRIG_OPCODE_COPYSIGN:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_COPYSIGN);
+      break;
+    case BRIG_OPCODE_NSIN:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_SIN);
+      break;
+    case BRIG_OPCODE_NLOG2:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_LOG2);
+      break;
+    case BRIG_OPCODE_NEXP2:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_EXP2);
+      break;
+    case BRIG_OPCODE_NFMA:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_FMA);
+      break;
+    case BRIG_OPCODE_NCOS:
+      builtin = mathfn_built_in (builtin_type, BUILT_IN_COS);
+      break;
+    case BRIG_OPCODE_POPCOUNT:
+      /* Popcount should be typed by its argument type (the return value
+        is always u32).  Let's use a b64 version for also for b32 for now.  */
+      return builtin_decl_explicit (BUILT_IN_POPCOUNTL);
+    case BRIG_OPCODE_BORROW:
+      /* Borrow uses the same builtin for unsigned and signed types.  */
+      if (brig_type == BRIG_TYPE_S32 || brig_type == BRIG_TYPE_U32)
+       return builtin_decl_explicit (BUILT_IN_HSAIL_BORROW_U32);
+      else
+       return builtin_decl_explicit (BUILT_IN_HSAIL_BORROW_U64);
+    case BRIG_OPCODE_CARRY:
+      /* Carry also uses the same builtin for unsigned and signed types.  */
+      if (brig_type == BRIG_TYPE_S32 || brig_type == BRIG_TYPE_U32)
+       return builtin_decl_explicit (BUILT_IN_HSAIL_CARRY_U32);
+      else
+       return builtin_decl_explicit (BUILT_IN_HSAIL_CARRY_U64);
+    default:
+
+      /* Use our builtin index for finding a proper builtin for the BRIG
+        opcode and BRIG type.  This takes care most of the builtin cases,
+        the special cases are handled in the separate 'case' statements
+        above.  */
+      builtin_map::const_iterator i
+       = s_custom_builtins.find (std::make_pair (brig_opcode, brig_type));
+      if (i != s_custom_builtins.end ())
+       return (*i).second;
+
+      if (brig_inner_type != brig_type)
+       {
+         /* Try to find a scalar built-in we could use.  */
+         i = s_custom_builtins.find
+           (std::make_pair (brig_opcode, brig_inner_type));
+         if (i != s_custom_builtins.end ())
+           return (*i).second;
+       }
+
+      /* In case this is an fp16 operation that is promoted to fp32,
+        try to find a fp32 scalar built-in.  */
+      if (brig_inner_type == BRIG_TYPE_F16)
+       {
+         i = s_custom_builtins.find
+           (std::make_pair (brig_opcode, BRIG_TYPE_F32));
+         if (i != s_custom_builtins.end ())
+           return (*i).second;
+       }
+      gcc_unreachable ();
+    }
+
+  if (VECTOR_TYPE_P (type) && builtin != NULL_TREE)
+    {
+      /* Try to find a vectorized version of the built-in.
+        TODO: properly assert that builtin is a mathfn builtin? */
+      tree vec_builtin
+       = targetm.vectorize.builtin_vectorized_function
+       (builtin_mathfn_code (builtin), type, type);
+      if (vec_builtin != NULL_TREE)
+       return vec_builtin;
+      else
+       return builtin;
+    }
+  if (builtin == NULL_TREE)
+    gcc_unreachable ();
+  return builtin;
+}
+
+/* Return the correct GENERIC type for storing comparison results
+   of operand with the type given in SOURCE_TYPE.  */
+
+tree
+brig_code_entry_handler::get_comparison_result_type (tree source_type)
+{
+  if (VECTOR_TYPE_P (source_type))
+    {
+      size_t element_size = int_size_in_bytes (TREE_TYPE (source_type));
+      return build_vector_type
+       (build_nonstandard_boolean_type (element_size * BITS_PER_UNIT),
+        TYPE_VECTOR_SUBPARTS (source_type));
+    }
+  else
+    return gccbrig_tree_type_for_hsa_type (BRIG_TYPE_B1);
+}
+
+/* Returns true in case the given opcode needs to know about work-item context
+   data.  In such case the context data is passed as a pointer to a work-item
+   context object, as the last argument in the builtin call.  */
+
+bool
+brig_code_entry_handler::needs_workitem_context_data
+  (BrigOpcode16_t brig_opcode) const
+{
+  switch (brig_opcode)
+    {
+    case BRIG_OPCODE_WORKITEMABSID:
+    case BRIG_OPCODE_WORKITEMFLATABSID:
+    case BRIG_OPCODE_WORKITEMFLATID:
+    case BRIG_OPCODE_CURRENTWORKITEMFLATID:
+    case BRIG_OPCODE_WORKITEMID:
+    case BRIG_OPCODE_WORKGROUPID:
+    case BRIG_OPCODE_WORKGROUPSIZE:
+    case BRIG_OPCODE_CURRENTWORKGROUPSIZE:
+    case BRIG_OPCODE_GRIDGROUPS:
+    case BRIG_OPCODE_GRIDSIZE:
+    case BRIG_OPCODE_DIM:
+    case BRIG_OPCODE_PACKETID:
+    case BRIG_OPCODE_PACKETCOMPLETIONSIG:
+    case BRIG_OPCODE_BARRIER:
+    case BRIG_OPCODE_WAVEBARRIER:
+    case BRIG_OPCODE_ARRIVEFBAR:
+    case BRIG_OPCODE_INITFBAR:
+    case BRIG_OPCODE_JOINFBAR:
+    case BRIG_OPCODE_LEAVEFBAR:
+    case BRIG_OPCODE_RELEASEFBAR:
+    case BRIG_OPCODE_WAITFBAR:
+    case BRIG_OPCODE_CUID:
+    case BRIG_OPCODE_MAXCUID:
+    case BRIG_OPCODE_DEBUGTRAP:
+    case BRIG_OPCODE_GROUPBASEPTR:
+    case BRIG_OPCODE_KERNARGBASEPTR:
+    case BRIG_OPCODE_ALLOCA:
+      return true;
+    default:
+      return false;
+    };
+}
+
+/* Returns true in case the given opcode that would normally be generated
+   as a builtin call can be expanded to tree nodes.  */
+
+bool
+brig_code_entry_handler::can_expand_builtin (BrigOpcode16_t brig_opcode) const
+{
+  switch (brig_opcode)
+    {
+    case BRIG_OPCODE_WORKITEMFLATABSID:
+    case BRIG_OPCODE_WORKITEMFLATID:
+    case BRIG_OPCODE_WORKITEMABSID:
+    case BRIG_OPCODE_WORKGROUPSIZE:
+    case BRIG_OPCODE_CURRENTWORKGROUPSIZE:
+      /* TODO: expand more builtins.  */
+      return true;
+    default:
+      return false;
+    };
+}
+
+/* Try to expand the given builtin call to reuse a previously generated
+   variable, if possible.  If not, just call the given builtin.
+   BRIG_OPCODE and BRIG_TYPE identify the builtin's BRIG opcode/type,
+   ARITH_TYPE its GENERIC type, and OPERANDS contains the builtin's
+   input operands.  */
+
+tree
+brig_code_entry_handler::expand_or_call_builtin (BrigOpcode16_t brig_opcode,
+                                                BrigType16_t brig_type,
+                                                tree arith_type,
+                                                tree_stl_vec &operands)
+{
+  if (m_parent.m_cf->m_is_kernel && can_expand_builtin (brig_opcode))
+    return expand_builtin (brig_opcode, operands);
+
+  tree built_in
+    = get_builtin_for_hsa_opcode (arith_type, brig_opcode, brig_type);
+
+  if (!VECTOR_TYPE_P (TREE_TYPE (TREE_TYPE (built_in)))
+      && arith_type != NULL_TREE && VECTOR_TYPE_P (arith_type)
+      && brig_opcode != BRIG_OPCODE_LERP
+      && brig_opcode != BRIG_OPCODE_PACKCVT
+      && brig_opcode != BRIG_OPCODE_SAD
+      && brig_opcode != BRIG_OPCODE_SADHI)
+    {
+      /* Call the scalar built-in for all elements in the vector.  */
+      tree_stl_vec operand0_elements;
+      if (operands.size () > 0)
+       unpack (operands[0], operand0_elements);
+
+      tree_stl_vec operand1_elements;
+      if (operands.size () > 1)
+       unpack (operands[1], operand1_elements);
+
+      tree_stl_vec result_elements;
+
+      for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)
+       {
+         tree_stl_vec call_operands;
+         if (operand0_elements.size () > 0)
+           call_operands.push_back (operand0_elements.at (i));
+
+         if (operand1_elements.size () > 0)
+           call_operands.push_back (operand1_elements.at (i));
+
+         result_elements.push_back
+           (expand_or_call_builtin (brig_opcode, brig_type,
+                                    TREE_TYPE (arith_type),
+                                    call_operands));
+       }
+      return pack (result_elements);
+    }
+
+  tree_stl_vec call_operands;
+  tree_stl_vec operand_types;
+
+  tree arg_type_chain = TYPE_ARG_TYPES (TREE_TYPE (built_in));
+
+  for (size_t i = 0; i < operands.size (); ++i)
+    {
+      tree operand_type = TREE_VALUE (arg_type_chain);
+      call_operands.push_back (convert (operand_type, operands[i]));
+      operand_types.push_back (operand_type);
+      arg_type_chain = TREE_CHAIN (arg_type_chain);
+    }
+
+  if (needs_workitem_context_data (brig_opcode))
+    {
+      call_operands.push_back (m_parent.m_cf->m_context_arg);
+      operand_types.push_back (ptr_type_node);
+      m_parent.m_cf->m_has_unexpanded_dp_builtins = true;
+    }
+
+  size_t operand_count = call_operands.size ();
+
+  call_operands.resize (4, NULL_TREE);
+  operand_types.resize (4, NULL_TREE);
+  for (size_t i = 0; i < operand_count; ++i)
+    call_operands.at (i) = build_reinterpret_cast (operand_types.at (i),
+                                                  call_operands.at (i));
+
+  tree fnptr = build_fold_addr_expr (built_in);
+  return build_call_array (TREE_TYPE (TREE_TYPE (built_in)), fnptr,
+                          operand_count, &call_operands[0]);
+}
+
+/* Instead of calling a built-in, reuse a previously returned value known to
+   be still valid.  This is beneficial especially for the work-item
+   identification related builtins as not having them as calls can lead to
+   more easily vectorizable parallel loops for multi work-item work-groups.
+   BRIG_OPCODE identifies the builtin and OPERANDS store the operands.  */
+
+tree
+brig_code_entry_handler::expand_builtin (BrigOpcode16_t brig_opcode,
+                                        tree_stl_vec &operands)
+{
+  tree_stl_vec uint32_0 = tree_stl_vec (1, build_int_cst (uint32_type_node, 0));
+
+  tree_stl_vec uint32_1 = tree_stl_vec (1, build_int_cst (uint32_type_node, 1));
+
+  tree_stl_vec uint32_2 = tree_stl_vec (1, build_int_cst (uint32_type_node, 2));
+
+  if (brig_opcode == BRIG_OPCODE_WORKITEMFLATABSID)
+    {
+      tree id0 = expand_builtin (BRIG_OPCODE_WORKITEMABSID, uint32_0);
+      id0 = convert (uint64_type_node, id0);
+
+      tree id1 = expand_builtin (BRIG_OPCODE_WORKITEMABSID, uint32_1);
+      id1 = convert (uint64_type_node, id1);
+
+      tree id2 = expand_builtin (BRIG_OPCODE_WORKITEMABSID, uint32_2);
+      id2 = convert (uint64_type_node, id2);
+
+      tree max0 = convert (uint64_type_node,
+                          m_parent.m_cf->m_grid_size_vars[0]);
+      tree max1 = convert (uint64_type_node,
+                          m_parent.m_cf->m_grid_size_vars[1]);
+
+      tree id2_x_max0_x_max1 = build2 (MULT_EXPR, uint64_type_node, id2, max0);
+      id2_x_max0_x_max1
+       = build2 (MULT_EXPR, uint64_type_node, id2_x_max0_x_max1, max1);
+
+      tree id1_x_max0 = build2 (MULT_EXPR, uint64_type_node, id1, max0);
+
+      tree sum = build2 (PLUS_EXPR, uint64_type_node, id0, id1_x_max0);
+      sum = build2 (PLUS_EXPR, uint64_type_node, sum, id2_x_max0_x_max1);
+
+      return add_temp_var ("workitemflatabsid", sum);
+    }
+  else if (brig_opcode == BRIG_OPCODE_WORKITEMABSID)
+    {
+      HOST_WIDE_INT dim = int_constant_value (operands[0]);
+
+      tree local_id_var = m_parent.m_cf->m_local_id_vars[dim];
+      tree wg_id_var = m_parent.m_cf->m_wg_id_vars[dim];
+      tree wg_size_var = m_parent.m_cf->m_wg_size_vars[dim];
+      tree grid_size_var = m_parent.m_cf->m_grid_size_vars[dim];
+
+      tree wg_id_x_wg_size = build2 (MULT_EXPR, uint32_type_node,
+                                    convert (uint32_type_node, wg_id_var),
+                                    convert (uint32_type_node, wg_size_var));
+      tree sum
+       = build2 (PLUS_EXPR, uint32_type_node, wg_id_x_wg_size, local_id_var);
+
+      /* We need a modulo here because of work-groups which have dimensions
+        larger than the grid size :( TO CHECK: is this really allowed in the
+        specs?  */
+      tree modulo
+       = build2 (TRUNC_MOD_EXPR, uint32_type_node, sum, grid_size_var);
+
+      return add_temp_var (std::string ("workitemabsid_")
+                            + (char) ((int) 'x' + dim),
+                          modulo);
+    }
+  else if (brig_opcode == BRIG_OPCODE_WORKITEMFLATID)
+    {
+      tree z_x_wgsx_wgsy
+       = build2 (MULT_EXPR, uint32_type_node,
+                 m_parent.m_cf->m_local_id_vars[2],
+                 m_parent.m_cf->m_wg_size_vars[0]);
+      z_x_wgsx_wgsy = build2 (MULT_EXPR, uint32_type_node, z_x_wgsx_wgsy,
+                             m_parent.m_cf->m_wg_size_vars[1]);
+
+      tree y_x_wgsx
+       = build2 (MULT_EXPR, uint32_type_node,
+                 m_parent.m_cf->m_local_id_vars[1],
+                 m_parent.m_cf->m_wg_size_vars[0]);
+
+      tree sum = build2 (PLUS_EXPR, uint32_type_node, y_x_wgsx, z_x_wgsx_wgsy);
+      sum = build2 (PLUS_EXPR, uint32_type_node,
+                   m_parent.m_cf->m_local_id_vars[0],
+                   sum);
+      return add_temp_var ("workitemflatid", sum);
+    }
+  else if (brig_opcode == BRIG_OPCODE_WORKGROUPSIZE)
+    {
+      HOST_WIDE_INT dim = int_constant_value (operands[0]);
+      return m_parent.m_cf->m_wg_size_vars[dim];
+    }
+  else if (brig_opcode == BRIG_OPCODE_CURRENTWORKGROUPSIZE)
+    {
+      HOST_WIDE_INT dim = int_constant_value (operands[0]);
+      return m_parent.m_cf->m_cur_wg_size_vars[dim];
+    }
+  else
+    gcc_unreachable ();
+
+  return NULL_TREE;
+}
+
+/* Appends and returns a new temp variable and an accompanying assignment
+   statement that stores the value of the given EXPR and has the given NAME.  */
+
+tree
+brig_code_entry_handler::add_temp_var (std::string name, tree expr)
+{
+  tree temp_var = create_tmp_var (TREE_TYPE (expr), name.c_str ());
+  tree assign = build2 (MODIFY_EXPR, TREE_TYPE (temp_var), temp_var, expr);
+  m_parent.m_cf->append_statement (assign);
+  return temp_var;
+}
+
+/* Creates a FP32 to FP16 conversion call, assuming the source and destination
+   are FP32 type variables.  */
+
+tree
+brig_code_entry_handler::build_f2h_conversion (tree source)
+{
+  return float_to_half () (*this, source);
+}
+
+/* Creates a FP16 to FP32 conversion call, assuming the source and destination
+   are FP32 type variables.  */
+
+tree
+brig_code_entry_handler::build_h2f_conversion (tree source)
+{
+  return half_to_float () (*this, source);
+}
+
+/* Builds and "normalizes" the dest and source operands for the instruction
+   execution; converts the input operands to the expected instruction type,
+   performs half to float conversions, constant to correct type variable,
+   and flush to zero (if applicable).  */
+
+tree_stl_vec
+brig_code_entry_handler::build_operands (const BrigInstBase &brig_inst)
+{
+  /* Flush to zero.  */
+  bool ftz = false;
+  const BrigBase *base = &brig_inst.base;
+
+  if (base->kind == BRIG_KIND_INST_MOD)
+    {
+      const BrigInstMod *mod = (const BrigInstMod *) base;
+      ftz = mod->modifier & BRIG_ALU_FTZ;
+    }
+  else if (base->kind == BRIG_KIND_INST_CMP)
+    {
+      const BrigInstCmp *cmp = (const BrigInstCmp *) base;
+      ftz = cmp->modifier & BRIG_ALU_FTZ;
+    }
+
+  bool is_vec_instr = hsa_type_packed_p (brig_inst.type);
+
+  size_t element_count;
+  if (is_vec_instr)
+    {
+      BrigType16_t brig_element_type = brig_inst.type & BRIG_TYPE_BASE_MASK;
+      element_count = gccbrig_hsa_type_bit_size (brig_inst.type)
+                     / gccbrig_hsa_type_bit_size (brig_element_type);
+    }
+  else
+    element_count = 1;
+
+  bool is_fp16_arith = false;
+
+  tree src_type;
+  tree dest_type;
+  if (base->kind == BRIG_KIND_INST_CMP)
+    {
+      const BrigInstCmp *cmp_inst = (const BrigInstCmp *) base;
+      src_type = gccbrig_tree_type_for_hsa_type (cmp_inst->sourceType);
+      dest_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+      is_fp16_arith
+       = (cmp_inst->sourceType & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_F16;
+    }
+  else if (base->kind == BRIG_KIND_INST_SOURCE_TYPE)
+    {
+      const BrigInstSourceType *src_type_inst
+       = (const BrigInstSourceType *) base;
+      src_type = gccbrig_tree_type_for_hsa_type (src_type_inst->sourceType);
+      dest_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+      is_fp16_arith
+       = (src_type_inst->sourceType & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_F16
+       && !gccbrig_is_bit_operation (brig_inst.opcode);
+    }
+  else if (base->kind == BRIG_KIND_INST_SEG_CVT)
+    {
+      const BrigInstSegCvt *seg_cvt_inst = (const BrigInstSegCvt *) base;
+      src_type = gccbrig_tree_type_for_hsa_type (seg_cvt_inst->sourceType);
+      dest_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+    }
+  else if (base->kind == BRIG_KIND_INST_MEM)
+    {
+      src_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+      dest_type = src_type;
+      /* With mem instructions we don't want to cast the fp16
+        back and forth between fp32, because the load/stores
+        are not specific to the data type.  */
+      is_fp16_arith = false;
+    }
+  else if (base->kind == BRIG_KIND_INST_CVT)
+    {
+      const BrigInstCvt *cvt_inst = (const BrigInstCvt *) base;
+
+      src_type = gccbrig_tree_type_for_hsa_type (cvt_inst->sourceType);
+      dest_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+    }
+  else
+    {
+      switch (brig_inst.opcode)
+       {
+       case BRIG_OPCODE_INITFBAR:
+       case BRIG_OPCODE_JOINFBAR:
+       case BRIG_OPCODE_WAITFBAR:
+       case BRIG_OPCODE_ARRIVEFBAR:
+       case BRIG_OPCODE_LEAVEFBAR:
+       case BRIG_OPCODE_RELEASEFBAR:
+         src_type = uint32_type_node;
+         break;
+       default:
+         src_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+         break;
+       }
+      dest_type = src_type;
+      is_fp16_arith
+       = !gccbrig_is_bit_operation (brig_inst.opcode)
+       && (brig_inst.type & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_F16;
+    }
+
+  /* Halfs are a tricky special case: their "storage format" is u16, but
+     scalars are stored in 32b regs while packed f16 are... well packed.  */
+  tree half_storage_type = element_count > 1
+                            ? gccbrig_tree_type_for_hsa_type (brig_inst.type)
+                            : uint32_type_node;
+
+  const BrigData *operand_entries
+    = m_parent.get_brig_data_entry (brig_inst.operands);
+  std::vector<tree> operands;
+  for (size_t i = 0; i < operand_entries->byteCount / 4; ++i)
+    {
+      uint32_t operand_offset = ((const uint32_t *) &operand_entries->bytes)[i];
+      const BrigBase *operand_data
+       = m_parent.get_brig_operand_entry (operand_offset);
+
+      const bool is_output
+       = gccbrig_hsa_opcode_op_output_p (brig_inst.opcode, i);
+
+      tree operand_type = is_output ? dest_type : src_type;
+
+      bool half_to_float = is_fp16_arith;
+
+      /* Special cases for operand types.  */
+      if ((brig_inst.opcode == BRIG_OPCODE_SHL
+          || brig_inst.opcode == BRIG_OPCODE_SHR)
+         && i == 2)
+         /* The shift amount is always a scalar.  */
+       operand_type
+         = VECTOR_TYPE_P (src_type) ? TREE_TYPE (src_type) : src_type;
+      else if (brig_inst.opcode == BRIG_OPCODE_SHUFFLE)
+       {
+         if (i == 3)
+           /* HSAIL shuffle inputs the MASK vector as tightly packed bits
+              while GENERIC VEC_PERM_EXPR expects the mask elements to be
+              of the same size as the elements in the input vectors.  Let's
+              cast to a scalar type here and convert to the VEC_PERM_EXPR
+              format in instruction handling.  There are no arbitrary bit
+              width int types in GENERIC so we cannot use the original
+              vector type.  */
+           operand_type = uint32_type_node;
+         else
+           /* Always treat the element as unsigned ints to avoid
+              sign extensions/negative offsets with masks, which
+              are expected to be of the same element type as the
+              data in VEC_PERM_EXPR.  With shuffles the data type
+              should not matter as it's a "raw operation".  */
+           operand_type = get_unsigned_int_type (operand_type);
+       }
+      else if (brig_inst.opcode == BRIG_OPCODE_PACK)
+       {
+         if (i == 1)
+           operand_type = get_unsigned_int_type (dest_type);
+         else if (i == 2)
+           operand_type = get_unsigned_int_type (TREE_TYPE (dest_type));
+         else if (i == 3)
+           operand_type = uint32_type_node;
+       }
+      else if (brig_inst.opcode == BRIG_OPCODE_UNPACK && i == 2)
+       operand_type = uint32_type_node;
+      else if (brig_inst.opcode == BRIG_OPCODE_SAD && i == 3)
+       operand_type = uint32_type_node;
+      else if (brig_inst.opcode == BRIG_OPCODE_CLASS && i == 2)
+       {
+         operand_type = uint32_type_node;
+         half_to_float = false;
+       }
+      else if (half_to_float)
+       /* Treat the operands as the storage type at this point.  */
+       operand_type = half_storage_type;
+
+      tree operand = build_tree_operand (brig_inst, *operand_data, operand_type,
+                                        !is_output);
+
+      gcc_assert (operand);
+
+      /* Cast/convert the inputs to correct types as expected by the GENERIC
+        opcode instruction.  */
+      if (!is_output)
+       {
+         if (half_to_float)
+           operand = build_h2f_conversion
+             (build_reinterpret_cast (half_storage_type, operand));
+         else if (TREE_CODE (operand) != LABEL_DECL
+                  && TREE_CODE (operand) != TREE_VEC
+                  && operand_data->kind != BRIG_KIND_OPERAND_ADDRESS
+                  && !VECTOR_TYPE_P (TREE_TYPE (operand)))
+           {
+             size_t reg_width = int_size_in_bytes (TREE_TYPE (operand));
+             size_t instr_width = int_size_in_bytes (operand_type);
+             if (reg_width == instr_width)
+               operand = build_reinterpret_cast (operand_type, operand);
+             else if (reg_width > instr_width)
+               {
+                 /* Clip the operand because the instruction's bitwidth
+                    is smaller than the HSAIL reg width.  */
+                 if (INTEGRAL_TYPE_P (operand_type))
+                   operand
+                     = convert_to_integer (signed_or_unsigned_type_for
+                                           (TYPE_UNSIGNED (operand_type),
+                                            operand_type), operand);
+                 else
+                   operand = build_reinterpret_cast (operand_type, operand);
+               }
+             else if (reg_width < instr_width)
+               /* At least shift amount operands can be read from smaller
+                  registers than the data operands.  */
+               operand = convert (operand_type, operand);
+           }
+         else if (brig_inst.opcode == BRIG_OPCODE_SHUFFLE)
+           /* Force the operand type to be treated as the raw type.  */
+           operand = build_reinterpret_cast (operand_type, operand);
+
+         if (brig_inst.opcode == BRIG_OPCODE_CMOV && i == 1)
+           {
+             /* gcc expects the lower bit to be 1 (or all ones in case of
+                vectors) while CMOV assumes false iff 0.  Convert the input
+                here to what gcc likes by generating
+                'operand = operand != 0'.  */
+             tree cmp_res_type = get_comparison_result_type (operand_type);
+             operand = build2 (NE_EXPR, cmp_res_type, operand,
+                               build_zero_cst (TREE_TYPE (operand)));
+           }
+
+         if (ftz)
+           operand = flush_to_zero (is_fp16_arith) (*this, operand);
+       }
+      operands.push_back (operand);
+    }
+  return operands;
+}
+
+/* Build the GENERIC for assigning the result of an instruction to the result
+   "register" (variable).  BRIG_INST is the original brig instruction,
+   OUTPUT the result variable/register, INST_EXPR the one producing the
+   result.  Required bitcasts and fp32 to fp16 conversions are added as
+   well.  */
+
+tree
+brig_code_entry_handler::build_output_assignment (const BrigInstBase &brig_inst,
+                                                 tree output, tree inst_expr)
+{
+  /* The destination type might be different from the output register
+     variable type (which is always an unsigned integer type).  */
+  tree output_type = TREE_TYPE (output);
+  tree input_type = TREE_TYPE (inst_expr);
+  bool is_fp16 = (brig_inst.type & BRIG_TYPE_BASE_MASK) == BRIG_TYPE_F16
+                && brig_inst.base.kind != BRIG_KIND_INST_MEM
+                && !gccbrig_is_bit_operation (brig_inst.opcode);
+
+  /* Flush to zero.  */
+  bool ftz = false;
+  const BrigBase *base = &brig_inst.base;
+
+  if (base->kind == BRIG_KIND_INST_MOD)
+    {
+      const BrigInstMod *mod = (const BrigInstMod *) base;
+      ftz = mod->modifier & BRIG_ALU_FTZ;
+    }
+  else if (base->kind == BRIG_KIND_INST_CMP)
+    {
+      const BrigInstCmp *cmp = (const BrigInstCmp *) base;
+      ftz = cmp->modifier & BRIG_ALU_FTZ;
+    }
+
+  if (TREE_CODE (inst_expr) == CALL_EXPR)
+    {
+      tree func_decl = TREE_OPERAND (TREE_OPERAND (inst_expr, 1), 0);
+      input_type = TREE_TYPE (TREE_TYPE (func_decl));
+    }
+
+  if (ftz && (VECTOR_FLOAT_TYPE_P (TREE_TYPE (inst_expr))
+             || SCALAR_FLOAT_TYPE_P (TREE_TYPE (inst_expr)) || is_fp16))
+    {
+      /* Ensure we don't duplicate the arithmetics to the arguments of the bit
+        field reference operators.  */
+      inst_expr = add_temp_var ("before_ftz", inst_expr);
+      inst_expr = flush_to_zero (is_fp16) (*this, inst_expr);
+    }
+
+  if (is_fp16)
+    {
+      inst_expr = add_temp_var ("before_f2h", inst_expr);
+      tree f2h_output = build_f2h_conversion (inst_expr);
+      tree conv_int = convert_to_integer (output_type, f2h_output);
+      tree assign = build2 (MODIFY_EXPR, output_type, output, conv_int);
+      m_parent.m_cf->append_statement (assign);
+      return assign;
+    }
+  else if (VECTOR_TYPE_P (TREE_TYPE (output)))
+    {
+      /* Expand/unpack the input value to the given vector elements.  */
+      size_t i;
+      tree input = inst_expr;
+      tree element_type = gccbrig_tree_type_for_hsa_type (brig_inst.type);
+      tree element;
+      tree last_assign = NULL_TREE;
+      FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (output), i, element)
+       {
+         tree element_ref
+           = build3 (BIT_FIELD_REF, element_type, input,
+                     TYPE_SIZE (element_type),
+                     build_int_cst (uint32_type_node,
+                                    i * int_size_in_bytes (element_type)
+                                    *  BITS_PER_UNIT));
+
+         last_assign
+           = build_output_assignment (brig_inst, element, element_ref);
+       }
+      return last_assign;
+    }
+  else
+    {
+      /* All we do here is to bitcast the result and store it to the
+        'register' (variable).  Mainly need to take care of differing
+        bitwidths.  */
+      size_t src_width = int_size_in_bytes (input_type);
+      size_t dst_width = int_size_in_bytes (output_type);
+
+      if (src_width == dst_width)
+       {
+         /* A simple bitcast should do.  */
+         tree bitcast = build_reinterpret_cast (output_type, inst_expr);
+         tree assign = build2 (MODIFY_EXPR, output_type, output, bitcast);
+         m_parent.m_cf->append_statement (assign);
+         return assign;
+       }
+      else
+       {
+         tree conv_int = convert_to_integer (output_type, inst_expr);
+         tree assign = build2 (MODIFY_EXPR, output_type, output, conv_int);
+         m_parent.m_cf->append_statement (assign);
+         return assign;
+       }
+    }
+  return NULL_TREE;
+}
+
+/* Appends a GENERIC statement (STMT) to the currently constructed function.  */
+
+void
+brig_code_entry_handler::append_statement (tree stmt)
+{
+  m_parent.m_cf->append_statement (stmt);
+}
+
+/* Unpacks the elements of the vector in VALUE to scalars (bit field
+   references) in ELEMENTS.  */
+
+void
+brig_code_entry_handler::unpack (tree value, tree_stl_vec &elements)
+{
+  size_t vec_size = int_size_in_bytes (TREE_TYPE (value));
+  size_t element_size
+    = int_size_in_bytes (TREE_TYPE (TREE_TYPE (value))) * BITS_PER_UNIT;
+  size_t element_count
+    = vec_size * BITS_PER_UNIT / element_size;
+
+  tree input_element_type = TREE_TYPE (TREE_TYPE (value));
+
+  value = add_temp_var ("unpack_input", value);
+
+  for (size_t i = 0; i < element_count; ++i)
+    {
+      tree element
+       = build3 (BIT_FIELD_REF, input_element_type, value,
+                 TYPE_SIZE (input_element_type),
+                 build_int_cst (unsigned_char_type_node, i * element_size));
+
+      element = add_temp_var ("scalar", element);
+      elements.push_back (element);
+    }
+}
+
+/* Pack the elements of the scalars in ELEMENTS to the returned vector.  */
+
+tree
+brig_code_entry_handler::pack (tree_stl_vec &elements)
+{
+  size_t element_count = elements.size ();
+
+  gcc_assert (element_count > 1);
+
+  tree output_element_type = TREE_TYPE (elements.at (0));
+
+  vec<constructor_elt, va_gc> *constructor_vals = NULL;
+  for (size_t i = 0; i < element_count; ++i)
+    CONSTRUCTOR_APPEND_ELT (constructor_vals, NULL_TREE, elements.at (i));
+
+  tree vec_type = build_vector_type (output_element_type, element_count);
+
+  /* build_constructor creates a vector type which is not a vector_cst
+     that requires compile time constant elements.  */
+  tree vec = build_constructor (vec_type, constructor_vals);
+
+  /* Add a temp variable for readability.  */
+  tree tmp_var = create_tmp_var (vec_type, "vec_out");
+  tree vec_tmp_assign = build2 (MODIFY_EXPR, TREE_TYPE (tmp_var), tmp_var, vec);
+  m_parent.m_cf->append_statement (vec_tmp_assign);
+  return tmp_var;
+}
+
+/* Visits the element(s) in the OPERAND, calling HANDLER to each of them.  */
+
+tree
+tree_element_unary_visitor::operator () (brig_code_entry_handler &handler,
+                                       tree operand)
+{
+  if (VECTOR_TYPE_P (TREE_TYPE (operand)))
+    {
+      size_t vec_size = int_size_in_bytes (TREE_TYPE (operand));
+      size_t element_size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (operand)));
+      size_t element_count = vec_size / element_size;
+
+      tree input_element_type = TREE_TYPE (TREE_TYPE (operand));
+      tree output_element_type = NULL_TREE;
+
+      vec<constructor_elt, va_gc> *constructor_vals = NULL;
+      for (size_t i = 0; i < element_count; ++i)
+       {
+         tree element = build3 (BIT_FIELD_REF, input_element_type, operand,
+                                TYPE_SIZE (input_element_type),
+                                build_int_cst (unsigned_char_type_node,
+                                               i * element_size
+                                               * BITS_PER_UNIT));
+
+         tree output = visit_element (handler, element);
+         output_element_type = TREE_TYPE (output);
+
+         CONSTRUCTOR_APPEND_ELT (constructor_vals, NULL_TREE, output);
+       }
+
+      tree vec_type = build_vector_type (output_element_type, element_count);
+
+      /* build_constructor creates a vector type which is not a vector_cst
+        that requires compile time constant elements.  */
+      tree vec = build_constructor (vec_type, constructor_vals);
+
+      /* Add a temp variable for readability.  */
+      tree tmp_var = create_tmp_var (vec_type, "vec_out");
+      tree vec_tmp_assign
+       = build2 (MODIFY_EXPR, TREE_TYPE (tmp_var), tmp_var, vec);
+      handler.append_statement (vec_tmp_assign);
+      return tmp_var;
+    }
+  else
+    return visit_element (handler, operand);
+}
+
+/* Visits the element pair(s) in the OPERAND0 and OPERAND1, calling HANDLER
+   to each of them.  */
+
+tree
+tree_element_binary_visitor::operator () (brig_code_entry_handler &handler,
+                                        tree operand0, tree operand1)
+{
+  if (VECTOR_TYPE_P (TREE_TYPE (operand0)))
+    {
+      gcc_assert (VECTOR_TYPE_P (TREE_TYPE (operand1)));
+      size_t vec_size = int_size_in_bytes (TREE_TYPE (operand0));
+      size_t element_size
+       = int_size_in_bytes (TREE_TYPE (TREE_TYPE (operand0)));
+      size_t element_count = vec_size / element_size;
+
+      tree input_element_type = TREE_TYPE (TREE_TYPE (operand0));
+      tree output_element_type = NULL_TREE;
+
+      vec<constructor_elt, va_gc> *constructor_vals = NULL;
+      for (size_t i = 0; i < element_count; ++i)
+       {
+
+         tree element0 = build3 (BIT_FIELD_REF, input_element_type, operand0,
+                                 TYPE_SIZE (input_element_type),
+                                 build_int_cst (unsigned_char_type_node,
+                                                i * element_size
+                                                * BITS_PER_UNIT));
+
+         tree element1 = build3 (BIT_FIELD_REF, input_element_type, operand1,
+                                 TYPE_SIZE (input_element_type),
+                                 build_int_cst (unsigned_char_type_node,
+                                                i * element_size
+                                                * BITS_PER_UNIT));
+
+         tree output = visit_element (handler, element0, element1);
+         output_element_type = TREE_TYPE (output);
+
+         CONSTRUCTOR_APPEND_ELT (constructor_vals, NULL_TREE, output);
+       }
+
+      tree vec_type = build_vector_type (output_element_type, element_count);
+
+      /* build_constructor creates a vector type which is not a vector_cst
+        that requires compile time constant elements.  */
+      tree vec = build_constructor (vec_type, constructor_vals);
+
+      /* Add a temp variable for readability.  */
+      tree tmp_var = create_tmp_var (vec_type, "vec_out");
+      tree vec_tmp_assign
+       = build2 (MODIFY_EXPR, TREE_TYPE (tmp_var), tmp_var, vec);
+      handler.append_statement (vec_tmp_assign);
+      return tmp_var;
+    }
+  else
+    return visit_element (handler, operand0, operand1);
+}
+
+/* Generates GENERIC code that flushes the visited element to zero.  */
+
+tree
+flush_to_zero::visit_element (brig_code_entry_handler &, tree operand)
+{
+  size_t size = int_size_in_bytes (TREE_TYPE (operand));
+  if (size == 4)
+    {
+      tree built_in
+       = (m_fp16) ? builtin_decl_explicit (BUILT_IN_HSAIL_FTZ_F32_F16) :
+       builtin_decl_explicit (BUILT_IN_HSAIL_FTZ_F32);
+
+      return call_builtin (built_in, 1, float_type_node, float_type_node,
+                          operand);
+    }
+  else if (size == 8)
+    {
+      return call_builtin (builtin_decl_explicit (BUILT_IN_HSAIL_FTZ_F64), 1,
+                          double_type_node, double_type_node, operand);
+    }
+  else
+    gcc_unreachable ();
+  return NULL_TREE;
+}
+
+/* Generates GENERIC code that converts a single precision float to half
+   precision float.  */
+
+tree
+float_to_half::visit_element (brig_code_entry_handler &caller, tree operand)
+{
+  tree built_in = builtin_decl_explicit (BUILT_IN_HSAIL_F32_TO_F16);
+
+  tree casted_operand = build_reinterpret_cast (uint32_type_node, operand);
+
+  tree call = call_builtin (built_in, 1, uint16_type_node, uint32_type_node,
+                           casted_operand);
+  tree output
+    = create_tmp_var (TREE_TYPE (TREE_TYPE (built_in)), "fp16out");
+  tree assign = build2 (MODIFY_EXPR, TREE_TYPE (output), output, call);
+  caller.append_statement (assign);
+  return output;
+}
+
+/* Generates GENERIC code that converts a half precision float to single
+   precision float.  */
+
+tree
+half_to_float::visit_element (brig_code_entry_handler &caller, tree operand)
+{
+  tree built_in = builtin_decl_explicit (BUILT_IN_HSAIL_F16_TO_F32);
+  tree truncated_source = convert_to_integer (uint16_type_node, operand);
+
+  tree call
+    = call_builtin (built_in, 1, uint32_type_node, uint16_type_node,
+                   truncated_source);
+
+  tree const_fp32_type
+    = build_type_variant (brig_to_generic::s_fp32_type, 1, 0);
+
+  tree output = create_tmp_var (const_fp32_type, "fp32out");
+  tree casted_result
+    = build_reinterpret_cast (brig_to_generic::s_fp32_type, call);
+
+  tree assign = build2 (MODIFY_EXPR, TREE_TYPE (output), output, casted_result);
+
+  caller.append_statement (assign);
+
+  return output;
+}
+
+/* Treats the INPUT as SRC_TYPE and sign or zero extends it to DEST_TYPE.  */
+
+tree
+brig_code_entry_handler::extend_int (tree input, tree dest_type, tree src_type)
+{
+  /* Extend integer conversions according to the destination's
+     ext mode.  First we need to clip the input register to
+     the possible smaller integer size to ensure the correct sign
+     bit is extended.  */
+  tree clipped_input = convert_to_integer (src_type, input);
+  tree conversion_result;
+
+  if (TYPE_UNSIGNED (src_type))
+    conversion_result
+      = convert_to_integer (unsigned_type_for (dest_type), clipped_input);
+  else
+    conversion_result
+      = convert_to_integer (signed_type_for (dest_type), clipped_input);
+
+  /* Treat the result as unsigned so we do not sign extend to the
+     register width.  For some reason this GENERIC sequence sign
+     extends to the s register:
+
+     D.1541 = (signed char) s1;
+     D.1542 = (signed short) D.1541;
+     s0 = (unsigned int) D.1542
+  */
+
+  /* The converted result is then extended to the target register
+     width, using the same sign as the destination.  */
+  return convert_to_integer (dest_type, conversion_result);
+}
+
+/* Returns the integer constant value of the given node.
+   If it's a cast, looks into the source of the cast.  */
+HOST_WIDE_INT
+brig_code_entry_handler::int_constant_value (tree node)
+{
+  tree n = node;
+  if (TREE_CODE (n) == VIEW_CONVERT_EXPR)
+    n = TREE_OPERAND (n, 0);
+  return int_cst_value (n);
+}
+
diff --git a/gcc/brig/brigfrontend/brig-code-entry-handler.h b/gcc/brig/brigfrontend/brig-code-entry-handler.h
new file mode 100644 (file)
index 0000000..8e7fbe8
--- /dev/null
@@ -0,0 +1,425 @@
+/* brig-code-entry-handler.h -- a gccbrig base class
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_BRIG_CODE_ENTRY_HANDLER_H
+#define GCC_BRIG_CODE_ENTRY_HANDLER_H
+
+#include "brig-to-generic.h"
+
+#include <map>
+#include <vector>
+
+class tree_element_unary_visitor;
+
+/* An interface to organize the different types of element handlers
+   for the code section.  */
+
+class brig_code_entry_handler : public brig_entry_handler
+{
+public:
+  typedef std::map<std::pair<BrigOpcode16_t, BrigType16_t>, tree> builtin_map;
+
+  brig_code_entry_handler (brig_to_generic &parent);
+
+  /* Handles the brig_code data at the given pointer and adds it to the
+     currently built tree.  Returns the number of consumed bytes.  */
+
+  virtual size_t operator () (const BrigBase *base) = 0;
+
+  void append_statement (tree stmt);
+
+protected:
+
+  tree get_tree_expr_type_for_hsa_type (BrigType16_t brig_type) const;
+  tree get_tree_cst_for_hsa_operand (const BrigOperandConstantBytes *brigConst,
+                                    tree type) const;
+  tree get_builtin_for_hsa_opcode (tree type, BrigOpcode16_t brig_opcode,
+                                  BrigType16_t brig_type) const;
+  tree get_comparison_result_type (tree source_type);
+
+  tree build_code_ref (const BrigBase &ref);
+
+  tree build_tree_operand (const BrigInstBase &brig_inst,
+                          const BrigBase &operand,
+                          tree operand_type = NULL_TREE,
+                          bool is_input = false);
+
+  tree build_address_operand (const BrigInstBase &brig_inst,
+                             const BrigOperandAddress &addr_operand);
+
+  tree build_tree_operand_from_brig (const BrigInstBase *brig_inst,
+                                    tree operand_type, size_t operand_index);
+
+  tree build_tree_cst_element (BrigType16_t element_type,
+                              const unsigned char *next_data) const;
+
+  bool needs_workitem_context_data (BrigOpcode16_t brig_opcode) const;
+
+  void unpack (tree value, tree_stl_vec &elements);
+  tree pack (tree_stl_vec &elements);
+
+  bool can_expand_builtin (BrigOpcode16_t brig_opcode) const;
+  tree expand_builtin (BrigOpcode16_t brig_opcode, tree_stl_vec &operands);
+
+  tree expand_or_call_builtin (BrigOpcode16_t brig_opcode,
+                              BrigType16_t brig_type, tree arith_type,
+                              tree_stl_vec &operands);
+
+  tree add_temp_var (std::string name, tree expr);
+
+  tree build_f2h_conversion (tree source);
+  tree build_h2f_conversion (tree source);
+
+  tree_stl_vec build_operands (const BrigInstBase &brig_inst);
+  tree build_output_assignment (const BrigInstBase &brig_inst, tree output,
+                               tree inst_expr);
+
+  tree apply_to_all_elements (tree_element_unary_visitor &visitor,
+                             tree operand);
+
+  HOST_WIDE_INT int_constant_value (tree node);
+
+  tree extend_int (tree input, tree dest_type, tree src_type);
+
+  /* HSAIL-specific builtin functions not yet integrated to gcc.  */
+
+  static builtin_map s_custom_builtins;
+};
+
+/* Implement the Visitor software pattern for performing various actions on
+   elements of vector operands.  This enables separating the vector element
+   traversal/extraction/packing code from whatever different actions are
+   performed to each element.  */
+
+class tree_element_unary_visitor
+{
+public:
+  tree operator () (brig_code_entry_handler &handler, tree operand);
+
+  /* Performs an action to a single element, which can have originally
+     been a vector element or a scalar.  */
+
+  virtual tree visit_element (brig_code_entry_handler &handler, tree operand)
+    = 0;
+};
+
+class tree_element_binary_visitor
+{
+public:
+  tree operator () (brig_code_entry_handler &handler, tree operand0,
+                  tree operand1);
+
+  /* Performs an action to a pair of elements, which can have originally
+     been a vector element or a scalar.  */
+
+  virtual tree visit_element (brig_code_entry_handler &handler, tree operand0,
+                             tree operand1)
+    = 0;
+};
+
+/* Visitor for flushing float elements to zero.  */
+
+class flush_to_zero : public tree_element_unary_visitor
+{
+public:
+  flush_to_zero (bool fp16) : m_fp16 (fp16)
+  {
+  }
+
+  virtual tree visit_element (brig_code_entry_handler &caller, tree operand);
+
+private:
+
+  /* True if the value should be flushed according to fp16 limits.  */
+
+  bool m_fp16;
+};
+
+/* Visitor for converting F16 elements to F32.  */
+
+class half_to_float : public tree_element_unary_visitor
+{
+public:
+  virtual tree visit_element (brig_code_entry_handler &caller, tree operand);
+};
+
+/* Visitor for converting F32 elements to F16.  */
+
+class float_to_half : public tree_element_unary_visitor
+{
+public:
+  virtual tree visit_element (brig_code_entry_handler &caller, tree operand);
+};
+
+/* A base class for instruction types that support floating point
+   modifiers.
+
+   operator () delegates to subclasses (template method pattern) in
+   type specific parts.  */
+
+class brig_inst_mod_handler : public brig_code_entry_handler
+{
+public:
+  brig_inst_mod_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  virtual size_t generate (const BrigBase *base);
+  virtual const BrigAluModifier8_t *modifier (const BrigBase *base) const;
+  virtual const BrigRound8_t *round (const BrigBase *base) const;
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_directive_function_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_function_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_directive_control_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_control_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_directive_variable_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_variable_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+
+  tree build_variable (const BrigDirectiveVariable *brigVar,
+                      tree_code var_decltype = VAR_DECL);
+
+  size_t get_brig_var_alignment (const BrigDirectiveVariable *brigVar);
+};
+
+class brig_directive_fbarrier_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_fbarrier_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_directive_label_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_label_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_directive_comment_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_comment_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_directive_arg_block_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_arg_block_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_basic_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_basic_inst_handler (brig_to_generic &parent);
+
+  size_t operator () (const BrigBase *base);
+
+private:
+  tree build_lower_element_broadcast (tree vec_operand);
+
+  bool must_be_scalarized (const BrigInstBase *brig_inst,
+                          tree instr_type) const;
+
+  tree build_inst_expr (BrigOpcode16_t brig_opcode, BrigType16_t brig_type,
+                        tree arith_type, tree_stl_vec &operands);
+
+  tree build_shuffle (tree arith_type, tree_stl_vec &operands);
+  tree build_unpack (tree_stl_vec &operands);
+  tree build_pack (tree_stl_vec &operands);
+
+  tree build_unpack_lo_or_hi (BrigOpcode16_t brig_opcode, tree arith_type,
+                             tree_stl_vec &operands);
+
+  tree_code get_tree_code_for_hsa_opcode (BrigOpcode16_t brig_opcode,
+                                         BrigType16_t brig_type) const;
+};
+
+class brig_cvt_inst_handler : public brig_inst_mod_handler
+{
+public:
+  brig_cvt_inst_handler (brig_to_generic &parent)
+    : brig_inst_mod_handler (parent)
+  {
+  }
+
+  virtual size_t generate (const BrigBase *base);
+  virtual const BrigAluModifier8_t *modifier (const BrigBase *base) const;
+  virtual const BrigRound8_t *round (const BrigBase *base) const;
+};
+
+class brig_branch_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_branch_inst_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_mem_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_mem_inst_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+
+private:
+  tree build_mem_access (const BrigInstBase *brig_inst, tree addr, tree data);
+};
+
+class brig_copy_move_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_copy_move_inst_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+
+private:
+  size_t handle_lda (const BrigInstBase *base);
+};
+
+class brig_atomic_inst_handler : public brig_code_entry_handler
+{
+private:
+  typedef std::map<std::string, tree> atomic_builtins_map;
+
+public:
+  brig_atomic_inst_handler (brig_to_generic &parent);
+
+  size_t operator () (const BrigBase *base);
+
+protected:
+  size_t generate_tree (const BrigInstBase &inst,
+                       BrigAtomicOperation8_t atomic_opcode);
+};
+
+class brig_signal_inst_handler : public brig_atomic_inst_handler
+{
+public:
+  brig_signal_inst_handler (brig_to_generic &parent)
+    : brig_atomic_inst_handler (parent)
+  {
+  }
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_cmp_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_cmp_inst_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_seg_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_seg_inst_handler (brig_to_generic &parent);
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_lane_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_lane_inst_handler (brig_to_generic &parent);
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_queue_inst_handler : public brig_code_entry_handler
+{
+public:
+  brig_queue_inst_handler (brig_to_generic &parent);
+
+  size_t operator () (const BrigBase *base);
+};
+
+class brig_directive_module_handler : public brig_code_entry_handler
+{
+public:
+  brig_directive_module_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t operator () (const BrigBase *base);
+};
+
+
+#endif
diff --git a/gcc/brig/brigfrontend/brig-comment-handler.cc b/gcc/brig/brigfrontend/brig-comment-handler.cc
new file mode 100644 (file)
index 0000000..61a187f
--- /dev/null
@@ -0,0 +1,38 @@
+/* brig-comment-handler.cc -- brig comment directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+extern int gccbrig_verbose;
+
+size_t
+brig_directive_comment_handler::operator () (const BrigBase *base)
+{
+  const BrigDirectiveComment *brig_comment
+    = (const BrigDirectiveComment *) base;
+
+  if (gccbrig_verbose)
+    {
+      std::string cmnt = m_parent.get_string (brig_comment->name);
+      fprintf (stderr, "brig: Comment: '%s'\n", cmnt.c_str());
+    }
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-control-handler.cc b/gcc/brig/brigfrontend/brig-control-handler.cc
new file mode 100644 (file)
index 0000000..2e4f5e3
--- /dev/null
@@ -0,0 +1,108 @@
+/* brig-control-handler.cc -- brig control directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+#include "diagnostic.h"
+#include "print-tree.h"
+
+size_t
+brig_directive_control_handler::operator () (const BrigBase *base)
+{
+  const BrigDirectiveControl *inst = (const BrigDirectiveControl *) base;
+  const BrigData *operand_entries
+    = m_parent.get_brig_data_entry (inst->operands);
+
+  /* Parse the constant integer operands.  */
+  std::vector<tree> operands;
+  for (size_t i = 0; i < operand_entries->byteCount / 4; ++i)
+    {
+      uint32_t operand_offset
+       = ((const uint32_t *) &operand_entries->bytes)[i];
+      const BrigBase *operand_data
+       = m_parent.get_brig_operand_entry (operand_offset);
+
+      tree operand_type
+       = (inst->control == BRIG_CONTROL_REQUIREDGRIDSIZE
+          || inst->control == BRIG_CONTROL_MAXFLATGRIDSIZE) ?
+       uint64_type_node : uint32_type_node;
+      operands.push_back
+       (build_tree_operand (*(const BrigInstBase*)inst, *operand_data,
+                            operand_type));
+    }
+
+  switch (inst->control)
+    {
+    case BRIG_CONTROL_MAXDYNAMICGROUPSIZE:
+      {
+       m_parent.m_cf->m_descriptor.max_dynamic_group_size
+         = int_constant_value (operands.at (0));
+       break;
+      }
+    case BRIG_CONTROL_MAXFLATGRIDSIZE:
+      {
+       m_parent.m_cf->m_descriptor.max_flat_grid_size
+         = int_constant_value (operands.at (0));
+       break;
+      }
+    case BRIG_CONTROL_MAXFLATWORKGROUPSIZE:
+      {
+       m_parent.m_cf->m_descriptor.max_flat_workgroup_size
+         = int_constant_value (operands.at (0));
+       break;
+      }
+    case BRIG_CONTROL_REQUIREDDIM:
+      {
+       m_parent.m_cf->m_descriptor.required_dim
+         = int_constant_value (operands.at (0));
+       break;
+      }
+    case BRIG_CONTROL_REQUIREDGRIDSIZE:
+      {
+       m_parent.m_cf->m_descriptor.required_grid_size[0]
+         = int_constant_value (operands.at (0));
+       m_parent.m_cf->m_descriptor.required_grid_size[1]
+         = int_constant_value (operands.at (1));
+       m_parent.m_cf->m_descriptor.required_grid_size[2]
+         = int_constant_value (operands.at (2));
+       break;
+      }
+    case BRIG_CONTROL_REQUIREDWORKGROUPSIZE:
+      {
+       m_parent.m_cf->m_descriptor.required_workgroup_size[0]
+         = int_constant_value (operands.at (0));
+       m_parent.m_cf->m_descriptor.required_workgroup_size[1]
+         = int_constant_value (operands.at (1));
+       m_parent.m_cf->m_descriptor.required_workgroup_size[2]
+         = int_constant_value (operands.at (2));
+       break;
+      }
+    case BRIG_CONTROL_REQUIRENOPARTIALWORKGROUPS:
+      /* Performance hint only, ignored for now.  */
+      break;
+    case BRIG_CONTROL_ENABLEBREAKEXCEPTIONS:
+    case BRIG_CONTROL_ENABLEDETECTEXCEPTIONS:
+      /* Unimplemented.  */
+      break;
+    default:
+      sorry ("Unsupported control directive %x.\n", inst->control);
+    }
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-copy-move-inst-handler.cc b/gcc/brig/brigfrontend/brig-copy-move-inst-handler.cc
new file mode 100644 (file)
index 0000000..08ff26d
--- /dev/null
@@ -0,0 +1,73 @@
+/* brig-copy-move-inst-handler.cc -- brig copy/move instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+#include "errors.h"
+#include "brig-util.h"
+
+size_t
+brig_copy_move_inst_handler::handle_lda (const BrigInstBase *brig_inst)
+{
+  tree dest_type = gccbrig_tree_type_for_hsa_type (brig_inst->type);
+
+  tree input = build_tree_operand_from_brig (brig_inst, NULL, 1);
+  tree output = build_tree_operand_from_brig (brig_inst, dest_type, 0);
+
+  build_output_assignment (*brig_inst, output, input);
+  return brig_inst->base.byteCount;
+}
+
+size_t
+brig_copy_move_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstBase *brig_inst
+    = (const BrigInstBase *) &((const BrigInstBasic *) base)->base;
+
+  if (brig_inst->opcode == BRIG_OPCODE_LDA)
+    return handle_lda (brig_inst);
+
+  const BrigInstSourceType *inst_src_type = (const BrigInstSourceType *) base;
+
+  tree source_type = gccbrig_tree_type_for_hsa_type (inst_src_type->sourceType);
+  tree dest_type = gccbrig_tree_type_for_hsa_type (brig_inst->type);
+
+  tree input = build_tree_operand_from_brig (brig_inst, source_type, 1);
+  tree output = build_tree_operand_from_brig (brig_inst, dest_type, 0);
+  if (brig_inst->opcode == BRIG_OPCODE_COMBINE)
+    {
+      /* For combine, a simple reinterpret cast from the array constructor
+        works.  */
+
+      tree casted = build_reinterpret_cast (dest_type, input);
+      tree assign = build2 (MODIFY_EXPR, TREE_TYPE (output), output, casted);
+      m_parent.m_cf->append_statement (assign);
+    }
+  else if (brig_inst->opcode == BRIG_OPCODE_EXPAND)
+    build_output_assignment (*brig_inst, output, input);
+  else
+    {
+      brig_basic_inst_handler basic (m_parent);
+      return basic (base);
+    }
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-cvt-inst-handler.cc b/gcc/brig/brigfrontend/brig-cvt-inst-handler.cc
new file mode 100644 (file)
index 0000000..a5b1619
--- /dev/null
@@ -0,0 +1,260 @@
+/* brig-cvt-inst-handler.cc -- brig cvt (convert) instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+
+#include "brig-code-entry-handler.h"
+
+#include "gimple-expr.h"
+#include "errors.h"
+#include "convert.h"
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+#include "diagnostic-core.h"
+#include "brig-util.h"
+
+const BrigAluModifier8_t *
+brig_cvt_inst_handler::modifier (const BrigBase *base) const
+{
+  const BrigInstCvt *inst = (const BrigInstCvt *) base;
+  return &inst->modifier;
+}
+
+const BrigRound8_t *
+brig_cvt_inst_handler::round (const BrigBase *base) const
+{
+  const BrigInstCvt *inst = (const BrigInstCvt *) base;
+  return &inst->round;
+}
+
+size_t
+brig_cvt_inst_handler::generate (const BrigBase *base)
+{
+  /* In cvt instructions there can be at least four data types involved:
+
+     - the input register type
+     - the output register type
+     - the conversion source type
+     - the conversion destination type
+  */
+
+  const BrigInstBase *brig_inst
+    = (const BrigInstBase *) &((const BrigInstBasic *) base)->base;
+  const BrigInstCvt *cvt_inst = (const BrigInstCvt *) base;
+
+  const BrigAluModifier8_t *inst_modifier = modifier (base);
+  const bool FTZ = inst_modifier != NULL && (*inst_modifier) & BRIG_ALU_FTZ;
+
+  /* The conversion source type.  */
+  tree src_type = get_tree_expr_type_for_hsa_type (cvt_inst->sourceType);
+
+  bool src_is_fp16 = cvt_inst->sourceType == BRIG_TYPE_F16;
+
+  /* The conversion destination type.  */
+  tree dest_type = gccbrig_tree_type_for_hsa_type (brig_inst->type);
+
+  bool dest_is_fp16 = brig_inst->type == BRIG_TYPE_F16;
+
+  if (!dest_type || !src_type)
+    {
+      gcc_unreachable ();
+      return base->byteCount;
+    }
+
+  tree_stl_vec operands = build_operands (*brig_inst);
+  tree &input = operands.at (1);
+  tree &output = operands.at (0);
+
+  size_t conv_src_size = int_size_in_bytes (src_type);
+  size_t conv_dst_size = int_size_in_bytes (dest_type);
+  size_t src_reg_size = int_size_in_bytes (TREE_TYPE (input));
+
+  /* The input register can be of different type&size than the
+     conversion input size.  First cast the input to the conversion
+     input type.  These casts are always bitcasts which can be
+     expressed as casts between different unsigned integers.  */
+  if (src_reg_size != conv_src_size)
+    {
+      tree unsigned_int_type = NULL_TREE;
+      if (INTEGRAL_TYPE_P (src_type))
+       unsigned_int_type = unsigned_type_for (src_type);
+      else /* Find a matching size int type for the REAL type.  */
+       {
+         if (conv_src_size == 2)
+           unsigned_int_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U16);
+         else if (conv_src_size == 4)
+           unsigned_int_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U32);
+         else if (conv_src_size == 8)
+           unsigned_int_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U64);
+         else
+           gcc_unreachable ();
+       }
+      input = convert_to_integer (unsigned_int_type, input);
+    }
+
+  if (src_is_fp16)
+    input = build_h2f_conversion (input);
+
+  /* Flush the float operand to zero if indicated with 'ftz'.  */
+  if (FTZ && SCALAR_FLOAT_TYPE_P (src_type))
+    {
+      tree casted_input = build_reinterpret_cast (src_type, input);
+      input = flush_to_zero (src_is_fp16) (*this, casted_input);
+    }
+
+  tree conversion_result = NULL_TREE;
+  if (brig_inst->type == BRIG_TYPE_B1)
+    {
+      /* When the destination is b1, cvt does a 'ztest' operation which is
+        defined as a != 0 for integers and similarly (!= 0.0f) for floats.  */
+      if (INTEGRAL_TYPE_P (src_type))
+       {
+         /* Generate an integer not equal operation.  */
+         conversion_result = build2 (NE_EXPR, TREE_TYPE (input), input,
+                                     build_int_cst (TREE_TYPE (input), 0));
+       }
+      else
+       {
+         /* For REAL source types, ztest returns 1 if the value is not +- 0.0f.
+            We can perform this check with an integer comparison after
+            masking away the sign bit from a correct position.  This is safer
+            than using absf because of exceptions in case of a NaN
+            input (NaN exceptions are not generated with cvt).  */
+         tree unsigned_int_type = NULL_TREE;
+         /* Bit battern with all but the upper bit 1.  */
+         tree and_mask = NULL_TREE;
+         if (conv_src_size == 2)
+           {
+             unsigned_int_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U16);
+             and_mask = build_int_cst (unsigned_int_type, 0x7FFF);
+           }
+         else if (conv_src_size == 4)
+           {
+             unsigned_int_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U32);
+             and_mask = build_int_cst (unsigned_int_type, 0x7FFFFFFF);
+           }
+         else if (conv_src_size == 8)
+           {
+             unsigned_int_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U64);
+             and_mask = build_int_cst (unsigned_int_type, 0x7FFFFFFFFFFFFFFF);
+           }
+         else
+           gcc_unreachable ();
+         tree casted_input = build_reinterpret_cast (unsigned_int_type, input);
+         tree masked_input
+           = build2 (BIT_AND_EXPR, unsigned_int_type, casted_input, and_mask);
+         conversion_result
+           = build2 (NE_EXPR, TREE_TYPE (masked_input), masked_input,
+                     build_int_cst (unsigned_int_type, 0));
+       }
+      /* The result from the comparison is a boolean, convert it to such.  */
+      conversion_result
+       = convert_to_integer (gccbrig_tree_type_for_hsa_type (BRIG_TYPE_B1),
+                             conversion_result);
+    }
+  else if (dest_is_fp16)
+    {
+      tree casted_input = build_reinterpret_cast (src_type, input);
+      conversion_result
+       = convert_to_real (brig_to_generic::s_fp32_type, casted_input);
+      if (FTZ)
+       conversion_result = flush_to_zero (true) (*this, conversion_result);
+      conversion_result = build_f2h_conversion (conversion_result);
+    }
+  else if (SCALAR_FLOAT_TYPE_P (dest_type))
+    {
+      tree casted_input = build_reinterpret_cast (src_type, input);
+      conversion_result = convert_to_real (dest_type, casted_input);
+    }
+  else if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
+    {
+      conversion_result = extend_int (input, dest_type, src_type);
+    }
+  else if (INTEGRAL_TYPE_P (dest_type) && SCALAR_FLOAT_TYPE_P (src_type))
+    {
+
+      if (cvt_inst->round == BRIG_ROUND_INTEGER_ZERO_SAT)
+       {
+
+         /* Use builtins for the saturating conversions.  */
+#undef DEF_HSAIL_SAT_BUILTIN
+#undef DEF_HSAIL_BUILTIN
+#undef DEF_HSAIL_ATOMIC_BUILTIN
+#undef DEF_HSAIL_INTR_BUILTIN
+#undef DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN
+
+         tree builtin = NULL_TREE;
+         BrigType16_t src_arith_type
+           = src_is_fp16
+           ? (BrigType16_t) BRIG_TYPE_F32 : cvt_inst->sourceType;
+#define DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN(ENUM, HSAIL_DST_TYPE, HSAIL_SRC_TYPE, \
+                                       NAME, TYPE, ATTRS)              \
+         if (brig_inst->type == HSAIL_DST_TYPE                         \
+             && src_arith_type == HSAIL_SRC_TYPE)              \
+           builtin = builtin_decl_explicit (ENUM);                     \
+         else
+#include "brig-builtins.def"
+           gcc_unreachable ();
+
+         tree casted_input = build_reinterpret_cast (src_type, input);
+         conversion_result
+           = call_builtin (builtin, 1, dest_type, src_type, casted_input);
+       }
+      else
+       {
+         tree casted_input = build_reinterpret_cast (src_type, input);
+
+         /* Perform the int to float conversion.  */
+         conversion_result = convert_to_integer (dest_type, casted_input);
+       }
+      /* The converted result is finally extended to the target register
+        width, using the same sign as the destination.  */
+      conversion_result
+       = convert_to_integer (TREE_TYPE (output), conversion_result);
+    }
+  else
+    {
+      /* Just use CONVERT_EXPR and hope for the best.  */
+      tree casted_input = build_reinterpret_cast (dest_type, input);
+      conversion_result = build1 (CONVERT_EXPR, dest_type, casted_input);
+    }
+
+  size_t dst_reg_size = int_size_in_bytes (TREE_TYPE (output));
+
+  tree assign = NULL_TREE;
+  /* The output register can be of different type&size than the
+     conversion output size.  Cast it to the register variable type.  */
+  if (dst_reg_size > conv_dst_size)
+    {
+      tree casted_output
+       = build1 (CONVERT_EXPR, TREE_TYPE (output), conversion_result);
+      assign = build2 (MODIFY_EXPR, TREE_TYPE (output), output, casted_output);
+    }
+  else
+    {
+      tree casted_output
+       = build_reinterpret_cast (TREE_TYPE (output), conversion_result);
+      assign = build2 (MODIFY_EXPR, TREE_TYPE (output), output, casted_output);
+    }
+  m_parent.m_cf->append_statement (assign);
+
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-fbarrier-handler.cc b/gcc/brig/brigfrontend/brig-fbarrier-handler.cc
new file mode 100644 (file)
index 0000000..b236885
--- /dev/null
@@ -0,0 +1,44 @@
+/* brig-fbarrier-handler.cc -- brig fbarrier directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+#include "stringpool.h"
+#include "errors.h"
+
+/* Allocate this many bytes from the group segment for each fbarrier.  */
+#define FBARRIER_STRUCT_SIZE 32
+
+size_t
+brig_directive_fbarrier_handler::operator () (const BrigBase *base)
+{
+  /* Model fbarriers as group segment variables with fixed size
+     large enough to store whatever data the actual target needs
+     to store to maintain the barrier info.  The handle is the
+     offset to the beginning of the object.  */
+
+  const BrigDirectiveFbarrier* fbar = (const BrigDirectiveFbarrier*)base;
+  if (m_parent.m_cf != NULL)
+    m_parent.m_cf->m_function_scope_vars.insert (base);
+  std::string var_name = m_parent.get_mangled_name (fbar);
+  m_parent.append_group_variable (var_name, FBARRIER_STRUCT_SIZE, 1);
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-function-handler.cc b/gcc/brig/brigfrontend/brig-function-handler.cc
new file mode 100644 (file)
index 0000000..4e05680
--- /dev/null
@@ -0,0 +1,374 @@
+/* brig-code-entry-handler.cc -- brig function directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+#include <iomanip>
+
+#include "brig-code-entry-handler.h"
+
+#include "brig-machine.h"
+#include "stringpool.h"
+#include "tree-iterator.h"
+#include "gimple-expr.h"
+#include "function.h"
+#include "phsa.h"
+
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+
+extern int gccbrig_verbose;
+
+size_t
+brig_directive_function_handler::operator () (const BrigBase *base)
+{
+  m_parent.finish_function ();
+
+  size_t bytes_consumed = base->byteCount;
+
+  const BrigDirectiveExecutable *exec = (const BrigDirectiveExecutable *) base;
+
+  if (gccbrig_verbose)
+    {
+      printf ("brig: function name %s\n",
+             m_parent.get_string (exec->name).c_str());
+      printf ("brig: inargs %d outargs %d name offset %d\n", exec->inArgCount,
+             exec->outArgCount, exec->name);
+    }
+
+  const bool is_definition
+    = exec->modifier & BRIG_EXECUTABLE_DEFINITION;
+
+  const bool is_kernel = base->kind == BRIG_KIND_DIRECTIVE_KERNEL;
+
+  /* There doesn't seem to be actual use cases for kernel declarations
+     as they cannot be called by the program.  Ignore them until there's
+     a reason not to.  */
+  if (is_kernel && !is_definition)
+    return bytes_consumed;
+
+  m_parent.m_cf = new brig_function (exec, &m_parent);
+
+  std::string func_name = m_parent.get_mangled_name (exec);
+
+  tree fndecl;
+  tree ret_value = NULL_TREE;
+
+  tree stmt_list = alloc_stmt_list ();
+
+  /* Add a function scope BIND_EXPR using which we can push local variables that
+     represent HSAIL registers.  */
+  tree bind_expr = build3 (BIND_EXPR, void_type_node, NULL, stmt_list, NULL);
+
+  if (is_kernel)
+    {
+      /* The generated kernel function is not the one that should be
+        called by the host.  */
+      func_name = std::string ("_") + func_name;
+
+      tree name_identifier
+       = get_identifier_with_length (func_name.c_str (), func_name.size ());
+
+      /* The generated kernel functions take the following arguments:
+
+        1) a char* which is a starting address of the argument segment where
+        the call's arguments are stored by the launcher.
+        2) a void* parameter that points to a phsail-finalizer context object
+        which passes the hsa kernel packet etc.
+        3) a void* parameter that contains the first flat address of the group
+        region allocated to the current work-group.  */
+
+      tree char_ptr_type_node = build_pointer_type (char_type_node);
+      fndecl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, name_identifier,
+                          build_function_type_list (void_type_node,
+                                                    char_ptr_type_node,
+                                                    ptr_type_node,
+                                                    ptr_type_node, NULL_TREE));
+
+      SET_DECL_ASSEMBLER_NAME (fndecl, name_identifier);
+
+      tree resdecl
+       = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, void_type_node);
+
+      tree typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
+      tree argtype = TREE_VALUE (typelist);
+      TYPE_ADDR_SPACE (argtype)
+       = gccbrig_get_target_addr_space_id (BRIG_SEGMENT_KERNARG);
+
+      tree arg_arg = build_decl (UNKNOWN_LOCATION, PARM_DECL,
+                                get_identifier ("__args"), char_ptr_type_node);
+      DECL_ARGUMENTS (fndecl) = arg_arg;
+      DECL_ARG_TYPE (arg_arg) = char_ptr_type_node;
+      DECL_CONTEXT (arg_arg) = fndecl;
+      DECL_ARTIFICIAL (arg_arg) = 1;
+      TREE_READONLY (arg_arg) = 1;
+      TREE_USED (arg_arg) = 1;
+
+      DECL_RESULT (fndecl) = resdecl;
+      DECL_CONTEXT (resdecl) = fndecl;
+      DECL_EXTERNAL (fndecl) = 0;
+    }
+  else
+    {
+      /* Build a regular function fingerprint to enable targets to optimize
+        the calling convention as they see fit.  */
+      tree name_identifier
+       = get_identifier_with_length (func_name.c_str (), func_name.size ());
+
+      m_parent.m_cf->m_arg_variables.clear ();
+
+      brig_directive_variable_handler arg_handler (m_parent);
+
+      vec<tree, va_gc> *args;
+      vec_alloc (args, 4);
+
+      tree arg_decls = NULL_TREE;
+
+      tree ret_type = void_type_node;
+      if (exec->outArgCount == 1)
+       {
+         /* The return value variable should be the first entry after the
+            function directive.  */
+         const BrigBase *retval
+           = (const BrigBase *) ((const char *) base + base->byteCount);
+         gcc_assert (retval->kind == BRIG_KIND_DIRECTIVE_VARIABLE);
+
+         const BrigDirectiveVariable *brigVar
+           = (const BrigDirectiveVariable *) retval;
+
+         brig_directive_variable_handler varhandler (m_parent);
+
+         if (brigVar->type & BRIG_TYPE_ARRAY)
+           {
+             /* Push array output arguments to the beginning of the
+                function argument list instead of regular function
+                return values.  */
+
+             tree arg_var = varhandler.build_variable (brigVar, PARM_DECL);
+             vec_safe_push (args, TREE_TYPE (arg_var));
+
+             m_parent.m_cf->add_arg_variable (brigVar, arg_var);
+
+             if (arg_decls == NULL_TREE)
+               arg_decls = arg_var;
+             else
+               chainon (arg_decls, arg_var);
+
+             m_parent.m_cf->add_arg_variable (brigVar, arg_var);
+
+             ret_value = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE,
+                                     void_type_node);
+           }
+         else
+           {
+             ret_value = varhandler.build_variable (brigVar, RESULT_DECL);
+             m_parent.m_cf->m_ret_value = ret_value;
+             ret_type = TREE_TYPE (ret_value);
+             m_parent.m_cf->m_ret_value_brig_var = brigVar;
+           }
+         bytes_consumed += retval->byteCount;
+       }
+      else
+       ret_value = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE,
+                               void_type_node);
+
+      TREE_ADDRESSABLE (ret_value) = 1;
+
+      if (exec->inArgCount > 0)
+       {
+         uint32_t arg_offset = exec->firstInArg;
+         for (size_t arg = 0; arg < exec->inArgCount; ++arg)
+           {
+
+             const BrigDirectiveVariable *brigVar
+               = (const BrigDirectiveVariable *) m_parent.get_brig_code_entry
+               (arg_offset);
+
+             gcc_assert (brigVar->base.kind == BRIG_KIND_DIRECTIVE_VARIABLE);
+
+             /* Delegate to the brig_directive_variable_handler.  */
+             brig_directive_variable_handler varhandler (m_parent);
+             tree arg_var = varhandler.build_variable (brigVar, PARM_DECL);
+             arg_offset += brigVar->base.byteCount;
+             vec_safe_push (args, TREE_TYPE (arg_var));
+
+             m_parent.m_cf->add_arg_variable (brigVar, arg_var);
+
+             if (arg_decls == NULL_TREE)
+               arg_decls = arg_var;
+             else
+               chainon (arg_decls, arg_var);
+           }
+       }
+
+      vec_safe_push (args, ptr_type_node);
+      vec_safe_push (args, ptr_type_node);
+
+      fndecl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, name_identifier,
+                          build_function_type_vec (ret_type, args));
+
+      DECL_RESULT (fndecl) = ret_value;
+      DECL_CONTEXT (ret_value) = fndecl;
+      DECL_EXTERNAL (fndecl) = 0;
+      DECL_ARGUMENTS (fndecl) = arg_decls;
+    }
+
+  /* All functions need the hidden __context argument passed on
+     because they might call WI-specific functions which need
+     the context info.  */
+  tree context_arg = build_decl (UNKNOWN_LOCATION, PARM_DECL,
+                                get_identifier ("__context"), ptr_type_node);
+  if (DECL_ARGUMENTS (fndecl) == NULL_TREE)
+    DECL_ARGUMENTS (fndecl) = context_arg;
+  else
+    chainon (DECL_ARGUMENTS (fndecl), context_arg);
+  DECL_CONTEXT (context_arg) = fndecl;
+  DECL_ARG_TYPE (context_arg) = ptr_type_node;
+  DECL_ARTIFICIAL (context_arg) = 1;
+  TREE_READONLY (context_arg) = 1;
+  TREE_USED (context_arg) = 1;
+
+  /* They can also access group memory, so we need to pass the
+     group pointer along too.  */
+  tree group_base_arg
+    = build_decl (UNKNOWN_LOCATION, PARM_DECL,
+                 get_identifier ("__group_base_addr"), ptr_type_node);
+  chainon (DECL_ARGUMENTS (fndecl), group_base_arg);
+  DECL_ARG_TYPE (group_base_arg) = ptr_type_node;
+  DECL_CONTEXT (group_base_arg) = fndecl;
+  DECL_ARTIFICIAL (group_base_arg) = 1;
+  TREE_READONLY (group_base_arg) = 1;
+  TREE_USED (group_base_arg) = 1;
+
+  /* Same for private.  */
+  tree private_base_arg
+    = build_decl (UNKNOWN_LOCATION, PARM_DECL,
+                 get_identifier ("__private_base_addr"), ptr_type_node);
+  chainon (DECL_ARGUMENTS (fndecl), private_base_arg);
+  DECL_ARG_TYPE (private_base_arg) = ptr_type_node;
+  DECL_CONTEXT (private_base_arg) = fndecl;
+  DECL_ARTIFICIAL (private_base_arg) = 1;
+  TREE_READONLY (private_base_arg) = 1;
+  TREE_USED (private_base_arg) = 1;
+
+  DECL_SAVED_TREE (fndecl) = bind_expr;
+
+  /* Try to preserve the functions across IPA.  */
+  DECL_PRESERVE_P (fndecl) = 1;
+  TREE_SIDE_EFFECTS (fndecl) = 1;
+
+  TREE_ADDRESSABLE (fndecl) = 1;
+
+  if (base->kind == BRIG_KIND_DIRECTIVE_FUNCTION)
+    {
+      TREE_STATIC (fndecl) = 1;
+      TREE_PUBLIC (fndecl) = 1;
+    }
+  else if (base->kind == BRIG_KIND_DIRECTIVE_KERNEL)
+    {
+      TREE_STATIC (fndecl) = 1;
+      TREE_PUBLIC (fndecl) = 1;
+    }
+  else if (base->kind == BRIG_KIND_DIRECTIVE_SIGNATURE)
+    {
+      TREE_STATIC (fndecl) = 0;
+      TREE_PUBLIC (fndecl) = 1;
+      DECL_EXTERNAL (fndecl) = 1;
+    }
+  else if (base->kind == BRIG_KIND_DIRECTIVE_INDIRECT_FUNCTION)
+    {
+      TREE_STATIC (fndecl) = 0;
+      TREE_PUBLIC (fndecl) = 1;
+    }
+  else
+    gcc_unreachable ();
+
+  TREE_USED (fndecl) = 1;
+  DECL_ARTIFICIAL (fndecl) = 0;
+
+  tree initial_block = make_node (BLOCK);
+  DECL_INITIAL (fndecl) = initial_block;
+  TREE_USED (DECL_INITIAL (fndecl)) = 1;
+
+  if (ret_value != NULL_TREE && TREE_TYPE (ret_value) != void_type_node)
+    {
+      DECL_CONTEXT (ret_value) = fndecl;
+      DECL_CHAIN (ret_value) = BIND_EXPR_VARS (bind_expr);
+      BIND_EXPR_VARS (bind_expr) = ret_value;
+    }
+
+  tree arg;
+  for (arg = DECL_ARGUMENTS (fndecl); arg != NULL_TREE; arg = TREE_CHAIN (arg))
+    {
+      DECL_CONTEXT (arg) = fndecl;
+      DECL_ARG_TYPE (arg) = TREE_TYPE (arg);
+    }
+
+  m_parent.add_function_decl (func_name, fndecl);
+  m_parent.append_global (fndecl);
+
+  if (!is_definition)
+    return bytes_consumed;
+
+  m_parent.start_function (fndecl);
+
+  m_parent.m_cf->m_name = func_name;
+  m_parent.m_cf->m_func_decl = fndecl;
+  m_parent.m_cf->m_current_bind_expr = bind_expr;
+  m_parent.m_cf->m_is_kernel = is_kernel;
+  m_parent.m_cf->m_context_arg = context_arg;
+  m_parent.m_cf->m_group_base_arg = group_base_arg;
+  m_parent.m_cf->m_private_base_arg = private_base_arg;
+
+  if (ret_value != NULL_TREE && TREE_TYPE (ret_value) != void_type_node)
+    {
+      /* We cannot assign to <<retval>> directly in gcc trunk.  We need to
+        create a local temporary variable which can be stored to and when
+        returning from the function, we'll copy it to the actual <<retval>>
+        in return statement's argument.  */
+      tree temp_var = m_parent.m_cf->m_ret_temp
+       = m_parent.m_cf->add_local_variable ("_retvalue_temp",
+                                            TREE_TYPE (ret_value));
+      TREE_ADDRESSABLE (temp_var) = 1;
+    }
+
+  if (is_kernel)
+    {
+      m_parent.m_cf->add_id_variables ();
+
+      /* Create a single entry point in the function.  */
+      m_parent.m_cf->m_entry_label_stmt
+       = build_stmt (LABEL_EXPR, m_parent.m_cf->label ("__kernel_entry"));
+      m_parent.m_cf->append_statement (m_parent.m_cf->m_entry_label_stmt);
+
+      tree bind_expr = m_parent.m_cf->m_current_bind_expr;
+      tree stmts = BIND_EXPR_BODY (bind_expr);
+
+      m_parent.m_cf->m_kernel_entry = tsi_last (stmts);
+
+      /* Let's not append the exit label yet, but only after the
+        function has been built.  We need to build it so it can
+        be referred to because returns are converted to gotos to this
+        label.  */
+      m_parent.m_cf->m_exit_label = m_parent.m_cf->label ("__kernel_exit");
+    }
+
+  return bytes_consumed;
+}
diff --git a/gcc/brig/brigfrontend/brig-function.cc b/gcc/brig/brigfrontend/brig-function.cc
new file mode 100644 (file)
index 0000000..5f9784c
--- /dev/null
@@ -0,0 +1,723 @@
+/* brig-function.cc -- declaration of brig_function class.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+#include <iomanip>
+
+#include "brig-function.h"
+#include "stringpool.h"
+#include "tree-iterator.h"
+#include "toplev.h"
+#include "gimplify.h"
+#include "gimple-expr.h"
+#include "print-tree.h"
+#include "hsa-brig-format.h"
+#include "stor-layout.h"
+#include "diagnostic-core.h"
+#include "brig-code-entry-handler.h"
+#include "brig-machine.h"
+#include "brig-util.h"
+#include "phsa.h"
+#include "tree-pretty-print.h"
+#include "dumpfile.h"
+#include "tree-cfg.h"
+#include "errors.h"
+#include "function.h"
+#include "brig-to-generic.h"
+#include "brig-builtins.h"
+
+brig_function::brig_function (const BrigDirectiveExecutable *exec,
+                             brig_to_generic *parent)
+  : m_brig_def (exec), m_is_kernel (false), m_is_finished (false), m_name (""),
+    m_current_bind_expr (NULL_TREE), m_func_decl (NULL_TREE),
+    m_context_arg (NULL_TREE), m_group_base_arg (NULL_TREE),
+    m_private_base_arg (NULL_TREE), m_ret_value (NULL_TREE),
+    m_next_kernarg_offset (0), m_kernarg_max_align (0),
+    m_ret_value_brig_var (NULL), m_has_barriers (false),
+    m_has_allocas (false), m_has_function_calls_with_barriers (false),
+    m_calls_analyzed (false), m_is_wg_function (false),
+    m_has_unexpanded_dp_builtins (false), m_generating_arg_block (false),
+    m_parent (parent)
+{
+  memset (m_regs, 0,
+         BRIG_2_TREE_HSAIL_TOTAL_REG_COUNT * sizeof (BrigOperandRegister *));
+  memset (&m_descriptor, 0, sizeof (phsa_descriptor));
+}
+
+brig_function::~brig_function ()
+{
+  for (size_t i = 0; i < BRIG_2_TREE_HSAIL_TOTAL_REG_COUNT; ++i)
+    {
+      if (m_regs[i] != NULL)
+       {
+         delete m_regs[i];
+         m_regs[i] = NULL;
+       }
+    }
+}
+
+/* Returns a GENERIC label with the given name in the given function.
+   Creates it, if not yet found.  */
+
+tree
+brig_function::label (const std::string &name)
+{
+  label_index::const_iterator i = m_label_index.find (name);
+  if (i == m_label_index.end ())
+    {
+      tree name_identifier
+       = get_identifier_with_length (name.c_str (), name.size ());
+
+      tree label_decl = build_decl (UNKNOWN_LOCATION, LABEL_DECL,
+                                   name_identifier, void_type_node);
+
+      DECL_CONTEXT (label_decl) = m_func_decl;
+      DECL_ARTIFICIAL (label_decl) = 0;
+
+      m_label_index[name] = label_decl;
+      return label_decl;
+    }
+  else
+    return (*i).second;
+}
+
+/* Record an argument variable for later use.  This includes both local
+   variables inside arg blocks and incoming function arguments.  */
+
+void
+brig_function::add_arg_variable (const BrigDirectiveVariable *brigVar,
+                                tree treeDecl)
+{
+  m_arg_variables[brigVar] = treeDecl;
+}
+
+tree
+brig_function::arg_variable (const BrigDirectiveVariable *var) const
+{
+  variable_index::const_iterator i = m_arg_variables.find (var);
+  if (i == m_arg_variables.end ())
+    return NULL_TREE;
+  else
+    return (*i).second;
+}
+
+/* Appends a new kernel argument descriptor for the current kernel's
+   arg space.  */
+
+void
+brig_function::append_kernel_arg (const BrigDirectiveVariable *var, size_t size,
+                                 size_t alignment)
+{
+  gcc_assert (m_func_decl != NULL_TREE);
+  gcc_assert (m_is_kernel);
+
+  size_t align_padding = m_next_kernarg_offset % alignment == 0 ?
+    0 : (alignment - m_next_kernarg_offset % alignment);
+  m_next_kernarg_offset += align_padding;
+  m_kernarg_offsets[var] = m_next_kernarg_offset;
+  m_next_kernarg_offset += size;
+
+  m_kernarg_max_align
+    = m_kernarg_max_align < alignment ? alignment : m_kernarg_max_align;
+}
+
+size_t
+brig_function::kernel_arg_offset (const BrigDirectiveVariable *var) const
+{
+  var_offset_table::const_iterator i = m_kernarg_offsets.find (var);
+  gcc_assert (i != m_kernarg_offsets.end ());
+  return (*i).second;
+}
+
+/* Add work-item ID variables to the beginning of the kernel function
+   which can be used for address computation as kernel dispatch packet
+   instructions can be expanded to GENERIC nodes referring to them.  */
+
+void
+brig_function::add_id_variables ()
+{
+  tree bind_expr = m_current_bind_expr;
+  tree stmts = BIND_EXPR_BODY (bind_expr);
+
+  /* Initialize the WG limits and local ids.  */
+
+  tree_stmt_iterator entry = tsi_start (stmts);
+
+  for (int i = 0; i < 3; ++i)
+    {
+      char dim_char = (char) ((int) 'x' + i);
+
+      /* The local sizes are limited to 16b values, but let's still use 32b
+        to avoid unnecessary casts (the ID functions are 32b).  */
+      m_local_id_vars[i]
+       = add_local_variable (std::string ("__local_") + dim_char,
+                             uint32_type_node);
+
+      tree workitemid_call
+       = call_builtin (builtin_decl_explicit (BUILT_IN_HSAIL_WORKITEMID), 2,
+                       uint32_type_node, uint32_type_node,
+                       build_int_cst (uint32_type_node, i), ptr_type_node,
+                       m_context_arg);
+
+      tree id_init = build2 (MODIFY_EXPR, TREE_TYPE (m_local_id_vars[i]),
+                            m_local_id_vars[i], workitemid_call);
+
+      tsi_link_after (&entry, id_init, TSI_NEW_STMT);
+
+      m_cur_wg_size_vars[i]
+       = add_local_variable (std::string ("__cur_wg_size_") + dim_char,
+                             uint32_type_node);
+
+      tree cwgz_call
+       = call_builtin
+       (builtin_decl_explicit (BUILT_IN_HSAIL_CURRENTWORKGROUPSIZE),
+        2, uint32_type_node, uint32_type_node,
+        build_int_cst (uint32_type_node, i), ptr_type_node, m_context_arg);
+
+      tree limit_init = build2 (MODIFY_EXPR, TREE_TYPE (m_cur_wg_size_vars[i]),
+                               m_cur_wg_size_vars[i], cwgz_call);
+
+      tsi_link_after (&entry, limit_init, TSI_NEW_STMT);
+
+      m_wg_id_vars[i]
+       = add_local_variable (std::string ("__workgroupid_") + dim_char,
+                             uint32_type_node);
+
+      tree wgid_call
+       = call_builtin (builtin_decl_explicit (BUILT_IN_HSAIL_WORKGROUPID),
+                       2, uint32_type_node, uint32_type_node,
+                       build_int_cst (uint32_type_node, i), ptr_type_node,
+                       m_context_arg);
+
+      tree wgid_init = build2 (MODIFY_EXPR, TREE_TYPE (m_wg_id_vars[i]),
+                              m_wg_id_vars[i], wgid_call);
+
+      tsi_link_after (&entry, wgid_init, TSI_NEW_STMT);
+
+      m_wg_size_vars[i]
+       = add_local_variable (std::string ("__workgroupsize_") + dim_char,
+                             uint32_type_node);
+
+      tree wgsize_call
+       = call_builtin (builtin_decl_explicit (BUILT_IN_HSAIL_WORKGROUPSIZE),
+                       2, uint32_type_node, uint32_type_node,
+                       build_int_cst (uint32_type_node, i), ptr_type_node,
+                       m_context_arg);
+
+      tree wgsize_init = build2 (MODIFY_EXPR, TREE_TYPE (m_wg_size_vars[i]),
+                                m_wg_size_vars[i], wgsize_call);
+
+      tsi_link_after (&entry, wgsize_init, TSI_NEW_STMT);
+
+      m_grid_size_vars[i]
+       = add_local_variable (std::string ("__gridsize_") + dim_char,
+                             uint32_type_node);
+
+      tree gridsize_call
+       = call_builtin (builtin_decl_explicit (BUILT_IN_HSAIL_GRIDSIZE), 2,
+                       uint32_type_node, uint32_type_node,
+                       build_int_cst (uint32_type_node, i), ptr_type_node,
+                       m_context_arg);
+
+      tree gridsize_init = build2 (MODIFY_EXPR, TREE_TYPE (m_grid_size_vars[i]),
+                                  m_grid_size_vars[i], gridsize_call);
+
+      tsi_link_after (&entry, gridsize_init, TSI_NEW_STMT);
+    }
+
+  m_kernel_entry = entry;
+}
+
+/* Creates a new local variable with the given NAME and given GENERIC
+   TYPE.  */
+
+tree
+brig_function::add_local_variable (std::string name, tree type)
+{
+  tree name_identifier
+    = get_identifier_with_length (name.c_str (), name.size ());
+  tree variable
+    = build_decl (UNKNOWN_LOCATION, VAR_DECL, name_identifier, type);
+
+  DECL_NONLOCAL (variable) = 0;
+  TREE_ADDRESSABLE (variable) = 0;
+  TREE_STATIC (variable) = 0;
+  TREE_USED (variable) = 1;
+  DECL_ARTIFICIAL (variable) = 0;
+
+  tree bind_expr = DECL_SAVED_TREE (m_func_decl);
+
+  DECL_CONTEXT (variable) = m_func_decl;
+
+  DECL_CHAIN (variable) = BIND_EXPR_VARS (bind_expr);
+  BIND_EXPR_VARS (bind_expr) = variable;
+  return variable;
+}
+
+/* Returns a DECL_VAR for the given HSAIL operand register.
+   If it has not been created yet for the function being generated,
+   creates it as an unsigned int variable.  */
+
+tree
+brig_function::get_m_var_declfor_reg (const BrigOperandRegister *reg)
+{
+  size_t offset = reg->regNum;
+  switch (reg->regKind)
+    {
+    case BRIG_REGISTER_KIND_QUAD:
+      offset
+       += BRIG_2_TREE_HSAIL_D_REG_COUNT + BRIG_2_TREE_HSAIL_S_REG_COUNT +
+       BRIG_2_TREE_HSAIL_C_REG_COUNT;
+      break;
+    case BRIG_REGISTER_KIND_DOUBLE:
+      offset += BRIG_2_TREE_HSAIL_S_REG_COUNT + BRIG_2_TREE_HSAIL_C_REG_COUNT;
+      break;
+    case BRIG_REGISTER_KIND_SINGLE:
+      offset += BRIG_2_TREE_HSAIL_C_REG_COUNT;
+    case BRIG_REGISTER_KIND_CONTROL:
+      break;
+    default:
+      gcc_unreachable ();
+      break;
+    }
+
+  reg_decl_index_entry *regEntry = m_regs[offset];
+  if (regEntry == NULL)
+    {
+      size_t reg_size = gccbrig_reg_size (reg);
+      tree type;
+      if (reg_size > 1)
+       type = build_nonstandard_integer_type (reg_size, true);
+      else
+       type = boolean_type_node;
+
+      /* Drop the const qualifier so we do not end up with a read only
+        register variable which cannot be written to later.  */
+      tree nonconst_type = build_type_variant (type, false, false);
+
+      regEntry = new reg_decl_index_entry;
+
+      regEntry->m_var_decl
+       = add_local_variable (gccbrig_reg_name (reg), nonconst_type);
+      m_regs[offset] = regEntry;
+    }
+  return regEntry->m_var_decl;
+}
+
+/* Builds a work-item do..while loop for a single DIM.  HEADER_ENTRY is
+   a statement after which the iteration variables should be initialized and
+   the loop body starts.  BRANCH_AFTER is the statement after which the loop
+   predicate check and the back edge goto will be appended.  */
+
+void
+brig_function::add_wi_loop (int dim, tree_stmt_iterator *header_entry,
+                           tree_stmt_iterator *branch_after)
+{
+  tree ivar = m_local_id_vars[dim];
+  tree ivar_max = m_cur_wg_size_vars[dim];
+  tree_stmt_iterator entry = *header_entry;
+
+  /* TODO: this is not a parallel loop as we share the "register variables"
+     across work-items.  Should create a copy of them per WI instance.  That
+     is, declare temporaries for new definitions inside the loop body, not at
+     function scope.  */
+
+  tree ivar_init = build2 (MODIFY_EXPR, TREE_TYPE (ivar), ivar,
+                          build_zero_cst (TREE_TYPE (ivar)));
+  tsi_link_after (&entry, ivar_init, TSI_NEW_STMT);
+
+  tree loop_body_label
+    = label (std::string ("__wi_loop_") + (char) ((int) 'x' + dim));
+  tree loop_body_label_stmt = build_stmt (LABEL_EXPR, loop_body_label);
+
+  tsi_link_after (&entry, loop_body_label_stmt, TSI_NEW_STMT);
+
+  if (m_has_unexpanded_dp_builtins)
+    {
+      tree id_set_builtin
+       = builtin_decl_explicit (BUILT_IN_HSAIL_SETWORKITEMID);
+      /* Set the local ID to the current wi-loop iteration variable value to
+        ensure the builtins see the correct values.  */
+      tree id_set_call
+       = call_builtin (id_set_builtin, 3,
+                       void_type_node, uint32_type_node,
+                       build_int_cst (uint32_type_node, dim), uint32_type_node,
+                       ivar, ptr_type_node, m_context_arg);
+      tsi_link_after (&entry, id_set_call, TSI_NEW_STMT);
+    }
+
+  /* Increment the WI iteration variable.  */
+  tree incr = build2 (PREINCREMENT_EXPR, TREE_TYPE (ivar), ivar,
+                     build_one_cst (TREE_TYPE (ivar)));
+
+  tsi_link_after (branch_after, incr, TSI_NEW_STMT);
+
+  /* Append the predicate check with the back edge goto.  */
+  tree condition = build2 (LT_EXPR, TREE_TYPE (ivar), ivar, ivar_max);
+  tree target_goto = build1 (GOTO_EXPR, void_type_node, loop_body_label);
+  tree if_stmt
+    = build3 (COND_EXPR, void_type_node, condition, target_goto, NULL_TREE);
+  tsi_link_after (branch_after, if_stmt, TSI_NEW_STMT);
+}
+
+/* Recursively analyzes the function and its callees for barrier usage.  */
+
+void
+brig_function::analyze_calls ()
+{
+  if (m_calls_analyzed)
+    return;
+
+  /* Set this early to not get stuck in case of recursive call graphs.
+     This is safe because if the function calls itself, either the function
+     has barrier calls which implies a call to a function with barrier calls,
+     or it doesn't in which case the result depends on the later called
+     functions.  */
+  m_calls_analyzed = true;
+
+  for (size_t i = 0; i < m_called_functions.size (); ++i)
+    {
+      tree f = m_called_functions[i];
+      brig_function *called_f = m_parent->get_finished_function (f);
+      if (called_f == NULL)
+       {
+         /* Unfinished function (only declaration within the set of BRIGs)
+            found.  Cannot finish the CG analysis.  Have to assume it does have
+            a barrier for safety.  */
+         m_has_function_calls_with_barriers = true;
+         m_has_unexpanded_dp_builtins = true;
+         break;
+       }
+      called_f->analyze_calls ();
+      /* We can assume m_has_barriers has been correctly set during the
+        construction of the function decl.  No need to reanalyze it.  */
+      m_has_function_calls_with_barriers |= called_f->m_has_barriers;
+
+      /* If the function or any of its called functions has dispatch
+        packet builtin calls that require the local id, we need to
+        set the local id to the context in the work item loop before
+        the functions are called.  If we analyze the opposite, these
+        function calls can be omitted.  */
+      m_has_unexpanded_dp_builtins |= called_f->m_has_unexpanded_dp_builtins;
+    }
+}
+
+/* Tries to convert the current kernel to a work-group function that executes
+   all work-items using loops.  Returns true in case the conversion was
+   successful.  */
+
+bool
+brig_function::convert_to_wg_function ()
+{
+  if (!m_calls_analyzed)
+    analyze_calls ();
+
+  if (m_has_barriers || m_has_function_calls_with_barriers)
+    return false;
+
+  /* The most trivial case: No barriers at all in the kernel.
+     We can create one big work-item loop around the whole kernel.  */
+  tree bind_expr = m_current_bind_expr;
+  tree stmts = BIND_EXPR_BODY (bind_expr);
+
+  for (int i = 0; i < 3; ++i)
+    {
+      /* The previous loop has added a new label to the end of the function,
+        the next level loop should wrap around it also.  */
+      tree_stmt_iterator function_exit = tsi_last (stmts);
+      add_wi_loop (i, &m_kernel_entry, &function_exit);
+    }
+
+  m_is_wg_function = true;
+  return false;
+}
+
+/* Emits a kernel description to a special ELF section so it can be
+   utilized by an HSA runtime implementation.  The assembly block
+   must be emitted to a statement list of an function, which is given
+   as an argument.  Returns the assembly block used to emit the section. */
+
+tree
+brig_function::emit_metadata (tree stmt_list)
+{
+  /* Emit an ELF section via an assembly directive that generates a special
+     ELF section for each kernel that contains raw bytes of a descriptor
+     object.  This is pretty disgusting, but life is never perfect ;)  */
+
+  /* Use the original kernel name without the '_' prefix in the section name.  */
+  std::string kern_name = m_is_kernel ? m_name.substr (1) : m_name;
+
+  std::ostringstream strstr;
+  strstr << std::endl
+        << ".pushsection " << PHSA_DESC_SECTION_PREFIX << kern_name
+        << std::endl
+        << "\t.p2align 1, 1, 1" << std::endl
+        << "\t.byte ";
+
+  for (size_t i = 0; i < sizeof (phsa_descriptor); ++i)
+    {
+      strstr << "0x" << std::setw (2) << std::setfill ('0') << std::hex
+            << (unsigned) *((unsigned char *) &m_descriptor + i);
+      if (i + 1 < sizeof (phsa_descriptor))
+       strstr << ", ";
+    }
+
+  strstr << std::endl << ".popsection" << std::endl << std::endl;
+
+  tree metadata_asm
+    = build_stmt (ASM_EXPR,
+                 build_string (strstr.str ().size (), strstr.str ().c_str ()),
+                 NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE);
+
+  append_to_statement_list_force (metadata_asm, &stmt_list);
+  return metadata_asm;
+}
+
+/* Emits the kernel launcher function.  Also emits the metadata section
+   creation statements in it.
+
+   The launcher function calls the device-side runtime
+   that runs the kernel for all work-items.  In C:
+
+   void KernelName (void* context, void* group_base_addr)
+   {
+     __hsail_launch_kernel (_KernelName, context, group_base_addr);
+   }
+
+   or, in case of a successful conversion to a work-group function:
+
+   void KernelName (void* context, void* group_base_addr)
+   {
+     __hsail_launch_wg_function (_KernelName, context, group_base_addr);
+   }
+
+   The user/host sees this function as the kernel to call from the
+   outside.  The actual kernel generated from HSAIL was named _KernelName.
+*/
+
+tree
+brig_function::emit_launcher_and_metadata ()
+{
+  /* The original kernel name without the '_' prefix.  */
+  std::string kern_name = m_name.substr (1);
+
+  tree name_identifier
+    = get_identifier_with_length (kern_name.c_str (), kern_name.size ());
+
+  tree launcher
+    = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, name_identifier,
+                 build_function_type_list (void_type_node, ptr_type_node,
+                                           ptr_type_node, NULL_TREE));
+
+  TREE_USED (launcher) = 1;
+  DECL_ARTIFICIAL (launcher) = 1;
+
+  tree context_arg = build_decl (UNKNOWN_LOCATION, PARM_DECL,
+                                get_identifier ("__context"), ptr_type_node);
+
+  DECL_ARGUMENTS (launcher) = context_arg;
+  DECL_ARG_TYPE (context_arg) = ptr_type_node;
+  DECL_CONTEXT (context_arg) = launcher;
+  TREE_USED (context_arg) = 1;
+  DECL_ARTIFICIAL (context_arg) = 1;
+
+  tree group_base_addr_arg
+    = build_decl (UNKNOWN_LOCATION, PARM_DECL,
+                 get_identifier ("__group_base_addr"), ptr_type_node);
+
+  chainon (DECL_ARGUMENTS (launcher), group_base_addr_arg);
+  DECL_ARG_TYPE (group_base_addr_arg) = ptr_type_node;
+  DECL_CONTEXT (group_base_addr_arg) = launcher;
+  TREE_USED (group_base_addr_arg) = 1;
+  DECL_ARTIFICIAL (group_base_addr_arg) = 1;
+
+  tree resdecl
+    = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, void_type_node);
+
+  DECL_RESULT (launcher) = resdecl;
+  DECL_CONTEXT (resdecl) = launcher;
+
+  DECL_INITIAL (launcher) = make_node (BLOCK);
+  TREE_USED (DECL_INITIAL (launcher)) = 1;
+
+  tree stmt_list = alloc_stmt_list ();
+
+  tree bind_expr = build3 (BIND_EXPR, void_type_node, NULL, stmt_list, NULL);
+
+  TREE_STATIC (launcher) = 0;
+  TREE_PUBLIC (launcher) = 1;
+
+  DECL_SAVED_TREE (launcher) = bind_expr;
+
+  if (DECL_STRUCT_FUNCTION (launcher) == NULL)
+    push_struct_function (launcher);
+  else
+    push_cfun (DECL_STRUCT_FUNCTION (launcher));
+
+  tree kernel_func_ptr = build1 (ADDR_EXPR, ptr_type_node, m_func_decl);
+
+  tree phsail_launch_kernel_call;
+
+  /* Emit a launcher depending whether we converted the kernel function to
+     a work group function or not.  */
+  if (m_is_wg_function)
+    phsail_launch_kernel_call
+      = call_builtin (builtin_decl_explicit (BUILT_IN_HSAIL_LAUNCH_WG_FUNC),
+                     3, void_type_node,
+                     ptr_type_node, kernel_func_ptr, ptr_type_node,
+                     context_arg, ptr_type_node, group_base_addr_arg);
+  else
+    phsail_launch_kernel_call
+      = call_builtin (builtin_decl_explicit (BUILT_IN_HSAIL_LAUNCH_KERNEL),
+                     3, void_type_node,
+                     ptr_type_node, kernel_func_ptr, ptr_type_node,
+                     context_arg, ptr_type_node, group_base_addr_arg);
+
+  append_to_statement_list_force (phsail_launch_kernel_call, &stmt_list);
+
+  emit_metadata (stmt_list);
+
+  return launcher;
+}
+
+tree
+brig_function::append_statement (tree stmt)
+{
+  gcc_assert (m_func_decl != NULL);
+
+  tree bind_expr = m_current_bind_expr;
+  tree stmts = BIND_EXPR_BODY (bind_expr);
+
+  append_to_statement_list_force (stmt, &stmts);
+  return stmt;
+}
+
+/* Creates a new "alloca frame" for the current function by
+   injecting an alloca frame push in the beginning of the function
+   and an alloca frame pop before all function exit points.  */
+
+void
+brig_function::create_alloca_frame ()
+{
+  tree_stmt_iterator entry;
+
+  /* Adds the alloca push only after the ids have been initialized
+     in case of a kernel function.  */
+  if (m_is_kernel)
+    entry = m_kernel_entry;
+  else
+    {
+      tree bind_expr = m_current_bind_expr;
+      tree stmts = BIND_EXPR_BODY (bind_expr);
+      entry = tsi_start (stmts);
+    }
+
+  tree push_frame_builtin = builtin_decl_explicit (BUILT_IN_HSAIL_PUSH_FRAME);
+  tree push_frame_call
+    = call_builtin (push_frame_builtin, 1, void_type_node, ptr_type_node,
+                   m_context_arg);
+
+  tsi_link_before (&entry, push_frame_call, TSI_NEW_STMT);
+
+  tree pop_frame_builtin = builtin_decl_explicit (BUILT_IN_HSAIL_POP_FRAME);
+
+  do
+    {
+      tree stmt = tsi_stmt (entry);
+      if (TREE_CODE (stmt) == RETURN_EXPR)
+       {
+         tree pop_frame_call
+           = call_builtin (pop_frame_builtin, 1, void_type_node,
+                           ptr_type_node, m_context_arg);
+
+         tsi_link_before (&entry, pop_frame_call, TSI_SAME_STMT);
+       }
+      tsi_next (&entry);
+    }
+  while (!tsi_end_p (entry));
+}
+
+/* Finishes the currently built function.  After calling this, no new
+   statements should be appeneded to the function.  */
+void
+brig_function::finish ()
+{
+  append_return_stmt ();
+
+  /* Currently assume single alloca frame per WG.  */
+  if (m_has_allocas)
+    create_alloca_frame ();
+}
+
+void
+brig_function::finish_kernel ()
+{
+  /* Kernel functions should have a single exit point.
+     Let's create one.  The return instructions should have
+     been converted to branches to this label.  */
+  append_statement (build_stmt (LABEL_EXPR, m_exit_label));
+  /* Attempt to convert the kernel to a work-group function that
+     executes all work-items of the WG using a loop.  */
+  convert_to_wg_function ();
+
+  append_return_stmt ();
+
+  /* Currently assume single alloca frame per WG.  */
+  if (m_has_allocas)
+    create_alloca_frame ();
+}
+
+void
+brig_function::append_return_stmt ()
+{
+  gcc_assert (m_current_bind_expr != NULL_TREE);
+  tree stmts = BIND_EXPR_BODY (m_current_bind_expr);
+
+  if (STATEMENT_LIST_TAIL (stmts) == NULL)
+    return; /* Empty function.  */
+
+  tree last_stmt = tsi_stmt (tsi_last (stmts));
+
+  if (TREE_CODE (last_stmt) == RETURN_EXPR)
+    return;
+
+  if (m_ret_value != NULL_TREE)
+    {
+      tree result_assign
+       = build2 (MODIFY_EXPR, TREE_TYPE (m_ret_value), m_ret_value,
+                 m_ret_temp);
+
+      tree return_expr
+       = build1 (RETURN_EXPR, TREE_TYPE (result_assign), result_assign);
+      append_to_statement_list_force (return_expr, &stmts);
+    }
+  else
+    {
+      tree return_stmt = build_stmt (RETURN_EXPR, NULL);
+      append_to_statement_list_force (return_stmt, &stmts);
+    }
+}
+
+bool
+brig_function::has_function_scope_var (const BrigBase* var) const
+{
+  return m_function_scope_vars.find (var) != m_function_scope_vars.end ();
+}
diff --git a/gcc/brig/brigfrontend/brig-function.h b/gcc/brig/brigfrontend/brig-function.h
new file mode 100644 (file)
index 0000000..81c3f89
--- /dev/null
@@ -0,0 +1,213 @@
+/* brig-function.h -- declaration of brig_function class.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef BRIG_FUNCTION_H
+#define BRIG_FUNCTION_H
+
+#include "config.h"
+#include "system.h"
+#include "ansidecl.h"
+#include "coretypes.h"
+#include "opts.h"
+#include "tree.h"
+#include "tree-iterator.h"
+#include "hsa-brig-format.h"
+
+class brig_to_generic;
+
+#include <map>
+#include <string>
+#include <vector>
+#include <set>
+
+#include "phsa.h"
+
+typedef std::map<std::string, tree> label_index;
+typedef std::map<const BrigDirectiveVariable *, tree> variable_index;
+typedef std::vector<tree> tree_stl_vec;
+
+/* There are 128 c regs and 2048 s/d/q regs each in the HSAIL.  */
+#define BRIG_2_TREE_HSAIL_C_REG_COUNT (128)
+#define BRIG_2_TREE_HSAIL_S_REG_COUNT (2048)
+#define BRIG_2_TREE_HSAIL_D_REG_COUNT (2048)
+#define BRIG_2_TREE_HSAIL_Q_REG_COUNT (2048)
+#define BRIG_2_TREE_HSAIL_TOTAL_REG_COUNT                                     \
+  (BRIG_2_TREE_HSAIL_C_REG_COUNT + BRIG_2_TREE_HSAIL_S_REG_COUNT              \
+   + BRIG_2_TREE_HSAIL_D_REG_COUNT + BRIG_2_TREE_HSAIL_Q_REG_COUNT)
+
+/* Holds data for the currently built GENERIC function.  */
+
+class brig_function
+{
+public:
+  typedef std::map<const BrigDirectiveVariable *, size_t> var_offset_table;
+
+private:
+  struct reg_decl_index_entry
+  {
+    tree m_var_decl;
+  };
+
+public:
+  brig_function (const BrigDirectiveExecutable *exec, brig_to_generic *parent);
+  ~brig_function ();
+
+  tree arg_variable (const BrigDirectiveVariable *var) const;
+  void add_arg_variable (const BrigDirectiveVariable *brigVar, tree treeDecl);
+
+  void append_kernel_arg (const BrigDirectiveVariable *var, size_t size,
+                         size_t alignment);
+
+  size_t kernel_arg_offset (const BrigDirectiveVariable *var) const;
+
+  void add_id_variables ();
+
+  tree label (const std::string &name);
+
+  tree add_local_variable (std::string name, tree type);
+
+  tree get_m_var_declfor_reg (const BrigOperandRegister *reg);
+
+  bool convert_to_wg_function ();
+
+  void add_wi_loop (int dim, tree_stmt_iterator *header_entry,
+                   tree_stmt_iterator *branch_after);
+
+  tree emit_metadata (tree stmt_list);
+  tree emit_launcher_and_metadata ();
+
+  tree append_statement (tree stmt);
+
+  void create_alloca_frame ();
+
+  void finish ();
+  void finish_kernel ();
+
+  void append_return_stmt ();
+
+  bool has_function_scope_var (const BrigBase* var) const;
+
+  void analyze_calls ();
+
+  const BrigDirectiveExecutable *m_brig_def;
+
+  bool m_is_kernel;
+  bool m_is_finished;
+  std::string m_name;
+  tree m_current_bind_expr;
+  tree m_func_decl;
+  tree m_entry_label_stmt;
+  tree m_exit_label;
+
+  /* The __context function argument.  */
+  tree m_context_arg;
+  /* The __group_base_ptr argument in the current function.
+     Points to the start of the group segment for the kernel
+     instance.  */
+  tree m_group_base_arg;
+  /* The __private_base_ptr argument in the current function.
+     Points to the start of the private segment.  */
+  tree m_private_base_arg;
+
+  /* The return value variable for the current function.  */
+  tree m_ret_value;
+
+  /* The offsets of the kernel arguments in the __arg blob
+     pointing to the kernel argument space.  */
+  size_t m_next_kernarg_offset;
+
+  /* The largest kernel argument variable alignment.  */
+  size_t m_kernarg_max_align;
+
+  var_offset_table m_kernarg_offsets;
+
+  /* Argument variables in the currently handled binding expression
+     (argument segment).  */
+  variable_index m_arg_variables;
+
+  /* The brig variable for the function return value.  */
+  const BrigDirectiveVariable *m_ret_value_brig_var;
+
+  /* The function local temporary variable for the return value.  */
+  tree m_ret_temp;
+
+  /* Labels in the current function are collected here so we can refer
+     to them from jumps before they have been placed to the function.  */
+  label_index m_label_index;
+
+  /* If the kernel contains at least one barrier, this is set to true.  */
+  bool m_has_barriers;
+
+  /* True if the function has at least one alloca instruction.  */
+  bool m_has_allocas;
+
+  /* If the kernel containts at least one function call that _may_
+     contain a barrier call, this is set to true.  */
+  bool m_has_function_calls_with_barriers;
+
+  /* Set to true after this function has been analyzed for barrier and
+     dispatch packet instruction usage in the final call graph analysis.  */
+  bool m_calls_analyzed;
+
+  /* True in case the function was successfully converted to a WG function.  */
+  bool m_is_wg_function;
+
+  /* Work-item ID related variables are cached in the entry of the kernel
+     function in order to use them directly in address computations, leading
+     to more efficient optimizations.  The references to the local variables
+     are stored here.  */
+  tree m_local_id_vars[3];
+  tree m_cur_wg_size_vars[3];
+  tree m_wg_id_vars[3];
+  tree m_wg_size_vars[3];
+  tree m_grid_size_vars[3];
+
+  /* Set to true in case the kernel contains at least one dispatch packet
+     (work-item ID-related) builtin call that could not be expanded to
+     tree nodes.  */
+  bool m_has_unexpanded_dp_builtins;
+
+  /* Points to the instruction after which the real kernel code starts.
+     Usually points to the last WI ID variable initialization statement.  */
+  tree_stmt_iterator m_kernel_entry;
+
+  /* True if we are currently generating the contents of an arg block.  */
+  bool m_generating_arg_block;
+
+  /* A collection of function scope variables seen so far for resolving
+     variable references vs. module scope declarations.  */
+  std::set<const BrigBase*> m_function_scope_vars;
+
+  /* The functions called by this function.  */
+  std::vector<tree> m_called_functions;
+
+  brig_to_generic *m_parent;
+  /* The metadata of the function that should be stored with the binary and
+     passed to the HSA runtime:  */
+  phsa_descriptor m_descriptor;
+
+private:
+  /* Bookkeeping for the different HSA registers and their tree declarations
+     for the currently generated function.  */
+  reg_decl_index_entry *m_regs[BRIG_2_TREE_HSAIL_TOTAL_REG_COUNT];
+};
+
+#endif
diff --git a/gcc/brig/brigfrontend/brig-inst-mod-handler.cc b/gcc/brig/brigfrontend/brig-inst-mod-handler.cc
new file mode 100644 (file)
index 0000000..8cd5503
--- /dev/null
@@ -0,0 +1,58 @@
+/* brig-inst-mod-handler.cc -- brig rounding moded instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+#include "gimple-expr.h"
+#include "errors.h"
+
+size_t
+brig_inst_mod_handler::generate (const BrigBase *base)
+{
+  brig_basic_inst_handler basic_handler (m_parent);
+  return basic_handler (base);
+}
+
+const BrigAluModifier8_t *
+brig_inst_mod_handler::modifier (const BrigBase *base) const
+{
+  const BrigInstMod *inst = (const BrigInstMod *) base;
+  return &inst->modifier;
+}
+
+const BrigRound8_t *
+brig_inst_mod_handler::round (const BrigBase *base) const
+{
+  const BrigInstMod *inst = (const BrigInstMod *) base;
+  return &inst->round;
+}
+
+/* This used to inject fesetround () calls to control the rounding mode of the
+   actual executed floating point operation.  It turned out that supporting
+   conversions using fesetround calls won't work in gcc due to it not being
+   able to restrict code motions across calls at the moment.  This
+   functionality is therefore disabled for now until a better solution is
+   found or if fesetround () is fixed in gcc.  */
+size_t
+brig_inst_mod_handler::operator () (const BrigBase *base)
+{
+  return generate (base);
+}
diff --git a/gcc/brig/brigfrontend/brig-label-handler.cc b/gcc/brig/brigfrontend/brig-label-handler.cc
new file mode 100644 (file)
index 0000000..890cf5b
--- /dev/null
@@ -0,0 +1,37 @@
+/* brig-label-handler.cc -- brig label directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+size_t
+brig_directive_label_handler::operator () (const BrigBase *base)
+{
+  const BrigDirectiveLabel *brig_label = (const BrigDirectiveLabel *) base;
+
+  const BrigData *label_name = m_parent.get_brig_data_entry (brig_label->name);
+
+  std::string label_str ((const char *) (label_name->bytes),
+                        label_name->byteCount);
+
+  tree stmt = build_stmt (LABEL_EXPR, m_parent.m_cf->label (label_str));
+  m_parent.m_cf->append_statement (stmt);
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-lane-inst-handler.cc b/gcc/brig/brigfrontend/brig-lane-inst-handler.cc
new file mode 100644 (file)
index 0000000..5cfe8d9
--- /dev/null
@@ -0,0 +1,84 @@
+/* brig-lane-inst-handler.cc -- brig lane instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+#include "errors.h"
+#include "diagnostic-core.h"
+#include "brig-util.h"
+
+brig_lane_inst_handler::brig_lane_inst_handler (brig_to_generic &parent)
+  : brig_code_entry_handler (parent)
+{
+}
+
+size_t
+brig_lane_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstLane &inst = *(const BrigInstLane *) base;
+  tree_stl_vec operands = build_operands (inst.base);
+
+  tree expr = NULL_TREE;
+  if (inst.base.opcode == BRIG_OPCODE_ACTIVELANECOUNT)
+    {
+      /* Because we are fixed to single WI per wave, it's enough to
+        just check the src value of the single work item itself.  */
+      expr = build2 (NE_EXPR, uint32_type_node,
+                    build_zero_cst (uint32_type_node), operands[1]);
+    }
+  else if (inst.base.opcode == BRIG_OPCODE_ACTIVELANEID)
+    {
+      expr = build_zero_cst (uint32_type_node);
+    }
+  else if (inst.base.opcode == BRIG_OPCODE_ACTIVELANEMASK)
+    {
+      tree u64_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U64);
+      tree zero_cst = build_zero_cst (u64_type);
+      expr = build2 (NE_EXPR, u64_type, zero_cst, operands[1]);
+
+      tree_stl_vec elements;
+      elements.push_back (expr);
+      elements.push_back (zero_cst);
+      elements.push_back (zero_cst);
+      elements.push_back (zero_cst);
+
+      expr = pack (elements);
+    }
+  else if (inst.base.opcode == BRIG_OPCODE_ACTIVELANEPERMUTE)
+    {
+      tree src = operands[1];
+      tree identity = operands[3];
+      tree use_identity = operands[4];
+
+      /* When WAVESIZE is 1, we either select the src of the work-item
+        itself or 'identity' in case use_identity is 1.  */
+
+      tree cmp = build2 (EQ_EXPR, uint32_type_node,
+                        build_int_cstu (uint32_type_node, 1), use_identity);
+
+      expr = build3 (COND_EXPR, TREE_TYPE (src), cmp, identity, src);
+    }
+  else
+    gcc_unreachable ();
+
+  build_output_assignment (inst.base, operands[0], expr);
+
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-machine.c b/gcc/brig/brigfrontend/brig-machine.c
new file mode 100644 (file)
index 0000000..62f07f7
--- /dev/null
@@ -0,0 +1,44 @@
+/* brig-machine.c -- gccbrig machine queries
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "brig-machine.h"
+
+/* Return the numerical address space id for the segment in the current
+   target.  Currently a dummy function that always returns 0, serves as
+   a placeholder for multi-AS machines.  */
+
+unsigned
+gccbrig_get_target_addr_space_id (BrigSegment8_t)
+{
+  return 0;
+}
+
+/* Return the WAVESIZE for the current target.  For now a dummy placeholder
+   returning always 1.  */
+
+unsigned
+gccbrig_get_target_wavesize ()
+{
+  return 1;
+}
diff --git a/gcc/brig/brigfrontend/brig-machine.h b/gcc/brig/brigfrontend/brig-machine.h
new file mode 100644 (file)
index 0000000..96efbf6
--- /dev/null
@@ -0,0 +1,33 @@
+/* brig-machine.h -- gccbrig machine queries
+   Copyright (C) 2016 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_BRIG_MACHINE_H
+#define GCC_BRIG_MACHINE_H
+
+#include "hsa-brig-format.h"
+
+/* These functions should be eventually converted to machine info queries and
+   redefined at backends.  At that point make these functions delegate to
+   those.  */
+
+unsigned gccbrig_get_target_addr_space_id (BrigSegment8_t segment);
+
+unsigned gccbrig_get_target_wavesize ();
+
+#endif
diff --git a/gcc/brig/brigfrontend/brig-mem-inst-handler.cc b/gcc/brig/brigfrontend/brig-mem-inst-handler.cc
new file mode 100644 (file)
index 0000000..dfd3369
--- /dev/null
@@ -0,0 +1,180 @@
+/* brig-mem-inst-handler.cc -- brig memory inst handler
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+#include "errors.h"
+#include "brig-util.h"
+#include "gimple-expr.h"
+#include "print-tree.h"
+#include "tree-pretty-print.h"
+#include "convert.h"
+#include "diagnostic-core.h"
+
+tree
+brig_mem_inst_handler::build_mem_access (const BrigInstBase *brig_inst,
+                                        tree addr, tree data)
+{
+  bool is_load = brig_inst->opcode == BRIG_OPCODE_LD;
+  bool is_store = brig_inst->opcode == BRIG_OPCODE_ST;
+
+  if (!is_load && !is_store)
+    gcc_unreachable ();
+
+  tree instr_type = gccbrig_tree_type_for_hsa_type (brig_inst->type);
+
+  if (VECTOR_TYPE_P (TREE_TYPE (data)))
+    instr_type = TREE_TYPE (data);
+
+  tree ptype = build_pointer_type (instr_type);
+
+  /* The HSAIL mem instructions are unaligned by default.
+     TODO: exploit the align modifier, it should lead to faster code.
+  */
+  tree unaligned_type = build_aligned_type (instr_type, 8);
+
+  /* Create a mem ref from the previous result, without offset.  */
+  tree mem_ref
+    = build2 (MEM_REF, unaligned_type, addr, build_int_cst (ptype, 0));
+
+  if (is_load)
+    {
+      /* Add a temporary variable so there won't be multiple
+        reads in case of vector unpack.  */
+      mem_ref = add_temp_var ("mem_read", mem_ref);
+      return build_output_assignment (*brig_inst, data, mem_ref);
+    }
+  else
+    {
+      tree stmt = build2 (MODIFY_EXPR, TREE_TYPE (mem_ref), mem_ref, data);
+      return m_parent.m_cf->append_statement (stmt);
+    }
+  return mem_ref;
+}
+
+size_t
+brig_mem_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstBase *brig_inst
+    = (const BrigInstBase *) &((const BrigInstBasic *) base)->base;
+
+  if (brig_inst->opcode == BRIG_OPCODE_ALLOCA)
+    {
+      tree_stl_vec operands = build_operands (*brig_inst);
+      size_t alignment = 1;
+      const BrigInstMem *mem_inst = (const BrigInstMem *) brig_inst;
+      if (mem_inst->align != BRIG_ALIGNMENT_NONE)
+       {
+         alignment = 1 << (mem_inst->align - 1);
+       }
+
+      tree align_opr = build_int_cstu (size_type_node, alignment);
+      tree_stl_vec inputs;
+      inputs.push_back (operands[1]);
+      inputs.push_back (align_opr);
+      tree builtin_call
+       = expand_or_call_builtin (BRIG_OPCODE_ALLOCA, BRIG_TYPE_U32,
+                                 uint32_type_node, inputs);
+      build_output_assignment (*brig_inst, operands[0], builtin_call);
+      m_parent.m_cf->m_has_allocas = true;
+      return base->byteCount;
+    }
+
+  tree instr_type = gccbrig_tree_type_for_hsa_type (brig_inst->type);
+
+  const BrigData *operand_entries
+    = m_parent.get_brig_data_entry (brig_inst->operands);
+
+  uint32_t data_operand_offset;
+  memcpy (&data_operand_offset, &operand_entries->bytes, 4);
+
+  const BrigBase *operand
+    = m_parent.get_brig_operand_entry (data_operand_offset);
+
+  const BrigData *operandData = NULL;
+
+  bool is_store = brig_inst->opcode == BRIG_OPCODE_ST;
+
+  bool is_three_element_vector_access
+    = operand->kind == BRIG_KIND_OPERAND_OPERAND_LIST
+      && (operandData = m_parent.get_brig_data_entry
+         (((const BrigOperandOperandList *) operand)->elements))
+      && operandData->byteCount / 4 == 3;
+
+  if (is_three_element_vector_access)
+    {
+      /* We need to scalarize the 3-element vector accesses here
+        because gcc assumes the GENERIC vector datatypes are of two exponent
+        size internally.  */
+      size_t bytes = operandData->byteCount;
+      const BrigOperandOffset32_t *operand_ptr
+       = (const BrigOperandOffset32_t *) operandData->bytes;
+
+      uint32_t addr_operand_offset;
+      memcpy (&addr_operand_offset, &operand_entries->bytes + 4, 4);
+
+      const BrigOperandAddress *addr_operand
+       = (const BrigOperandAddress *) m_parent.get_brig_operand_entry
+       (addr_operand_offset);
+
+      tree address_base = build_address_operand (*brig_inst, *addr_operand);
+
+      uint32_t address_offset = 0;
+      while (bytes > 0)
+       {
+         BrigOperandOffset32_t offset = *operand_ptr;
+         const BrigBase *operand_element
+           = m_parent.get_brig_operand_entry (offset);
+         tree data
+           = build_tree_operand (*brig_inst, *operand_element, instr_type);
+
+         tree ptr_offset = build_int_cst (size_type_node, address_offset);
+         tree address = build2 (POINTER_PLUS_EXPR, TREE_TYPE (address_base),
+                                address_base, ptr_offset);
+
+         if (is_store && TREE_TYPE (data) != instr_type)
+           {
+             if (int_size_in_bytes (TREE_TYPE (data))
+                   == int_size_in_bytes (instr_type)
+                 && !INTEGRAL_TYPE_P (instr_type))
+               data = build1 (VIEW_CONVERT_EXPR, instr_type, data);
+             else
+               data = convert (instr_type, data);
+           }
+
+         build_mem_access (brig_inst, address, data);
+
+         address_offset += int_size_in_bytes (instr_type);
+         ++operand_ptr;
+         bytes -= 4;
+       }
+    }
+  else
+    {
+      tree_stl_vec operands = build_operands (*brig_inst);
+
+      tree &data = operands.at (0);
+      tree &addr = operands.at (1);
+      build_mem_access (brig_inst, addr, data);
+    }
+
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-module-handler.cc b/gcc/brig/brigfrontend/brig-module-handler.cc
new file mode 100644 (file)
index 0000000..2c25189
--- /dev/null
@@ -0,0 +1,41 @@
+/* brig-module-handler.cc -- brig module directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+#include "diagnostic-core.h"
+
+size_t
+brig_directive_module_handler::operator () (const BrigBase *base)
+{
+  const BrigDirectiveModule* mod = (const BrigDirectiveModule*)base;
+  m_parent.m_module_name = m_parent.get_string (mod->name).substr (1);
+  if (mod->hsailMajor != 1 || mod->hsailMinor != 0)
+    fatal_error (UNKNOWN_LOCATION, PHSA_ERROR_PREFIX_INCOMPATIBLE_MODULE " "
+                "HSAIL version not supported. HSAIL 1.0 required.");
+  if (mod->machineModel != BRIG_MACHINE_LARGE)
+    fatal_error (UNKNOWN_LOCATION, PHSA_ERROR_PREFIX_INCOMPATIBLE_MODULE " "
+                "Only HSA 'large' machine model supported.");
+  /* Do not check for the profile as the runtime conformance suite tests
+     with 'full' profile BRIGs even though they don't use any full profile
+     features.  This allows us to run the conformance suite with the
+     BRIG FE.  */
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-queue-inst-handler.cc b/gcc/brig/brigfrontend/brig-queue-inst-handler.cc
new file mode 100644 (file)
index 0000000..eaf9d8d
--- /dev/null
@@ -0,0 +1,93 @@
+/* brig-queue-inst-handler.cc -- brig user mode queue related instruction
+   handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+
+#include "brig-code-entry-handler.h"
+#include "brig-util.h"
+#include "convert.h"
+#include "tree-pretty-print.h"
+#include "errors.h"
+#include "diagnostic-core.h"
+#include "brig-builtins.h"
+
+brig_queue_inst_handler::brig_queue_inst_handler (brig_to_generic &parent)
+  : brig_code_entry_handler (parent)
+{
+}
+
+size_t
+brig_queue_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstBase &inst_base = *(const BrigInstBase *) base;
+
+  tree_stl_vec operands = build_operands (inst_base);
+
+  if (inst_base.opcode == BRIG_OPCODE_LDQUEUEWRITEINDEX
+      || inst_base.opcode == BRIG_OPCODE_LDQUEUEREADINDEX)
+    {
+      tree builtin
+       = inst_base.opcode == BRIG_OPCODE_LDQUEUEWRITEINDEX
+       ? builtin_decl_explicit (BUILT_IN_HSAIL_LDQUEUEWRITEINDEX)
+       : builtin_decl_explicit (BUILT_IN_HSAIL_LDQUEUEREADINDEX);
+
+      tree expr
+       = call_builtin (builtin, 1, uint64_type_node,
+                       uint64_type_node, operands[1]);
+      build_output_assignment (inst_base, operands[0], expr);
+    }
+  else if (inst_base.opcode == BRIG_OPCODE_STQUEUEWRITEINDEX
+          || inst_base.opcode == BRIG_OPCODE_STQUEUEREADINDEX)
+    {
+      tree builtin
+       = inst_base.opcode == BRIG_OPCODE_STQUEUEWRITEINDEX
+       ? builtin_decl_explicit (BUILT_IN_HSAIL_STQUEUEWRITEINDEX)
+       : builtin_decl_explicit (BUILT_IN_HSAIL_STQUEUEREADINDEX);
+
+      call_builtin (builtin, 2, void_type_node,
+                   uint64_type_node, operands[0], uint64_type_node,
+                   operands[1]);
+    }
+  else if (inst_base.opcode == BRIG_OPCODE_ADDQUEUEWRITEINDEX)
+    {
+      tree builtin = builtin_decl_explicit (BUILT_IN_HSAIL_ADDQUEUEWRITEINDEX);
+
+      tree expr = call_builtin (builtin, 2,
+                               uint64_type_node, uint64_type_node, operands[1],
+                               uint64_type_node, operands[2]);
+      build_output_assignment (inst_base, operands[0], expr);
+    }
+  else if (inst_base.opcode == BRIG_OPCODE_CASQUEUEWRITEINDEX)
+    {
+      tree builtin = builtin_decl_explicit (BUILT_IN_HSAIL_CASQUEUEWRITEINDEX);
+
+      tree expr
+       = call_builtin (builtin, 3, uint64_type_node,
+                       uint64_type_node, operands[1], uint64_type_node,
+                       operands[2], uint64_type_node, operands[3]);
+      build_output_assignment (inst_base, operands[0], expr);
+    }
+  else
+    gcc_unreachable ();
+
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-seg-inst-handler.cc b/gcc/brig/brigfrontend/brig-seg-inst-handler.cc
new file mode 100644 (file)
index 0000000..e680114
--- /dev/null
@@ -0,0 +1,146 @@
+/* brig-seg-inst-handler.cc -- brig segment related instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+
+#include "brig-code-entry-handler.h"
+#include "brig-util.h"
+#include "convert.h"
+#include "tree-pretty-print.h"
+#include "errors.h"
+#include "diagnostic-core.h"
+
+brig_seg_inst_handler::brig_seg_inst_handler (brig_to_generic &parent)
+  : brig_code_entry_handler (parent)
+{
+}
+
+size_t
+brig_seg_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstBase &inst_base = *(const BrigInstBase *) base;
+
+  std::vector<tree> operands = build_operands (inst_base);
+
+  tree expr = NULL_TREE;
+
+  if (inst_base.opcode == BRIG_OPCODE_STOF)
+    {
+      const BrigInstSegCvt &inst = *(const BrigInstSegCvt *) base;
+
+      if (inst.segment == BRIG_SEGMENT_GROUP)
+       expr = build2 (PLUS_EXPR, size_type_node,
+                      convert_to_integer (size_type_node,
+                                          m_parent.m_cf->m_group_base_arg),
+                      convert_to_integer (size_type_node, operands[1]));
+      else if (inst.segment == BRIG_SEGMENT_PRIVATE
+              || inst.segment == BRIG_SEGMENT_SPILL)
+       expr = build2 (PLUS_EXPR, size_type_node,
+                      convert_to_integer (size_type_node,
+                                          m_parent.m_cf->m_private_base_arg),
+                      convert_to_integer (size_type_node, operands[1]));
+      else
+       gcc_unreachable ();
+
+      if (!(inst.modifier & BRIG_SEG_CVT_NONULL))
+       {
+         /* Need to convert the null value. -1 is used for 32b segments,
+            and 0 for flat/global.  */
+         tree cmp
+           = build2 (EQ_EXPR, uint32_type_node,
+                     build_int_cstu (uint32_type_node, -1), operands[1]);
+
+         tree null_check = build3 (COND_EXPR, size_type_node, cmp,
+                                   build_int_cstu (size_type_node, 0), expr);
+
+         expr = null_check;
+       }
+    }
+  else if (inst_base.opcode == BRIG_OPCODE_FTOS)
+    {
+      const BrigInstSegCvt &inst = *(const BrigInstSegCvt *) base;
+
+      if (inst.segment == BRIG_SEGMENT_GROUP)
+       expr = build2 (MINUS_EXPR, size_type_node,
+                      convert_to_integer (size_type_node,
+                                          m_parent.m_cf->m_group_base_arg),
+                      convert_to_integer (size_type_node, operands[1]));
+      else if (inst.segment == BRIG_SEGMENT_PRIVATE)
+       expr = build2 (MINUS_EXPR, size_type_node,
+                      convert_to_integer (size_type_node,
+                                          m_parent.m_cf->m_private_base_arg),
+                      convert_to_integer (size_type_node, operands[1]));
+      else
+       gcc_unreachable ();
+
+      if (!(inst.modifier & BRIG_SEG_CVT_NONULL))
+       {
+         /* Need to convert the null value. -1 is used for 32b segments,
+            and 0 for flat/global.  */
+         tree cmp = build2 (EQ_EXPR, size_type_node,
+                            build_int_cstu (size_type_node, 0), operands[1]);
+
+         tree null_check
+           = build3 (COND_EXPR, size_type_node, cmp,
+                     build_int_cstu (uint32_type_node, -1), expr);
+         expr = null_check;
+       }
+    }
+  else if (inst_base.opcode == BRIG_OPCODE_NULLPTR)
+    {
+      const BrigInstSeg &inst = *(const BrigInstSeg *) base;
+      if (inst.segment == BRIG_SEGMENT_GLOBAL
+         || inst.segment == BRIG_SEGMENT_FLAT
+         || inst.segment == BRIG_SEGMENT_READONLY)
+       expr = build_int_cstu (uint64_type_node, 0);
+      else
+       expr = build_int_cstu (uint32_type_node, -1);
+    }
+  else if (inst_base.opcode == BRIG_OPCODE_SEGMENTP)
+    {
+      const BrigInstSegCvt &inst = *(const BrigInstSegCvt *) base;
+
+      tree builtin = NULL_TREE;
+      switch (inst.segment)
+       {
+       case BRIG_SEGMENT_GLOBAL:
+         builtin = builtin_decl_explicit (BUILT_IN_HSAIL_SEGMENTP_GLOBAL);
+         break;
+       case BRIG_SEGMENT_GROUP:
+         builtin = builtin_decl_explicit (BUILT_IN_HSAIL_SEGMENTP_GROUP);
+         break;
+       case BRIG_SEGMENT_PRIVATE:
+         builtin = builtin_decl_explicit (BUILT_IN_HSAIL_SEGMENTP_PRIVATE);
+         break;
+       default:
+         gcc_unreachable ();
+       }
+
+      expr = call_builtin (builtin, 2,
+                          uint32_type_node, uint64_type_node, operands[1],
+                          ptr_type_node, m_parent.m_cf->m_context_arg);
+    }
+  else
+    gcc_unreachable ();
+
+  build_output_assignment (inst_base, operands[0], expr);
+  return base->byteCount;
+}
diff --git a/gcc/brig/brigfrontend/brig-signal-inst-handler.cc b/gcc/brig/brigfrontend/brig-signal-inst-handler.cc
new file mode 100644 (file)
index 0000000..5dd2268
--- /dev/null
@@ -0,0 +1,42 @@
+/* brig-signal-inst-handler.cc -- brig signal instruction handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+
+#include "brig-code-entry-handler.h"
+#include "brig-util.h"
+#include "fold-const.h"
+#include "diagnostic.h"
+#include "tree-pretty-print.h"
+#include "print-tree.h"
+#include "convert.h"
+#include "langhooks.h"
+#include "gimple-expr.h"
+
+size_t
+brig_signal_inst_handler::operator () (const BrigBase *base)
+{
+  const BrigInstSignal *inst = (const BrigInstSignal *) base;
+  BrigAtomicOperation8_t atomic_opcode;
+  atomic_opcode = inst->signalOperation;
+
+  return generate_tree (inst->base, atomic_opcode);
+}
diff --git a/gcc/brig/brigfrontend/brig-to-generic.cc b/gcc/brig/brigfrontend/brig-to-generic.cc
new file mode 100644 (file)
index 0000000..d3a6786
--- /dev/null
@@ -0,0 +1,796 @@
+/* brig2tree.cc -- brig to gcc generic/gimple tree conversion
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <cassert>
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "target.h"
+#include "function.h"
+#include "brig-to-generic.h"
+#include "stringpool.h"
+#include "tree-iterator.h"
+#include "toplev.h"
+#include "gimplify.h"
+#include "gimple-expr.h"
+#include "print-tree.h"
+#include "hsa-brig-format.h"
+#include "stor-layout.h"
+#include "diagnostic-core.h"
+#include "brig-code-entry-handler.h"
+#include "brig-machine.h"
+#include "brig-util.h"
+#include "phsa.h"
+#include "tree-pretty-print.h"
+#include "dumpfile.h"
+#include "tree-cfg.h"
+#include "errors.h"
+#include "fold-const.h"
+#include "cgraph.h"
+#include "dumpfile.h"
+#include "tree-pretty-print.h"
+
+extern int gccbrig_verbose;
+
+tree brig_to_generic::s_fp16_type;
+tree brig_to_generic::s_fp32_type;
+tree brig_to_generic::s_fp64_type;
+
+brig_to_generic::brig_to_generic ()
+  : m_cf (NULL), m_brig (NULL), m_next_group_offset (0),
+    m_next_private_offset (0)
+{
+  m_globals = NULL_TREE;
+
+  /* Initialize the basic REAL types.
+     This doesn't work straight away because most of the targets
+     do not support fp16 natively.  Let's by default convert
+     to fp32 and back before and after each instruction (handle it as
+     a storage format only), and later add an optimization pass
+     that removes the extra converts (in case of multiple fp16 ops
+     in a row).  */
+  s_fp16_type = make_node (REAL_TYPE);
+  TYPE_PRECISION (s_fp16_type) = 16;
+  TYPE_SIZE (s_fp16_type) = bitsize_int (16);
+  TYPE_SIZE_UNIT (s_fp16_type) = size_int (2);
+  SET_TYPE_ALIGN (s_fp16_type, 16);
+  layout_type (s_fp16_type);
+
+  s_fp32_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_F32);
+  s_fp64_type = gccbrig_tree_type_for_hsa_type (BRIG_TYPE_F64);
+
+  /* TODO: (machine)query the preferred rounding mode that is set by
+     the machine by default.  This can be redefined by each BRIG module
+     header.  */
+  m_default_float_rounding_mode = BRIG_ROUND_FLOAT_ZERO;
+
+  m_dump_file = dump_begin (TDI_original, &m_dump_flags);
+}
+
+class unimplemented_entry_handler : public brig_code_entry_handler
+{
+public:
+  unimplemented_entry_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t
+  operator () (const BrigBase *base)
+  {
+    gcc_unreachable ();
+    return base->byteCount;
+  }
+};
+
+/* Handler for entries that can be (and are) safely skipped for the purposes
+   of GENERIC generation.  */
+
+class skipped_entry_handler : public brig_code_entry_handler
+{
+public:
+  skipped_entry_handler (brig_to_generic &parent)
+    : brig_code_entry_handler (parent)
+  {
+  }
+
+  size_t
+  operator () (const BrigBase *base)
+  {
+    return base->byteCount;
+  }
+};
+
+/* Parses the given BRIG blob.  */
+
+void
+brig_to_generic::parse (const char *brig_blob)
+{
+  m_brig = brig_blob;
+  m_brig_blobs.push_back (brig_blob);
+
+  const BrigModuleHeader *mheader = (const BrigModuleHeader *) brig_blob;
+
+  if (strncmp (mheader->identification, "HSA BRIG", 8) != 0)
+    fatal_error (UNKNOWN_LOCATION, PHSA_ERROR_PREFIX_INCOMPATIBLE_MODULE
+                "Unrecognized file format.");
+  if (mheader->brigMajor != 1 || mheader->brigMinor != 0)
+    fatal_error (UNKNOWN_LOCATION, PHSA_ERROR_PREFIX_INCOMPATIBLE_MODULE
+                "BRIG version not supported. BRIG 1.0 required.");
+
+  m_data = m_code = m_operand = NULL;
+
+  /* Find the positions of the different sections.  */
+  for (uint32_t sec = 0; sec < mheader->sectionCount; ++sec)
+    {
+      uint64_t offset
+       = ((const uint64_t *) (brig_blob + mheader->sectionIndex))[sec];
+
+      const BrigSectionHeader *section_header
+       = (const BrigSectionHeader *) (brig_blob + offset);
+
+      std::string name ((const char *) (&section_header->name),
+                       section_header->nameLength);
+
+      if (sec == BRIG_SECTION_INDEX_DATA && name == "hsa_data")
+       {
+         m_data = (const char *) section_header;
+         m_data_size = section_header->byteCount;
+       }
+      else if (sec == BRIG_SECTION_INDEX_CODE && name == "hsa_code")
+       {
+         m_code = (const char *) section_header;
+         m_code_size = section_header->byteCount;
+       }
+      else if (sec == BRIG_SECTION_INDEX_OPERAND && name == "hsa_operand")
+       {
+         m_operand = (const char *) section_header;
+         m_operand_size = section_header->byteCount;
+       }
+      else
+       {
+         gcc_unreachable ();
+       }
+    }
+
+  if (m_code == NULL)
+    gcc_unreachable ();
+  if (m_data == NULL)
+    gcc_unreachable ();
+  if (m_operand == NULL)
+    gcc_unreachable ();
+
+  brig_basic_inst_handler inst_handler (*this);
+  brig_branch_inst_handler branch_inst_handler (*this);
+  brig_cvt_inst_handler cvt_inst_handler (*this);
+  brig_seg_inst_handler seg_inst_handler (*this);
+  brig_copy_move_inst_handler copy_move_inst_handler (*this);
+  brig_signal_inst_handler signal_inst_handler (*this);
+  brig_atomic_inst_handler atomic_inst_handler (*this);
+  brig_cmp_inst_handler cmp_inst_handler (*this);
+  brig_mem_inst_handler mem_inst_handler (*this);
+  brig_inst_mod_handler inst_mod_handler (*this);
+  brig_directive_label_handler label_handler (*this);
+  brig_directive_variable_handler var_handler (*this);
+  brig_directive_fbarrier_handler fbar_handler (*this);
+  brig_directive_comment_handler comment_handler (*this);
+  brig_directive_function_handler func_handler (*this);
+  brig_directive_control_handler control_handler (*this);
+  brig_directive_arg_block_handler arg_block_handler (*this);
+  brig_directive_module_handler module_handler (*this);
+  brig_lane_inst_handler lane_inst_handler (*this);
+  brig_queue_inst_handler queue_inst_handler (*this);
+  skipped_entry_handler skipped_handler (*this);
+  unimplemented_entry_handler unimplemented_handler (*this);
+
+  struct code_entry_handler_info
+  {
+    BrigKind kind;
+    brig_code_entry_handler *handler;
+  };
+
+  /* TODO: Convert to a hash table / map.  For now, put the more common
+     entries to the top to keep the scan fast on average.  */
+  code_entry_handler_info handlers[]
+    = {{BRIG_KIND_INST_BASIC, &inst_handler},
+       {BRIG_KIND_INST_CMP, &cmp_inst_handler},
+       {BRIG_KIND_INST_MEM, &mem_inst_handler},
+       {BRIG_KIND_INST_MOD, &inst_mod_handler},
+       {BRIG_KIND_INST_CVT, &cvt_inst_handler},
+       {BRIG_KIND_INST_SEG_CVT, &seg_inst_handler},
+       {BRIG_KIND_INST_SEG, &seg_inst_handler},
+       {BRIG_KIND_INST_ADDR, &copy_move_inst_handler},
+       {BRIG_KIND_INST_SOURCE_TYPE, &copy_move_inst_handler},
+       {BRIG_KIND_INST_ATOMIC, &atomic_inst_handler},
+       {BRIG_KIND_INST_SIGNAL, &signal_inst_handler},
+       {BRIG_KIND_INST_BR, &branch_inst_handler},
+       {BRIG_KIND_INST_LANE, &lane_inst_handler},
+       {BRIG_KIND_INST_QUEUE, &queue_inst_handler},
+       /* Assuming fences are not needed.  FIXME: call builtins
+         when porting to a platform where they are.  */
+       {BRIG_KIND_INST_MEM_FENCE, &skipped_handler},
+       {BRIG_KIND_DIRECTIVE_LABEL, &label_handler},
+       {BRIG_KIND_DIRECTIVE_VARIABLE, &var_handler},
+       {BRIG_KIND_DIRECTIVE_ARG_BLOCK_START, &arg_block_handler},
+       {BRIG_KIND_DIRECTIVE_ARG_BLOCK_END, &arg_block_handler},
+       {BRIG_KIND_DIRECTIVE_FBARRIER, &fbar_handler},
+       {BRIG_KIND_DIRECTIVE_COMMENT, &comment_handler},
+       {BRIG_KIND_DIRECTIVE_KERNEL, &func_handler},
+       {BRIG_KIND_DIRECTIVE_SIGNATURE, &func_handler},
+       {BRIG_KIND_DIRECTIVE_FUNCTION, &func_handler},
+       {BRIG_KIND_DIRECTIVE_INDIRECT_FUNCTION, &func_handler},
+       {BRIG_KIND_DIRECTIVE_MODULE, &module_handler},
+       /* Skipping debug locations for now as not needed for conformance.  */
+       {BRIG_KIND_DIRECTIVE_LOC, &skipped_handler},
+       /* There are no supported pragmas at this moment.  */
+       {BRIG_KIND_DIRECTIVE_PRAGMA, &skipped_handler},
+       {BRIG_KIND_DIRECTIVE_CONTROL, &control_handler},
+       {BRIG_KIND_DIRECTIVE_EXTENSION, &skipped_handler}};
+
+  const BrigSectionHeader *csection_header = (const BrigSectionHeader *) m_code;
+
+  for (size_t b = csection_header->headerByteCount; b < m_code_size;)
+    {
+      const BrigBase *entry = (const BrigBase *) (m_code + b);
+
+      brig_code_entry_handler *handler = &unimplemented_handler;
+
+      if (m_cf != NULL && b >= m_cf->m_brig_def->nextModuleEntry)
+       finish_function (); /* The function definition ended.  */
+
+      /* Find a handler.  */
+      for (size_t i = 0;
+          i < sizeof (handlers) / sizeof (code_entry_handler_info); ++i)
+       {
+         if (handlers[i].kind == entry->kind)
+           handler = handlers[i].handler;
+       }
+      b += (*handler) (entry);
+      continue;
+    }
+
+  finish_function ();
+}
+
+const BrigData *
+brig_to_generic::get_brig_data_entry (size_t entry_offset) const
+{
+  return (const BrigData *) (m_data + entry_offset);
+}
+
+const BrigBase *
+brig_to_generic::get_brig_operand_entry (size_t entry_offset) const
+{
+  return (const BrigBase *) (m_operand + entry_offset);
+}
+
+const BrigBase *
+brig_to_generic::get_brig_code_entry (size_t entry_offset) const
+{
+  return (const BrigBase *) (m_code + entry_offset);
+}
+
+void
+brig_to_generic::append_global (tree g)
+{
+  if (m_globals == NULL_TREE)
+    {
+      m_globals = g;
+      return;
+    }
+  else
+    {
+      tree last = tree_last (m_globals);
+      TREE_CHAIN (last) = g;
+    }
+}
+
+tree
+brig_to_generic::global_variable (const std::string &name) const
+{
+  label_index::const_iterator i = m_global_variables.find (name);
+  if (i == m_global_variables.end ())
+    return NULL_TREE;
+  else
+    return (*i).second;
+}
+
+/* Returns a function declaration with the given name.  Assumes it has been
+   created previously via a DirectiveFunction or similar.  */
+
+tree
+brig_to_generic::function_decl (const std::string &name)
+{
+  label_index::const_iterator i = m_function_index.find (name);
+  if (i == m_function_index.end ())
+    return NULL_TREE;
+  return (*i).second;
+}
+
+void
+brig_to_generic::add_function_decl (const std::string &name, tree func_decl)
+{
+  m_function_index[name] = func_decl;
+}
+
+/* Adds a GENERIC global variable VAR_DECL with the given NAME to the
+   current module.  If we have generated a host def var ptr (a place holder
+   for variables that are defined by the HSA host code) for this global
+   variable definition (because there was a declaration earlier which looked
+   like it might have been a host defined variable), we now have
+   to assign its address and make it private to allow the references to
+   point to the defined variable instead.  */
+
+void
+brig_to_generic::add_global_variable (const std::string &name, tree var_decl)
+{
+  append_global (var_decl);
+  m_global_variables[name] = var_decl;
+
+  std::string host_def_var_name
+    = std::string (PHSA_HOST_DEF_PTR_PREFIX) + name;
+  tree host_def_var = global_variable (host_def_var_name.c_str ());
+  if (host_def_var == NULL_TREE)
+    return;
+
+  tree ptype = build_pointer_type (TREE_TYPE (var_decl));
+  tree var_addr = build1 (ADDR_EXPR, ptype, var_decl);
+
+  DECL_INITIAL (host_def_var) = var_addr;
+  TREE_PUBLIC (host_def_var) = 0;
+}
+
+/* Adds an indirection pointer for a potential host-defined program scope
+   variable declaration.  */
+
+void
+brig_to_generic::add_host_def_var_ptr (const std::string &name, tree var_decl)
+{
+  std::string var_name = std::string (PHSA_HOST_DEF_PTR_PREFIX) + name;
+
+  tree name_identifier = get_identifier (var_name.c_str ());
+
+  tree ptr_var = build_decl (UNKNOWN_LOCATION, VAR_DECL, name_identifier,
+                            build_pointer_type (TREE_TYPE (var_decl)));
+  DECL_EXTERNAL (ptr_var) = 0;
+  DECL_ARTIFICIAL (ptr_var) = 0;
+
+  TREE_PUBLIC (ptr_var) = 1;
+  TREE_USED (ptr_var) = 1;
+  TREE_ADDRESSABLE (ptr_var) = 1;
+  TREE_STATIC (ptr_var) = 1;
+
+  append_global (ptr_var);
+  m_global_variables[var_name] = ptr_var;
+}
+
+/* Produce a "mangled name" for the given brig function or kernel.
+   The mangling is used to make unique global symbol name in case of
+   module scope functions.  Program scope functions are not mangled
+   (except for dropping the leading &), which makes the functions
+   directly visible for linking using the original function name.  */
+
+std::string
+brig_to_generic::get_mangled_name
+(const BrigDirectiveExecutable *func) const
+{
+  /* Strip the leading &.  */
+  std::string func_name = get_string (func->name).substr (1);
+  if (func->linkage == BRIG_LINKAGE_MODULE)
+    {
+      /* Mangle the module scope function names with the module name and
+        make them public so they can be queried by the HSA runtime from
+        the produced binary.  Assume it's the currently processed function
+        we are always referring to.  */
+      func_name = "gccbrig." + m_module_name + "." + func_name;
+    }
+  return func_name;
+}
+
+std::string
+brig_to_generic::get_string (size_t entry_offset) const
+{
+  const BrigData *data_item = get_brig_data_entry (entry_offset);
+  return std::string ((const char *) &data_item->bytes, data_item->byteCount);
+}
+
+/* Adapted from c-semantics.c.  */
+
+tree
+build_stmt (enum tree_code code, ...)
+{
+  tree ret;
+  int length, i;
+  va_list p;
+  bool side_effects;
+
+  /* This function cannot be used to construct variably-sized nodes.  */
+  gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
+
+  va_start (p, code);
+
+  ret = make_node (code);
+  TREE_TYPE (ret) = void_type_node;
+  length = TREE_CODE_LENGTH (code);
+
+  /* TREE_SIDE_EFFECTS will already be set for statements with
+     implicit side effects.  Here we make sure it is set for other
+     expressions by checking whether the parameters have side
+     effects.  */
+
+  side_effects = false;
+  for (i = 0; i < length; i++)
+    {
+      tree t = va_arg (p, tree);
+      if (t && !TYPE_P (t))
+       side_effects |= TREE_SIDE_EFFECTS (t);
+      TREE_OPERAND (ret, i) = t;
+    }
+
+  TREE_SIDE_EFFECTS (ret) |= side_effects;
+
+  va_end (p);
+  return ret;
+}
+
+/* BRIG regs are untyped, but GENERIC is not.  We need to add implicit casts
+   in case treating the operand with an instruction with a type different
+   than the created reg var type in order to select correct instruction type
+   later on.  This function creates the necessary reinterpret type cast from
+   a source variable to the destination type.  In case no cast is needed to
+   the same type, SOURCE is returned directly.  */
+
+tree
+build_reinterpret_cast (tree destination_type, tree source)
+{
+
+  gcc_assert (source && destination_type && TREE_TYPE (source) != NULL_TREE
+             && destination_type != NULL_TREE);
+
+  tree source_type = TREE_TYPE (source);
+  if (TREE_CODE (source) == CALL_EXPR)
+    {
+      tree func_decl = TREE_OPERAND (TREE_OPERAND (source, 1), 0);
+      source_type = TREE_TYPE (TREE_TYPE (func_decl));
+    }
+
+  if (destination_type == source_type)
+    return source;
+
+  size_t src_size = int_size_in_bytes (source_type);
+  size_t dst_size = int_size_in_bytes (destination_type);
+  if (src_size == dst_size)
+    return build1 (VIEW_CONVERT_EXPR, destination_type, source);
+  else if (src_size < dst_size)
+    {
+      /* The src_size can be smaller at least with f16 scalars which are
+        stored to 32b register variables.  First convert to an equivalent
+        size unsigned type, then extend to an unsigned type of the
+        target width, after which VIEW_CONVERT_EXPR can be used to
+        force to the target type.  */
+      tree unsigned_temp = build1 (VIEW_CONVERT_EXPR,
+                                  get_unsigned_int_type (source_type),
+                                  source);
+      return build1 (VIEW_CONVERT_EXPR, destination_type,
+                    convert (get_unsigned_int_type (destination_type),
+                             unsigned_temp));
+    }
+  else
+    gcc_unreachable ();
+  return NULL_TREE;
+}
+
+/* Returns the finished brig_function for the given generic FUNC_DECL,
+   or NULL, if not found.  */
+
+brig_function *
+brig_to_generic::get_finished_function (tree func_decl)
+{
+  std::string func_name
+    = identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (func_decl)));
+  std::map<std::string, brig_function *>::iterator i
+    = m_finished_functions.find (func_name);
+  if (i != m_finished_functions.end ())
+    return (*i).second;
+  else
+    return NULL;
+}
+
+/* Finalizes the currently handled function.  Should be called before
+   setting a new function.  */
+
+void
+brig_to_generic::finish_function ()
+{
+  if (m_cf == NULL || m_cf->m_func_decl == NULL_TREE)
+    {
+      /* It can be a finished func declaration fingerprint, in that case we
+        don't have m_func_decl.  */
+      m_cf = NULL;
+      return;
+    }
+
+  if (!m_cf->m_is_kernel)
+    {
+      tree bind_expr = m_cf->m_current_bind_expr;
+      tree stmts = BIND_EXPR_BODY (bind_expr);
+      m_cf->finish ();
+      m_cf->emit_metadata (stmts);
+      dump_function (m_dump_file, m_cf);
+      gimplify_function_tree (m_cf->m_func_decl);
+      cgraph_node::finalize_function (m_cf->m_func_decl, true);
+    }
+  else
+    /* Emit the kernel only at the very end so we can analyze the total
+       group and private memory usage.  */
+    m_kernels.push_back (m_cf);
+
+  pop_cfun ();
+
+  m_finished_functions[m_cf->m_name] = m_cf;
+  m_cf = NULL;
+}
+
+/* Initializes a new currently handled function.  */
+
+void
+brig_to_generic::start_function (tree f)
+{
+  if (DECL_STRUCT_FUNCTION (f) == NULL)
+    push_struct_function (f);
+  else
+    push_cfun (DECL_STRUCT_FUNCTION (f));
+
+  m_cf->m_func_decl = f;
+}
+
+/* Appends a new group variable (or an fbarrier) to the current kernel's
+   group segment.  */
+
+void
+brig_to_generic::append_group_variable (const std::string &name, size_t size,
+                                       size_t alignment)
+{
+  size_t align_padding = m_next_group_offset % alignment == 0 ?
+    0 : (alignment - m_next_group_offset % alignment);
+  m_next_group_offset += align_padding;
+  m_group_offsets[name] = m_next_group_offset;
+  m_next_group_offset += size;
+}
+
+size_t
+brig_to_generic::group_variable_segment_offset (const std::string &name) const
+{
+  var_offset_table::const_iterator i = m_group_offsets.find (name);
+  gcc_assert (i != m_group_offsets.end ());
+  return (*i).second;
+}
+
+/* The size of the group and private segments required by the currently
+   processed kernel.  Private segment size must be multiplied by the
+   number of work-items in the launch, in case of a work-group function.  */
+
+size_t
+brig_to_generic::group_segment_size () const
+{
+  return m_next_group_offset;
+}
+
+/* Appends a new group variable to the current kernel's private segment.  */
+
+void
+brig_to_generic::append_private_variable (const std::string &name,
+                                         size_t size, size_t alignment)
+{
+  size_t align_padding = m_next_private_offset % alignment == 0 ?
+    0 : (alignment - m_next_private_offset % alignment);
+  m_next_private_offset += align_padding;
+  m_private_offsets[name] = m_next_private_offset;
+  m_next_private_offset += size;
+  m_private_data_sizes[name] = size + align_padding;
+}
+
+size_t
+brig_to_generic::private_variable_segment_offset
+  (const std::string &name) const
+{
+  var_offset_table::const_iterator i = m_private_offsets.find (name);
+  gcc_assert (i != m_private_offsets.end ());
+  return (*i).second;
+}
+
+bool
+brig_to_generic::has_private_variable (const std::string &name) const
+{
+  std::map<std::string, size_t>::const_iterator i
+    = m_private_data_sizes.find (name);
+  return i != m_private_data_sizes.end ();
+}
+
+bool
+brig_to_generic::has_group_variable (const std::string &name) const
+{
+  var_offset_table::const_iterator i = m_group_offsets.find (name);
+  return i != m_group_offsets.end ();
+}
+
+size_t
+brig_to_generic::private_variable_size (const std::string &name) const
+{
+  std::map<std::string, size_t>::const_iterator i
+    = m_private_data_sizes.find (name);
+  gcc_assert (i != m_private_data_sizes.end ());
+  return (*i).second;
+}
+
+size_t
+brig_to_generic::private_segment_size () const
+{
+  return m_next_private_offset;
+}
+
+/* Cached builtins indexed by name.  */
+
+typedef std::map<std::string, tree> builtin_index;
+builtin_index builtin_cache_;
+
+/* Build a call to a builtin function.  PDECL is the builtin function to
+   call.  NARGS is the number of input arguments, RETTYPE the built-in
+   functions return value type, and ... is the list of arguments passed to
+   the call with type first, then the value.  */
+
+tree
+call_builtin (tree pdecl, int nargs, tree rettype, ...)
+{
+  if (rettype == error_mark_node)
+    return error_mark_node;
+
+  tree *types = new tree[nargs];
+  tree *args = new tree[nargs];
+
+  va_list ap;
+  va_start (ap, rettype);
+  for (int i = 0; i < nargs; ++i)
+    {
+      types[i] = va_arg (ap, tree);
+      tree arg = va_arg (ap, tree);
+      args[i] = build_reinterpret_cast (types[i], arg);
+      if (types[i] == error_mark_node || args[i] == error_mark_node)
+       {
+         delete[] types;
+         delete[] args;
+         return error_mark_node;
+       }
+    }
+  va_end (ap);
+
+  tree fnptr = build_fold_addr_expr (pdecl);
+
+  tree ret = build_call_array (rettype, fnptr, nargs, args);
+
+  delete[] types;
+  delete[] args;
+
+  return ret;
+}
+
+/* Generate all global declarations.  Should be called after the last
+   BRIG has been fed in.  */
+
+void
+brig_to_generic::write_globals ()
+{
+  /* Now that the whole BRIG module has been processed, build a launcher
+     and a metadata section for each built kernel.  */
+  for (size_t i = 0; i < m_kernels.size (); ++i)
+    {
+      brig_function *f = m_kernels[i];
+
+      /* Finish kernels now that we know the call graphs and their barrier
+        usage.  */
+      f->finish_kernel ();
+
+      dump_function (m_dump_file, f);
+      gimplify_function_tree (f->m_func_decl);
+      cgraph_node::finalize_function (f->m_func_decl, true);
+
+      f->m_descriptor.is_kernel = 1;
+      /* TODO: analyze the kernel's actual group and private segment usage
+        using a call graph.  Now the private and group mem sizes are overly
+        pessimistic in case of multiple kernels in the same module.  */
+      f->m_descriptor.group_segment_size = group_segment_size ();
+      f->m_descriptor.private_segment_size = private_segment_size ();
+
+      /* The kernarg size is rounded up to a multiple of 16 according to
+        the PRM specs.  */
+      f->m_descriptor.kernarg_segment_size = f->m_next_kernarg_offset;
+      if (f->m_descriptor.kernarg_segment_size % 16 > 0)
+       f->m_descriptor.kernarg_segment_size
+         += 16 - f->m_next_kernarg_offset % 16;
+      f->m_descriptor.kernarg_max_align = f->m_kernarg_max_align;
+
+      tree launcher = f->emit_launcher_and_metadata ();
+
+      append_global (launcher);
+
+      gimplify_function_tree (launcher);
+      cgraph_node::finalize_function (launcher, true);
+      pop_cfun ();
+    }
+
+  int no_globals = list_length (m_globals);
+  tree *vec = new tree[no_globals];
+
+  int i = 0;
+  tree global = m_globals;
+  while (global)
+    {
+      vec[i] = global;
+      ++i;
+      global = TREE_CHAIN (global);
+    }
+
+  wrapup_global_declarations (vec, no_globals);
+
+  delete[] vec;
+
+  for (size_t i = 0; i < m_brig_blobs.size (); ++i)
+    delete m_brig_blobs[i];
+}
+
+/* Returns an type with unsigned int elements corresponding to the
+   size and element count of ORIGINAL_TYPE.  */
+
+tree
+get_unsigned_int_type (tree original_type)
+{
+  if (VECTOR_TYPE_P (original_type))
+    {
+      size_t esize
+       = int_size_in_bytes (TREE_TYPE (original_type)) * BITS_PER_UNIT;
+      size_t ecount = TYPE_VECTOR_SUBPARTS (original_type);
+      return build_vector_type (build_nonstandard_integer_type (esize, true),
+                               ecount);
+    }
+  else
+    return build_nonstandard_integer_type (int_size_in_bytes (original_type)
+                                          * BITS_PER_UNIT,
+                                          true);
+}
+
+void
+dump_function (FILE *dump_file, brig_function *f)
+{
+  /* Dump the BRIG-specific tree IR.  */
+  if (dump_file)
+    {
+      fprintf (dump_file, "\n;; Function %s", f->m_name.c_str ());
+      fprintf (dump_file, "\n;; enabled by -%s\n\n",
+              dump_flag_name (TDI_original));
+      print_generic_decl (dump_file, f->m_func_decl, 0);
+      print_generic_expr (dump_file, f->m_current_bind_expr, 0);
+      fprintf (dump_file, "\n");
+    }
+}
diff --git a/gcc/brig/brigfrontend/brig-to-generic.h b/gcc/brig/brigfrontend/brig-to-generic.h
new file mode 100644 (file)
index 0000000..8e15589
--- /dev/null
@@ -0,0 +1,225 @@
+/* brig-to-generic.h -- brig to gcc generic conversion
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef BRIG_TO_GENERIC_H
+#define BRIG_TO_GENERIC_H
+
+#include <string>
+#include <map>
+#include <vector>
+
+#include "config.h"
+#include "system.h"
+#include "ansidecl.h"
+#include "coretypes.h"
+#include "opts.h"
+#include "tree.h"
+#include "tree-iterator.h"
+#include "hsa-brig-format.h"
+#include "brig-function.h"
+
+
+struct reg_decl_index_entry;
+
+/* Converts an HSAIL BRIG input to GENERIC.  This class holds global state
+   for the translation process.  Handling of the smaller pieces of BRIG data
+   is delegated to various handler classes declared in
+   brig-code-entry-handlers.h.  */
+
+class brig_to_generic
+{
+public:
+  typedef std::map<const BrigDirectiveVariable *, tree> variable_index;
+
+private:
+  typedef std::map<std::string, size_t> var_offset_table;
+  typedef std::map<const BrigBase *, std::string> name_index;
+
+public:
+  brig_to_generic ();
+
+  void parse (const char *brig_blob);
+
+  void write_globals ();
+
+  std::string get_string (size_t entry_offset) const;
+
+  const BrigData *get_brig_data_entry (size_t entry_offset) const;
+  const BrigBase *get_brig_operand_entry (size_t entry_offset) const;
+  const BrigBase *get_brig_code_entry (size_t entry_offset) const;
+
+  void append_global (tree g);
+
+  tree function_decl (const std::string &name);
+  void add_function_decl (const std::string &name, tree func_decl);
+
+  tree global_variable (const std::string &name) const;
+  void add_global_variable (const std::string &name, tree var_decl);
+  void add_host_def_var_ptr (const std::string &name, tree var_decl);
+
+  void start_function (tree f);
+  void finish_function ();
+
+  void append_group_variable (const std::string &name, size_t size,
+                             size_t alignment);
+
+  void append_private_variable (const std::string &name, size_t size,
+                               size_t alignment);
+
+  size_t group_variable_segment_offset (const std::string &name) const;
+
+  bool
+  has_group_variable (const std::string &name) const;
+
+  size_t
+  private_variable_segment_offset (const std::string &name) const;
+
+  bool
+  has_private_variable (const std::string &name) const;
+
+  size_t private_variable_size (const std::string &name) const;
+
+  template <typename T>
+    std::string
+    get_mangled_name_tmpl (const T *brigVar) const;
+
+  std::string get_mangled_name (const BrigDirectiveFbarrier *fbar) const
+    { return get_mangled_name_tmpl (fbar); }
+  std::string get_mangled_name (const BrigDirectiveVariable *var) const
+    { return get_mangled_name_tmpl (var); }
+  std::string get_mangled_name (const BrigDirectiveExecutable *func) const;
+
+  size_t group_segment_size () const;
+  size_t private_segment_size () const;
+
+  brig_function *get_finished_function (tree func_decl);
+
+  static tree s_fp16_type;
+  static tree s_fp32_type;
+  static tree s_fp64_type;
+
+  /* The default rounding mode that should be used for float instructions.
+     This can be set in each BRIG module header.  */
+  BrigRound8_t m_default_float_rounding_mode;
+
+  /* The currently built function.  */
+  brig_function *m_cf;
+
+  /* The name of the currently handled BRIG module.  */
+  std::string m_module_name;
+
+private:
+  /* The BRIG blob and its different sections of the file currently being
+     parsed.  */
+  const char *m_brig;
+  const char *m_data;
+  size_t m_data_size;
+  const char *m_operand;
+  size_t m_operand_size;
+  const char *m_code;
+  size_t m_code_size;
+
+  tree m_globals;
+
+  label_index m_global_variables;
+
+  /* The size of each private variable, including the alignment padding.  */
+  std::map<std::string, size_t> m_private_data_sizes;
+
+  /* The same for group variables.  */
+  size_t m_next_group_offset;
+  var_offset_table m_group_offsets;
+
+  /* And private.  */
+  size_t m_next_private_offset;
+  var_offset_table m_private_offsets;
+
+  /* Name index for declared functions.  */
+  label_index m_function_index;
+
+  /* Stores all processed kernels in order.  */
+  std::vector<brig_function *> m_kernels;
+
+  /* Stores all already processed functions from the translation unit
+     for some interprocedural analysis.  */
+  std::map<std::string, brig_function *> m_finished_functions;
+
+  /* The parsed BRIG blobs.  Owned and will be deleted after use.  */
+  std::vector<const char *> m_brig_blobs;
+
+  /* The original dump file.  */
+  FILE *m_dump_file;
+
+  /* The original dump file flags.  */
+  int m_dump_flags;
+};
+
+/* Produce a "mangled name" for the given brig variable.  The mangling is used
+   to make unique global symbol names for module and function scope variables.
+   The templated version is suitable for most of the variable types.  Functions
+   and kernels (BrigDirectiveExecutable) are handled with a specialized
+   get_mangled_name() version.  */
+
+template <typename T>
+std::string
+brig_to_generic::get_mangled_name_tmpl (const T *brigVar) const
+{
+  std::string var_name = get_string (brigVar->name).substr (1);
+
+  /* Mangle the variable name using the function name and the module name
+     in case of a function scope variable.  */
+  if (m_cf != NULL
+      && m_cf->has_function_scope_var (&brigVar->base))
+    var_name = m_cf->m_name + "." + var_name;
+
+  if (brigVar->linkage == BRIG_LINKAGE_MODULE)
+    var_name = "gccbrig." + m_module_name + "." + var_name;
+  return var_name;
+}
+
+/* An interface to organize the different types of BRIG element handlers.  */
+
+class brig_entry_handler
+{
+public:
+  brig_entry_handler (brig_to_generic &parent) : m_parent (parent)
+  {
+  }
+
+  /* Handles the brig_code data at the given pointer and adds it to the
+     currently built tree.  Returns the number of consumed bytes;  */
+  virtual size_t operator () (const BrigBase *base) = 0;
+
+protected:
+  brig_to_generic &m_parent;
+};
+
+tree call_builtin (tree pdecl, int nargs, tree rettype, ...);
+
+tree build_reinterpret_cast (tree destination_type, tree source);
+
+tree build_stmt (enum tree_code code, ...);
+
+tree get_unsigned_int_type (tree type);
+
+void dump_function (FILE *dump_file, brig_function *f);
+
+#endif
diff --git a/gcc/brig/brigfrontend/brig-util.cc b/gcc/brig/brigfrontend/brig-util.cc
new file mode 100644 (file)
index 0000000..8b17b59
--- /dev/null
@@ -0,0 +1,447 @@
+/* brig-util.cc -- gccbrig utility functions
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include <sstream>
+
+#include "stdint.h"
+#include "hsa-brig-format.h"
+#include "brig-util.h"
+#include "errors.h"
+#include "diagnostic-core.h"
+
+/* Return true if operand number OPNUM of instruction with OPCODE is an output.
+   False if it is an input.  Some code reused from Martin Jambor's gcc-hsa
+   tree.  */
+
+bool
+gccbrig_hsa_opcode_op_output_p (BrigOpcode16_t opcode, int opnum)
+{
+  switch (opcode)
+    {
+    case BRIG_OPCODE_BR:
+    case BRIG_OPCODE_SBR:
+    case BRIG_OPCODE_CBR:
+    case BRIG_OPCODE_ST:
+    case BRIG_OPCODE_ATOMICNORET:
+    case BRIG_OPCODE_SIGNALNORET:
+    case BRIG_OPCODE_INITFBAR:
+    case BRIG_OPCODE_JOINFBAR:
+    case BRIG_OPCODE_WAITFBAR:
+    case BRIG_OPCODE_ARRIVEFBAR:
+    case BRIG_OPCODE_LEAVEFBAR:
+    case BRIG_OPCODE_RELEASEFBAR:
+    case BRIG_OPCODE_DEBUGTRAP:
+      return false;
+    default:
+      return opnum == 0;
+    }
+}
+
+unsigned
+gccbrig_hsa_type_bit_size (BrigType16_t t)
+{
+
+  unsigned pack_type = t & ~BRIG_TYPE_BASE_MASK;
+
+  if (pack_type == BRIG_TYPE_PACK_32)
+    return 32;
+  else if (pack_type == BRIG_TYPE_PACK_64)
+    return 64;
+  else if (pack_type == BRIG_TYPE_PACK_128)
+    return 128;
+
+  switch (t)
+    {
+    case BRIG_TYPE_NONE:
+      return 0;
+
+    case BRIG_TYPE_B1:
+      return 1;
+
+    case BRIG_TYPE_U8:
+    case BRIG_TYPE_S8:
+    case BRIG_TYPE_B8:
+      return 8;
+
+    case BRIG_TYPE_U16:
+    case BRIG_TYPE_S16:
+    case BRIG_TYPE_B16:
+    case BRIG_TYPE_F16:
+      return 16;
+
+    case BRIG_TYPE_U32:
+    case BRIG_TYPE_S32:
+    case BRIG_TYPE_B32:
+    case BRIG_TYPE_F32:
+    case BRIG_TYPE_U8X4:
+    case BRIG_TYPE_U16X2:
+    case BRIG_TYPE_S8X4:
+    case BRIG_TYPE_S16X2:
+    case BRIG_TYPE_F16X2:
+    case BRIG_TYPE_SIG32:
+      return 32;
+
+    case BRIG_TYPE_U64:
+    case BRIG_TYPE_S64:
+    case BRIG_TYPE_F64:
+    case BRIG_TYPE_B64:
+    case BRIG_TYPE_U8X8:
+    case BRIG_TYPE_U16X4:
+    case BRIG_TYPE_U32X2:
+    case BRIG_TYPE_S8X8:
+    case BRIG_TYPE_S16X4:
+    case BRIG_TYPE_S32X2:
+    case BRIG_TYPE_F16X4:
+    case BRIG_TYPE_F32X2:
+    case BRIG_TYPE_SIG64:
+      return 64;
+
+    case BRIG_TYPE_B128:
+    case BRIG_TYPE_U8X16:
+    case BRIG_TYPE_U16X8:
+    case BRIG_TYPE_U32X4:
+    case BRIG_TYPE_U64X2:
+    case BRIG_TYPE_S8X16:
+    case BRIG_TYPE_S16X8:
+    case BRIG_TYPE_S32X4:
+    case BRIG_TYPE_S64X2:
+    case BRIG_TYPE_F16X8:
+    case BRIG_TYPE_F32X4:
+    case BRIG_TYPE_F64X2:
+      return 128;
+
+    default:
+      printf ("HMM %d %x\n", t, t);
+      gcc_unreachable ();
+    }
+}
+
+/* gcc-hsa borrowed code ENDS.  */
+
+uint64_t
+gccbrig_to_uint64_t (const BrigUInt64 &brig_type)
+{
+  return (uint64_t (brig_type.hi) << 32) | uint64_t (brig_type.lo);
+}
+
+int
+gccbrig_reg_size (const BrigOperandRegister *brig_reg)
+{
+  switch (brig_reg->regKind)
+    {
+    case BRIG_REGISTER_KIND_CONTROL:
+      return 1;
+    case BRIG_REGISTER_KIND_SINGLE:
+      return 32;
+    case BRIG_REGISTER_KIND_DOUBLE:
+      return 64;
+    case BRIG_REGISTER_KIND_QUAD:
+      return 128;
+    default:
+      gcc_unreachable ();
+      break;
+    }
+}
+
+std::string
+gccbrig_reg_name (const BrigOperandRegister *reg)
+{
+  std::ostringstream strstr;
+  switch (reg->regKind)
+    {
+    case BRIG_REGISTER_KIND_CONTROL:
+      strstr << 'c';
+      break;
+    case BRIG_REGISTER_KIND_SINGLE:
+      strstr << 's';
+      break;
+    case BRIG_REGISTER_KIND_DOUBLE:
+      strstr << 'd';
+      break;
+    case BRIG_REGISTER_KIND_QUAD:
+      strstr << 'q';
+      break;
+    default:
+      gcc_unreachable ();
+      return "";
+    }
+  strstr << reg->regNum;
+  return strstr.str ();
+}
+
+std::string
+gccbrig_type_name (BrigType16_t type)
+{
+  switch (type)
+    {
+    case BRIG_TYPE_U8:
+      return "u8";
+    case BRIG_TYPE_U16:
+      return "u16";
+    case BRIG_TYPE_U32:
+      return "u32";
+    case BRIG_TYPE_U64:
+      return "u64";
+    case BRIG_TYPE_S8:
+      return "s8";
+    case BRIG_TYPE_S16:
+      return "s16";
+    case BRIG_TYPE_S32:
+      return "s32";
+    case BRIG_TYPE_S64:
+      return "s64";
+    default:
+      gcc_unreachable ();
+      break;
+    }
+}
+
+std::string
+gccbrig_segment_name (BrigSegment8_t segment)
+{
+  if (segment == BRIG_SEGMENT_GLOBAL)
+    return "global";
+  else if (segment == BRIG_SEGMENT_GROUP)
+    return "group";
+  else if (segment == BRIG_SEGMENT_PRIVATE)
+    return "private";
+  else
+    gcc_unreachable ();
+}
+
+bool
+gccbrig_is_float_type (BrigType16_t type)
+{
+  return (type == BRIG_TYPE_F32 || type == BRIG_TYPE_F64
+         || type == BRIG_TYPE_F16);
+}
+
+BrigType16_t
+gccbrig_tree_type_to_hsa_type (tree tree_type)
+{
+  if (INTEGRAL_TYPE_P (tree_type))
+    {
+      if (TYPE_UNSIGNED (tree_type))
+       {
+         switch (int_size_in_bytes (tree_type))
+           {
+           case 1:
+             return BRIG_TYPE_U8;
+           case 2:
+             return BRIG_TYPE_U16;
+           case 4:
+             return BRIG_TYPE_U32;
+           case 8:
+             return BRIG_TYPE_U64;
+           default:
+             break;
+           }
+       }
+      else
+       {
+         switch (int_size_in_bytes (tree_type))
+           {
+           case 1:
+             return BRIG_TYPE_S8;
+           case 2:
+             return BRIG_TYPE_S16;
+           case 4:
+             return BRIG_TYPE_S32;
+           case 8:
+             return BRIG_TYPE_S64;
+           default:
+             break;
+           }
+       }
+    }
+  else if (VECTOR_TYPE_P (tree_type))
+    {
+      tree element_type = TREE_TYPE (tree_type);
+      size_t element_size = int_size_in_bytes (element_type) * 8;
+      BrigType16_t brig_element_type;
+      switch (element_size)
+       {
+       case 8:
+         brig_element_type
+           = TYPE_UNSIGNED (element_type) ? BRIG_TYPE_U8 : BRIG_TYPE_S8;
+         break;
+       case 16:
+         brig_element_type
+           = TYPE_UNSIGNED (element_type) ? BRIG_TYPE_U16 : BRIG_TYPE_S16;
+         break;
+       case 32:
+         brig_element_type
+           = TYPE_UNSIGNED (element_type) ? BRIG_TYPE_U32 : BRIG_TYPE_S32;
+         break;
+       case 64:
+         brig_element_type
+           = TYPE_UNSIGNED (element_type) ? BRIG_TYPE_U64 : BRIG_TYPE_S64;
+         break;
+       default:
+         gcc_unreachable ();
+       }
+
+      BrigType16_t pack_type;
+      switch (int_size_in_bytes (tree_type) * 8)
+       {
+       case 32:
+         pack_type = BRIG_TYPE_PACK_32;
+         break;
+       case 64:
+         pack_type = BRIG_TYPE_PACK_64;
+         break;
+       case 128:
+         pack_type = BRIG_TYPE_PACK_128;
+         break;
+       default:
+         gcc_unreachable ();
+       }
+      return brig_element_type | pack_type;
+    }
+  gcc_unreachable ();
+}
+
+/* Returns true in case the operation is a "bit level" operation,
+   that is, not having operand type depending semantical differences.  */
+
+bool
+gccbrig_is_bit_operation (BrigOpcode16_t opcode)
+{
+  return opcode == BRIG_OPCODE_CMOV || opcode == BRIG_OPCODE_SHUFFLE
+        || opcode == BRIG_OPCODE_UNPACK || opcode == BRIG_OPCODE_UNPACKLO
+        || opcode == BRIG_OPCODE_UNPACKHI || opcode == BRIG_OPCODE_ST
+        || opcode == BRIG_OPCODE_PACK;
+}
+
+/* The program scope definition can be left external within the
+   kernel binary which means it must be defined by the host via
+   HSA runtime.  For these we have special treatment:
+   Create additional pointer indirection when accessing the variable
+   value from kernel code through a generated pointer
+   __gccbrig_ptr_variable_name.  The pointer value then can be set either
+   within the kernel binary (in case of a later linked in definition)
+   or from the host.  */
+
+bool
+gccbrig_might_be_host_defined_var_p (const BrigDirectiveVariable *brigVar)
+{
+  bool is_definition = brigVar->modifier & BRIG_VARIABLE_DEFINITION;
+  return (brigVar->segment == BRIG_SEGMENT_GLOBAL
+         || brigVar->segment == BRIG_SEGMENT_READONLY) && !is_definition
+    && brigVar->linkage == BRIG_LINKAGE_PROGRAM
+    && (brigVar->allocation == BRIG_ALLOCATION_PROGRAM
+       || brigVar->allocation == BRIG_ALLOCATION_AGENT);
+}
+
+/* Produce a GENERIC type for the given HSA/BRIG type.  Returns the element
+   type in case of vector instructions.  */
+
+tree
+gccbrig_tree_type_for_hsa_type (BrigType16_t brig_type)
+{
+  tree tree_type = NULL_TREE;
+
+  if (hsa_type_packed_p (brig_type))
+    {
+      /* The element type is encoded in the bottom 5 bits.  */
+      BrigType16_t inner_brig_type = brig_type & BRIG_TYPE_BASE_MASK;
+
+      unsigned full_size = gccbrig_hsa_type_bit_size (brig_type);
+
+      if (inner_brig_type == BRIG_TYPE_F16)
+       return build_vector_type (gccbrig_tree_type_for_hsa_type (BRIG_TYPE_U16),
+                                 full_size / 16);
+
+      tree inner_type = gccbrig_tree_type_for_hsa_type (inner_brig_type);
+
+      unsigned inner_size = gccbrig_hsa_type_bit_size (inner_brig_type);
+      unsigned nunits = full_size / inner_size;
+      tree_type = build_vector_type (inner_type, nunits);
+    }
+  else
+    {
+      switch (brig_type)
+       {
+       case BRIG_TYPE_NONE:
+         tree_type = void_type_node;
+         break;
+       case BRIG_TYPE_B1:
+         tree_type = boolean_type_node;
+         break;
+       case BRIG_TYPE_S8:
+       case BRIG_TYPE_S16:
+       case BRIG_TYPE_S32:
+       case BRIG_TYPE_S64:
+         /* Ensure a fixed width integer.  */
+         tree_type
+           = build_nonstandard_integer_type
+           (gccbrig_hsa_type_bit_size (brig_type), false);
+         break;
+       case BRIG_TYPE_U8:
+         return unsigned_char_type_node;
+       case BRIG_TYPE_U16:
+       case BRIG_TYPE_U32:
+       case BRIG_TYPE_U64:
+       case BRIG_TYPE_B8: /* Handle bit vectors as unsigned ints.  */
+       case BRIG_TYPE_B16:
+       case BRIG_TYPE_B32:
+       case BRIG_TYPE_B64:
+       case BRIG_TYPE_B128:
+       case BRIG_TYPE_SIG32: /* Handle signals as integers for now.  */
+       case BRIG_TYPE_SIG64:
+         tree_type = build_nonstandard_integer_type
+           (gccbrig_hsa_type_bit_size (brig_type), true);
+         break;
+       case BRIG_TYPE_F16:
+         tree_type = uint16_type_node;
+         break;
+       case BRIG_TYPE_F32:
+         /* TODO: make sure that the alignment of the float are at least as
+            strict than mandated by HSA, and conform to IEEE (like mandated
+            by HSA).  */
+         tree_type = float_type_node;
+         break;
+       case BRIG_TYPE_F64:
+         tree_type = double_type_node;
+         break;
+       case BRIG_TYPE_SAMP:
+       case BRIG_TYPE_ROIMG:
+       case BRIG_TYPE_WOIMG:
+       case BRIG_TYPE_RWIMG:
+         {
+           /* Handle images and samplers as target-specific blobs of data
+              that should be allocated earlier on from the runtime side.
+              Create a void* that should be initialized to point to the blobs
+              by the kernel launcher.  Images and samplers are accessed
+              via builtins that take void* as the reference.  TODO: who and
+              how these arrays should be initialized?  */
+           tree void_ptr = build_pointer_type (void_type_node);
+           return void_ptr;
+         }
+       default:
+         gcc_unreachable ();
+         break;
+       }
+    }
+
+  /* Drop const qualifiers.  */
+  return tree_type;
+}
diff --git a/gcc/brig/brigfrontend/brig-util.h b/gcc/brig/brigfrontend/brig-util.h
new file mode 100644 (file)
index 0000000..3786616
--- /dev/null
@@ -0,0 +1,53 @@
+/* brig-util.h -- gccbrig utility functions
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_BRIG_UTIL_H
+#define GCC_BRIG_UTIL_H
+
+#include "brig-to-generic.h"
+
+bool gccbrig_hsa_opcode_op_output_p (BrigOpcode16_t opcode, int opnum);
+
+unsigned gccbrig_hsa_type_bit_size (BrigType16_t t);
+
+uint64_t gccbrig_to_uint64_t (const BrigUInt64 &brig_type);
+
+int gccbrig_reg_size (const BrigOperandRegister *brig_reg);
+
+std::string gccbrig_reg_name (const BrigOperandRegister *reg);
+
+std::string gccbrig_type_name (BrigType16_t type);
+
+std::string gccbrig_segment_name (BrigSegment8_t segment);
+
+bool gccbrig_is_float_type (BrigType16_t type);
+
+bool gccbrig_is_bit_operation (BrigOpcode16_t opcode);
+
+BrigType16_t gccbrig_tree_type_to_hsa_type (tree tree_type);
+tree gccbrig_tree_type_for_hsa_type (BrigType16_t brig_type);
+
+bool gccbrig_might_be_host_defined_var_p (const BrigDirectiveVariable *brigVar);
+
+/* From hsa.h.  */
+bool hsa_type_packed_p (BrigType16_t type);
+
+#endif
diff --git a/gcc/brig/brigfrontend/brig-variable-handler.cc b/gcc/brig/brigfrontend/brig-variable-handler.cc
new file mode 100644 (file)
index 0000000..b4a8d67
--- /dev/null
@@ -0,0 +1,264 @@
+/* brig-variable-handler.cc -- brig variable directive handling
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   This file is part of GCC.
+
+   GCC 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 3, or (at your option) any later
+   version.
+
+   GCC 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 GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "brig-code-entry-handler.h"
+
+#include "stringpool.h"
+#include "errors.h"
+#include "brig-machine.h"
+#include "brig-util.h"
+#include "print-tree.h"
+#include "diagnostic-core.h"
+
+tree
+brig_directive_variable_handler::build_variable
+  (const BrigDirectiveVariable *brigVar, tree_code var_decltype)
+{
+  std::string var_name = m_parent.get_mangled_name (brigVar);
+
+  bool is_definition = brigVar->modifier & BRIG_VARIABLE_DEFINITION;
+
+  tree name_identifier = get_identifier (var_name.c_str ());
+
+  tree var_decl;
+  tree t;
+  if (brigVar->type & BRIG_TYPE_ARRAY)
+    {
+      tree element_type
+       = gccbrig_tree_type_for_hsa_type (brigVar->type & ~BRIG_TYPE_ARRAY);
+      uint64_t element_count = gccbrig_to_uint64_t (brigVar->dim);
+      if (is_definition && element_count == 0)
+       fatal_error (UNKNOWN_LOCATION, "Array definition with zero elements.");
+      if (var_decltype == PARM_DECL)
+       t = build_pointer_type (element_type);
+      else
+       t = build_array_type_nelts (element_type, element_count);
+    }
+  else
+    {
+      t = gccbrig_tree_type_for_hsa_type (brigVar->type);
+    }
+
+  size_t alignment = get_brig_var_alignment (brigVar);
+
+  if (brigVar->segment == BRIG_SEGMENT_READONLY
+      || brigVar->segment == BRIG_SEGMENT_KERNARG
+      || (brigVar->modifier & BRIG_VARIABLE_CONST))
+    TYPE_READONLY (t) = 1;
+
+  TYPE_ADDR_SPACE (t) = gccbrig_get_target_addr_space_id (brigVar->segment);
+
+  var_decl = build_decl (UNKNOWN_LOCATION, var_decltype, name_identifier, t);
+
+  SET_DECL_ALIGN (var_decl, alignment * BITS_PER_UNIT);
+
+  /* Force the HSA alignments.  */
+  DECL_USER_ALIGN (var_decl) = 1;
+
+  TREE_USED (var_decl) = 1;
+
+  TREE_PUBLIC (var_decl) = 1;
+  if (is_definition)
+    DECL_EXTERNAL (var_decl) = 0;
+  else
+    DECL_EXTERNAL (var_decl) = 1; /* The definition is elsewhere.  */
+
+  if (brigVar->init != 0)
+    {
+      gcc_assert (brigVar->segment == BRIG_SEGMENT_READONLY
+                 || brigVar->segment == BRIG_SEGMENT_GLOBAL);
+
+      const BrigBase *cst_operand_data
+       = m_parent.get_brig_operand_entry (brigVar->init);
+
+      tree initializer = NULL_TREE;
+      if (cst_operand_data->kind == BRIG_KIND_OPERAND_CONSTANT_BYTES)
+       initializer = get_tree_cst_for_hsa_operand
+         ((const BrigOperandConstantBytes *) cst_operand_data, t);
+      else
+       error ("variable initializers of type %x not implemented",
+              cst_operand_data->kind);
+      gcc_assert (initializer != NULL_TREE);
+      DECL_INITIAL (var_decl) = initializer;
+    }
+
+  if (var_decltype == PARM_DECL)
+    {
+      DECL_ARG_TYPE (var_decl) = TREE_TYPE (var_decl);
+      DECL_EXTERNAL (var_decl) = 0;
+      TREE_PUBLIC (var_decl) = 0;
+    }
+
+  TREE_ADDRESSABLE (var_decl) = 1;
+
+  TREE_USED (var_decl) = 1;
+  DECL_NONLOCAL (var_decl) = 1;
+  DECL_ARTIFICIAL (var_decl) = 0;
+
+  return var_decl;
+}
+
+size_t
+brig_directive_variable_handler::operator () (const BrigBase *base)
+{
+  const BrigDirectiveVariable *brigVar = (const BrigDirectiveVariable *) base;
+
+  bool is_definition = brigVar->modifier & BRIG_VARIABLE_DEFINITION;
+
+  size_t var_size;
+  tree var_type;
+  if (brigVar->type & BRIG_TYPE_ARRAY)
+    {
+      tree element_type
+       = gccbrig_tree_type_for_hsa_type (brigVar->type & ~BRIG_TYPE_ARRAY);
+      uint64_t element_count = gccbrig_to_uint64_t (brigVar->dim);
+      if (is_definition && element_count == 0)
+       fatal_error (UNKNOWN_LOCATION, "Array definition with zero elements.");
+      var_type = build_array_type_nelts (element_type, element_count);
+      size_t element_size = tree_to_uhwi (TYPE_SIZE (element_type));
+      var_size = element_size * element_count / 8;
+    }
+  else
+    {
+      var_type = gccbrig_tree_type_for_hsa_type (brigVar->type);
+      var_size = tree_to_uhwi (TYPE_SIZE (var_type)) / 8;
+    }
+
+  size_t alignment = get_brig_var_alignment (brigVar);
+
+  if (m_parent.m_cf != NULL)
+    m_parent.m_cf->m_function_scope_vars.insert (base);
+
+  std::string var_name = m_parent.get_mangled_name (brigVar);
+  if (brigVar->segment == BRIG_SEGMENT_KERNARG)
+    {
+      /* Do not create a real variable, but only a table of
+        offsets to the kernarg segment buffer passed as the
+        single argument by the kernel launcher for later
+        reference.  Ignore kernel declarations.  */
+      if (m_parent.m_cf != NULL && m_parent.m_cf->m_func_decl != NULL_TREE)
+       m_parent.m_cf->append_kernel_arg (brigVar, var_size, alignment);
+      return base->byteCount;
+    }
+  else if (brigVar->segment == BRIG_SEGMENT_GROUP)
+    {
+      /* Handle group region variables similarly as kernargs:
+        assign offsets to the group region on the fly when
+        a new module scope or function scope group variable is
+        introduced.  These offsets will be then added to the
+        group_base hidden pointer passed to the kernel in order to
+        get the flat address.  */
+      if (!m_parent.has_group_variable (var_name))
+       m_parent.append_group_variable (var_name, var_size, alignment);
+      return base->byteCount;
+    }
+  else if (brigVar->segment == BRIG_SEGMENT_PRIVATE
+          || brigVar->segment == BRIG_SEGMENT_SPILL)
+    {
+      /* Private variables are handled like group variables,
+        except that their offsets are multiplied by the work-item
+        flat id, when accessed.  */
+      if (!m_parent.has_private_variable (var_name))
+       m_parent.append_private_variable (var_name, var_size, alignment);
+      return base->byteCount;
+    }
+  else if (brigVar->segment == BRIG_SEGMENT_GLOBAL
+          || brigVar->segment == BRIG_SEGMENT_READONLY)
+    {
+      tree def = is_definition ? NULL_TREE :
+       m_parent.global_variable (var_name);
+
+      if (!is_definition && def != NULL_TREE)
+       {
+         /* We have a definition already for this declaration.
+            Use the definition instead of the declaration.  */
+       }
+      else if (gccbrig_might_be_host_defined_var_p (brigVar))
+       {
+         tree var_decl = build_variable (brigVar);
+         m_parent.add_host_def_var_ptr (var_name, var_decl);
+       }
+      else
+       {
+         tree var_decl = build_variable (brigVar);
+         /* Make all global variables program scope for now
+            so we can get their address from the Runtime API.  */
+         DECL_CONTEXT (var_decl) = NULL_TREE;
+         TREE_STATIC (var_decl) = 1;
+         m_parent.add_global_variable (var_name, var_decl);
+       }
+    }
+  else if (brigVar->segment == BRIG_SEGMENT_ARG)
+    {
+
+      if (m_parent.m_cf->m_generating_arg_block)
+       {
+         tree var_decl = build_variable (brigVar);
+         tree bind_expr = m_parent.m_cf->m_current_bind_expr;
+
+         DECL_CONTEXT (var_decl) = m_parent.m_cf->m_func_decl;
+         DECL_CHAIN (var_decl) = BIND_EXPR_VARS (bind_expr);
+         BIND_EXPR_VARS (bind_expr) = var_decl;
+         TREE_PUBLIC (var_decl) = 0;
+
+         m_parent.m_cf->add_arg_variable (brigVar, var_decl);
+       }
+      else
+       {
+         /* Must be an incoming function argument which has
+            been parsed in brig-function-handler.cc.  No
+            need to generate anything here.  */
+       }
+    }
+  else
+    gcc_unreachable ();
+
+  return base->byteCount;
+}
+
+/* Returns the alignment for the given BRIG variable.  In case the variable
+   explicitly defines alignment and its larger than the natural alignment,
+   returns it instead of the natural one.  */
+
+size_t
+brig_directive_variable_handler::get_brig_var_alignment
+(const BrigDirectiveVariable *brigVar)
+{
+
+  size_t defined_alignment
+    = brigVar->align == BRIG_ALIGNMENT_NONE ? 0 : 1 << (brigVar->align - 1);
+  size_t natural_alignment;
+  if (brigVar->type & BRIG_TYPE_ARRAY)
+    {
+      tree element_type
+       = gccbrig_tree_type_for_hsa_type (brigVar->type & ~BRIG_TYPE_ARRAY);
+      size_t element_size = tree_to_uhwi (TYPE_SIZE (element_type));
+      natural_alignment = element_size / BITS_PER_UNIT;
+    }
+  else
+    {
+      tree t = gccbrig_tree_type_for_hsa_type (brigVar->type);
+      natural_alignment = tree_to_uhwi (TYPE_SIZE (t)) / BITS_PER_UNIT;
+    }
+
+  return natural_alignment > defined_alignment
+    ? natural_alignment : defined_alignment;
+}
diff --git a/gcc/brig/brigfrontend/phsa.h b/gcc/brig/brigfrontend/phsa.h
new file mode 100644 (file)
index 0000000..00e0a7c
--- /dev/null
@@ -0,0 +1,69 @@
+/* phsa.h -- interfacing between the gcc BRIG FE and the phsa runtime
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef PHSA_H
+#define PHSA_H
+
+#include <stdint.h>
+
+/* This struct is used to pass information from the BRIG FE to the
+   runtime of the finalizer kernel, its control directives etc.
+   The data is passed raw in a special ELF section named
+   phsa.kerneldesc.kernel_function_name.  */
+
+typedef struct __attribute__((__packed__))
+{
+  /* Set to 1 in case the function is a kernel.  */
+  uint8_t is_kernel;
+  /* The size of the group segment used by the kernel.  */
+  uint32_t group_segment_size;
+  /* Size of the private segment used by a single work-item.  */
+  uint32_t private_segment_size;
+  /* Total size of the kernel arguments.  */
+  uint32_t kernarg_segment_size;
+  /* Maximum alignment of a kernel argument variable.  */
+  uint16_t kernarg_max_align;
+  /* Maximum size (in bytes) of dynamic group memory.  */
+  uint32_t max_dynamic_group_size;
+  /* Max number of work-items used to launch the kernel.  */
+  uint64_t max_flat_grid_size;
+  /* Max number of work-items in a work-group used to launch the kernel.  */
+  uint32_t max_flat_workgroup_size;
+  /* The grid size required by the kernel.  */
+  uint64_t required_grid_size[3];
+  /* The work group size required by the kernel.  */
+  uint32_t required_workgroup_size[3];
+  /* The number of dimensions required by the kernel.  */
+  uint8_t required_dim;
+
+} phsa_descriptor;
+
+/* The prefix to use in the ELF section containing descriptor for
+   a function.  */
+#define PHSA_DESC_SECTION_PREFIX "phsa.desc."
+#define PHSA_HOST_DEF_PTR_PREFIX "__phsa.host_def."
+
+/* The frontend error messages are parsed by the host runtime, known
+   prefix strings are used to separate the different runtime error
+   codes.  */
+#define PHSA_ERROR_PREFIX_INCOMPATIBLE_MODULE "Incompatible module:"
+
+#endif
diff --git a/gcc/brig/brigspec.c b/gcc/brig/brigspec.c
new file mode 100644 (file)
index 0000000..42b7d53
--- /dev/null
@@ -0,0 +1,135 @@
+/* brigspec.c -- Specific flags and argument handling of the gcc BRIG front end.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "gcc.h"
+#include "opts.h"
+
+/* This bit is set if we saw a `-xfoo' language specification.  */
+#define LANGSPEC (1 << 1)
+/* This bit is set if they did `-lm' or `-lmath'.  */
+#define MATHLIB (1 << 2)
+/* This bit is set if they did `-lpthread'.  */
+#define THREADLIB (1 << 3)
+/* This bit is set if they did `-lc'.  */
+#define WITHLIBC (1 << 4)
+/* Skip this option.  */
+#define SKIPOPT (1 << 5)
+
+#ifndef MATH_LIBRARY
+#define MATH_LIBRARY "m"
+#endif
+#ifndef MATH_LIBRARY_PROFILE
+#define MATH_LIBRARY_PROFILE MATH_LIBRARY
+#endif
+
+#define LIBHSAIL "hsail-rt"
+
+void
+lang_specific_driver (struct cl_decoded_option **in_decoded_options,
+                     unsigned int *in_decoded_options_count,
+                     int *in_added_libraries)
+{
+  unsigned int i, j;
+
+  /* The new argument list will be contained in this.  */
+  struct cl_decoded_option *new_decoded_options;
+
+  /* An array used to flag each argument that needs a bit set for
+     LANGSPEC, MATHLIB, or WITHLIBC.  */
+  int *args;
+
+  /* By default, we throw on the math library if we have one.  */
+  int need_math = (MATH_LIBRARY[0] != '\0');
+
+  /* True if we should add -shared-libgcc to the command-line.  */
+  int shared_libgcc = 1;
+
+  /* The total number of arguments with the new stuff.  */
+  unsigned int argc;
+
+  /* The argument list.  */
+  struct cl_decoded_option *decoded_options;
+
+  /* The number of libraries added in.  */
+  int added_libraries;
+
+  /* The total number of arguments with the new stuff.  */
+  int num_args = 1;
+
+  argc = *in_decoded_options_count;
+  decoded_options = *in_decoded_options;
+  added_libraries = *in_added_libraries;
+
+  args = XCNEWVEC (int, argc);
+
+  for (i = 1; i < argc; i++)
+    {
+      switch (decoded_options[i].opt_index)
+       {
+       case OPT_o:
+         break;
+
+       case OPT_SPECIAL_input_file:
+         break;
+       }
+    }
+
+  /* Make sure to have room for the trailing NULL argument.  */
+  num_args = argc + need_math + shared_libgcc + 10;
+  new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
+
+  i = 0;
+  j = 0;
+
+  /* Copy the 0th argument, i.e., the name of the program itself.  */
+  new_decoded_options[j++] = decoded_options[i++];
+
+  /* NOTE: We start at 1 now, not 0.  */
+  while (i < argc)
+    {
+      new_decoded_options[j] = decoded_options[i];
+
+      if ((args[i] & SKIPOPT) != 0)
+       --j;
+
+      i++;
+      j++;
+    }
+
+  generate_option (OPT_l, LIBHSAIL, 1, CL_DRIVER, &new_decoded_options[j]);
+  j++;
+
+  *in_decoded_options_count = j;
+  *in_decoded_options = new_decoded_options;
+  *in_added_libraries = added_libraries;
+}
+
+/* Called before linking.  Returns 0 on success and -1 on failure.  */
+
+int lang_specific_pre_link (void) /* Not used for Brig.  */ { return 0; }
+
+/* Number of extra output files that lang_specific_pre_link may generate.  */
+
+int lang_specific_extra_outfiles = 0; /* Not used for Brig.  */
diff --git a/gcc/brig/config-lang.in b/gcc/brig/config-lang.in
new file mode 100644 (file)
index 0000000..6d07cae
--- /dev/null
@@ -0,0 +1,41 @@
+# config-lang.in -- Top level configure fragment for gcc BRIG (HSAIL) frontend.
+
+# Copyright (C) 2015 Free Software Foundation, Inc.
+
+# This file is part of GCC.
+
+# GCC 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 3, or (at your option)
+# any later version.
+
+# GCC 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Configure looks for the existence of this file to auto-config each language.
+# We define several parameters used by configure:
+#
+# language     - name of language as it would appear in $(LANGUAGES)
+# compilers    - value to add to $(COMPILERS)
+
+language="brig"
+
+compilers="brig1\$(exeext)"
+
+target_libs="target-libbrig target-libhsail-rt"
+
+# The BRIG frontend is written in C++, so we need to build the C++
+# compiler during stage 1.  Note: when cross-compiling / not bootstrapping,
+# this can be safely removed. gcc 4.9.1 force enables c++/libstdc++ to the
+# target compiler due to this.
+lang_requires_boot_languages=c++
+
+gtfiles="\$(srcdir)/brig/brig-lang.c \$(srcdir)/brig/brig-c.h"
+
+build_by_default="no"
diff --git a/gcc/brig/lang-specs.h b/gcc/brig/lang-specs.h
new file mode 100644 (file)
index 0000000..c5b9f5e
--- /dev/null
@@ -0,0 +1,28 @@
+/* lang-specs.h -- gcc driver specs for BRIG (HSAIL) frontend.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option) any later
+version.
+
+GCC 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 GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+/* This is the contribution to the `default_compilers' array in gcc.c
+   for the BRIG (HSAIL) input.  */
+
+{".brig", "@brig", 0, 1, 0},
+  {"@brig",
+   "brig1 %i %(cc1_options) %{I*} %{L*} %D %{!fsyntax-only:%(invoke_as)}", 0, 1,
+   0},
diff --git a/gcc/brig/lang.opt b/gcc/brig/lang.opt
new file mode 100644 (file)
index 0000000..0ba70ae
--- /dev/null
@@ -0,0 +1,41 @@
+; lang.opt -- Options for the gcc BRIG (HSAIL) front end.
+
+; Copyright (C) 2015 Free Software Foundation, Inc.
+;
+; This file is part of GCC.
+;
+; GCC 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 3, or (at your option) any later
+; version.
+;
+; GCC 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 GCC; see the file COPYING3.  If not see
+; <http://www.gnu.org/licenses/>.
+
+; See the GCC internals manual for a description of this file's format.
+
+; Please try to keep this file in ASCII collating order.
+
+Language
+BRIG
+
+-dump
+BRIG Separate Alias(d)
+
+-dump=
+BRIG Joined Alias(d)
+
+L
+BRIG Joined Separate
+; Not documented
+
+-output=
+BRIG Driver Joined Alias(o) MissingArgError(missing filename after %qs)
+
+; This comment is to ensure we retain the blank line above.
index 91745b4a82a52e997f76ab3936e7837061cfb755..ee6d0522aa7ded38fb7c74fd79c76e0f686ce19f 100644 (file)
@@ -67,7 +67,10 @@ DEF_PRIMITIVE_TYPE (BT_LONGLONG, long_long_integer_type_node)
 DEF_PRIMITIVE_TYPE (BT_ULONGLONG, long_long_unsigned_type_node)
 DEF_PRIMITIVE_TYPE (BT_INTMAX, intmax_type_node)
 DEF_PRIMITIVE_TYPE (BT_UINTMAX, uintmax_type_node)
-DEF_PRIMITIVE_TYPE (BT_UINT16, uint16_type_node)
+DEF_PRIMITIVE_TYPE (BT_INT8, signed_char_type_node)
+DEF_PRIMITIVE_TYPE (BT_INT16, short_integer_type_node)
+DEF_PRIMITIVE_TYPE (BT_UINT8, char_type_node)
+DEF_PRIMITIVE_TYPE (BT_UINT16, short_unsigned_type_node)
 DEF_PRIMITIVE_TYPE (BT_UINT32, uint32_type_node)
 DEF_PRIMITIVE_TYPE (BT_UINT64, uint64_type_node)
 DEF_PRIMITIVE_TYPE (BT_WORD, (*lang_hooks.types.type_for_mode) (word_mode, 1))
@@ -167,6 +170,7 @@ DEF_FUNCTION_TYPE_0 (BT_FN_CONST_STRING, BT_CONST_STRING)
 DEF_FUNCTION_TYPE_0 (BT_FN_PID, BT_PID)
 DEF_FUNCTION_TYPE_0 (BT_FN_INT, BT_INT)
 DEF_FUNCTION_TYPE_0 (BT_FN_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_0 (BT_FN_ULONG, BT_ULONG)
 DEF_FUNCTION_TYPE_0 (BT_FN_FLOAT, BT_FLOAT)
 DEF_FUNCTION_TYPE_0 (BT_FN_DOUBLE, BT_DOUBLE)
 /* For "long double" we use LONGDOUBLE (not LONG_DOUBLE) to
@@ -271,16 +275,29 @@ DEF_FUNCTION_TYPE_1 (BT_FN_VOID_VPTR, BT_VOID, BT_VOLATILE_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_VOID_PTRPTR, BT_VOID, BT_PTR_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_VOID_CONST_PTR, BT_VOID, BT_CONST_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_UINT_UINT, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT_INT, BT_UINT, BT_INT)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT_ULONG, BT_UINT, BT_ULONG)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT_LONG, BT_UINT, BT_LONG)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT_PTR, BT_UINT, BT_PTR)
+DEF_FUNCTION_TYPE_1 (BT_FN_ULONG_PTR, BT_ULONG, BT_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_ULONG_ULONG, BT_ULONG, BT_ULONG)
 DEF_FUNCTION_TYPE_1 (BT_FN_ULONGLONG_ULONGLONG, BT_ULONGLONG, BT_ULONGLONG)
+DEF_FUNCTION_TYPE_1 (BT_FN_INT8_FLOAT, BT_INT8, BT_FLOAT)
+DEF_FUNCTION_TYPE_1 (BT_FN_INT16_FLOAT, BT_INT16, BT_FLOAT)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT32_FLOAT, BT_UINT32, BT_FLOAT)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT16_FLOAT, BT_UINT16, BT_FLOAT)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT8_FLOAT, BT_UINT8, BT_FLOAT)
 DEF_FUNCTION_TYPE_1 (BT_FN_UINT16_UINT16, BT_UINT16, BT_UINT16)
 DEF_FUNCTION_TYPE_1 (BT_FN_UINT32_UINT32, BT_UINT32, BT_UINT32)
 DEF_FUNCTION_TYPE_1 (BT_FN_UINT64_UINT64, BT_UINT64, BT_UINT64)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT64_FLOAT, BT_UINT64, BT_FLOAT)
 DEF_FUNCTION_TYPE_1 (BT_FN_BOOL_INT, BT_BOOL, BT_INT)
 DEF_FUNCTION_TYPE_1 (BT_FN_PTR_CONST_PTR, BT_PTR, BT_CONST_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_CONST_PTR_CONST_PTR, BT_CONST_PTR, BT_CONST_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_BND_CONST_PTR, BT_BND, BT_CONST_PTR)
 DEF_FUNCTION_TYPE_1 (BT_FN_CONST_PTR_BND, BT_CONST_PTR, BT_BND)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT16_UINT32, BT_UINT16, BT_UINT32)
+DEF_FUNCTION_TYPE_1 (BT_FN_UINT32_UINT16, BT_UINT32, BT_UINT16)
 
 DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR, BT_FN_VOID_PTR)
 
@@ -301,18 +318,52 @@ DEF_FUNCTION_TYPE_2 (BT_FN_INT_CONST_STRING_FILEPTR,
                     BT_INT, BT_CONST_STRING, BT_FILEPTR)
 DEF_FUNCTION_TYPE_2 (BT_FN_INT_INT_FILEPTR,
                     BT_INT, BT_INT, BT_FILEPTR)
+DEF_FUNCTION_TYPE_2 (BT_FN_UINT16_UINT16_UINT16,
+                    BT_UINT16, BT_UINT16, BT_UINT16)
+DEF_FUNCTION_TYPE_2 (BT_FN_INT_PTR_INT,
+                    BT_INT, BT_PTR, BT_INT)
+DEF_FUNCTION_TYPE_2 (BT_FN_UINT_PTR_UINT,
+                    BT_UINT, BT_PTR, BT_UINT)
+DEF_FUNCTION_TYPE_2 (BT_FN_LONG_PTR_LONG,
+                    BT_LONG, BT_PTR, BT_LONG)
+DEF_FUNCTION_TYPE_2 (BT_FN_ULONG_PTR_ULONG,
+                    BT_ULONG, BT_PTR, BT_ULONG)
 DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTRMODE_PTR,
                     BT_VOID, BT_PTRMODE, BT_PTR)
 DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_PTRMODE,
                     BT_VOID, BT_PTR, BT_PTRMODE)
+DEF_FUNCTION_TYPE_2 (BT_FN_VOID_UINT64_UINT64,
+                    BT_VOID, BT_UINT64, BT_UINT64)
 DEF_FUNCTION_TYPE_2 (BT_FN_VOID_VALIST_REF_VALIST_ARG,
                     BT_VOID, BT_VALIST_REF, BT_VALIST_ARG)
 DEF_FUNCTION_TYPE_2 (BT_FN_LONG_LONG_LONG,
                     BT_LONG, BT_LONG, BT_LONG)
+DEF_FUNCTION_TYPE_2 (BT_FN_UINT8_UINT8_UINT8,
+                    BT_UINT8, BT_UINT8, BT_UINT8)
+DEF_FUNCTION_TYPE_2 (BT_FN_INT8_INT8_INT8,
+                    BT_INT8, BT_INT8, BT_INT8)
+DEF_FUNCTION_TYPE_2 (BT_FN_INT16_INT16_INT16,
+                    BT_INT16, BT_INT16, BT_INT16)
+DEF_FUNCTION_TYPE_2 (BT_FN_INT_INT_INT,
+                    BT_INT, BT_INT, BT_INT)
+DEF_FUNCTION_TYPE_2 (BT_FN_UINT_FLOAT_UINT,
+                    BT_UINT, BT_FLOAT, BT_UINT)
+DEF_FUNCTION_TYPE_2 (BT_FN_FLOAT_UINT_UINT,
+                    BT_FLOAT, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_2 (BT_FN_ULONG_UINT_UINT,
+                    BT_ULONG, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_2 (BT_FN_ULONG_UINT_PTR,
+                    BT_ULONG, BT_UINT, BT_PTR)
+DEF_FUNCTION_TYPE_2 (BT_FN_ULONG_ULONG_ULONG,
+                    BT_ULONG, BT_ULONG, BT_ULONG)
+DEF_FUNCTION_TYPE_2 (BT_FN_UINT_UINT_UINT,
+                    BT_UINT, BT_UINT, BT_UINT)
 DEF_FUNCTION_TYPE_2 (BT_FN_INT_PTR_CONST_STRING,
                     BT_INT, BT_PTR, BT_CONST_STRING)
 DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_SIZE,
                     BT_VOID, BT_PTR, BT_SIZE)
+DEF_FUNCTION_TYPE_2 (BT_FN_VOID_UINT_PTR,
+                    BT_VOID, BT_UINT, BT_PTR)
 DEF_FUNCTION_TYPE_2 (BT_FN_FLOAT_FLOAT_FLOAT,
                     BT_FLOAT, BT_FLOAT, BT_FLOAT)
 DEF_FUNCTION_TYPE_2 (BT_FN_DOUBLE_DOUBLE_DOUBLE,
@@ -408,6 +459,7 @@ DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_SIZE_CONST_VPTR, BT_BOOL, BT_SIZE,
                     BT_CONST_VOLATILE_PTR)
 DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_INT_BOOL, BT_BOOL, BT_INT, BT_BOOL)
 DEF_FUNCTION_TYPE_2 (BT_FN_VOID_UINT_UINT, BT_VOID, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_2 (BT_FN_UINT_UINT_PTR, BT_UINT, BT_UINT, BT_PTR)
 DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_SIZE, BT_PTR, BT_CONST_PTR, BT_SIZE)
 DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_CONST_PTR, BT_PTR, BT_CONST_PTR, BT_CONST_PTR)
 DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTRPTR_CONST_PTR, BT_VOID, BT_PTR_PTR, BT_CONST_PTR)
@@ -415,6 +467,8 @@ DEF_FUNCTION_TYPE_2 (BT_FN_VOID_CONST_PTR_SIZE, BT_VOID, BT_CONST_PTR, BT_SIZE)
 DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_BND, BT_VOID, BT_PTR, BT_BND)
 DEF_FUNCTION_TYPE_2 (BT_FN_CONST_PTR_CONST_PTR_CONST_PTR, BT_CONST_PTR, BT_CONST_PTR, BT_CONST_PTR)
 DEF_FUNCTION_TYPE_2 (BT_FN_BND_CONST_PTR_SIZE, BT_BND, BT_CONST_PTR, BT_SIZE)
+DEF_FUNCTION_TYPE_2 (BT_FN_UINT32_UINT64_PTR,
+                    BT_UINT32, BT_UINT64, BT_PTR)
 
 DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR_PTR, BT_FN_VOID_PTR_PTR)
 
@@ -444,6 +498,20 @@ DEF_FUNCTION_TYPE_3 (BT_FN_INT_FILEPTR_CONST_STRING_VALIST_ARG,
                     BT_INT, BT_FILEPTR, BT_CONST_STRING, BT_VALIST_ARG)
 DEF_FUNCTION_TYPE_3 (BT_FN_INT_PTR_PTR_PTR,
                     BT_INT, BT_PTR, BT_PTR, BT_PTR)
+DEF_FUNCTION_TYPE_3 (BT_FN_INT_INT_UINT_UINT,
+                    BT_INT, BT_INT, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT_UINT_UINT_UINT,
+                    BT_UINT, BT_UINT, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT_UINT_UINT_PTR,
+                    BT_UINT, BT_UINT, BT_UINT, BT_PTR)
+DEF_FUNCTION_TYPE_3 (BT_FN_UINT_ULONG_ULONG_UINT,
+                    BT_UINT, BT_ULONG, BT_ULONG, BT_UINT)
+DEF_FUNCTION_TYPE_3 (BT_FN_ULONG_ULONG_ULONG_ULONG,
+                    BT_ULONG, BT_ULONG, BT_ULONG, BT_ULONG)
+DEF_FUNCTION_TYPE_3 (BT_FN_LONG_LONG_UINT_UINT,
+                    BT_LONG, BT_LONG, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_3 (BT_FN_ULONG_ULONG_UINT_UINT,
+                    BT_ULONG, BT_ULONG, BT_UINT, BT_UINT)
 DEF_FUNCTION_TYPE_3 (BT_FN_STRING_CONST_STRING_CONST_STRING_INT,
                     BT_STRING, BT_CONST_STRING, BT_CONST_STRING, BT_INT)
 DEF_FUNCTION_TYPE_3 (BT_FN_FLOAT_FLOAT_FLOAT_FLOAT,
@@ -512,6 +580,10 @@ DEF_FUNCTION_TYPE_3 (BT_FN_BOOL_ULONG_ULONG_ULONGPTR, BT_BOOL, BT_ULONG,
                     BT_ULONG, BT_PTR_ULONG)
 DEF_FUNCTION_TYPE_3 (BT_FN_BOOL_ULONGLONG_ULONGLONG_ULONGLONGPTR, BT_BOOL,
                     BT_ULONGLONG, BT_ULONGLONG, BT_PTR_ULONGLONG)
+DEF_FUNCTION_TYPE_3 (BT_FN_VOID_UINT32_UINT64_PTR,
+                    BT_VOID, BT_UINT32, BT_UINT64, BT_PTR)
+DEF_FUNCTION_TYPE_3 (BT_FN_VOID_UINT32_UINT32_PTR,
+                    BT_VOID, BT_UINT32, BT_UINT32, BT_PTR)
 
 DEF_FUNCTION_TYPE_4 (BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR,
                     BT_SIZE, BT_CONST_PTR, BT_SIZE, BT_SIZE, BT_FILEPTR)
@@ -523,6 +595,12 @@ DEF_FUNCTION_TYPE_4 (BT_FN_PTR_PTR_CONST_PTR_SIZE_SIZE,
                     BT_PTR, BT_PTR, BT_CONST_PTR, BT_SIZE, BT_SIZE)
 DEF_FUNCTION_TYPE_4 (BT_FN_PTR_PTR_INT_SIZE_SIZE,
                     BT_PTR, BT_PTR, BT_INT, BT_SIZE, BT_SIZE)
+DEF_FUNCTION_TYPE_4 (BT_FN_UINT_UINT_UINT_UINT_UINT,
+                    BT_UINT, BT_UINT, BT_UINT, BT_UINT, BT_UINT)
+DEF_FUNCTION_TYPE_4 (BT_FN_UINT_FLOAT_FLOAT_FLOAT_FLOAT,
+                    BT_UINT, BT_FLOAT, BT_FLOAT, BT_FLOAT, BT_FLOAT)
+DEF_FUNCTION_TYPE_4 (BT_FN_ULONG_ULONG_ULONG_UINT_UINT,
+                    BT_ULONG, BT_ULONG, BT_ULONG, BT_UINT, BT_UINT)
 DEF_FUNCTION_TYPE_4 (BT_FN_STRING_STRING_CONST_STRING_SIZE_SIZE,
                     BT_STRING, BT_STRING, BT_CONST_STRING, BT_SIZE, BT_SIZE)
 DEF_FUNCTION_TYPE_4 (BT_FN_INT_FILEPTR_INT_CONST_STRING_VALIST_ARG,
index b5dc291502390cf963e2195cfb24b7f4233bcc5f..d7f80e66bd9332b740949375e051e06c07b958e8 100644 (file)
@@ -1000,5 +1000,48 @@ DEF_GCC_BUILTIN (BUILT_IN_LINE, "LINE", BT_FN_INT, ATTR_NOTHROW_LEAF_LIST)
 /* Pointer Bounds Checker builtins.  */
 #include "chkp-builtins.def"
 
+/* Do not expose the BRIG builtins by default gcc-wide, but only privately in
+   the BRIG FE as long as there are no references for them in the middle end
+   or any of the upstream backends.  */
+
+#ifndef DEF_HSAIL_BUILTIN
+#define DEF_HSAIL_BUILTIN(ENUM, HSAIL_OPCODE, HSAIL_TYPE, NAME, TYPE, ATTRS) \
+  DEF_BUILTIN_STUB (ENUM, "__builtin_" NAME)
+#endif
+
+/* HSAIL atomic builtins do not have separate identifying opcodes.  */
+
+#ifndef DEF_HSAIL_ATOMIC_BUILTIN
+#define DEF_HSAIL_ATOMIC_BUILTIN(ENUM, ATOMIC_OPCODE, HSAIL_TYPE, NAME, \
+       TYPE, ATTRS) \
+  DEF_BUILTIN_STUB (ENUM, "__builtin_" NAME)
+#endif
+
+/* HSAIL saturating arithmetics builtins.  */
+
+#ifndef DEF_HSAIL_SAT_BUILTIN
+#define DEF_HSAIL_SAT_BUILTIN(ENUM, BRIG_OPCODE, HSAIL_TYPE, NAME, \
+       TYPE, ATTRS) \
+  DEF_BUILTIN_STUB (ENUM, "__builtin_" NAME)
+#endif
+
+/* HSAIL builtins used internally by the frontend.  */
+
+#ifndef DEF_HSAIL_INTR_BUILTIN
+#define DEF_HSAIL_INTR_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
+  DEF_BUILTIN_STUB (ENUM, "__builtin_" NAME)
+#endif
+
+/* HSAIL saturated conversions.  */
+
+#ifndef DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN
+#define DEF_HSAIL_CVT_ZEROI_SAT_BUILTIN(ENUM, HSAIL_DEST_TYPE, HSAIL_SRC_TYPE, \
+  NAME, TYPE, ATTRS) \
+  DEF_BUILTIN_STUB (ENUM, "__builtin_" NAME)
+#endif
+
+/* HSAIL/BRIG frontend builtins.  */
+#include "brig-builtins.def"
+
 #undef DEF_BUILTIN_CHKP
 #undef DEF_BUILTIN
index 6e1158a5889b1429a70af6d95d7cc4932c21c46b..09c2081d20c5994ab9adcccc3c1b299003731c08 100644 (file)
@@ -16,7 +16,7 @@
 GCC stands for ``GNU Compiler Collection''.  GCC is an integrated
 distribution of compilers for several major programming languages.  These
 languages currently include C, C++, Objective-C, Objective-C++,
-Fortran, Ada, and Go.
+Fortran, Ada, Go, and BRIG (HSAIL).
 
 The abbreviation @dfn{GCC} has multiple meanings in common use.  The
 current official meaning is ``GNU Compiler Collection'', which refers
index 762be5f5215f1f08bbdfa080d4293b98d98c5de0..bc4edfdb096b19802d404d8292f3fd786fa1e2ea 100644 (file)
@@ -2665,7 +2665,10 @@ separately.
 
 Second, you must have the testing tools installed.  This includes
 @uref{http://www.gnu.org/software/dejagnu/,,DejaGnu}, Tcl, and Expect;
-the DejaGnu site has links to these.
+the DejaGnu site has links to these. For running the BRIG frontend
+tests, a tool to assemble the binary BRIGs from HSAIL text,
+@uref{https://github.com/HSAFoundation/HSAIL-Tools/,,HSAILasm} must
+be installed.
 
 If the directories where @command{runtest} and @command{expect} were
 installed are not in the @env{PATH}, you may need to set the following
index 45af80c3530755e73db76edeaffaf6d338c7be63..d8724aacd28744354e65583c32ed09d3ec1c7f7d 100644 (file)
@@ -1338,6 +1338,9 @@ traditional preprocessor).
 @item @var{file}.go
 Go source code.
 
+@item @var{file}.brig
+BRIG files (binary representation of HSAIL).
+
 @item @var{file}.ads
 Ada source code file that contains a library unit declaration (a
 declaration of a package, subprogram, or generic, or a generic
@@ -1386,6 +1389,7 @@ assembler  assembler-with-cpp
 ada
 f77  f77-cpp-input f95  f95-cpp-input
 go
+brig
 @end smallexample
 
 @item -x none
index 1c8b3cb087248c14bf29149b0c947cf87b91bd92..9f5317cc03e6eb895a8b204e4f8886a69cb38b04 100644 (file)
@@ -301,6 +301,14 @@ available online, see @uref{http://gcc.gnu.org/readings.html}
 As of the GCC 4.7.1 release, GCC supports the Go 1 language standard,
 described at @uref{http://golang.org/doc/go1.html}.
 
+@section HSA Intermediate Language (HSAIL)
+
+GCC can compile the binary representation (BRIG) of the HSAIL text format as
+described in HSA Programmer's Reference Manual version 1.0.1. This
+capability is typically utilized to implement the HSA runtime API's HSAIL 
+finalization extension for a gcc supported processor. HSA standards are
+freely available at @uref{http://www.hsafoundation.com/standards/}.
+
 @section References for Other Languages
 
 @xref{Top, GNAT Reference Manual, About This Guide, gnat_rm,
index f16f51ce9c25e8dff51fd85b028a15996a1380ad..f09180968bfc0cc94f6ab019137875de075f0c0d 100644 (file)
@@ -1,3 +1,23 @@
+2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
+           Martin Jambor  <mjambor@suse.cz>
+
+       * lib/brig-dg.exp: New file.
+       * lib/brig.exp: Likewise.
+       * brig.dg/README: Likewise.
+       * brig.dg/dg.exp: Likewise.
+       * brig.dg/test/gimple/alloca.hsail: Likewise.
+       * brig.dg/test/gimple/atomics.hsail: Likewise.
+       * brig.dg/test/gimple/branches.hsail: Likewise.
+       * brig.dg/test/gimple/fbarrier.hsail: Likewise.
+       * brig.dg/test/gimple/function_calls.hsail: Likewise.
+       * brig.dg/test/gimple/kernarg.hsail: Likewise.
+       * brig.dg/test/gimple/mem.hsail: Likewise.
+       * brig.dg/test/gimple/mulhi.hsail: Likewise.
+       * brig.dg/test/gimple/packed.hsail: Likewise.
+       * brig.dg/test/gimple/smoke_test.hsail: Likewise.
+       * brig.dg/test/gimple/variables.hsail: Likewise.
+       * brig.dg/test/gimple/vector.hsail: Likewise.
+
 2017-01-24  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.dg/asan/asan_test.C: Enable on all *-*-linux* targets that
diff --git a/gcc/testsuite/brig.dg/README b/gcc/testsuite/brig.dg/README
new file mode 100644 (file)
index 0000000..2ad5b24
--- /dev/null
@@ -0,0 +1,12 @@
+BRIG (HSAIL) frontend test cases
+--------------------------------
+
+The suite consists of "smoke tests" that test several features of
+the compilation and regression tests, but is not an exhaustive test
+suite for all HSAIL instructions. The HSA PRM conformance suite
+is supposed to be used for that.
+
+HSAILasm is required for converting the text HSAIL files to BRIGs
+which the compiler consumes. It can be built from
+https://github.com/HSAFoundation/HSAIL-Tools
+
diff --git a/gcc/testsuite/brig.dg/dg.exp b/gcc/testsuite/brig.dg/dg.exp
new file mode 100644 (file)
index 0000000..d4f37e6
--- /dev/null
@@ -0,0 +1,31 @@
+#   Copyright (C) 2009-2014 Free Software Foundation, Inc.
+
+# This program 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 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+load_lib brig-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+if [expr [llength [auto_execok HSAILasm]] > 0] {
+    dg-runtest [find $srcdir/$subdir *.hsail] "" ""
+} else {
+    unsupported "All BRIG FE tests require HSAILasm in PATH."
+}
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/brig.dg/test/gimple/alloca.hsail b/gcc/testsuite/brig.dg/test/gimple/alloca.hsail
new file mode 100644 (file)
index 0000000..479ab72
--- /dev/null
@@ -0,0 +1,37 @@
+module &module:1:0:$full:$large:$default;
+
+/* Tests for alloca. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+prog function &subfunction(arg_u32 %return_value)() {
+     alloca_align(1)_u32 $s2, 256;
+     st_arg_u32 $s2, [%return_value];
+     ret;
+};
+
+prog kernel &kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+        ld_kernarg_u64 $d0, [%input_ptr];
+        ld_global_u32 $s0, [$d0];
+
+       alloca_align(256)_u32 $s1, 16;
+       {
+               arg_u32 %return_value;
+               call &subfunction(%return_value)();
+               ld_arg_u32 $s1, [%return_value];
+       }
+        ld_kernarg_u64 $d1, [%output_ptr];
+        st_global_u32 $s1, [$d0];
+};
+
+/* { dg-final { scan-tree-dump "s2 = __builtin___hsail_alloca \\\(256, 1, __context\\\);" "gimple" } } */
+
+/* { dg-final { scan-tree-dump "s1 = __builtin___hsail_alloca \\\(16, 256, __context\\\);" "gimple" } } */
+
+
+/* Both functions should have an alloca frame push and pop. */
+/* { dg-final { scan-tree-dump-times "__builtin___hsail_alloca_push_frame \\\(__context\\\);" 2 "gimple" } } */
+
+/* { dg-final { scan-tree-dump-times "__builtin___hsail_alloca_pop_frame \\\(__context\\\);" 2 "gimple" } } */
diff --git a/gcc/testsuite/brig.dg/test/gimple/atomics.hsail b/gcc/testsuite/brig.dg/test/gimple/atomics.hsail
new file mode 100644 (file)
index 0000000..b877a66
--- /dev/null
@@ -0,0 +1,33 @@
+module &module:1:0:$full:$large:$default;
+
+/* Test for atomic instructions. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-original" } */
+
+prog kernel &Kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+        ld_kernarg_u64 $d0, [%input_ptr];
+
+       atomic_ld_global_rlx_system_b32 $s0, [$d0];
+       atomic_add_global_rlx_system_u32 $s1, [$d0 + 4], $s0;
+
+        ld_kernarg_u64 $d0, [%output_ptr];
+        atomicnoret_st_global_rlx_system_b32 [$d0], $s2;
+
+       atomicnoret_min_global_rlx_system_u32 [$d0 + 4], $s1;
+
+        ret;
+};
+
+/* The atomic loads are implemented by casting to an atomic pointer. */
+/* { dg-final { scan-tree-dump "s0 = VIEW_CONVERT_EXPR<unsigned int>\\\(\\\*\\\(atomic unsigned int \\\*\\\)" "original"} } */
+
+/* The atomic add should call a gcc builtin. */
+/* { dg-final { scan-tree-dump "= __sync_fetch_and_add_4 \\\(" "original"} } */
+
+/* The atomic stores are implemented by casting to an atomic pointer. */
+/* { dg-final { scan-tree-dump "\\\*\\\(atomic unsigned int \\\*\\\) d0 = s2;" "original"} } */
+
+/* The atomic min is implemented by a custom builtin. */
+/* { dg-final { scan-tree-dump "builtin_out.\[0-9\]+ = __builtin___hsail_atomic_min_u32 \\\(" "original"} } */
diff --git a/gcc/testsuite/brig.dg/test/gimple/branches.hsail b/gcc/testsuite/brig.dg/test/gimple/branches.hsail
new file mode 100644 (file)
index 0000000..081fde3
--- /dev/null
@@ -0,0 +1,58 @@
+module &module:1:0:$full:$large:$default;
+
+/* Test different style of branches. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+prog kernel &Kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+        ld_kernarg_u64 $d0, [%input_ptr];
+        ld_global_u64 $d1, [$d0];
+        ld_global_u64 $d2, [$d0 + 8];
+
+        ld_global_u32 $s0, [$d0 + 16];
+        ld_global_u32 $s1, [$d0 + 20];
+
+       sbr_width(all)_u32 $s1 [@case0, @case1, @case2];
+@case0:
+        st_global_u64 0, [$d0];
+       br @out;
+@case1:
+        st_global_u64 1, [$d0];
+       br @out;
+@case2:
+        st_global_u64 2, [$d0];
+@out:
+       cmp_eq_u32_u32 $s2, $s1, $s0;
+       cvt_b1_u32 $c0, $s2;
+
+       cbr_width(all)_b1 $c0, @true_branch;
+@false_branch:
+        st_global_u64 $d1, [$d0];
+
+@true_branch:
+        ld_kernarg_u64 $d0, [%output_ptr];
+
+        st_global_u32 $s2, [$d0 + 8];
+       br @skip;
+        st_global_u32 $s3, [$d0 + 12];
+
+@skip:
+        ret;
+};
+
+/* sbr is converted to a switch */
+/* { dg-final { scan-tree-dump "switch \\\(s1\\\) <default: <D.\[0-9\]+>, case 0: <D.\[0-9\]+>, case 1: <D.\[0-9\]+>, case 2: <D.\[0-9\]+>>" "gimple"} } */
+
+/* br @out converted to gotos */
+/* { dg-final { scan-tree-dump-times "goto @out" 2 "gimple"} } */ 
+
+/* the comparison instruction */
+/* { dg-final { scan-tree-dump "c0 = s2 != 0;" "gimple" } } */
+
+/* cbr to an if clause */
+/* { dg-final { scan-tree-dump "if \\\(c0 != 0\\\) goto @true_branch; else goto <D.\[0-9\]+>;" "gimple" } } */
+
+/* br @skip converted to a goto */
+/* { dg-final { scan-tree-dump "goto @skip" "gimple"} } */ 
diff --git a/gcc/testsuite/brig.dg/test/gimple/fbarrier.hsail b/gcc/testsuite/brig.dg/test/gimple/fbarrier.hsail
new file mode 100644 (file)
index 0000000..a58ca09
--- /dev/null
@@ -0,0 +1,74 @@
+module &module:1:0:$full:$large:$default;
+
+/* Tests for fbarrier. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+fbarrier &fb_module_scope;
+
+prog function &subfunction(arg_u32 %return_value)() {
+
+     workitemflatabsid_u32 $s3;
+     cvt_b1_u32 $c1, $s3;
+     cbr_width(all)_b1 $c1, @skip_fbar;
+     waitfbar &fb_module_scope;
+@skip_fbar:
+
+     st_arg_u32 $s3, [%return_value];
+     ret;
+};
+
+prog kernel &kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+       fbarrier %fb_func_scope;
+
+        ld_kernarg_u64 $d0, [%input_ptr];
+        ld_global_u32 $s0, [$d0];
+
+       workitemflatabsid_u32 $s1;
+       cvt_b1_u32 $c1, $s1;
+       cbr_width(all)_b1 $c1, @skip_init;
+
+       initfbar &fb_module_scope;
+       initfbar %fb_func_scope;
+
+        joinfbar &fb_module_scope;
+
+@skip_init:
+       barrier_width(all);
+
+        joinfbar %fb_func_scope;
+
+       {
+               arg_u32 %return_value;
+               call &subfunction(%return_value)();
+               ld_arg_u32 $s1, [%return_value];
+       }
+       arrivefbar %fb_func_scope;
+
+        ld_kernarg_u64 $d1, [%output_ptr];
+        st_global_u32 $s1, [$d0];
+
+       workitemflatabsid_u32 $s1;
+       cvt_b1_u32 $c0, $s1;
+       cbr_width(all)_b1 $c0, @skip_fini;
+
+       releasefbar &fb_module_scope;
+       releasefbar %fb_func_scope;
+
+@skip_fini:
+
+};
+/* fbarriers are allocated from the group memory in the order of 
+   appearance. The current implementation allocates 32B per fbarrier. */
+
+/* { dg-final { scan-tree-dump "__hsail_waitfbar \\\(0, __context\\\);" "gimple"} } */
+/* { dg-final { scan-tree-dump "__hsail_initfbar \\\(0, __context\\\);" "gimple"} } */
+/* { dg-final { scan-tree-dump "__hsail_initfbar \\\(32, __context\\\);" "gimple"} } */
+/* { dg-final { scan-tree-dump "__hsail_joinfbar \\\(0, __context\\\);" "gimple"} } */
+/* { dg-final { scan-tree-dump "@skip_init:\[\n ]+__builtin___hsail_barrier \\\(__context\\\);\[\n ]+__builtin___hsail_joinfbar \\\(32, __context\\\);" "gimple"} } */
+
+/* { dg-final { scan-tree-dump "__hsail_arrivefbar \\\(32, __context\\\);" "gimple"} } */
+
+/* { dg-final { scan-tree-dump "__hsail_releasefbar \\\(0, __context\\\);\[\n ]+__builtin___hsail_releasefbar \\\(32, __context\\\);" "gimple"} } */
diff --git a/gcc/testsuite/brig.dg/test/gimple/function_calls.hsail b/gcc/testsuite/brig.dg/test/gimple/function_calls.hsail
new file mode 100644 (file)
index 0000000..d3b690c
--- /dev/null
@@ -0,0 +1,59 @@
+module &module:1:0:$full:$large:$default;
+
+/* Function calls and argument passing. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+prog function &subfunction(arg_u32 %return_value)(arg_f32 %float_arg, arg_f64 %double_arg, arg_f16 %half_arg) {
+     ld_arg_f32 $s0, [%float_arg];
+     cvt_u32_f32 $s0, $s0;
+
+     ld_arg_f64 $d0, [%double_arg];
+     cvt_u32_f64 $s1, $d0;
+
+     ld_arg_f16 $s2, [%half_arg];
+     cvt_u32_f16 $s2, $s2;
+
+     add_u32 $s3, $s0, $s1;
+     add_u32 $s3, $s3, $s2;
+
+     st_arg_u32 $s3, [%return_value];
+     ret;
+};
+
+prog kernel &kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+        ld_kernarg_u64 $d0, [%input_ptr];
+        ld_global_u32 $s0, [$d0];
+       {
+               arg_f32 %float_arg;
+               arg_f64 %double_arg;
+               arg_f16 %half_arg;
+               arg_u32 %return_value;
+
+               st_arg_f32 12.0f, [%float_arg];
+               st_arg_f64 640.0d, [%double_arg];
+               st_arg_f16 12.0h, [%half_arg];
+
+               call &subfunction(%return_value)(%float_arg, %double_arg, %half_arg);
+
+               ld_arg_u32 $s1, [%return_value];
+       }       
+        ld_kernarg_u64 $d1, [%output_ptr];
+        st_global_u32 $s1, [$d0];
+};
+
+/* The generated function call should have the incoming arguments and three hidden arguments. */
+
+/* { dg-final { scan-tree-dump "_\[0-9\]+ = subfunction \\\(_kernel.float_arg.\[_0-9\]+, _kernel.double_arg.\[_0-9\]+, _kernel.half_arg.\[_0-9\]+, __context, __group_base_addr, __private_base_addr\\\);" "gimple"} } */
+
+/* The callee should refer directly to the scalar arguments when it reads them. */
+/* { dg-final { scan-tree-dump "= float_arg;" "gimple"} } */
+/* { dg-final { scan-tree-dump "= double_arg;" "gimple"} } */
+/* { dg-final { scan-tree-dump "= half_arg;" "gimple"} } */
+
+/* The return value is stored to a temporary before returned. */
+/* { dg-final { scan-tree-dump "_retvalue_temp = s3;" "gimple"} } */
+/* { dg-final { scan-tree-dump "D.\[0-9\]+ = _retvalue_temp;" "gimple"} } */
+/* { dg-final { scan-tree-dump "return D.\[0-9\]+;" "gimple"} } */
diff --git a/gcc/testsuite/brig.dg/test/gimple/kernarg.hsail b/gcc/testsuite/brig.dg/test/gimple/kernarg.hsail
new file mode 100644 (file)
index 0000000..7f30919
--- /dev/null
@@ -0,0 +1,25 @@
+module &module:1:0:$full:$large:$default;
+
+/* Tests for kernarg addressing modes. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-original" } */
+
+prog kernel &Kernel(kernarg_u64 %input[4], kernarg_u64 %output_ptr, kernarg_u64 %i)
+{
+       ld_kernarg_u64 $d0, [%i];
+       ld_kernarg_u64 $d0, [%input][$d0 + 1];
+
+       ld_kernarg_u64 $d1, [%output_ptr];
+       st_global_u64 $d0, [$d1];
+
+       ret;
+};
+
+/* [%i] */
+/* { dg-final { scan-tree-dump " = \\\*\\\(unsigned long \\\*\\\) \\\(__args \\\+ 40\\\);" "original"} } */
+
+/* [%input][$d0 + 1] */
+/* { dg-final { scan-tree-dump "\\\*\\\(unsigned long \\\*\\\) \\\(\\\(VIEW_CONVERT_EXPR<void \\\*>\\\(\\\(unsigned long\\\) __args\\\) \\\+ \\\(unsigned long\\\) d0\\\) \\\+ 1\\\);" "original"} } */
+
+
diff --git a/gcc/testsuite/brig.dg/test/gimple/mem.hsail b/gcc/testsuite/brig.dg/test/gimple/mem.hsail
new file mode 100644 (file)
index 0000000..75835a1
--- /dev/null
@@ -0,0 +1,39 @@
+module &module:1:0:$full:$large:$default;
+
+/* Tests for load/store addressing modes. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-original" } */
+
+prog kernel &Kernel(kernarg_u64 %input_ptr, kernarg_u64 %input_ptr2, kernarg_u64 %output_ptr)
+{
+       global_u32 %global_array[4];
+
+       ld_kernarg_u64 $d0, [%input_ptr];
+       ld_kernarg_u64 $d2, [%input_ptr2];
+       ld_global_u32 $s0, [$d0];
+       ld_global_u64 $d1, [$d2 + 4];
+
+       ld_global_u32 $s2, [%global_array][$d1 + 4];
+
+       ld_kernarg_u64 $d0, [%output_ptr];
+       st_global_u32 $s0, [$d0];
+       st_global_u32 $s1, [$d0 + 4];
+       st_global_u32 $s2, [$d0 + 8];
+
+       ret;
+};
+
+/* %input_ptr, %input_ptr2 and %output_ptr accesses should generate offsets to the __args array */
+/* { dg-final { scan-tree-dump "__args;\[\n \]+d0 =" "original"} } */
+/* { dg-final { scan-tree-dump "\\\(__args \\\+ 8\\\);\[\n \]+d2 =" "original"} } */
+/* { dg-final { scan-tree-dump "\\\(__args \\\+ 16\\\);\[\n \]+d0 =" "original"} } */
+
+/* ld_global_u32 $s0, [$d0] */
+/* { dg-final { scan-tree-dump "\\\*\\\(unsigned int \\\*\\\) d0;\[\n \]+s0 =" "original"} } */
+
+/* ld_global_u64 $d1, [$d2 + 4] pointer arithmetics*/
+/* { dg-final { scan-tree-dump "d2 \\\+ 4\\\);\[\n \]+d1 = " "original"} } */
+
+/* ld_global_u32 $s2, [%global_array][$d1 + 4]; is the most complex form */
+/* { dg-final { scan-tree-dump "\\\(unsigned long\\\) &_Kernel.global_array\\\) \\\+ \\\(unsigned long\\\) d1\\\) \\\+ 4" "original" } } */
diff --git a/gcc/testsuite/brig.dg/test/gimple/mulhi.hsail b/gcc/testsuite/brig.dg/test/gimple/mulhi.hsail
new file mode 100644 (file)
index 0000000..acdced9
--- /dev/null
@@ -0,0 +1,33 @@
+module &module:1:0:$full:$large:$default;
+
+/* Test high part multiplies. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+prog kernel &Kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+        ld_kernarg_u64 $d0, [%input_ptr];
+        ld_global_u64 $d1, [$d0];
+        ld_global_u64 $d2, [$d0 + 8];
+
+        ld_global_u32 $s0, [$d0 + 16];
+        ld_global_u32 $s1, [$d0 + 20];
+
+       mulhi_s32 $s2, $s0, $s1;
+       mulhi_s64 $d2, $d1, $d2;
+
+       mad24hi_s32 $s3, $s0, $s1, $s2;
+       mul24hi_s32 $s3, $s3, $s1;
+
+        ld_kernarg_u64 $d0, [%output_ptr];
+        st_global_u64 $d1, [$d0];
+        st_global_u32 $s2, [$d0 + 8];
+        st_global_u32 $s3, [$d0 + 12];
+
+        ret;
+};
+
+/* All of the hipart mults areImplemented using MULT_HIGHPART_EXPR (h*). */
+/* { dg-final { scan-tree-dump-times " h\\\* " 4 "gimple"} } */
+
diff --git a/gcc/testsuite/brig.dg/test/gimple/packed.hsail b/gcc/testsuite/brig.dg/test/gimple/packed.hsail
new file mode 100644 (file)
index 0000000..9219ffd
--- /dev/null
@@ -0,0 +1,78 @@
+module &module:1:0:$full:$large:$default;
+
+/* Test for different cases of packed instruction controls. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple -fdump-tree-original" } */
+
+prog kernel &Kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+        ld_kernarg_u64 $d0, [%input_ptr];
+        ld_global_b128 $q0, [$d0];
+
+       add_pp_u8x16 $q1, $q0, u8x16(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+
+       /* Broadcast the 15 as it's the lowest element (pos 0) in the resulting vector. */
+       add_ps_u8x16 $q2, $q1, u8x16(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+
+       /* Broadcast the lowest element of q1. */
+       add_sp_u8x16 $q3, $q1, $q2;
+
+       /* Perform a scalar computation with the lowest element of both inputs and store it to the lowest element of dest. */
+       add_ss_u8x16 $q4, $q2, $q3;
+
+       /* Saturating arithmetics variations. */
+       add_pp_sat_u8x16 $q5, $q4, u8x16(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+
+       /* Broadcast the 15 as it's the lowest element (pos 0) in the resulting vector. */
+       add_ps_sat_u8x16 $q6, $q5, u8x16(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
+
+       /* Broadcast the lowest element of q1. */
+       add_sp_sat_u8x16 $q7, $q6, $q5;
+
+       /* Perform a scalar computation with the lowest element of both inputs and store it to the lowest element of dest. */
+       add_ss_sat_u8x16 $q8, $q7, $q6;
+
+       /* Single operand vector computation. */
+       neg_p_s16x8 $q9, $q8;
+
+        ld_kernarg_u64 $d0, [%output_ptr];
+        st_global_b128 $q8, [$d0];
+
+        ret;
+};
+
+/* The b128 load is done using uint128_t*.
+/* { dg-final { scan-tree-dump "q0 = VIEW_CONVERT_EXPR<uint128_t>\\\(mem_read.\[0-9\]+\\\);" "original"} } */
+
+/* Before arithmetics, the uint128_t is casted to a vector datatype. */
+/* { dg-final { scan-tree-dump "<vector\\\(16\\\) unsigned char>\\\(q0\\\) \\\+ \\\{" "original"} } */
+
+/* The u8x16 constant is generated to an array with elements in reverse order */
+/* in comparison to the HSAIL syntax. */
+/* { dg-final { scan-tree-dump "\\\+ { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }" "original"} } */
+
+/* After arithmetics, the vector DT is casted back to a uint128_t. */
+/* { dg-final { scan-tree-dump "q1 = VIEW_CONVERT_EXPR<uint128_t>" "original"} } */
+
+/* Broadcasted the constant vector's lowest element and summed it up in the next line. */
+/* { dg-final { scan-tree-dump "= { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 };\[\n \]+_\[0-9\]+ = _\[0-9\]+ \\\+ _\[0-9\]+;" "gimple"} } */
+
+/* Broadcasted the registers lowest element via a VEC_PERM_EXPR that has an all-zeros mask. */
+/* { dg-final { scan-tree-dump "VEC_PERM_EXPR <_\[0-9\]+, _\[0-9\]+, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }>;" "gimple" } } */
+
+/* For the add_ss we assume performing the computation over the whole vector is cheaper than */
+/* extracting the scalar and performing a scalar operation. This aims to stay in the vector
+/* datapath as long as possible. */
+/* { dg-final { scan-tree-dump "_\[0-9\]+ = VIEW_CONVERT_EXPR<vector\\\(16\\\) unsigned char>\\\(q2\\\);\[\n \]+_\[0-9\]+ = VIEW_CONVERT_EXPR<vector\\\(16\\\) unsigned char>\\\(q3\\\);\[\n \]+_\[0-9\]+ = _\[0-9\]+ \\\+ _\[0-9\]+;" "gimple" } } */
+
+/* Insert the lowest element of the result to the lowest element of the result register. */
+/* { dg-final { scan-tree-dump "= VEC_PERM_EXPR <_\[0-9\]+, new_output.\[0-9\]+_\[0-9\]+, { 16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }>;" "gimple" } } */
+
+/* { dg-final { scan-tree-dump "q4 = VIEW_CONVERT_EXPR<uint128_t>\\\(s_output.\[0-9\]+_\[0-9\]+\\\);" "gimple" } } */
+
+/* The saturating arithmetics are (curently) implemented using scalar builtin calls. */
+/* { dg-final { scan-tree-dump-times "= __builtin___hsail_sat_add_u8" 64 "gimple" } } */
+
+/* A single operand vector instr (neg.) */
+/* { dg-final { scan-tree-dump " = VIEW_CONVERT_EXPR<vector\\\(8\\\) signed short>\\\(q8\\\);\[\n \]+_\[0-9\]+ = -_\[0-9\]+;\[\n \]+" "gimple" } } */
diff --git a/gcc/testsuite/brig.dg/test/gimple/smoke_test.hsail b/gcc/testsuite/brig.dg/test/gimple/smoke_test.hsail
new file mode 100644 (file)
index 0000000..850aeeb
--- /dev/null
@@ -0,0 +1,91 @@
+module &module:1:0:$full:$large:$default;
+
+/* A basic smoke test. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+prog kernel &Kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+       ld_kernarg_u64 $d0, [%input_ptr];
+       ld_global_u32 $s0, [$d0];
+       ld_global_u32 $s1, [$d0 + 4];
+
+       add_u32 $s2, $s0, $s1;
+       add_u32 $s3, $s0, 4294967295;
+
+       ld_kernarg_u64 $d0, [%output_ptr];
+       st_global_u32 $s2, [$d0];
+       st_global_u32 $s3, [$d0 + 4];
+
+       ret;
+};
+
+prog kernel &KernelWithBarrier(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+       ld_kernarg_u64 $d0, [%input_ptr];
+       ld_global_u32 $s0, [$d0];
+       ld_global_u32 $s1, [$d0 + 4];
+
+       add_u32 $s2, $s0, $s1;
+
+       barrier_width(all);
+
+       add_u32 $s3, $s0, 4294967295;
+
+       ld_kernarg_u64 $d0, [%output_ptr];
+       st_global_u32 $s2, [$d0];
+       st_global_u32 $s3, [$d0 + 4];
+
+       ret;
+};
+
+/* The kernel function itself should have a fingerprint as follows */
+/* _Kernel (unsigned char * __args, void * __context, void * __group_base_addr, void * __private_base_addr) */
+/* { dg-final { scan-tree-dump "_Kernel \\\(unsigned char \\\* __args, void \\\* __context, void \\\* __group_base_addr, void \\\* __private_base_addr\\\)" "gimple"} } */
+
+/* ld_kernarg: mem_read.0 = MEM[(unsigned long *)__args]; */
+/* { dg-final { scan-tree-dump "mem_read.\[0-9\] = MEM\\\[\\\(unsigned long \\\*\\\)__args\\\];" "gimple"} } */
+
+/* The latter ld_global_u32 should be visible as a pointer dereference (after pointer arithmetics on a temporary var): */
+/* mem_read.2 = *D.1691; */
+/* { dg-final { scan-tree-dump "mem_read.\[0-9\] = \\\*\[_0-9\]+;" "gimple"} } */
+
+/* add_u32s should generate +operators */
+/* { dg-final { scan-tree-dump "s2 = s0 \\\+ s1;" "gimple"} } */
+/* { dg-final { scan-tree-dump "s3 = s0 \\\+ 4294967295;" "gimple"} } */
+
+/* The latter st_global_u32 should be visible as a pointer dereference (after pointer arithmetics on a temporary var): */
+/* *D.1694 = s3; */
+/* { dg-final { scan-tree-dump "\\\*\[_0-9\]+ = s3;" "gimple"} } */
+
+/* The return inside the kernel should be generated to a goto to the end of the kernel. */
+/*  goto __kernel_exit; */
+/*  __kernel_exit: */
+/* { dg-final { scan-tree-dump "goto __kernel_exit;" "gimple"} } */
+/* { dg-final { scan-tree-dump "__kernel_exit:" "gimple"} } */
+
+/* Expecting a work item loop because there are no barrier calls. */
+/* { dg-final { scan-tree-dump "if \\\(__local_x < __cur_wg_size_x\\\) goto __wi_loop_x; else goto" "gimple"} } */
+/* { dg-final { scan-tree-dump "if \\\(__local_y < __cur_wg_size_y\\\) goto __wi_loop_y; else goto" "gimple"} } */
+/* { dg-final { scan-tree-dump "if \\\(__local_z < __cur_wg_size_z\\\) goto __wi_loop_z; else goto" "gimple"} } */
+
+/* The launcher should call __hsail_launch_wg_function in this case: */
+/* Kernel (void * __context, void * __group_base_addr) */
+/* { dg-final { scan-tree-dump "Kernel \\\(void \\\* __context, void \\\* __group_base_addr\\\)" "gimple"} } */
+/* { dg-final { scan-tree-dump "__hsail_launch_wg_function \\\(_Kernel, __context, __group_base_addr\\\);" "gimple"} }*/
+
+/* The kernel should have the magic metadata section injected to the ELF. */
+/* TODO: this should be disabled in case not outputting to an ELF. */
+/* Currently ELF is assumed by the brig frontend. Do not check for the context */
+/* as it is likely to change. */
+/* { dg-final { scan-tree-dump "\\\.pushsection phsa\\\.desc\\\.Kernel" "gimple"} }*/
+
+/* The kernel with the barrier call should have the barrier builtin call in between the two summations. */
+/* { dg-final { scan-tree-dump "s2 = s0 \\\+ s1;\[\n \]+__builtin___hsail_barrier \\\(__context\\\);\[\n \]+s3 = s0 \\\+ 4294967295;" "gimple"} } */
+
+/* The kernel with the barrier call's launcher function should call the thread-spawning function. */
+/* { dg-final { scan-tree-dump "__hsail_launch_kernel \\\(_KernelWithBarrier, __context, __group_base_addr\\\);" "gimple" } } */
+
+
+
diff --git a/gcc/testsuite/brig.dg/test/gimple/variables.hsail b/gcc/testsuite/brig.dg/test/gimple/variables.hsail
new file mode 100644 (file)
index 0000000..c76ea60
--- /dev/null
@@ -0,0 +1,124 @@
+module &module:1:0:$full:$large:$default;
+
+/* Tests for different variable scopes and address spaces. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+prog align(256) private_u32 &prog_private;
+private_u32 &mod_private;
+
+prog group_u32 &prog_group;
+group_u32 &mod_group;
+
+prog global_u32 &prog_global;
+global_u32 &mod_global;
+
+decl prog global_u32 &prog_global_host_def;
+
+prog readonly_u32 &prog_readonly;
+readonly_u32 &mod_readonly;
+
+prog function &subfunction(arg_u32 %return_value)(arg_u32 %arg) {
+
+     private_u32 %func_private;
+     group_u32 %func_group;
+     align(256) global_u32 %func_global;
+     readonly_u32 %func_readonly;
+
+     ld_private_u32 $s200, [%func_private];
+     st_private_u32 $s200, [&prog_private];
+
+     ld_group_u32 $s203, [%func_group];
+     st_group_u32 $s203, [&prog_group];
+
+     ld_global_u32 $s204, [%func_global];
+     st_global_u32 $s204, [&prog_global];
+
+     ld_readonly_u32 $s205, [%func_readonly];
+     st_global_u32 $s205, [%func_global];
+
+     st_arg_u32 $s2, [%return_value];
+     ret;
+};
+
+prog kernel &kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+       private_u32 %kern_private;
+       group_u32 %kern_group;
+       global_u32 %kern_global;
+       readonly_u32 %kern_readonly;
+
+        ld_kernarg_u64 $d0, [%input_ptr];
+        ld_global_u32 $s0, [$d0];
+
+       ld_private_u32 $s2, [&prog_private];
+       st_private_u32 $s2, [%kern_private];
+       ld_private_u32 $s3, [&mod_private];
+       st_private_u32 $s3, [&prog_private];
+
+       ld_group_u32 $s4, [&prog_group];
+       st_group_u32 $s4, [%kern_group];
+       ld_group_u32 $s5, [&mod_group];
+       st_group_u32 $s5, [&prog_group];
+
+       ld_global_u32 $s6, [&prog_global];
+       st_global_u32 $s6, [%kern_global];
+       ld_global_u32 $s7, [&mod_global];
+       st_global_u32 $s7, [&prog_global];
+
+       ld_readonly_u32 $s8, [&prog_readonly];
+       st_global_u32 $s8, [%kern_global];
+       ld_readonly_u32 $s9, [&mod_readonly];
+       st_global_u32 $s9, [&prog_global];
+
+       ld_readonly_u32 $s10, [%kern_readonly];
+       st_global_u32 $s10, [%kern_global];
+       ld_readonly_u32 $s11, [%kern_readonly];
+       st_global_u32 $s11, [&prog_global_host_def];
+
+       {
+               arg_u32 %arg;
+               arg_u32 %return_value;
+               st_arg_u32 $s1, [%arg];
+               call &subfunction(%return_value)(%arg);
+               ld_arg_u32 $s1, [%return_value];
+       }
+        ld_kernarg_u64 $d1, [%output_ptr];
+        st_global_u32 $s1, [$d0];
+};
+
+/* Private variable offsets assigned in the order of their appearance */
+/*
+ prog_private @0       (align 256) -> until 254 to ensure all WIs
+ mod_private  @256                    have their chunks aligned
+ func_private @260
+ kern_private @264
+*/
+
+/* Group variable offsets assigned in the order of their appearance */
+/*
+ prog_group @0         (2)
+ mod_group  @4         (4)
+ func_group @8         (1)
+ kern_group @12                (3)
+*/
+
+/* { dg-final { scan-tree-dump "\\\+ 8;.*\\\+ 12;.*\\\+ 4;" "gimple" } } */
+
+/* The "mangling" of the global and readonly vars. */
+/* { dg-final { scan-tree-dump "\[ \]*prog_global = s204;" "gimple" } } */
+
+/* { dg-final { scan-tree-dump "\.module.mod_global;" "gimple" } } */
+
+/* Host defined variables need indirect access as the address is
+   known only at run time. */
+/* { dg-final { scan-tree-dump "\\\*\\\__phsa.host_def.prog_global_host_def.\[0-9\]+_\[0-9\]+ = s11;" "gimple" } } */
+
+/* { dg-final { scan-tree-dump "\.subfunction.func_global;" "gimple" } } */
+/* { dg-final { scan-tree-dump "\.subfunction.func_readonly;" "gimple" } } */
+
+/* { dg-final { scan-tree-dump "kernel.kern_global" "gimple" } } */
+/* { dg-final { scan-tree-dump "kernel.kern_readonly" "gimple" } } */
+
+
diff --git a/gcc/testsuite/brig.dg/test/gimple/vector.hsail b/gcc/testsuite/brig.dg/test/gimple/vector.hsail
new file mode 100644 (file)
index 0000000..2071840
--- /dev/null
@@ -0,0 +1,57 @@
+module &module:1:0:$full:$large:$default;
+
+/* A test for vector operands. */
+
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-original" } */
+
+prog kernel &Kernel(kernarg_u64 %input_ptr, kernarg_u64 %output_ptr)
+{
+        ld_kernarg_u64 $d0, [%input_ptr];
+       ld_v2_global_f32 ($s0, $s1), [$d0];
+       ld_v3_global_f32 ($s2, $s3, $s4), [$d0 + 8];
+       ld_v4_global_f32 ($s5, $s6, $s7, $s8), [$d0 + 20];
+
+       add_f32 $s9, $s0, $s1;
+       combine_v2_b64_b32 $d2, ($s1, $s0);
+       combine_v2_b64_b32 $d3, ($s2, $s3);
+
+       add_pp_f32x2 $d4, $d2, $d3;
+
+       expand_v2_b32_b64 ($s0, $s3), $d4;
+
+        ld_kernarg_u64 $d1, [%output_ptr];
+        st_v2_global_f32 ($s0, $s1), [$d1];
+        st_v3_global_f32 ($s2, $s3, $s4), [$d1 + 8];
+        st_v4_global_f32 ($s5, $s6, $s7, $s8), [$d1 + 20];
+
+        ret;
+};
+
+/* The v2 load is done via casting to a vector datatype ptr. */
+/* { dg-final { scan-tree-dump " = MEM\\\[\\\(vector\\\(2\\\) <float:32> \\\*\\\)" "original"} } */
+
+/* The v3 load is scalarized (at the moment) due to gcc requiring 2's exponent wide vectors. */
+/* { dg-final { scan-tree-dump "s0 = VIEW_CONVERT_EXPR<unsigned int>\\\(BIT_FIELD_REF <mem_read.\[0-9\]+, 32, 0>\\\);\[\n ]+s1 = VIEW_CONVERT_EXPR<unsigned int>\\\(BIT_FIELD_REF <mem_read.\[0-9\]+, 32, 32>\\\);" "original"} } */
+
+/* The v4 load is done via casting to a vector datatype ptr. */
+/* { dg-final { scan-tree-dump " = MEM\\\[\\\(vector\\\(4\\\) <float:32> \\\*\\\)" "original"} } */
+
+/* The combines are generated to vector constructors. */
+/* { dg-final { scan-tree-dump "{s1, s0}" "original"} } */
+/* { dg-final { scan-tree-dump "{s2, s3}" "original"} } */
+
+/* Expands to BIT_FIELD_REFs. */
+/* { dg-final { scan-tree-dump "s0 = BIT_FIELD_REF <d4, 32, 0>;" "original"} } */
+/* { dg-final { scan-tree-dump "s3 = BIT_FIELD_REF <d4, 32, 32>;" "original"} } */
+
+/* The v1 store is done via casting to a vector datatype ptr and constructing a vector from the inputs. */
+/* { dg-final { scan-tree-dump "MEM\\\[\\\(vector\\\(2\\\) <float:32> \\\*\\\)\\\(<float:32> \\\*\\\) d1\\\] = " "original"} } */
+
+/* The v3 store is scalarized (at the moment) due to gcc requiring 2's exponent wide vectors. */
+/* { dg-final { scan-tree-dump "\\\*\\\(<float:32> \\\*\\\) \\\(\\\(sizetype\\\) d1 \\\+ 8\\\) \\\+ 0 = VIEW_CONVERT_EXPR<<float:32>>\\\(s2\\\);" "original"} } */
+/* { dg-final { scan-tree-dump "\\\*\\\(<float:32> \\\*\\\) \\\(\\\(sizetype\\\) d1 \\\+ 8\\\) \\\+ 4 = VIEW_CONVERT_EXPR<<float:32>>\\\(s3\\\);" "original"} } */
+/* { dg-final { scan-tree-dump "\\\*\\\(<float:32> \\\*\\\) \\\(\\\(sizetype\\\) d1 \\\+ 8\\\) \\\+ 8 = VIEW_CONVERT_EXPR<<float:32>>\\\(s4\\\);" "original"} } */
+
+/* The v4 store is done via casting to a vector datatype and constructing a vector from the inputs. */
+/* { dg-final { scan-tree-dump "MEM\\\[\\\(vector\\\(4\\\) <float:32> \\\*\\\)\\\(<float:32> \\\*\\\) \\\(\\\(sizetype\\\) d1 \\\+ 20\\\)\\\] = {VIEW_CONVERT_EXPR<<float:32>>\\\(s5\\\), VIEW_CONVERT_EXPR<<float:32>>\\\(s6\\\), VIEW_CONVERT_EXPR<<float:32>>\\\(s7\\\), VIEW_CONVERT_EXPR<<float:32>>\\\(s8\\\)};" "original"} } */
diff --git a/gcc/testsuite/lib/brig-dg.exp b/gcc/testsuite/lib/brig-dg.exp
new file mode 100644 (file)
index 0000000..ee96708
--- /dev/null
@@ -0,0 +1,29 @@
+#   Copyright (C) 2009-2014 Free Software Foundation, Inc.
+
+# This program 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 3 of the License, or
+# (at your option) any later version.
+# 
+# This program 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+load_lib gcc-dg.exp
+
+# Define brig callbacks for dg.exp.
+
+proc brig-dg-test { prog do_what extra_tool_flags } {
+    set result \
+       [gcc-dg-test-1 brig_target_compile $prog $do_what $extra_tool_flags]
+    
+    set comp_output [lindex $result 0]
+    set output_file [lindex $result 1]
+
+    return [list $comp_output $output_file]
+}
diff --git a/gcc/testsuite/lib/brig.exp b/gcc/testsuite/lib/brig.exp
new file mode 100644 (file)
index 0000000..d1c967d
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright (C) 2009-2016 Free Software Foundation, Inc.
+
+# This program 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 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+load_lib prune.exp
+load_lib gcc-defs.exp
+load_lib timeout.exp
+load_lib target-libpath.exp
+#
+# brig_target_compile -- compile a HSAIL input to BRIG using HSAILasm and then
+#                        compile the BRIG to target ISA using gcc
+
+proc brig_target_compile { source dest type options } {
+    global tmpdir
+    global testname_with_flags
+    if { [file extension $source] == ".hsail" } {
+       # We cannot assume all inputs are .hsail as the dg machinery
+       # calls this for a some c files to check linker plugin support or
+       # similar.
+       set brig_source ${tmpdir}/[file tail ${source}].brig
+       exec HSAILasm $source -o ${brig_source}
+       set source ${brig_source}
+       # Change the testname the .brig.
+       set testname_with_flags [file tail $source]
+    }
+    return [target_compile $source $dest $type $options]
+}
+
index d580750b00a05b8da0600fb431144fc43249a159..4c1879b665388cae565310a3cfec5caf92959394 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
+           Martin Jambor  <mjambor@suse.cz>
+
+       * hsa.h: Moved here from libgomp/plugin/hsa.h.
+
 2017-01-04  Richard Earnshaw  <rearnsha@arm.com>
            Jiong Wang  <jiong.wang@arm.com>
 
diff --git a/include/hsa.h b/include/hsa.h
new file mode 100644 (file)
index 0000000..9b9c826
--- /dev/null
@@ -0,0 +1,635 @@
+/* HSA runtime API 1.0.1 representation description.
+   Copyright (C) 2016-2017 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC 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 3, or (at your option)
+any later version.
+
+GCC 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.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.
+
+The contents of the file was created by extracting data structures, enum,
+typedef and other definitions from HSA Runtime Programmer’s Reference Manual
+Version 1.0 (http://www.hsafoundation.com/standards/).
+
+HTML version is provided on the following link:
+http://www.hsafoundation.com/html/Content/Runtime/Topics/Runtime_title_page.htm
+*/
+
+#ifndef _HSA_H
+#define _HSA_H 1
+
+#define HSA_LARGE_MODEL 1
+
+typedef struct hsa_signal_s { uint64_t handle; } hsa_signal_t;
+typedef enum {
+  HSA_QUEUE_TYPE_MULTI = 0,
+  HSA_QUEUE_TYPE_SINGLE = 1
+} hsa_queue_type_t;
+
+typedef enum { HSA_PROFILE_BASE = 0, HSA_PROFILE_FULL = 1 } hsa_profile_t;
+typedef struct hsa_region_s { uint64_t handle; } hsa_region_t;
+typedef enum {
+  HSA_EXECUTABLE_SYMBOL_INFO_TYPE = 0,
+  HSA_EXECUTABLE_SYMBOL_INFO_NAME_LENGTH = 1,
+  HSA_EXECUTABLE_SYMBOL_INFO_NAME = 2,
+  HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME_LENGTH = 3,
+  HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME = 4,
+  HSA_EXECUTABLE_SYMBOL_INFO_AGENT = 20,
+  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ADDRESS = 21,
+  HSA_EXECUTABLE_SYMBOL_INFO_LINKAGE = 5,
+  HSA_EXECUTABLE_SYMBOL_INFO_IS_DEFINITION = 17,
+  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALLOCATION = 6,
+  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SEGMENT = 7,
+  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALIGNMENT = 8,
+  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SIZE = 9,
+  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_IS_CONST = 10,
+  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT = 22,
+  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE = 11,
+  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT = 12,
+  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE = 13,
+  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE = 14,
+  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK = 15,
+  HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_OBJECT = 23,
+  HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION = 16
+} hsa_executable_symbol_info_t;
+typedef enum {
+  HSA_REGION_GLOBAL_FLAG_KERNARG = 1,
+  HSA_REGION_GLOBAL_FLAG_FINE_GRAINED = 2,
+  HSA_REGION_GLOBAL_FLAG_COARSE_GRAINED = 4
+} hsa_region_global_flag_t;
+typedef struct hsa_code_object_s { uint64_t handle; } hsa_code_object_t;
+typedef enum {
+  HSA_KERNEL_DISPATCH_PACKET_SETUP_WIDTH_DIMENSIONS = 2
+} hsa_kernel_dispatch_packet_setup_width_t;
+typedef enum {
+  HSA_DEVICE_TYPE_CPU = 0,
+  HSA_DEVICE_TYPE_GPU = 1,
+  HSA_DEVICE_TYPE_DSP = 2
+} hsa_device_type_t;
+typedef enum {
+  HSA_STATUS_SUCCESS = 0x0,
+  HSA_STATUS_INFO_BREAK = 0x1,
+  HSA_STATUS_ERROR = 0x1000,
+  HSA_STATUS_ERROR_INVALID_ARGUMENT = 0x1001,
+  HSA_STATUS_ERROR_INVALID_QUEUE_CREATION = 0x1002,
+  HSA_STATUS_ERROR_INVALID_ALLOCATION = 0x1003,
+  HSA_STATUS_ERROR_INVALID_AGENT = 0x1004,
+  HSA_STATUS_ERROR_INVALID_REGION = 0x1005,
+  HSA_STATUS_ERROR_INVALID_SIGNAL = 0x1006,
+  HSA_STATUS_ERROR_INVALID_QUEUE = 0x1007,
+  HSA_STATUS_ERROR_OUT_OF_RESOURCES = 0x1008,
+  HSA_STATUS_ERROR_INVALID_PACKET_FORMAT = 0x1009,
+  HSA_STATUS_ERROR_RESOURCE_FREE = 0x100A,
+  HSA_STATUS_ERROR_NOT_INITIALIZED = 0x100B,
+  HSA_STATUS_ERROR_REFCOUNT_OVERFLOW = 0x100C,
+  HSA_STATUS_ERROR_INCOMPATIBLE_ARGUMENTS = 0x100D,
+  HSA_STATUS_ERROR_INVALID_INDEX = 0x100E,
+  HSA_STATUS_ERROR_INVALID_ISA = 0x100F,
+  HSA_STATUS_ERROR_INVALID_ISA_NAME = 0x1017,
+  HSA_STATUS_ERROR_INVALID_CODE_OBJECT = 0x1010,
+  HSA_STATUS_ERROR_INVALID_EXECUTABLE = 0x1011,
+  HSA_STATUS_ERROR_FROZEN_EXECUTABLE = 0x1012,
+  HSA_STATUS_ERROR_INVALID_SYMBOL_NAME = 0x1013,
+  HSA_STATUS_ERROR_VARIABLE_ALREADY_DEFINED = 0x1014,
+  HSA_STATUS_ERROR_VARIABLE_UNDEFINED = 0x1015,
+  HSA_STATUS_ERROR_EXCEPTION = 0x1016
+} hsa_status_t;
+typedef enum {
+  HSA_EXTENSION_FINALIZER = 0,
+  HSA_EXTENSION_IMAGES = 1
+} hsa_extension_t;
+typedef struct hsa_queue_s {
+  hsa_queue_type_t type;
+  uint32_t features;
+
+#ifdef HSA_LARGE_MODEL
+  void *base_address;
+#elif defined HSA_LITTLE_ENDIAN
+  void *base_address;
+  uint32_t reserved0;
+#else
+  uint32_t reserved0;
+  void *base_address;
+#endif
+
+  hsa_signal_t doorbell_signal;
+  uint32_t size;
+  uint32_t reserved1;
+  uint64_t id;
+} hsa_queue_t;
+typedef struct hsa_agent_dispatch_packet_s {
+  uint16_t header;
+  uint16_t type;
+  uint32_t reserved0;
+
+#ifdef HSA_LARGE_MODEL
+  void *return_address;
+#elif defined HSA_LITTLE_ENDIAN
+  void *return_address;
+  uint32_t reserved1;
+#else
+  uint32_t reserved1;
+  void *return_address;
+#endif
+  uint64_t arg[4];
+  uint64_t reserved2;
+  hsa_signal_t completion_signal;
+} hsa_agent_dispatch_packet_t;
+typedef enum {
+  HSA_CODE_SYMBOL_INFO_TYPE = 0,
+  HSA_CODE_SYMBOL_INFO_NAME_LENGTH = 1,
+  HSA_CODE_SYMBOL_INFO_NAME = 2,
+  HSA_CODE_SYMBOL_INFO_MODULE_NAME_LENGTH = 3,
+  HSA_CODE_SYMBOL_INFO_MODULE_NAME = 4,
+  HSA_CODE_SYMBOL_INFO_LINKAGE = 5,
+  HSA_CODE_SYMBOL_INFO_IS_DEFINITION = 17,
+  HSA_CODE_SYMBOL_INFO_VARIABLE_ALLOCATION = 6,
+  HSA_CODE_SYMBOL_INFO_VARIABLE_SEGMENT = 7,
+  HSA_CODE_SYMBOL_INFO_VARIABLE_ALIGNMENT = 8,
+  HSA_CODE_SYMBOL_INFO_VARIABLE_SIZE = 9,
+  HSA_CODE_SYMBOL_INFO_VARIABLE_IS_CONST = 10,
+  HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE = 11,
+  HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT = 12,
+  HSA_CODE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE = 13,
+  HSA_CODE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE = 14,
+  HSA_CODE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK = 15,
+  HSA_CODE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION = 16
+} hsa_code_symbol_info_t;
+typedef enum {
+  HSA_QUEUE_FEATURE_KERNEL_DISPATCH = 1,
+  HSA_QUEUE_FEATURE_AGENT_DISPATCH = 2
+} hsa_queue_feature_t;
+typedef enum {
+  HSA_VARIABLE_ALLOCATION_AGENT = 0,
+  HSA_VARIABLE_ALLOCATION_PROGRAM = 1
+} hsa_variable_allocation_t;
+typedef enum {
+  HSA_FENCE_SCOPE_NONE = 0,
+  HSA_FENCE_SCOPE_AGENT = 1,
+  HSA_FENCE_SCOPE_SYSTEM = 2
+} hsa_fence_scope_t;
+typedef struct hsa_agent_s { uint64_t handle; } hsa_agent_t;
+typedef enum { HSA_CODE_OBJECT_TYPE_PROGRAM = 0 } hsa_code_object_type_t;
+typedef enum {
+  HSA_SIGNAL_CONDITION_EQ = 0,
+  HSA_SIGNAL_CONDITION_NE = 1,
+  HSA_SIGNAL_CONDITION_LT = 2,
+  HSA_SIGNAL_CONDITION_GTE = 3
+} hsa_signal_condition_t;
+typedef enum {
+  HSA_EXECUTABLE_STATE_UNFROZEN = 0,
+  HSA_EXECUTABLE_STATE_FROZEN = 1
+} hsa_executable_state_t;
+typedef enum {
+  HSA_ENDIANNESS_LITTLE = 0,
+  HSA_ENDIANNESS_BIG = 1
+} hsa_endianness_t;
+typedef enum {
+  HSA_MACHINE_MODEL_SMALL = 0,
+  HSA_MACHINE_MODEL_LARGE = 1
+} hsa_machine_model_t;
+typedef enum {
+  HSA_AGENT_INFO_NAME = 0,
+  HSA_AGENT_INFO_VENDOR_NAME = 1,
+  HSA_AGENT_INFO_FEATURE = 2,
+  HSA_AGENT_INFO_MACHINE_MODEL = 3,
+  HSA_AGENT_INFO_PROFILE = 4,
+  HSA_AGENT_INFO_DEFAULT_FLOAT_ROUNDING_MODE = 5,
+  HSA_AGENT_INFO_BASE_PROFILE_DEFAULT_FLOAT_ROUNDING_MODES = 23,
+  HSA_AGENT_INFO_FAST_F16_OPERATION = 24,
+  HSA_AGENT_INFO_WAVEFRONT_SIZE = 6,
+  HSA_AGENT_INFO_WORKGROUP_MAX_DIM = 7,
+  HSA_AGENT_INFO_WORKGROUP_MAX_SIZE = 8,
+  HSA_AGENT_INFO_GRID_MAX_DIM = 9,
+  HSA_AGENT_INFO_GRID_MAX_SIZE = 10,
+  HSA_AGENT_INFO_FBARRIER_MAX_SIZE = 11,
+  HSA_AGENT_INFO_QUEUES_MAX = 12,
+  HSA_AGENT_INFO_QUEUE_MIN_SIZE = 13,
+  HSA_AGENT_INFO_QUEUE_MAX_SIZE = 14,
+  HSA_AGENT_INFO_QUEUE_TYPE = 15,
+  HSA_AGENT_INFO_NODE = 16,
+  HSA_AGENT_INFO_DEVICE = 17,
+  HSA_AGENT_INFO_CACHE_SIZE = 18,
+  HSA_AGENT_INFO_ISA = 19,
+  HSA_AGENT_INFO_EXTENSIONS = 20,
+  HSA_AGENT_INFO_VERSION_MAJOR = 21,
+  HSA_AGENT_INFO_VERSION_MINOR = 22
+} hsa_agent_info_t;
+typedef struct hsa_barrier_and_packet_s {
+  uint16_t header;
+  uint16_t reserved0;
+  uint32_t reserved1;
+  hsa_signal_t dep_signal[5];
+  uint64_t reserved2;
+  hsa_signal_t completion_signal;
+} hsa_barrier_and_packet_t;
+typedef struct hsa_dim3_s {
+  uint32_t x;
+  uint32_t y;
+  uint32_t z;
+} hsa_dim3_t;
+typedef enum {
+  HSA_ACCESS_PERMISSION_RO = 1,
+  HSA_ACCESS_PERMISSION_WO = 2,
+  HSA_ACCESS_PERMISSION_RW = 3
+} hsa_access_permission_t;
+typedef enum {
+  HSA_AGENT_FEATURE_KERNEL_DISPATCH = 1,
+  HSA_AGENT_FEATURE_AGENT_DISPATCH = 2
+} hsa_agent_feature_t;
+typedef enum {
+  HSA_WAIT_STATE_BLOCKED = 0,
+  HSA_WAIT_STATE_ACTIVE = 1
+} hsa_wait_state_t;
+typedef struct hsa_executable_s { uint64_t handle; } hsa_executable_t;
+typedef enum {
+  HSA_REGION_SEGMENT_GLOBAL = 0,
+  HSA_REGION_SEGMENT_READONLY = 1,
+  HSA_REGION_SEGMENT_PRIVATE = 2,
+  HSA_REGION_SEGMENT_GROUP = 3
+} hsa_region_segment_t;
+typedef enum {
+  HSA_REGION_INFO_SEGMENT = 0,
+  HSA_REGION_INFO_GLOBAL_FLAGS = 1,
+  HSA_REGION_INFO_SIZE = 2,
+  HSA_REGION_INFO_ALLOC_MAX_SIZE = 4,
+  HSA_REGION_INFO_RUNTIME_ALLOC_ALLOWED = 5,
+  HSA_REGION_INFO_RUNTIME_ALLOC_GRANULE = 6,
+  HSA_REGION_INFO_RUNTIME_ALLOC_ALIGNMENT = 7
+} hsa_region_info_t;
+typedef enum {
+  HSA_ISA_INFO_NAME_LENGTH = 0,
+  HSA_ISA_INFO_NAME = 1,
+  HSA_ISA_INFO_CALL_CONVENTION_COUNT = 2,
+  HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONT_SIZE = 3,
+  HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONTS_PER_COMPUTE_UNIT = 4
+} hsa_isa_info_t;
+typedef enum {
+  HSA_VARIABLE_SEGMENT_GLOBAL = 0,
+  HSA_VARIABLE_SEGMENT_READONLY = 1
+} hsa_variable_segment_t;
+typedef struct hsa_callback_data_s { uint64_t handle; } hsa_callback_data_t;
+typedef enum {
+  HSA_SYMBOL_KIND_VARIABLE = 0,
+  HSA_SYMBOL_KIND_KERNEL = 1,
+  HSA_SYMBOL_KIND_INDIRECT_FUNCTION = 2
+} hsa_symbol_kind_t;
+typedef struct hsa_kernel_dispatch_packet_s {
+  uint16_t header;
+  uint16_t setup;
+  uint16_t workgroup_size_x;
+  uint16_t workgroup_size_y;
+  uint16_t workgroup_size_z;
+  uint16_t reserved0;
+  uint32_t grid_size_x;
+  uint32_t grid_size_y;
+  uint32_t grid_size_z;
+  uint32_t private_segment_size;
+  uint32_t group_segment_size;
+  uint64_t kernel_object;
+
+#ifdef HSA_LARGE_MODEL
+  void *kernarg_address;
+#elif defined HSA_LITTLE_ENDIAN
+  void *kernarg_address;
+  uint32_t reserved1;
+#else
+  uint32_t reserved1;
+  void *kernarg_address;
+#endif
+  uint64_t reserved2;
+  hsa_signal_t completion_signal;
+} hsa_kernel_dispatch_packet_t;
+typedef enum {
+  HSA_PACKET_TYPE_VENDOR_SPECIFIC = 0,
+  HSA_PACKET_TYPE_INVALID = 1,
+  HSA_PACKET_TYPE_KERNEL_DISPATCH = 2,
+  HSA_PACKET_TYPE_BARRIER_AND = 3,
+  HSA_PACKET_TYPE_AGENT_DISPATCH = 4,
+  HSA_PACKET_TYPE_BARRIER_OR = 5
+} hsa_packet_type_t;
+typedef enum {
+  HSA_PACKET_HEADER_TYPE = 0,
+  HSA_PACKET_HEADER_BARRIER = 8,
+  HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE = 9,
+  HSA_PACKET_HEADER_RELEASE_FENCE_SCOPE = 11
+} hsa_packet_header_t;
+typedef struct hsa_isa_s { uint64_t handle; } hsa_isa_t;
+typedef enum {
+  HSA_DEFAULT_FLOAT_ROUNDING_MODE_DEFAULT = 0,
+  HSA_DEFAULT_FLOAT_ROUNDING_MODE_ZERO = 1,
+  HSA_DEFAULT_FLOAT_ROUNDING_MODE_NEAR = 2
+} hsa_default_float_rounding_mode_t;
+typedef struct hsa_code_symbol_s { uint64_t handle; } hsa_code_symbol_t;
+typedef struct hsa_executable_symbol_s {
+  uint64_t handle;
+} hsa_executable_symbol_t;
+#ifdef HSA_LARGE_MODEL
+typedef int64_t hsa_signal_value_t;
+#else
+typedef int32_t hsa_signal_value_t;
+#endif
+typedef enum {
+  HSA_EXCEPTION_POLICY_BREAK = 1,
+  HSA_EXCEPTION_POLICY_DETECT = 2
+} hsa_exception_policy_t;
+typedef enum {
+  HSA_SYSTEM_INFO_VERSION_MAJOR = 0,
+  HSA_SYSTEM_INFO_VERSION_MINOR = 1,
+  HSA_SYSTEM_INFO_TIMESTAMP = 2,
+  HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY = 3,
+  HSA_SYSTEM_INFO_SIGNAL_MAX_WAIT = 4,
+  HSA_SYSTEM_INFO_ENDIANNESS = 5,
+  HSA_SYSTEM_INFO_MACHINE_MODEL = 6,
+  HSA_SYSTEM_INFO_EXTENSIONS = 7
+} hsa_system_info_t;
+typedef enum {
+  HSA_EXECUTABLE_INFO_PROFILE = 1,
+  HSA_EXECUTABLE_INFO_STATE = 2
+} hsa_executable_info_t;
+typedef enum {
+  HSA_KERNEL_DISPATCH_PACKET_SETUP_DIMENSIONS = 0
+} hsa_kernel_dispatch_packet_setup_t;
+typedef enum {
+  HSA_PACKET_HEADER_WIDTH_TYPE = 8,
+  HSA_PACKET_HEADER_WIDTH_BARRIER = 1,
+  HSA_PACKET_HEADER_WIDTH_ACQUIRE_FENCE_SCOPE = 2,
+  HSA_PACKET_HEADER_WIDTH_RELEASE_FENCE_SCOPE = 2
+} hsa_packet_header_width_t;
+typedef enum {
+  HSA_CODE_OBJECT_INFO_VERSION = 0,
+  HSA_CODE_OBJECT_INFO_TYPE = 1,
+  HSA_CODE_OBJECT_INFO_ISA = 2,
+  HSA_CODE_OBJECT_INFO_MACHINE_MODEL = 3,
+  HSA_CODE_OBJECT_INFO_PROFILE = 4,
+  HSA_CODE_OBJECT_INFO_DEFAULT_FLOAT_ROUNDING_MODE = 5
+} hsa_code_object_info_t;
+typedef struct hsa_barrier_or_packet_s {
+  uint16_t header;
+  uint16_t reserved0;
+  uint32_t reserved1;
+  hsa_signal_t dep_signal[5];
+  uint64_t reserved2;
+  hsa_signal_t completion_signal;
+} hsa_barrier_or_packet_t;
+typedef enum {
+  HSA_SYMBOL_KIND_LINKAGE_MODULE = 0,
+  HSA_SYMBOL_KIND_LINKAGE_PROGRAM = 1,
+} hsa_symbol_kind_linkage_t;
+hsa_status_t hsa_executable_validate(hsa_executable_t executable,
+                                     uint32_t *result);
+uint64_t hsa_queue_add_write_index_acq_rel(const hsa_queue_t *queue,
+                                           uint64_t value);
+
+uint64_t hsa_queue_add_write_index_acquire(const hsa_queue_t *queue,
+                                           uint64_t value);
+
+uint64_t hsa_queue_add_write_index_relaxed(const hsa_queue_t *queue,
+                                           uint64_t value);
+
+uint64_t hsa_queue_add_write_index_release(const hsa_queue_t *queue,
+                                           uint64_t value);
+hsa_status_t hsa_shut_down();
+void hsa_signal_add_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_add_acquire(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_add_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_add_release(hsa_signal_t signal, hsa_signal_value_t value);
+hsa_status_t hsa_executable_readonly_variable_define(
+    hsa_executable_t executable, hsa_agent_t agent, const char *variable_name,
+    void *address);
+hsa_status_t hsa_agent_extension_supported(uint16_t extension,
+                                           hsa_agent_t agent,
+                                           uint16_t version_major,
+                                           uint16_t version_minor,
+                                           bool *result);
+hsa_signal_value_t hsa_signal_load_acquire(hsa_signal_t signal);
+
+hsa_signal_value_t hsa_signal_load_relaxed(hsa_signal_t signal);
+hsa_status_t hsa_executable_get_info(hsa_executable_t executable,
+                                     hsa_executable_info_t attribute,
+                                     void *value);
+hsa_status_t hsa_iterate_agents(hsa_status_t (*callback)(hsa_agent_t agent,
+                                                         void *data),
+                                void *data);
+void hsa_signal_subtract_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_subtract_acquire(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_subtract_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_subtract_release(hsa_signal_t signal, hsa_signal_value_t value);
+hsa_status_t
+hsa_executable_symbol_get_info(hsa_executable_symbol_t executable_symbol,
+                               hsa_executable_symbol_info_t attribute,
+                               void *value);
+void hsa_signal_xor_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_xor_acquire(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_xor_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_xor_release(hsa_signal_t signal, hsa_signal_value_t value);
+hsa_status_t hsa_code_object_get_info(hsa_code_object_t code_object,
+                                      hsa_code_object_info_t attribute,
+                                      void *value);
+hsa_status_t hsa_code_object_deserialize(void *serialized_code_object,
+                                         size_t serialized_code_object_size,
+                                         const char *options,
+                                         hsa_code_object_t *code_object);
+hsa_status_t hsa_status_string(hsa_status_t status, const char **status_string);
+hsa_status_t hsa_code_object_get_symbol(hsa_code_object_t code_object,
+                                        const char *symbol_name,
+                                        hsa_code_symbol_t *symbol);
+void hsa_signal_store_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_store_release(hsa_signal_t signal, hsa_signal_value_t value);
+hsa_status_t hsa_signal_destroy(hsa_signal_t signal);
+hsa_status_t hsa_system_get_extension_table(uint16_t extension,
+                                            uint16_t version_major,
+                                            uint16_t version_minor,
+                                            void *table);
+hsa_status_t hsa_agent_iterate_regions(
+    hsa_agent_t agent,
+    hsa_status_t (*callback)(hsa_region_t region, void *data), void *data);
+hsa_status_t hsa_executable_agent_global_variable_define(
+    hsa_executable_t executable, hsa_agent_t agent, const char *variable_name,
+    void *address);
+hsa_status_t hsa_queue_create(hsa_agent_t agent, uint32_t size,
+                              hsa_queue_type_t type,
+                              void (*callback)(hsa_status_t status,
+                                               hsa_queue_t *source, void *data),
+                              void *data, uint32_t private_segment_size,
+                              uint32_t group_segment_size, hsa_queue_t **queue);
+hsa_status_t hsa_isa_compatible(hsa_isa_t code_object_isa, hsa_isa_t agent_isa,
+                                bool *result);
+hsa_status_t hsa_code_object_serialize(
+    hsa_code_object_t code_object,
+    hsa_status_t (*alloc_callback)(size_t size, hsa_callback_data_t data,
+                                   void **address),
+    hsa_callback_data_t callback_data, const char *options,
+    void **serialized_code_object, size_t *serialized_code_object_size);
+hsa_status_t hsa_region_get_info(hsa_region_t region,
+                                 hsa_region_info_t attribute, void *value);
+hsa_status_t hsa_executable_freeze(hsa_extension_t executable,
+                                   const char *options);
+hsa_status_t hsa_system_extension_supported(uint16_t extension,
+                                            uint16_t version_major,
+                                            uint16_t version_minor,
+                                            bool *result);
+hsa_signal_value_t hsa_signal_wait_acquire(hsa_signal_t signal,
+                                           hsa_signal_condition_t condition,
+                                           hsa_signal_value_t compare_value,
+                                           uint64_t timeout_hint,
+                                           hsa_wait_state_t wait_state_hint);
+
+hsa_signal_value_t hsa_signal_wait_relaxed(hsa_signal_t signal,
+                                           hsa_signal_condition_t condition,
+                                           hsa_signal_value_t compare_value,
+                                           uint64_t timeout_hint,
+                                           hsa_wait_state_t wait_state_hint);
+hsa_status_t hsa_memory_copy(void *dst, const void *src, size_t size);
+hsa_status_t hsa_memory_free(void *ptr);
+hsa_status_t hsa_queue_destroy(hsa_queue_t *queue);
+hsa_status_t hsa_isa_from_name(const char *name, hsa_isa_t *isa);
+hsa_status_t hsa_isa_get_info(hsa_isa_t isa, hsa_isa_info_t attribute,
+                              uint32_t index, void *value);
+hsa_status_t hsa_signal_create(hsa_signal_value_t initial_value,
+                               uint32_t num_consumers,
+                               const hsa_agent_t *consumers,
+                               hsa_signal_t *signal);
+hsa_status_t hsa_code_symbol_get_info(hsa_code_symbol_t code_symbol,
+                                      hsa_code_symbol_info_t attribute,
+                                      void *value);
+hsa_signal_value_t hsa_signal_cas_acq_rel(hsa_signal_t signal,
+                                          hsa_signal_value_t expected,
+                                          hsa_signal_value_t value);
+
+hsa_signal_value_t hsa_signal_cas_acquire(hsa_signal_t signal,
+                                          hsa_signal_value_t expected,
+                                          hsa_signal_value_t value);
+
+hsa_signal_value_t hsa_signal_cas_relaxed(hsa_signal_t signal,
+                                          hsa_signal_value_t expected,
+                                          hsa_signal_value_t value);
+
+hsa_signal_value_t hsa_signal_cas_release(hsa_signal_t signal,
+                                          hsa_signal_value_t expected,
+                                          hsa_signal_value_t value);
+hsa_status_t hsa_code_object_iterate_symbols(
+    hsa_code_object_t code_object,
+    hsa_status_t (*callback)(hsa_code_object_t code_object,
+                             hsa_code_symbol_t symbol, void *data),
+    void *data);
+void hsa_queue_store_read_index_relaxed(const hsa_queue_t *queue,
+                                        uint64_t value);
+
+void hsa_queue_store_read_index_release(const hsa_queue_t *queue,
+                                        uint64_t value);
+hsa_status_t hsa_memory_assign_agent(void *ptr, hsa_agent_t agent,
+                                     hsa_access_permission_t access);
+hsa_status_t hsa_queue_inactivate(hsa_queue_t *queue);
+hsa_status_t hsa_executable_get_symbol(hsa_executable_t executable,
+                                       const char *module_name,
+                                       const char *symbol_name,
+                                       hsa_agent_t agent,
+                                       int32_t call_convention,
+                                       hsa_executable_symbol_t *symbol);
+uint64_t hsa_queue_cas_write_index_acq_rel(const hsa_queue_t *queue,
+                                           uint64_t expected, uint64_t value);
+
+uint64_t hsa_queue_cas_write_index_acquire(const hsa_queue_t *queue,
+                                           uint64_t expected, uint64_t value);
+
+uint64_t hsa_queue_cas_write_index_relaxed(const hsa_queue_t *queue,
+                                           uint64_t expected, uint64_t value);
+
+uint64_t hsa_queue_cas_write_index_release(const hsa_queue_t *queue,
+                                           uint64_t expected, uint64_t value);
+void hsa_signal_and_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_and_acquire(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_and_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_and_release(hsa_signal_t signal, hsa_signal_value_t value);
+uint64_t hsa_queue_load_read_index_acquire(const hsa_queue_t *queue);
+
+uint64_t hsa_queue_load_read_index_relaxed(const hsa_queue_t *queue);
+hsa_status_t hsa_executable_load_code_object(hsa_executable_t executable,
+                                             hsa_agent_t agent,
+                                             hsa_code_object_t code_object,
+                                             const char *options);
+uint64_t hsa_queue_load_write_index_acquire(const hsa_queue_t *queue);
+
+uint64_t hsa_queue_load_write_index_relaxed(const hsa_queue_t *queue);
+hsa_status_t hsa_agent_get_exception_policies(hsa_agent_t agent,
+                                              hsa_profile_t profile,
+                                              uint16_t *mask);
+hsa_status_t hsa_memory_deregister(void *ptr, size_t size);
+void hsa_signal_or_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_or_acquire(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_or_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
+
+void hsa_signal_or_release(hsa_signal_t signal, hsa_signal_value_t value);
+hsa_status_t hsa_soft_queue_create(hsa_region_t region, uint32_t size,
+                                   hsa_queue_type_t type, uint32_t features,
+                                   hsa_signal_t doorbell_signal,
+                                   hsa_queue_t **queue);
+hsa_status_t hsa_executable_iterate_symbols(
+    hsa_executable_t executable,
+    hsa_status_t (*callback)(hsa_executable_t executable,
+                             hsa_executable_symbol_t symbol, void *data),
+    void *data);
+hsa_status_t hsa_memory_register(void *ptr, size_t size);
+void hsa_queue_store_write_index_relaxed(const hsa_queue_t *queue,
+                                         uint64_t value);
+
+void hsa_queue_store_write_index_release(const hsa_queue_t *queue,
+                                         uint64_t value);
+hsa_status_t hsa_executable_global_variable_define(hsa_executable_t executable,
+                                                   const char *variable_name,
+                                                   void *address);
+hsa_status_t hsa_executable_destroy(hsa_executable_t executable);
+hsa_status_t hsa_code_object_destroy(hsa_code_object_t code_object);
+hsa_status_t hsa_memory_allocate(hsa_region_t region, size_t size, void **ptr);
+hsa_signal_value_t hsa_signal_exchange_acq_rel(hsa_signal_t signal,
+                                               hsa_signal_value_t value);
+
+hsa_signal_value_t hsa_signal_exchange_acquire(hsa_signal_t signal,
+                                               hsa_signal_value_t value);
+
+hsa_signal_value_t hsa_signal_exchange_relaxed(hsa_signal_t signal,
+                                               hsa_signal_value_t value);
+
+hsa_signal_value_t hsa_signal_exchange_release(hsa_signal_t signal,
+                                               hsa_signal_value_t value);
+hsa_status_t hsa_agent_get_info(hsa_agent_t agent, hsa_agent_info_t attribute,
+                                void *value);
+hsa_status_t hsa_init();
+hsa_status_t hsa_system_get_info(hsa_system_info_t attribute, void *value);
+hsa_status_t hsa_executable_create(hsa_profile_t profile,
+                                   hsa_executable_state_t executable_state,
+                                   const char *options,
+                                   hsa_executable_t *executable);
+
+#endif /* _HSA_H */
index 806c4f2f2bdb3a3b1f6a6c39437f18637d040c5b..be6a13a99fc44eaddb8b86b979ecdb3d8c947296 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
+           Martin Jambor  <mjambor@suse.cz>
+
+       * plugin/hsa.h: Moved to top level include.
+       * plugin/plugin-hsa.c: Chanfgd include of hsa.h accordingly.
+
 2017-01-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR other/79046
diff --git a/libgomp/plugin/hsa.h b/libgomp/plugin/hsa.h
deleted file mode 100644 (file)
index 9b9c826..0000000
+++ /dev/null
@@ -1,635 +0,0 @@
-/* HSA runtime API 1.0.1 representation description.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC 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 3, or (at your option)
-any later version.
-
-GCC 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.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.
-
-The contents of the file was created by extracting data structures, enum,
-typedef and other definitions from HSA Runtime Programmer’s Reference Manual
-Version 1.0 (http://www.hsafoundation.com/standards/).
-
-HTML version is provided on the following link:
-http://www.hsafoundation.com/html/Content/Runtime/Topics/Runtime_title_page.htm
-*/
-
-#ifndef _HSA_H
-#define _HSA_H 1
-
-#define HSA_LARGE_MODEL 1
-
-typedef struct hsa_signal_s { uint64_t handle; } hsa_signal_t;
-typedef enum {
-  HSA_QUEUE_TYPE_MULTI = 0,
-  HSA_QUEUE_TYPE_SINGLE = 1
-} hsa_queue_type_t;
-
-typedef enum { HSA_PROFILE_BASE = 0, HSA_PROFILE_FULL = 1 } hsa_profile_t;
-typedef struct hsa_region_s { uint64_t handle; } hsa_region_t;
-typedef enum {
-  HSA_EXECUTABLE_SYMBOL_INFO_TYPE = 0,
-  HSA_EXECUTABLE_SYMBOL_INFO_NAME_LENGTH = 1,
-  HSA_EXECUTABLE_SYMBOL_INFO_NAME = 2,
-  HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME_LENGTH = 3,
-  HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME = 4,
-  HSA_EXECUTABLE_SYMBOL_INFO_AGENT = 20,
-  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ADDRESS = 21,
-  HSA_EXECUTABLE_SYMBOL_INFO_LINKAGE = 5,
-  HSA_EXECUTABLE_SYMBOL_INFO_IS_DEFINITION = 17,
-  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALLOCATION = 6,
-  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SEGMENT = 7,
-  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALIGNMENT = 8,
-  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SIZE = 9,
-  HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_IS_CONST = 10,
-  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT = 22,
-  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE = 11,
-  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT = 12,
-  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE = 13,
-  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE = 14,
-  HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK = 15,
-  HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_OBJECT = 23,
-  HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION = 16
-} hsa_executable_symbol_info_t;
-typedef enum {
-  HSA_REGION_GLOBAL_FLAG_KERNARG = 1,
-  HSA_REGION_GLOBAL_FLAG_FINE_GRAINED = 2,
-  HSA_REGION_GLOBAL_FLAG_COARSE_GRAINED = 4
-} hsa_region_global_flag_t;
-typedef struct hsa_code_object_s { uint64_t handle; } hsa_code_object_t;
-typedef enum {
-  HSA_KERNEL_DISPATCH_PACKET_SETUP_WIDTH_DIMENSIONS = 2
-} hsa_kernel_dispatch_packet_setup_width_t;
-typedef enum {
-  HSA_DEVICE_TYPE_CPU = 0,
-  HSA_DEVICE_TYPE_GPU = 1,
-  HSA_DEVICE_TYPE_DSP = 2
-} hsa_device_type_t;
-typedef enum {
-  HSA_STATUS_SUCCESS = 0x0,
-  HSA_STATUS_INFO_BREAK = 0x1,
-  HSA_STATUS_ERROR = 0x1000,
-  HSA_STATUS_ERROR_INVALID_ARGUMENT = 0x1001,
-  HSA_STATUS_ERROR_INVALID_QUEUE_CREATION = 0x1002,
-  HSA_STATUS_ERROR_INVALID_ALLOCATION = 0x1003,
-  HSA_STATUS_ERROR_INVALID_AGENT = 0x1004,
-  HSA_STATUS_ERROR_INVALID_REGION = 0x1005,
-  HSA_STATUS_ERROR_INVALID_SIGNAL = 0x1006,
-  HSA_STATUS_ERROR_INVALID_QUEUE = 0x1007,
-  HSA_STATUS_ERROR_OUT_OF_RESOURCES = 0x1008,
-  HSA_STATUS_ERROR_INVALID_PACKET_FORMAT = 0x1009,
-  HSA_STATUS_ERROR_RESOURCE_FREE = 0x100A,
-  HSA_STATUS_ERROR_NOT_INITIALIZED = 0x100B,
-  HSA_STATUS_ERROR_REFCOUNT_OVERFLOW = 0x100C,
-  HSA_STATUS_ERROR_INCOMPATIBLE_ARGUMENTS = 0x100D,
-  HSA_STATUS_ERROR_INVALID_INDEX = 0x100E,
-  HSA_STATUS_ERROR_INVALID_ISA = 0x100F,
-  HSA_STATUS_ERROR_INVALID_ISA_NAME = 0x1017,
-  HSA_STATUS_ERROR_INVALID_CODE_OBJECT = 0x1010,
-  HSA_STATUS_ERROR_INVALID_EXECUTABLE = 0x1011,
-  HSA_STATUS_ERROR_FROZEN_EXECUTABLE = 0x1012,
-  HSA_STATUS_ERROR_INVALID_SYMBOL_NAME = 0x1013,
-  HSA_STATUS_ERROR_VARIABLE_ALREADY_DEFINED = 0x1014,
-  HSA_STATUS_ERROR_VARIABLE_UNDEFINED = 0x1015,
-  HSA_STATUS_ERROR_EXCEPTION = 0x1016
-} hsa_status_t;
-typedef enum {
-  HSA_EXTENSION_FINALIZER = 0,
-  HSA_EXTENSION_IMAGES = 1
-} hsa_extension_t;
-typedef struct hsa_queue_s {
-  hsa_queue_type_t type;
-  uint32_t features;
-
-#ifdef HSA_LARGE_MODEL
-  void *base_address;
-#elif defined HSA_LITTLE_ENDIAN
-  void *base_address;
-  uint32_t reserved0;
-#else
-  uint32_t reserved0;
-  void *base_address;
-#endif
-
-  hsa_signal_t doorbell_signal;
-  uint32_t size;
-  uint32_t reserved1;
-  uint64_t id;
-} hsa_queue_t;
-typedef struct hsa_agent_dispatch_packet_s {
-  uint16_t header;
-  uint16_t type;
-  uint32_t reserved0;
-
-#ifdef HSA_LARGE_MODEL
-  void *return_address;
-#elif defined HSA_LITTLE_ENDIAN
-  void *return_address;
-  uint32_t reserved1;
-#else
-  uint32_t reserved1;
-  void *return_address;
-#endif
-  uint64_t arg[4];
-  uint64_t reserved2;
-  hsa_signal_t completion_signal;
-} hsa_agent_dispatch_packet_t;
-typedef enum {
-  HSA_CODE_SYMBOL_INFO_TYPE = 0,
-  HSA_CODE_SYMBOL_INFO_NAME_LENGTH = 1,
-  HSA_CODE_SYMBOL_INFO_NAME = 2,
-  HSA_CODE_SYMBOL_INFO_MODULE_NAME_LENGTH = 3,
-  HSA_CODE_SYMBOL_INFO_MODULE_NAME = 4,
-  HSA_CODE_SYMBOL_INFO_LINKAGE = 5,
-  HSA_CODE_SYMBOL_INFO_IS_DEFINITION = 17,
-  HSA_CODE_SYMBOL_INFO_VARIABLE_ALLOCATION = 6,
-  HSA_CODE_SYMBOL_INFO_VARIABLE_SEGMENT = 7,
-  HSA_CODE_SYMBOL_INFO_VARIABLE_ALIGNMENT = 8,
-  HSA_CODE_SYMBOL_INFO_VARIABLE_SIZE = 9,
-  HSA_CODE_SYMBOL_INFO_VARIABLE_IS_CONST = 10,
-  HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE = 11,
-  HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT = 12,
-  HSA_CODE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE = 13,
-  HSA_CODE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE = 14,
-  HSA_CODE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK = 15,
-  HSA_CODE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION = 16
-} hsa_code_symbol_info_t;
-typedef enum {
-  HSA_QUEUE_FEATURE_KERNEL_DISPATCH = 1,
-  HSA_QUEUE_FEATURE_AGENT_DISPATCH = 2
-} hsa_queue_feature_t;
-typedef enum {
-  HSA_VARIABLE_ALLOCATION_AGENT = 0,
-  HSA_VARIABLE_ALLOCATION_PROGRAM = 1
-} hsa_variable_allocation_t;
-typedef enum {
-  HSA_FENCE_SCOPE_NONE = 0,
-  HSA_FENCE_SCOPE_AGENT = 1,
-  HSA_FENCE_SCOPE_SYSTEM = 2
-} hsa_fence_scope_t;
-typedef struct hsa_agent_s { uint64_t handle; } hsa_agent_t;
-typedef enum { HSA_CODE_OBJECT_TYPE_PROGRAM = 0 } hsa_code_object_type_t;
-typedef enum {
-  HSA_SIGNAL_CONDITION_EQ = 0,
-  HSA_SIGNAL_CONDITION_NE = 1,
-  HSA_SIGNAL_CONDITION_LT = 2,
-  HSA_SIGNAL_CONDITION_GTE = 3
-} hsa_signal_condition_t;
-typedef enum {
-  HSA_EXECUTABLE_STATE_UNFROZEN = 0,
-  HSA_EXECUTABLE_STATE_FROZEN = 1
-} hsa_executable_state_t;
-typedef enum {
-  HSA_ENDIANNESS_LITTLE = 0,
-  HSA_ENDIANNESS_BIG = 1
-} hsa_endianness_t;
-typedef enum {
-  HSA_MACHINE_MODEL_SMALL = 0,
-  HSA_MACHINE_MODEL_LARGE = 1
-} hsa_machine_model_t;
-typedef enum {
-  HSA_AGENT_INFO_NAME = 0,
-  HSA_AGENT_INFO_VENDOR_NAME = 1,
-  HSA_AGENT_INFO_FEATURE = 2,
-  HSA_AGENT_INFO_MACHINE_MODEL = 3,
-  HSA_AGENT_INFO_PROFILE = 4,
-  HSA_AGENT_INFO_DEFAULT_FLOAT_ROUNDING_MODE = 5,
-  HSA_AGENT_INFO_BASE_PROFILE_DEFAULT_FLOAT_ROUNDING_MODES = 23,
-  HSA_AGENT_INFO_FAST_F16_OPERATION = 24,
-  HSA_AGENT_INFO_WAVEFRONT_SIZE = 6,
-  HSA_AGENT_INFO_WORKGROUP_MAX_DIM = 7,
-  HSA_AGENT_INFO_WORKGROUP_MAX_SIZE = 8,
-  HSA_AGENT_INFO_GRID_MAX_DIM = 9,
-  HSA_AGENT_INFO_GRID_MAX_SIZE = 10,
-  HSA_AGENT_INFO_FBARRIER_MAX_SIZE = 11,
-  HSA_AGENT_INFO_QUEUES_MAX = 12,
-  HSA_AGENT_INFO_QUEUE_MIN_SIZE = 13,
-  HSA_AGENT_INFO_QUEUE_MAX_SIZE = 14,
-  HSA_AGENT_INFO_QUEUE_TYPE = 15,
-  HSA_AGENT_INFO_NODE = 16,
-  HSA_AGENT_INFO_DEVICE = 17,
-  HSA_AGENT_INFO_CACHE_SIZE = 18,
-  HSA_AGENT_INFO_ISA = 19,
-  HSA_AGENT_INFO_EXTENSIONS = 20,
-  HSA_AGENT_INFO_VERSION_MAJOR = 21,
-  HSA_AGENT_INFO_VERSION_MINOR = 22
-} hsa_agent_info_t;
-typedef struct hsa_barrier_and_packet_s {
-  uint16_t header;
-  uint16_t reserved0;
-  uint32_t reserved1;
-  hsa_signal_t dep_signal[5];
-  uint64_t reserved2;
-  hsa_signal_t completion_signal;
-} hsa_barrier_and_packet_t;
-typedef struct hsa_dim3_s {
-  uint32_t x;
-  uint32_t y;
-  uint32_t z;
-} hsa_dim3_t;
-typedef enum {
-  HSA_ACCESS_PERMISSION_RO = 1,
-  HSA_ACCESS_PERMISSION_WO = 2,
-  HSA_ACCESS_PERMISSION_RW = 3
-} hsa_access_permission_t;
-typedef enum {
-  HSA_AGENT_FEATURE_KERNEL_DISPATCH = 1,
-  HSA_AGENT_FEATURE_AGENT_DISPATCH = 2
-} hsa_agent_feature_t;
-typedef enum {
-  HSA_WAIT_STATE_BLOCKED = 0,
-  HSA_WAIT_STATE_ACTIVE = 1
-} hsa_wait_state_t;
-typedef struct hsa_executable_s { uint64_t handle; } hsa_executable_t;
-typedef enum {
-  HSA_REGION_SEGMENT_GLOBAL = 0,
-  HSA_REGION_SEGMENT_READONLY = 1,
-  HSA_REGION_SEGMENT_PRIVATE = 2,
-  HSA_REGION_SEGMENT_GROUP = 3
-} hsa_region_segment_t;
-typedef enum {
-  HSA_REGION_INFO_SEGMENT = 0,
-  HSA_REGION_INFO_GLOBAL_FLAGS = 1,
-  HSA_REGION_INFO_SIZE = 2,
-  HSA_REGION_INFO_ALLOC_MAX_SIZE = 4,
-  HSA_REGION_INFO_RUNTIME_ALLOC_ALLOWED = 5,
-  HSA_REGION_INFO_RUNTIME_ALLOC_GRANULE = 6,
-  HSA_REGION_INFO_RUNTIME_ALLOC_ALIGNMENT = 7
-} hsa_region_info_t;
-typedef enum {
-  HSA_ISA_INFO_NAME_LENGTH = 0,
-  HSA_ISA_INFO_NAME = 1,
-  HSA_ISA_INFO_CALL_CONVENTION_COUNT = 2,
-  HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONT_SIZE = 3,
-  HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONTS_PER_COMPUTE_UNIT = 4
-} hsa_isa_info_t;
-typedef enum {
-  HSA_VARIABLE_SEGMENT_GLOBAL = 0,
-  HSA_VARIABLE_SEGMENT_READONLY = 1
-} hsa_variable_segment_t;
-typedef struct hsa_callback_data_s { uint64_t handle; } hsa_callback_data_t;
-typedef enum {
-  HSA_SYMBOL_KIND_VARIABLE = 0,
-  HSA_SYMBOL_KIND_KERNEL = 1,
-  HSA_SYMBOL_KIND_INDIRECT_FUNCTION = 2
-} hsa_symbol_kind_t;
-typedef struct hsa_kernel_dispatch_packet_s {
-  uint16_t header;
-  uint16_t setup;
-  uint16_t workgroup_size_x;
-  uint16_t workgroup_size_y;
-  uint16_t workgroup_size_z;
-  uint16_t reserved0;
-  uint32_t grid_size_x;
-  uint32_t grid_size_y;
-  uint32_t grid_size_z;
-  uint32_t private_segment_size;
-  uint32_t group_segment_size;
-  uint64_t kernel_object;
-
-#ifdef HSA_LARGE_MODEL
-  void *kernarg_address;
-#elif defined HSA_LITTLE_ENDIAN
-  void *kernarg_address;
-  uint32_t reserved1;
-#else
-  uint32_t reserved1;
-  void *kernarg_address;
-#endif
-  uint64_t reserved2;
-  hsa_signal_t completion_signal;
-} hsa_kernel_dispatch_packet_t;
-typedef enum {
-  HSA_PACKET_TYPE_VENDOR_SPECIFIC = 0,
-  HSA_PACKET_TYPE_INVALID = 1,
-  HSA_PACKET_TYPE_KERNEL_DISPATCH = 2,
-  HSA_PACKET_TYPE_BARRIER_AND = 3,
-  HSA_PACKET_TYPE_AGENT_DISPATCH = 4,
-  HSA_PACKET_TYPE_BARRIER_OR = 5
-} hsa_packet_type_t;
-typedef enum {
-  HSA_PACKET_HEADER_TYPE = 0,
-  HSA_PACKET_HEADER_BARRIER = 8,
-  HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE = 9,
-  HSA_PACKET_HEADER_RELEASE_FENCE_SCOPE = 11
-} hsa_packet_header_t;
-typedef struct hsa_isa_s { uint64_t handle; } hsa_isa_t;
-typedef enum {
-  HSA_DEFAULT_FLOAT_ROUNDING_MODE_DEFAULT = 0,
-  HSA_DEFAULT_FLOAT_ROUNDING_MODE_ZERO = 1,
-  HSA_DEFAULT_FLOAT_ROUNDING_MODE_NEAR = 2
-} hsa_default_float_rounding_mode_t;
-typedef struct hsa_code_symbol_s { uint64_t handle; } hsa_code_symbol_t;
-typedef struct hsa_executable_symbol_s {
-  uint64_t handle;
-} hsa_executable_symbol_t;
-#ifdef HSA_LARGE_MODEL
-typedef int64_t hsa_signal_value_t;
-#else
-typedef int32_t hsa_signal_value_t;
-#endif
-typedef enum {
-  HSA_EXCEPTION_POLICY_BREAK = 1,
-  HSA_EXCEPTION_POLICY_DETECT = 2
-} hsa_exception_policy_t;
-typedef enum {
-  HSA_SYSTEM_INFO_VERSION_MAJOR = 0,
-  HSA_SYSTEM_INFO_VERSION_MINOR = 1,
-  HSA_SYSTEM_INFO_TIMESTAMP = 2,
-  HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY = 3,
-  HSA_SYSTEM_INFO_SIGNAL_MAX_WAIT = 4,
-  HSA_SYSTEM_INFO_ENDIANNESS = 5,
-  HSA_SYSTEM_INFO_MACHINE_MODEL = 6,
-  HSA_SYSTEM_INFO_EXTENSIONS = 7
-} hsa_system_info_t;
-typedef enum {
-  HSA_EXECUTABLE_INFO_PROFILE = 1,
-  HSA_EXECUTABLE_INFO_STATE = 2
-} hsa_executable_info_t;
-typedef enum {
-  HSA_KERNEL_DISPATCH_PACKET_SETUP_DIMENSIONS = 0
-} hsa_kernel_dispatch_packet_setup_t;
-typedef enum {
-  HSA_PACKET_HEADER_WIDTH_TYPE = 8,
-  HSA_PACKET_HEADER_WIDTH_BARRIER = 1,
-  HSA_PACKET_HEADER_WIDTH_ACQUIRE_FENCE_SCOPE = 2,
-  HSA_PACKET_HEADER_WIDTH_RELEASE_FENCE_SCOPE = 2
-} hsa_packet_header_width_t;
-typedef enum {
-  HSA_CODE_OBJECT_INFO_VERSION = 0,
-  HSA_CODE_OBJECT_INFO_TYPE = 1,
-  HSA_CODE_OBJECT_INFO_ISA = 2,
-  HSA_CODE_OBJECT_INFO_MACHINE_MODEL = 3,
-  HSA_CODE_OBJECT_INFO_PROFILE = 4,
-  HSA_CODE_OBJECT_INFO_DEFAULT_FLOAT_ROUNDING_MODE = 5
-} hsa_code_object_info_t;
-typedef struct hsa_barrier_or_packet_s {
-  uint16_t header;
-  uint16_t reserved0;
-  uint32_t reserved1;
-  hsa_signal_t dep_signal[5];
-  uint64_t reserved2;
-  hsa_signal_t completion_signal;
-} hsa_barrier_or_packet_t;
-typedef enum {
-  HSA_SYMBOL_KIND_LINKAGE_MODULE = 0,
-  HSA_SYMBOL_KIND_LINKAGE_PROGRAM = 1,
-} hsa_symbol_kind_linkage_t;
-hsa_status_t hsa_executable_validate(hsa_executable_t executable,
-                                     uint32_t *result);
-uint64_t hsa_queue_add_write_index_acq_rel(const hsa_queue_t *queue,
-                                           uint64_t value);
-
-uint64_t hsa_queue_add_write_index_acquire(const hsa_queue_t *queue,
-                                           uint64_t value);
-
-uint64_t hsa_queue_add_write_index_relaxed(const hsa_queue_t *queue,
-                                           uint64_t value);
-
-uint64_t hsa_queue_add_write_index_release(const hsa_queue_t *queue,
-                                           uint64_t value);
-hsa_status_t hsa_shut_down();
-void hsa_signal_add_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_add_acquire(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_add_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_add_release(hsa_signal_t signal, hsa_signal_value_t value);
-hsa_status_t hsa_executable_readonly_variable_define(
-    hsa_executable_t executable, hsa_agent_t agent, const char *variable_name,
-    void *address);
-hsa_status_t hsa_agent_extension_supported(uint16_t extension,
-                                           hsa_agent_t agent,
-                                           uint16_t version_major,
-                                           uint16_t version_minor,
-                                           bool *result);
-hsa_signal_value_t hsa_signal_load_acquire(hsa_signal_t signal);
-
-hsa_signal_value_t hsa_signal_load_relaxed(hsa_signal_t signal);
-hsa_status_t hsa_executable_get_info(hsa_executable_t executable,
-                                     hsa_executable_info_t attribute,
-                                     void *value);
-hsa_status_t hsa_iterate_agents(hsa_status_t (*callback)(hsa_agent_t agent,
-                                                         void *data),
-                                void *data);
-void hsa_signal_subtract_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_subtract_acquire(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_subtract_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_subtract_release(hsa_signal_t signal, hsa_signal_value_t value);
-hsa_status_t
-hsa_executable_symbol_get_info(hsa_executable_symbol_t executable_symbol,
-                               hsa_executable_symbol_info_t attribute,
-                               void *value);
-void hsa_signal_xor_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_xor_acquire(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_xor_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_xor_release(hsa_signal_t signal, hsa_signal_value_t value);
-hsa_status_t hsa_code_object_get_info(hsa_code_object_t code_object,
-                                      hsa_code_object_info_t attribute,
-                                      void *value);
-hsa_status_t hsa_code_object_deserialize(void *serialized_code_object,
-                                         size_t serialized_code_object_size,
-                                         const char *options,
-                                         hsa_code_object_t *code_object);
-hsa_status_t hsa_status_string(hsa_status_t status, const char **status_string);
-hsa_status_t hsa_code_object_get_symbol(hsa_code_object_t code_object,
-                                        const char *symbol_name,
-                                        hsa_code_symbol_t *symbol);
-void hsa_signal_store_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_store_release(hsa_signal_t signal, hsa_signal_value_t value);
-hsa_status_t hsa_signal_destroy(hsa_signal_t signal);
-hsa_status_t hsa_system_get_extension_table(uint16_t extension,
-                                            uint16_t version_major,
-                                            uint16_t version_minor,
-                                            void *table);
-hsa_status_t hsa_agent_iterate_regions(
-    hsa_agent_t agent,
-    hsa_status_t (*callback)(hsa_region_t region, void *data), void *data);
-hsa_status_t hsa_executable_agent_global_variable_define(
-    hsa_executable_t executable, hsa_agent_t agent, const char *variable_name,
-    void *address);
-hsa_status_t hsa_queue_create(hsa_agent_t agent, uint32_t size,
-                              hsa_queue_type_t type,
-                              void (*callback)(hsa_status_t status,
-                                               hsa_queue_t *source, void *data),
-                              void *data, uint32_t private_segment_size,
-                              uint32_t group_segment_size, hsa_queue_t **queue);
-hsa_status_t hsa_isa_compatible(hsa_isa_t code_object_isa, hsa_isa_t agent_isa,
-                                bool *result);
-hsa_status_t hsa_code_object_serialize(
-    hsa_code_object_t code_object,
-    hsa_status_t (*alloc_callback)(size_t size, hsa_callback_data_t data,
-                                   void **address),
-    hsa_callback_data_t callback_data, const char *options,
-    void **serialized_code_object, size_t *serialized_code_object_size);
-hsa_status_t hsa_region_get_info(hsa_region_t region,
-                                 hsa_region_info_t attribute, void *value);
-hsa_status_t hsa_executable_freeze(hsa_extension_t executable,
-                                   const char *options);
-hsa_status_t hsa_system_extension_supported(uint16_t extension,
-                                            uint16_t version_major,
-                                            uint16_t version_minor,
-                                            bool *result);
-hsa_signal_value_t hsa_signal_wait_acquire(hsa_signal_t signal,
-                                           hsa_signal_condition_t condition,
-                                           hsa_signal_value_t compare_value,
-                                           uint64_t timeout_hint,
-                                           hsa_wait_state_t wait_state_hint);
-
-hsa_signal_value_t hsa_signal_wait_relaxed(hsa_signal_t signal,
-                                           hsa_signal_condition_t condition,
-                                           hsa_signal_value_t compare_value,
-                                           uint64_t timeout_hint,
-                                           hsa_wait_state_t wait_state_hint);
-hsa_status_t hsa_memory_copy(void *dst, const void *src, size_t size);
-hsa_status_t hsa_memory_free(void *ptr);
-hsa_status_t hsa_queue_destroy(hsa_queue_t *queue);
-hsa_status_t hsa_isa_from_name(const char *name, hsa_isa_t *isa);
-hsa_status_t hsa_isa_get_info(hsa_isa_t isa, hsa_isa_info_t attribute,
-                              uint32_t index, void *value);
-hsa_status_t hsa_signal_create(hsa_signal_value_t initial_value,
-                               uint32_t num_consumers,
-                               const hsa_agent_t *consumers,
-                               hsa_signal_t *signal);
-hsa_status_t hsa_code_symbol_get_info(hsa_code_symbol_t code_symbol,
-                                      hsa_code_symbol_info_t attribute,
-                                      void *value);
-hsa_signal_value_t hsa_signal_cas_acq_rel(hsa_signal_t signal,
-                                          hsa_signal_value_t expected,
-                                          hsa_signal_value_t value);
-
-hsa_signal_value_t hsa_signal_cas_acquire(hsa_signal_t signal,
-                                          hsa_signal_value_t expected,
-                                          hsa_signal_value_t value);
-
-hsa_signal_value_t hsa_signal_cas_relaxed(hsa_signal_t signal,
-                                          hsa_signal_value_t expected,
-                                          hsa_signal_value_t value);
-
-hsa_signal_value_t hsa_signal_cas_release(hsa_signal_t signal,
-                                          hsa_signal_value_t expected,
-                                          hsa_signal_value_t value);
-hsa_status_t hsa_code_object_iterate_symbols(
-    hsa_code_object_t code_object,
-    hsa_status_t (*callback)(hsa_code_object_t code_object,
-                             hsa_code_symbol_t symbol, void *data),
-    void *data);
-void hsa_queue_store_read_index_relaxed(const hsa_queue_t *queue,
-                                        uint64_t value);
-
-void hsa_queue_store_read_index_release(const hsa_queue_t *queue,
-                                        uint64_t value);
-hsa_status_t hsa_memory_assign_agent(void *ptr, hsa_agent_t agent,
-                                     hsa_access_permission_t access);
-hsa_status_t hsa_queue_inactivate(hsa_queue_t *queue);
-hsa_status_t hsa_executable_get_symbol(hsa_executable_t executable,
-                                       const char *module_name,
-                                       const char *symbol_name,
-                                       hsa_agent_t agent,
-                                       int32_t call_convention,
-                                       hsa_executable_symbol_t *symbol);
-uint64_t hsa_queue_cas_write_index_acq_rel(const hsa_queue_t *queue,
-                                           uint64_t expected, uint64_t value);
-
-uint64_t hsa_queue_cas_write_index_acquire(const hsa_queue_t *queue,
-                                           uint64_t expected, uint64_t value);
-
-uint64_t hsa_queue_cas_write_index_relaxed(const hsa_queue_t *queue,
-                                           uint64_t expected, uint64_t value);
-
-uint64_t hsa_queue_cas_write_index_release(const hsa_queue_t *queue,
-                                           uint64_t expected, uint64_t value);
-void hsa_signal_and_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_and_acquire(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_and_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_and_release(hsa_signal_t signal, hsa_signal_value_t value);
-uint64_t hsa_queue_load_read_index_acquire(const hsa_queue_t *queue);
-
-uint64_t hsa_queue_load_read_index_relaxed(const hsa_queue_t *queue);
-hsa_status_t hsa_executable_load_code_object(hsa_executable_t executable,
-                                             hsa_agent_t agent,
-                                             hsa_code_object_t code_object,
-                                             const char *options);
-uint64_t hsa_queue_load_write_index_acquire(const hsa_queue_t *queue);
-
-uint64_t hsa_queue_load_write_index_relaxed(const hsa_queue_t *queue);
-hsa_status_t hsa_agent_get_exception_policies(hsa_agent_t agent,
-                                              hsa_profile_t profile,
-                                              uint16_t *mask);
-hsa_status_t hsa_memory_deregister(void *ptr, size_t size);
-void hsa_signal_or_acq_rel(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_or_acquire(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_or_relaxed(hsa_signal_t signal, hsa_signal_value_t value);
-
-void hsa_signal_or_release(hsa_signal_t signal, hsa_signal_value_t value);
-hsa_status_t hsa_soft_queue_create(hsa_region_t region, uint32_t size,
-                                   hsa_queue_type_t type, uint32_t features,
-                                   hsa_signal_t doorbell_signal,
-                                   hsa_queue_t **queue);
-hsa_status_t hsa_executable_iterate_symbols(
-    hsa_executable_t executable,
-    hsa_status_t (*callback)(hsa_executable_t executable,
-                             hsa_executable_symbol_t symbol, void *data),
-    void *data);
-hsa_status_t hsa_memory_register(void *ptr, size_t size);
-void hsa_queue_store_write_index_relaxed(const hsa_queue_t *queue,
-                                         uint64_t value);
-
-void hsa_queue_store_write_index_release(const hsa_queue_t *queue,
-                                         uint64_t value);
-hsa_status_t hsa_executable_global_variable_define(hsa_executable_t executable,
-                                                   const char *variable_name,
-                                                   void *address);
-hsa_status_t hsa_executable_destroy(hsa_executable_t executable);
-hsa_status_t hsa_code_object_destroy(hsa_code_object_t code_object);
-hsa_status_t hsa_memory_allocate(hsa_region_t region, size_t size, void **ptr);
-hsa_signal_value_t hsa_signal_exchange_acq_rel(hsa_signal_t signal,
-                                               hsa_signal_value_t value);
-
-hsa_signal_value_t hsa_signal_exchange_acquire(hsa_signal_t signal,
-                                               hsa_signal_value_t value);
-
-hsa_signal_value_t hsa_signal_exchange_relaxed(hsa_signal_t signal,
-                                               hsa_signal_value_t value);
-
-hsa_signal_value_t hsa_signal_exchange_release(hsa_signal_t signal,
-                                               hsa_signal_value_t value);
-hsa_status_t hsa_agent_get_info(hsa_agent_t agent, hsa_agent_info_t attribute,
-                                void *value);
-hsa_status_t hsa_init();
-hsa_status_t hsa_system_get_info(hsa_system_info_t attribute, void *value);
-hsa_status_t hsa_executable_create(hsa_profile_t profile,
-                                   hsa_executable_state_t executable_state,
-                                   const char *options,
-                                   hsa_executable_t *executable);
-
-#endif /* _HSA_H */
index af6fad21d9b985ec2e32a1ba58faca514cb38dee..9757fc66b84471f7aee40c40f52913b883cd9964 100644 (file)
@@ -34,7 +34,7 @@
 #include <pthread.h>
 #include <inttypes.h>
 #include <stdbool.h>
-#include <plugin/hsa.h>
+#include <hsa.h>
 #include <plugin/hsa_ext_finalize.h>
 #include <dlfcn.h>
 #include "libgomp-plugin.h"
diff --git a/libhsail-rt/ChangeLog b/libhsail-rt/ChangeLog
new file mode 100644 (file)
index 0000000..51625f8
--- /dev/null
@@ -0,0 +1,27 @@
+2017-01-24  Pekka Jääskeläinen <pekka@parmance.com>
+           Martin Jambor  <mjambor@suse.cz>
+
+       * Makefile.am: New file.
+       * target-config.h.in: Likewise.
+       * configure.ac: Likewise.
+       * configure: Likewise.
+       * config.h.in: Likewise.
+       * aclocal.m4: Likewise.
+       * README: Likewise.
+       * Makefile.in: Likewise.
+       * include/internal/fibers.h: Likewise.
+       * include/internal/phsa-queue-interface.h: Likewise.
+       * include/internal/phsa-rt.h: Likewise.
+       * include/internal/workitems.h: Likewise.
+       * rt/arithmetic.c: Likewise.
+       * rt/atomics.c: Likewise.
+       * rt/bitstring.c: Likewise.
+       * rt/fbarrier.c: Likewise.
+       * rt/fibers.c: Likewise.
+       * rt/fp16.c: Likewise.
+       * rt/misc.c: Likewise.
+       * rt/multimedia.c: Likewise.
+       * rt/queue.c: Likewise.
+       * rt/sat_arithmetic.c: Likewise.
+       * rt/segment.c: Likewise.
+       * rt/workitems.c: Likewise.
diff --git a/libhsail-rt/Makefile.am b/libhsail-rt/Makefile.am
new file mode 100644 (file)
index 0000000..ef12df8
--- /dev/null
@@ -0,0 +1,124 @@
+# Makefile.am -- libhsail-rt library Makefile.
+
+# Starting point copied from libcilkrts:
+#  @copyright
+#  Copyright (C) 2011, 2013, Intel Corporation
+#  All rights reserved.
+#
+#  @copyright
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+#
+#    * Redistributions of source code must retain the above copyright
+#      notice, this list of conditions and the following disclaimer.
+#    * Redistributions in binary form must reproduce the above copyright
+#      notice, this list of conditions and the following disclaimer in
+#      the documentation and/or other materials provided with the
+#      distribution.
+#    * Neither the name of Intel Corporation nor the names of its
+#      contributors may be used to endorse or promote products derived
+#      from this software without specific prior written permission.
+#
+#  @copyright
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+#  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+#  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+#  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+#  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+#  WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+
+# libhsail-rt modifications:
+# Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+# for General Processor Tech.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+# Process this file with autoreconf to produce Makefile.in.
+
+AUTOMAKE_OPTIONS = foreign subdir-objects
+
+gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
+
+MAINT_CHARSET = latin1
+
+mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
+
+ACLOCAL_AMFLAGS = -I m4
+
+WARN_CFLAGS = $(WARN_FLAGS) $(WERROR)
+
+# -I/-D flags to pass when compiling.
+AM_CPPFLAGS = -I$(srcdir)/rt -I$(srcdir)/include/internal
+
+AM_CFLAGS = \
+       -I $(srcdir)/../include \
+       -I $(srcdir)/../libgcc \
+       -I $(MULTIBUILDTOP)../../gcc/include $(PTH_CFLAGS)
+
+toolexeclib_LTLIBRARIES = libhsail-rt.la
+
+runtime_files = \
+       rt/arithmetic.c \
+       rt/atomics.c \
+       rt/bitstring.c \
+       rt/fbarrier.c \
+       rt/fp16.c \
+       rt/misc.c \
+       rt/multimedia.c \
+       rt/queue.c \
+       rt/sat_arithmetic.c \
+       rt/segment.c \
+       rt/workitems.c \
+       rt/fibers.c
+
+libhsail_rt_la_SOURCES = $(runtime_files)
+libhsail_rt_la_LDFLAGS  = -rpath '$(libdir)'
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+       "AR_FLAGS=$(AR_FLAGS)" \
+       "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+       "CFLAGS=$(CFLAGS)" \
+       "CXXFLAGS=$(CXXFLAGS)" \
+       "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+       "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+       "INSTALL=$(INSTALL)" \
+       "INSTALL_DATA=$(INSTALL_DATA)" \
+       "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+       "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+       "JC1FLAGS=$(JC1FLAGS)" \
+       "LDFLAGS=$(LDFLAGS)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+       "MAKE=$(MAKE)" \
+       "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+       "PICFLAG=$(PICFLAG)" \
+       "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+       "SHELL=$(SHELL)" \
+       "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+       "exec_prefix=$(exec_prefix)" \
+       "infodir=$(infodir)" \
+       "libdir=$(libdir)" \
+       "prefix=$(prefix)" \
+       "includedir=$(includedir)" \
+       "AR=$(AR)" \
+       "AS=$(AS)" \
+       "LD=$(LD)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "NM=$(NM)" \
+       "PICFLAG=$(PICFLAG)" \
+       "RANLIB=$(RANLIB)" \
+       "DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES=
+
+
diff --git a/libhsail-rt/Makefile.in b/libhsail-rt/Makefile.in
new file mode 100644 (file)
index 0000000..250cfbc
--- /dev/null
@@ -0,0 +1,740 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Makefile.am -- libhsail-rt library Makefile.
+
+# Starting point copied from libcilkrts:
+#  @copyright
+#  Copyright (C) 2011, 2013, Intel Corporation
+#  All rights reserved.
+#
+#  @copyright
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+#
+#    * Redistributions of source code must retain the above copyright
+#      notice, this list of conditions and the following disclaimer.
+#    * Redistributions in binary form must reproduce the above copyright
+#      notice, this list of conditions and the following disclaimer in
+#      the documentation and/or other materials provided with the
+#      distribution.
+#    * Neither the name of Intel Corporation nor the names of its
+#      contributors may be used to endorse or promote products derived
+#      from this software without specific prior written permission.
+#
+#  @copyright
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+#  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+#  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+#  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+#  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+#  WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+
+# libhsail-rt modifications:
+# Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+# for General Processor Tech.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+# Process this file with autoreconf to produce Makefile.in.
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = .
+DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/configure $(am__configure_deps) \
+       $(srcdir)/target-config.h.in $(srcdir)/../mkinstalldirs \
+       $(srcdir)/../depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
+       $(top_srcdir)/../config/lead-dot.m4 \
+       $(top_srcdir)/../config/multi.m4 $(top_srcdir)/../libtool.m4 \
+       $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
+       $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+CONFIG_HEADER = target-config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(toolexeclibdir)"
+LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
+libhsail_rt_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am__objects_1 = rt/arithmetic.lo rt/atomics.lo rt/bitstring.lo \
+       rt/fbarrier.lo rt/fp16.lo rt/misc.lo rt/multimedia.lo \
+       rt/queue.lo rt/sat_arithmetic.lo rt/segment.lo rt/workitems.lo \
+       rt/fibers.lo
+am_libhsail_rt_la_OBJECTS = $(am__objects_1)
+libhsail_rt_la_OBJECTS = $(am_libhsail_rt_la_OBJECTS)
+libhsail_rt_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+       $(libhsail_rt_la_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/../depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+       --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+       --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+       $(LDFLAGS) -o $@
+SOURCES = $(libhsail_rt_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+ETAGS = etags
+CTAGS = ctags
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+config_dir = @config_dir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+toolexecdir = @toolexecdir@
+toolexeclibdir = @toolexeclibdir@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign subdir-objects
+gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
+MAINT_CHARSET = latin1
+mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
+ACLOCAL_AMFLAGS = -I m4
+WARN_CFLAGS = $(WARN_FLAGS) $(WERROR)
+
+# -I/-D flags to pass when compiling.
+AM_CPPFLAGS = -I$(srcdir)/rt -I$(srcdir)/include/internal
+AM_CFLAGS = \
+       -I $(srcdir)/../include \
+       -I $(srcdir)/../libgcc \
+       -I $(MULTIBUILDTOP)../../gcc/include $(PTH_CFLAGS)
+
+toolexeclib_LTLIBRARIES = libhsail-rt.la
+runtime_files = \
+       rt/arithmetic.c \
+       rt/atomics.c \
+       rt/bitstring.c \
+       rt/fbarrier.c \
+       rt/fp16.c \
+       rt/misc.c \
+       rt/multimedia.c \
+       rt/queue.c \
+       rt/sat_arithmetic.c \
+       rt/segment.c \
+       rt/workitems.c \
+       rt/fibers.c
+
+libhsail_rt_la_SOURCES = $(runtime_files)
+libhsail_rt_la_LDFLAGS = -rpath '$(libdir)'
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+       "AR_FLAGS=$(AR_FLAGS)" \
+       "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+       "CFLAGS=$(CFLAGS)" \
+       "CXXFLAGS=$(CXXFLAGS)" \
+       "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+       "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+       "INSTALL=$(INSTALL)" \
+       "INSTALL_DATA=$(INSTALL_DATA)" \
+       "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+       "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+       "JC1FLAGS=$(JC1FLAGS)" \
+       "LDFLAGS=$(LDFLAGS)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+       "MAKE=$(MAKE)" \
+       "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+       "PICFLAG=$(PICFLAG)" \
+       "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+       "SHELL=$(SHELL)" \
+       "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+       "exec_prefix=$(exec_prefix)" \
+       "infodir=$(infodir)" \
+       "libdir=$(libdir)" \
+       "prefix=$(prefix)" \
+       "includedir=$(includedir)" \
+       "AR=$(AR)" \
+       "AS=$(AS)" \
+       "LD=$(LD)" \
+       "LIBCFLAGS=$(LIBCFLAGS)" \
+       "NM=$(NM)" \
+       "PICFLAG=$(PICFLAG)" \
+       "RANLIB=$(RANLIB)" \
+       "DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES = 
+all: target-config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh: Makefile
+       @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+             $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+target-config.h: stamp-h1
+       @if test ! -f $@; then rm -f stamp-h1; else :; fi
+       @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+
+stamp-h1: $(srcdir)/target-config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status target-config.h
+$(srcdir)/target-config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+       ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f target-config.h stamp-h1
+install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \
+       }
+
+uninstall-toolexeclibLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \
+       done
+
+clean-toolexeclibLTLIBRARIES:
+       -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES)
+       @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+rt/$(am__dirstamp):
+       @$(MKDIR_P) rt
+       @: > rt/$(am__dirstamp)
+rt/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) rt/$(DEPDIR)
+       @: > rt/$(DEPDIR)/$(am__dirstamp)
+rt/arithmetic.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/atomics.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/bitstring.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/fbarrier.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/fp16.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/misc.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/multimedia.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/queue.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/sat_arithmetic.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/segment.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/workitems.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+rt/fibers.lo: rt/$(am__dirstamp) rt/$(DEPDIR)/$(am__dirstamp)
+libhsail-rt.la: $(libhsail_rt_la_OBJECTS) $(libhsail_rt_la_DEPENDENCIES) $(EXTRA_libhsail_rt_la_DEPENDENCIES) 
+       $(libhsail_rt_la_LINK) -rpath $(toolexeclibdir) $(libhsail_rt_la_OBJECTS) $(libhsail_rt_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+       -rm -f rt/arithmetic.$(OBJEXT)
+       -rm -f rt/arithmetic.lo
+       -rm -f rt/atomics.$(OBJEXT)
+       -rm -f rt/atomics.lo
+       -rm -f rt/bitstring.$(OBJEXT)
+       -rm -f rt/bitstring.lo
+       -rm -f rt/fbarrier.$(OBJEXT)
+       -rm -f rt/fbarrier.lo
+       -rm -f rt/fibers.$(OBJEXT)
+       -rm -f rt/fibers.lo
+       -rm -f rt/fp16.$(OBJEXT)
+       -rm -f rt/fp16.lo
+       -rm -f rt/misc.$(OBJEXT)
+       -rm -f rt/misc.lo
+       -rm -f rt/multimedia.$(OBJEXT)
+       -rm -f rt/multimedia.lo
+       -rm -f rt/queue.$(OBJEXT)
+       -rm -f rt/queue.lo
+       -rm -f rt/sat_arithmetic.$(OBJEXT)
+       -rm -f rt/sat_arithmetic.lo
+       -rm -f rt/segment.$(OBJEXT)
+       -rm -f rt/segment.lo
+       -rm -f rt/workitems.$(OBJEXT)
+       -rm -f rt/workitems.lo
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/arithmetic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/atomics.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/bitstring.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/fbarrier.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/fibers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/fp16.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/misc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/multimedia.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/queue.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/sat_arithmetic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/segment.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rt/$(DEPDIR)/workitems.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@   depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+       -rm -rf rt/.libs rt/_libs
+
+distclean-libtool:
+       -rm -f libtool config.lt
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) target-config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) target-config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) target-config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS) target-config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) target-config.h
+installdirs:
+       for dir in "$(DESTDIR)$(toolexeclibdir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -rm -f rt/$(DEPDIR)/$(am__dirstamp)
+       -rm -f rt/$(am__dirstamp)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-toolexeclibLTLIBRARIES \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf rt/$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-toolexeclibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -rf rt/$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-toolexeclibLTLIBRARIES
+
+.MAKE: all install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+       clean-generic clean-libtool clean-toolexeclibLTLIBRARIES ctags \
+       distclean distclean-compile distclean-generic distclean-hdr \
+       distclean-libtool distclean-tags dvi dvi-am html html-am info \
+       info-am install install-am install-data install-data-am \
+       install-dvi install-dvi-am install-exec install-exec-am \
+       install-html install-html-am install-info install-info-am \
+       install-man install-pdf install-pdf-am install-ps \
+       install-ps-am install-strip install-toolexeclibLTLIBRARIES \
+       installcheck installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags uninstall uninstall-am uninstall-toolexeclibLTLIBRARIES
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libhsail-rt/README b/libhsail-rt/README
new file mode 100644 (file)
index 0000000..2792253
--- /dev/null
@@ -0,0 +1,4 @@
+Run autoconf2.64 && automake-1.11  to regenerate the buildfiles.
+You might need to manually tweak the minor automake version number
+in configure.ac and aclocal.m4 (search for 1.11.6) in case your
+local 1.11 minor version doesn't match. 
\ No newline at end of file
diff --git a/libhsail-rt/aclocal.m4 b/libhsail-rt/aclocal.m4
new file mode 100644 (file)
index 0000000..f77a2da
--- /dev/null
@@ -0,0 +1,978 @@
+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],,
+[m4_warning([this file was generated for autoconf 2.64.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.6], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+             [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                 [_AM_DEPENDENCIES(CC)],
+                 [define([AC_PROG_CC],
+                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                 [_AM_DEPENDENCIES(CXX)],
+                 [define([AC_PROG_CXX],
+                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                 [_AM_DEPENDENCIES(OBJC)],
+                 [define([AC_PROG_OBJC],
+                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([../config/depstand.m4])
+m4_include([../config/lead-dot.m4])
+m4_include([../config/multi.m4])
+m4_include([../libtool.m4])
+m4_include([../ltoptions.m4])
+m4_include([../ltsugar.m4])
+m4_include([../ltversion.m4])
+m4_include([../lt~obsolete.m4])
diff --git a/libhsail-rt/config.h.in b/libhsail-rt/config.h.in
new file mode 100644 (file)
index 0000000..9dd4110
--- /dev/null
@@ -0,0 +1,217 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if you have the `acosl' function. */
+#undef HAVE_ACOSL
+
+/* Define to 1 if you have the `asinl' function. */
+#undef HAVE_ASINL
+
+/* Define to 1 if you have the `atan2l' function. */
+#undef HAVE_ATAN2L
+
+/* Define to 1 if you have the `atanl' function. */
+#undef HAVE_ATANL
+
+/* Define to 1 if you have the `cosl' function. */
+#undef HAVE_COSL
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `expl' function. */
+#undef HAVE_EXPL
+
+/* Define to 1 if you have the `expm1l' function. */
+#undef HAVE_EXPM1L
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `ldexpl' function. */
+#undef HAVE_LDEXPL
+
+/* Define to 1 if you have the <linux/ether.h> header file. */
+#undef HAVE_LINUX_ETHER_H
+
+/* Define to 1 if you have the <linux/fs.h> header file. */
+#undef HAVE_LINUX_FS_H
+
+/* Define to 1 if you have the <linux/reboot.h> header file. */
+#undef HAVE_LINUX_REBOOT_H
+
+/* Define to 1 if you have the `log10l' function. */
+#undef HAVE_LOG10L
+
+/* Define to 1 if you have the `log1pl' function. */
+#undef HAVE_LOG1PL
+
+/* Define to 1 if you have the `logl' function. */
+#undef HAVE_LOGL
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <netinet/icmp6.h> header file. */
+#undef HAVE_NETINET_ICMP6_H
+
+/* Define to 1 if you have the <netinet/if_ether.h> header file. */
+#undef HAVE_NETINET_IF_ETHER_H
+
+/* Define to 1 if you have the <netinet/in_syst.h> header file. */
+#undef HAVE_NETINET_IN_SYST_H
+
+/* Define to 1 if you have the <netinet/ip.h> header file. */
+#undef HAVE_NETINET_IP_H
+
+/* Define to 1 if you have the <netinet/ip_mroute.h> header file. */
+#undef HAVE_NETINET_IP_MROUTE_H
+
+/* Define to 1 if you have the <netpacket/packet.h> header file. */
+#undef HAVE_NETPACKET_PACKET_H
+
+/* Define to 1 if you have the <net/if_arp.h> header file. */
+#undef HAVE_NET_IF_ARP_H
+
+/* Define to 1 if you have the <net/if.h> header file. */
+#undef HAVE_NET_IF_H
+
+/* Define to 1 if you have the <net/route.h> header file. */
+#undef HAVE_NET_ROUTE_H
+
+/* Define to 1 if you have the <sched.h> header file. */
+#undef HAVE_SCHED_H
+
+/* Define to 1 if you have the `sinl' function. */
+#undef HAVE_SINL
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if the compiler provides the __sync_bool_compare_and_swap
+   function for uint32 */
+#undef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4
+
+/* Define to 1 if the compiler provides the __sync_bool_compare_and_swap
+   function for uint64 */
+#undef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8
+
+/* Define to 1 if you have the <syscall.h> header file. */
+#undef HAVE_SYSCALL_H
+
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+#undef HAVE_SYS_EPOLL_H
+
+/* Define to 1 if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define to 1 if you have the <sys/inotify.h> header file. */
+#undef HAVE_SYS_INOTIFY_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/mount.h> header file. */
+#undef HAVE_SYS_MOUNT_H
+
+/* Define to 1 if you have the <sys/prctl.h> header file. */
+#undef HAVE_SYS_PRCTL_H
+
+/* Define to 1 if you have the <sys/ptrace.h> header file. */
+#undef HAVE_SYS_PTRACE_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/statfs.h> header file. */
+#undef HAVE_SYS_STATFS_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/syscall.h> header file. */
+#undef HAVE_SYS_SYSCALL_H
+
+/* Define to 1 if you have the <sys/sysinfo.h> header file. */
+#undef HAVE_SYS_SYSINFO_H
+
+/* Define to 1 if you have the <sys/timex.h> header file. */
+#undef HAVE_SYS_TIMEX_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/user.h> header file. */
+#undef HAVE_SYS_USER_H
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#undef HAVE_SYS_UTSNAME_H
+
+/* Define to 1 if you have the <sys/vfs.h> header file. */
+#undef HAVE_SYS_VFS_H
+
+/* Define to 1 if you have the `tanl' function. */
+#undef HAVE_TANL
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <utime.h> header file. */
+#undef HAVE_UTIME_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
diff --git a/libhsail-rt/configure b/libhsail-rt/configure
new file mode 100644 (file)
index 0000000..0c10830
--- /dev/null
@@ -0,0 +1,17016 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.64 for phsa HSAIL runtime library 1.0.
+#
+# Report bugs to <pekka.jaaskelainen@parmance.com>.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
+# Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+       # neutralization value for shells without unset; and this also
+       # works around shells that cannot unset nonexistent variables.
+       BASH_ENV=/dev/null
+       ENV=/dev/null
+       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+       export CONFIG_SHELL
+       exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: pekka.jaaskelainen@parmance.com about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='phsa HSAIL runtime library'
+PACKAGE_TARNAME='phsa-hsail-runtime-library'
+PACKAGE_VERSION='1.0'
+PACKAGE_STRING='phsa HSAIL runtime library 1.0'
+PACKAGE_BUGREPORT='pekka.jaaskelainen@parmance.com'
+PACKAGE_URL=''
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+toolexeclibdir
+toolexecdir
+CXXCPP
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+RANLIB
+AR
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+MAC_LINKER_SCRIPT_FALSE
+MAC_LINKER_SCRIPT_TRUE
+LINUX_LINKER_SCRIPT_FALSE
+LINUX_LINKER_SCRIPT_TRUE
+config_dir
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_maintainer_mode
+enable_dependency_tracking
+enable_version_specific_runtime_libs
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+enable_libtool_lock
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CPP
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information."
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures phsa HSAIL runtime library 1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root
+                          [DATAROOTDIR/doc/phsa-hsail-runtime-library]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of phsa HSAIL runtime library 1.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-version-specific-runtime-libs
+                          Specify that runtime libraries should be installed
+                          in a compi ler-specific directory
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CPP         C preprocessor
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <pekka.jaaskelainen@parmance.com>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+phsa HSAIL runtime library configure 1.0
+generated by GNU Autoconf 2.64
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } >/dev/null && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } >/dev/null && {
+        test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_cxx_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+       return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+       return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  return $ac_retval
+
+} # ac_fn_c_compute_int
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by phsa HSAIL runtime library $as_me 1.0, which was
+generated by GNU Autoconf 2.64.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+# Needed to define ${target}.  Needs to be very early to avoid annoying
+# warning about calling AC_ARG_PROGRAM before AC_CANONICAL_SYSTEM
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  for ac_t in install-sh install.sh shtool; do
+    if test -f "$ac_dir/$ac_t"; then
+      ac_aux_dir=$ac_dir
+      ac_install_sh="$ac_aux_dir/$ac_t -c"
+      break 2
+    fi
+  done
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if test "${ac_cv_build+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if test "${ac_cv_host+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if test "${ac_cv_target+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+target_alias=${target_alias-$host_alias}
+
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
+    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+        for ac_exec_ext in '' $ac_executable_extensions; do
+          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+            'mkdir (GNU coreutils) '* | \
+            'mkdir (coreutils) '* | \
+            'mkdir (fileutils) '4.1*)
+              ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+              break 3;;
+          esac
+        done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='phsa-hsail-runtime-library'
+ VERSION='1.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "no acceptable C compiler found in \$PATH
+See \`config.log' for more details." "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    rm -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+if test -z "$ac_file"; then :
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "C compiler cannot create executables
+See \`config.log' for more details." "$LINENO" 5; }; }
+fi
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if test "${ac_cv_objext+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    rm -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+        CXXFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+# AC_PROG_LIBTOOL
+ac_config_files="$ac_config_files Makefile"
+
+
+if test "${multilib}" = "yes"; then
+  multilib_arg="--enable-multilib"
+else
+  multilib_arg=
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-version-specific-runtime-libs" >&5
+$as_echo_n "checking for --enable-version-specific-runtime-libs... " >&6; }
+# Check whether --enable-version-specific-runtime-libs was given.
+if test "${enable_version_specific_runtime_libs+set}" = set; then :
+  enableval=$enable_version_specific_runtime_libs; case "$enableval" in
+    yes) enable_version_specific_runtime_libs=yes ;;
+    no)  enable_version_specific_runtime_libs=no ;;
+    *)   as_fn_error "Unknown argument to enable/disable version-specific libs
+" "$LINENO" 5;;
+   esac
+else
+  enable_version_specific_runtime_libs=no
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_version_specific_runtime_libs" >&5
+$as_echo "$enable_version_specific_runtime_libs" >&6; }
+
+# Calculate toolexeclibdir
+# Also toolexecdir, though it's only used in toolexeclibdir
+case ${enable_version_specific_runtime_libs} in
+  yes)
+    # Need the gcc compiler version to know where to install libraries
+    # and header files if --enable-version-specific-runtime-libs option
+    # is selected.
+    toolexecdir='$(libdir)/gcc/$(target_alias)'
+    toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
+    ;;
+  no)
+    if test -n "$with_cross_host" &&
+       test x"$with_cross_host" != x"no"; then
+      # Install a library built with a cross compiler in tooldir, not libdir.
+      toolexecdir='$(exec_prefix)/$(target_alias)'
+      toolexeclibdir='$(toolexecdir)/lib'
+    else
+      toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+      toolexeclibdir='$(libdir)'
+    fi
+    multi_os_directory=`$CC -print-multi-os-directory`
+    case $multi_os_directory in
+      .) ;; # Avoid trailing /.
+      *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+    esac
+    ;;
+esac
+
+# Set config_dir based on the target.  config_dir specifies where to get
+# target-specific files.  The generic implementation is incomplete, but
+# contains information on what's needed
+case "${target}" in
+
+  x86_64-*-*)
+    config_dir="x86"
+    ;;
+
+  i?86-*-*)
+    config_dir="x86"
+    ;;
+
+  *)
+    config_dir="generic"
+    ;;
+
+esac
+
+
+# We have linker scripts for appropriate operating systems
+linux_linker_script=no
+case "${host}" in
+    *-*-linux*)
+        linux_linker_script=yes
+        ;;
+esac
+ if test "$linux_linker_script" = "yes"; then
+  LINUX_LINKER_SCRIPT_TRUE=
+  LINUX_LINKER_SCRIPT_FALSE='#'
+else
+  LINUX_LINKER_SCRIPT_TRUE='#'
+  LINUX_LINKER_SCRIPT_FALSE=
+fi
+
+
+mac_linker_script=no
+case "${host}" in
+    *-*-apple*)
+        mac_linker_script=yes
+        ;;
+esac
+ if test "$mac_linker_script" = "yes"; then
+  MAC_LINKER_SCRIPT_TRUE=
+  MAC_LINKER_SCRIPT_FALSE='#'
+else
+  MAC_LINKER_SCRIPT_TRUE='#'
+  MAC_LINKER_SCRIPT_FALSE=
+fi
+
+
+enable_dlopen=yes
+
+
+
+case `pwd` in
+  *\ * | *\    *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.2.7a'
+macro_revision='1.3134'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`print -r -- -n 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if test "${ac_cv_path_SED+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if test "${ac_cv_path_FGREP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break
+       ;;
+      *)
+       test "$with_gnu_ld" != yes && break
+       ;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if test "${lt_cv_path_NM+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+       # Check to see if the nm accepts a BSD-compat flag.
+       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+       #   nm: unknown option "B" ignored
+       # Tru64's nm complains that /dev/null is an invalid object file
+       case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+       */dev/null* | *'Invalid file or object type'*)
+         lt_cv_path_NM="$tmp_nm -B"
+         break
+         ;;
+       *)
+         case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+         */dev/null*)
+           lt_cv_path_NM="$tmp_nm -p"
+           break
+           ;;
+         *)
+           lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+           continue # so that we can try to find one that supports BSD flags
+           ;;
+         esac
+         ;;
+       esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if test "${lt_cv_nm_interface+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536      # usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[         ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+                = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+             test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[     ]\($symcode$symcode*\)[         ][      ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+       mv -f "$nlist"T "$nlist"
+      else
+       rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+       if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+         cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+         # Now generate the symbol file.
+         eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+         cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+         $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+         cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+         # Now try linking the two files.
+         mv conftest.$ac_objext conftstm.$ac_objext
+         lt_save_LIBS="$LIBS"
+         lt_save_CFLAGS="$CFLAGS"
+         LIBS="conftstm.$ac_objext"
+         CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+           pipe_works=yes
+         fi
+         LIBS="$lt_save_LIBS"
+         CFLAGS="$lt_save_CFLAGS"
+       else
+         echo "cannot find nm_test_func in $nlist" >&5
+       fi
+      else
+       echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+       HPUX_IA64_MODE="32"
+       ;;
+      *ELF-64*)
+       HPUX_IA64_MODE="64"
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -melf32bsmip"
+         ;;
+       *N32*)
+         LD="${LD-ld} -melf32bmipn32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -melf64bmip"
+       ;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+       *32-bit*)
+         LD="${LD-ld} -32"
+         ;;
+       *N32*)
+         LD="${LD-ld} -n32"
+         ;;
+       *64-bit*)
+         LD="${LD-ld} -64"
+         ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_i386_fbsd"
+           ;;
+         x86_64-*linux*)
+           case `/usr/bin/file conftest.o` in
+             *x86-64*)
+               LD="${LD-ld} -m elf32_x86_64"
+               ;;
+             *)
+               LD="${LD-ld} -m elf_i386"
+               ;;
+           esac
+           ;;
+         powerpc64le-*linux*)
+           LD="${LD-ld} -m elf32lppclinux"
+           ;;
+         powerpc64-*linux*)
+           LD="${LD-ld} -m elf32ppclinux"
+           ;;
+         s390x-*linux*)
+           LD="${LD-ld} -m elf_s390"
+           ;;
+         sparc64-*linux*)
+           LD="${LD-ld} -m elf32_sparc"
+           ;;
+       esac
+       ;;
+      *64-bit*)
+       case $host in
+         x86_64-*kfreebsd*-gnu)
+           LD="${LD-ld} -m elf_x86_64_fbsd"
+           ;;
+         x86_64-*linux*)
+           LD="${LD-ld} -m elf_x86_64"
+           ;;
+         powerpcle-*linux*)
+           LD="${LD-ld} -m elf64lppc"
+           ;;
+         powerpc-*linux*)
+           LD="${LD-ld} -m elf64ppc"
+           ;;
+         s390*-*linux*|s390*-*tpf*)
+           LD="${LD-ld} -m elf64_s390"
+           ;;
+         sparc*-*linux*)
+           LD="${LD-ld} -m elf64_sparc"
+           ;;
+       esac
+       ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+       if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+         LD="${LD-ld} -64"
+       fi
+       ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+       # By default we will add the -single_module flag. You can override
+       # by either setting the environment variable LT_MULTI_MODULE
+       # non-empty at configure time, or by adding -multi_module to the
+       # link flags.
+       rm -rf libconftest.dylib*
+       echo "int foo(void){return 1;}" > conftest.c
+       echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+       $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+         -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+       if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+         lt_cv_apple_cc_single_mod=yes
+       else
+         cat conftest.err >&5
+       fi
+       rm -rf libconftest.dylib*
+       rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+       LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if test "${lt_cv_ld_force_load+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
+       lt_cv_ld_force_load=yes
+      else
+       cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+       10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+       10.[012][,.]*)
+         _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+       10.*)
+         _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+eval as_val=\$$as_ac_Header
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+# Set options
+
+
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_shared=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_static=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+       IFS="$lt_save_ifs"
+       if test "X$pkg" = "X$p"; then
+         enable_fast_install=yes
+       fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if test "${lt_cv_objdir+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+       case $deplibs_check_method in
+       "file_magic "*)
+         file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+         MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+         if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+           $EGREP "$file_magic_regex" > /dev/null; then
+           :
+         else
+           cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+         fi ;;
+       esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static='-Bstatic'
+      fi
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       # +Z the default
+       ;;
+      *)
+       lt_prog_compiler_pic='-fPIC'
+       ;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      lt_prog_compiler_pic='-Xcompiler -fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static='-Bstatic'
+      else
+       lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+       # +Z the default
+       ;;
+      *)
+       lt_prog_compiler_pic='+Z'
+       ;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-KPIC'
+       lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fPIC'
+       lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='--shared'
+       lt_prog_compiler_static='--static'
+       ;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+       # which looks to be a dead project)
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-fpic'
+       lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+       # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+       lt_prog_compiler_wl='-Wl,'
+       lt_prog_compiler_pic='-qpic'
+       lt_prog_compiler_static='-qstaticlink'
+       ;;
+      *)
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ F* | *Sun*Fortran*)
+         # Sun Fortran 8.3 passes all unrecognized flags to the linker
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl=''
+         ;;
+       *Sun\ C*)
+         # Sun C 5.9
+         lt_prog_compiler_pic='-KPIC'
+         lt_prog_compiler_static='-Bstatic'
+         lt_prog_compiler_wl='-Wl,'
+         ;;
+       esac
+       ;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+       lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+       lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+       lt_prog_compiler_pic='-Kconform_pic'
+       lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
+$as_echo "$lt_prog_compiler_pic" >&6; }
+
+
+
+
+
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+       # The AIX port of GNU ld has always aspired to compatibility
+       # with the native linker.  However, as the warning in the GNU ld
+       # block says, versions before 2.19.5* couldn't really create working
+       # shared libraries, regardless of the interface used.
+       case `$LD -v 2>&1` in
+         *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+         *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+         *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+         *)
+           lt_use_gnu_ld_interface=yes
+           ;;
+       esac
+       ;;
+      *)
+       lt_use_gnu_ld_interface=yes
+       ;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       allow_undefined_flag=unsupported
+       # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+       # support --undefined.  This deserves some investigation.  FIXME
+       archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+       # If the export-symbols file already is a .def file (1st line
+       # is EXPORTS), use it as is; otherwise, prepend...
+       archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+         cp $export_symbols $output_objdir/$soname.def;
+       else
+         echo EXPORTS > $output_objdir/$soname.def;
+         cat $export_symbols >> $output_objdir/$soname.def;
+       fi~
+       $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+       case $cc_basename in
+         diet\ *) tmp_diet=yes;;       # linux-dietlibc with static linking (!diet-dyn)
+       esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+        && test "$tmp_diet" = no
+      then
+       tmp_addflag=' $pic_flag'
+       tmp_sharedflag='-shared'
+       case $cc_basename,$host_cpu in
+        pgcc*)                         # Portland Group C compiler
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag'
+         ;;
+       pgf77* | pgf90* | pgf95* | pgfortran*)
+                                       # Portland Group f77 and f90 compilers
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         tmp_addflag=' $pic_flag -Mnomain' ;;
+       ecc*,ia64* | icc*,ia64*)        # Intel C compiler on ia64
+         tmp_addflag=' -i_dynamic' ;;
+       efc*,ia64* | ifort*,ia64*)      # Intel Fortran compiler on ia64
+         tmp_addflag=' -i_dynamic -nofor_main' ;;
+       ifc* | ifort*)                  # Intel Fortran compiler
+         tmp_addflag=' -nofor_main' ;;
+       lf95*)                          # Lahey Fortran 8.1
+         whole_archive_flag_spec=
+         tmp_sharedflag='--shared' ;;
+       xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+         tmp_sharedflag='-qmkshrobj'
+         tmp_addflag= ;;
+       nvcc*)  # Cuda Compiler Driver 2.2
+         whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         compiler_needs_object=yes
+         ;;
+       esac
+       case `$CC -V 2>&1 | sed 5q` in
+       *Sun\ C*)                       # Sun C 5.9
+         whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+         compiler_needs_object=yes
+         tmp_sharedflag='-G' ;;
+       *Sun\ F*)                       # Sun Fortran 8.3
+         tmp_sharedflag='-G' ;;
+       esac
+       archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+           cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+           echo "local: *; };" >> $output_objdir/$libname.ver~
+           $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+       case $cc_basename in
+       xlf* | bgf* | bgxlf* | mpixlf*)
+         # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+         whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+         hardcode_libdir_flag_spec=
+         hardcode_libdir_flag_spec_ld='-rpath $libdir'
+         archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+         if test "x$supports_anon_versioning" = xyes; then
+           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+             cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+             echo "local: *; };" >> $output_objdir/$libname.ver~
+             $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+         fi
+         ;;
+       esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+       wlarc=
+      else
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+       ld_shlibs=no
+       cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+       ;;
+       *)
+         # For security reasons, it is highly recommended that you always
+         # use absolute paths for naming shared libraries, and exclude the
+         # DT_RUNPATH tag from executables and libraries.  But doing so
+         # requires that you compile everything twice, which is a pain.
+         if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+           hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+           archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+         else
+           ld_shlibs=no
+         fi
+       ;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+       ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+       # Neither direct hardcoding nor static linking is supported with a
+       # broken collect2.
+       hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+       # On IA64, the linker does run time linking by default, so we don't
+       # have to do anything special.
+       aix_use_runtimelinking=no
+       exp_sym_flag='-Bexport'
+       no_entry_flag=""
+      else
+       # If we're using GNU nm, then we don't want the "-C" option.
+       # -C means demangle to AIX nm, but means don't demangle with GNU nm
+       # Also, AIX nm treats weak defined symbols like other global
+       # defined symbols, whereas GNU nm marks them as "W".
+       if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+         export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       else
+         export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+       fi
+       aix_use_runtimelinking=no
+
+       # Test if we are trying to use run time linking or normal
+       # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+       # need to do runtime linking.
+       case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+         for ld_flag in $LDFLAGS; do
+         if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+           aix_use_runtimelinking=yes
+           break
+         fi
+         done
+         ;;
+       esac
+
+       exp_sym_flag='-bexport'
+       no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+       case $host_os in aix4.[012]|aix4.[012].*)
+       # We only want to do this on AIX 4.2 and lower, the check
+       # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+          strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+         # We have reworked collect2
+         :
+         else
+         # We have old collect2
+         hardcode_direct=unsupported
+         # It fails to find uninstalled libraries when the uninstalled
+         # path is not listed in the libpath.  Setting hardcode_minus_L
+         # to unsupported forces relinking
+         hardcode_minus_L=yes
+         hardcode_libdir_flag_spec='-L$libdir'
+         hardcode_libdir_separator=
+         fi
+         ;;
+       esac
+       shared_flag='-shared'
+       if test "$aix_use_runtimelinking" = yes; then
+         shared_flag="$shared_flag "'${wl}-G'
+       fi
+      else
+       # not using gcc
+       if test "$host_cpu" = ia64; then
+       # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+       # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+       else
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag='${wl}-G'
+         else
+           shared_flag='${wl}-bM:SRE'
+         fi
+       fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+       # Warning - without using the other runtime loading flags (-brtl),
+       # -berok will link without error, but may produce a broken library.
+       allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+       /^0/ {
+           s/^0  *\(.*\)$/\1/
+           p
+       }
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+       if test "$host_cpu" = ia64; then
+         hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+         allow_undefined_flag="-z nodefs"
+         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+       else
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+       /^0/ {
+           s/^0  *\(.*\)$/\1/
+           p
+       }
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+         # Warning - without using the other run time loading flags,
+         # -berok will link without error, but may produce a broken library.
+         no_undefined_flag=' ${wl}-bernotok'
+         allow_undefined_flag=' ${wl}-berok'
+         if test "$with_gnu_ld" = yes; then
+           # We only use this code for GNU lds that support --whole-archive.
+           whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+         else
+           # Exported symbols can be pulled into shared objects from archives
+           whole_archive_flag_spec='$convenience'
+         fi
+         archive_cmds_need_lc=yes
+         # This is similar to how AIX traditionally builds its shared libraries.
+         archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+       fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_from_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+       archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+       archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+       hardcode_libdir_flag_spec_ld='+b $libdir'
+       hardcode_libdir_separator=:
+       hardcode_direct=yes
+       hardcode_direct_absolute=yes
+       export_dynamic_flag_spec='${wl}-E'
+       # hardcode_minus_L: Not really in the search PATH,
+       # but as the default location of the library.
+       hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+       case $host_cpu in
+       hppa*64*)
+         archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       esac
+      else
+       case $host_cpu in
+       hppa*64*)
+         archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       ia64*)
+         archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+
+         # Older versions of the 11.00 compiler do not understand -b yet
+         # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+         { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if test "${lt_cv_prog_compiler__b+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+         ;;
+       esac
+      fi
+      if test "$with_gnu_ld" = no; then
+       hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+       hardcode_libdir_separator=:
+
+       case $host_cpu in
+       hppa*64*|ia64*)
+         hardcode_direct=no
+         hardcode_shlibpath_var=no
+         ;;
+       *)
+         hardcode_direct=yes
+         hardcode_direct_absolute=yes
+         export_dynamic_flag_spec='${wl}-E'
+
+         # hardcode_minus_L: Not really in the search PATH,
+         # but as the default location of the library.
+         hardcode_minus_L=yes
+         ;;
+       esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       # Try to use the -exported_symbol ld option, if it does not
+       # work, assume that -exports_file does not work either and
+       # implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo(void) {}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        LDFLAGS="$save_LDFLAGS"
+      else
+       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+       archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+       archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+       hardcode_direct=yes
+       hardcode_shlibpath_var=no
+       hardcode_direct_absolute=yes
+       if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+         archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+         hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+         export_dynamic_flag_spec='${wl}-E'
+       else
+         case $host_os in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+         esac
+       fi
+      else
+       ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+       allow_undefined_flag=' -expect_unresolved \*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)     # as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+       allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+       hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+       allow_undefined_flag=' -expect_unresolved \*'
+       archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+       archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+       $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+       # Both c and cxx compiler support -rpath directly
+       hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+       wlarc='${wl}'
+       archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+       case `$CC -V 2>&1` in
+       *"Compilers 5.0"*)
+         wlarc=''
+         archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+         ;;
+       *)
+         wlarc='${wl}'
+         archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+         $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+         ;;
+       esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+       # The compiler driver will combine and reorder linker options,
+       # but understands `-z linker_flag'.  GCC discards it without `$wl',
+       # but is careful enough not to reorder.
+       # Supported since Solaris 2.6 (maybe 2.5.1?)
+       if test "$GCC" = yes; then
+         whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+       else
+         whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+       fi
+       ;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+       # Use $CC to link under sequent, because it throws in some extra .o
+       # files that make .init and .fini sections work.
+       archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+       sni)
+         archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         hardcode_direct=yes # is this really true???
+       ;;
+       siemens)
+         ## LD is ld it makes a PLAMLIB
+         ## CC just makes a GrossModule.
+         archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+         reload_cmds='$CC -r -o $output$reload_objs'
+         hardcode_direct=no
+        ;;
+       motorola)
+         archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+         hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+       ;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+       hardcode_shlibpath_var=no
+       runpath_var=LD_RUN_PATH
+       hardcode_runpath_var=yes
+       ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+       archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+       archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+       archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+       export_dynamic_flag_spec='${wl}-Blargedynsym'
+       ;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$lt_prog_compiler_wl
+         pic_flag=$lt_prog_compiler_pic
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$allow_undefined_flag
+         allow_undefined_flag=
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+         then
+           lt_cv_archive_cmds_need_lc=no
+         else
+           lt_cv_archive_cmds_need_lc=yes
+         fi
+         allow_undefined_flag=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+       lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+          echo ' yes '
+          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+       :
+      else
+       can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+       if test "$lt_cv_prog_gnu_ld" = yes; then
+               version_type=linux
+       else
+               version_type=irix
+       fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+        LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+       shlibpath_overrides_runpath=no
+       ;;
+      *)
+       shlibpath_overrides_runpath=yes
+       ;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+       ;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 10969 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+void fnord () __attribute__((visibility("default")));
+#endif
+
+void fnord () { int i=42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+         if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line 11075 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL          RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL                DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL                0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW           RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW         DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW       RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW     DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW     0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+void fnord () __attribute__((visibility("default")));
+#endif
+
+void fnord () { int i=42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+         if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+       }
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break
+       ;;
+      *)
+       test "$with_gnu_ld" != yes && break
+       ;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+         $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+           for ld_flag in $LDFLAGS; do
+             case $ld_flag in
+             *-brtl*)
+               aix_use_runtimelinking=yes
+               break
+               ;;
+             esac
+           done
+           ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+         collect2name=`${CC} -print-prog-name=collect2`
+         if test -f "$collect2name" &&
+            strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+         then
+           # We have reworked collect2
+           :
+         else
+           # We have old collect2
+           hardcode_direct_CXX=unsupported
+           # It fails to find uninstalled libraries when the uninstalled
+           # path is not listed in the libpath.  Setting hardcode_minus_L
+           # to unsupported forces relinking
+           hardcode_minus_L_CXX=yes
+           hardcode_libdir_flag_spec_CXX='-L$libdir'
+           hardcode_libdir_separator_CXX=
+         fi
+          esac
+          shared_flag='-shared'
+         if test "$aix_use_runtimelinking" = yes; then
+           shared_flag="$shared_flag "'${wl}-G'
+         fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+         # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+         # chokes on -Wl,-G. The following line is correct:
+         shared_flag='-G'
+          else
+           if test "$aix_use_runtimelinking" = yes; then
+             shared_flag='${wl}-G'
+           else
+             shared_flag='${wl}-bM:SRE'
+           fi
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+       # export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+       /^0/ {
+           s/^0  *\(.*\)$/\1/
+           p
+       }
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+           hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+           allow_undefined_flag_CXX="-z nodefs"
+           archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+           # Determine the default libpath from the value encoded in an
+           # empty executable.
+           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+       /^0/ {
+           s/^0  *\(.*\)$/\1/
+           p
+       }
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+           hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+           # Warning - without using the other run time loading flags,
+           # -berok will link without error, but may produce a broken library.
+           no_undefined_flag_CXX=' ${wl}-bernotok'
+           allow_undefined_flag_CXX=' ${wl}-berok'
+           if test "$with_gnu_ld" = yes; then
+             # We only use this code for GNU lds that support --whole-archive.
+             whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           else
+             # Exported symbols can be pulled into shared objects from archives
+             whole_archive_flag_spec_CXX='$convenience'
+           fi
+           archive_cmds_need_lc_CXX=yes
+           # This is similar to how AIX traditionally builds its shared
+           # libraries.
+           archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+         allow_undefined_flag_CXX=unsupported
+         # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+         # support --undefined.  This deserves some investigation.  FIXME
+         archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+       else
+         ld_shlibs_CXX=no
+       fi
+       ;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+         # FIXME: insert proper C++ library support
+         ld_shlibs_CXX=no
+         ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+        # as there is no search path for DLLs.
+        hardcode_libdir_flag_spec_CXX='-L$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+        allow_undefined_flag_CXX=unsupported
+        always_export_symbols_CXX=no
+        enable_shared_with_static_runtimes_CXX=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+           cp $export_symbols $output_objdir/$soname.def;
+          else
+           echo EXPORTS > $output_objdir/$soname.def;
+           cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          ld_shlibs_CXX=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+       ;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          ghcx*)
+           # Green Hills C++ Compiler
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+       # switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+                                            # but as the default
+                                            # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+         hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+         hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+             export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+                                                # but as the default
+                                                # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          aCC*)
+           case $host_cpu in
+             hppa*64*)
+               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             ia64*)
+               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+             *)
+               archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+               ;;
+           esac
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test $with_gnu_ld = no; then
+               case $host_cpu in
+                 hppa*64*)
+                   archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 ia64*)
+                   archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+                 *)
+                   archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+                   ;;
+               esac
+             fi
+           else
+             # FIXME: insert proper C++ library support
+             ld_shlibs_CXX=no
+           fi
+           ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+       hardcode_direct_CXX=no
+       hardcode_shlibpath_var_CXX=no
+       hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+       export_dynamic_flag_spec_CXX='${wl}-E'
+       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+       # Instead, shared libraries are loaded at an image base (0x10000000 by
+       # default) and relocated if they conflict, which is a slow very memory
+       # consuming and fragmenting process.  To avoid this, we pick a random,
+       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+       archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+       ;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+           # SGI C++
+           archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+           # Archives containing C++ object files must be created using
+           # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+           ;;
+          *)
+           if test "$GXX" = yes; then
+             if test "$with_gnu_ld" = no; then
+               archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+             else
+               archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+             fi
+           fi
+           link_all_deplibs_CXX=yes
+           ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+           archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+           # Archives containing C++ object files must be created using
+           # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+           old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+           ;;
+         icpc* | ecpc* )
+           # Intel C++
+           with_gnu_ld=yes
+           # version 8.0 and above of icpc choke on multiply defined symbols
+           # if we add $predep_objects and $postdep_objects, however 7.1 and
+           # earlier do not add the objects themselves.
+           case `$CC -V 2>&1` in
+             *"Version 7."*)
+               archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+             *)  # Version 8.0 or newer
+               tmp_idyn=
+               case $host_cpu in
+                 ia64*) tmp_idyn=' -i_dynamic';;
+               esac
+               archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+               ;;
+           esac
+           archive_cmds_need_lc_CXX=no
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+           whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+           ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+           case `$CC -V` in
+           *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+             prelink_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+             old_archive_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+               $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+               $RANLIB $oldlib'
+             archive_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             archive_expsym_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+               $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           *) # Version 6 and above use weak symbols
+             archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+             archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+             ;;
+           esac
+
+           hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+           whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+         cxx*)
+           # Compaq C++
+           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+           runpath_var=LD_RUN_PATH
+           hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+           hardcode_libdir_separator_CXX=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+           ;;
+         xl* | mpixl* | bgxl*)
+           # IBM XL 8.0 on PPC, with GNU ld
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+           export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+           archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+           if test "x$supports_anon_versioning" = xyes; then
+             archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+               cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+               echo "local: *; };" >> $output_objdir/$libname.ver~
+               $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+           fi
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             no_undefined_flag_CXX=' -zdefs'
+             archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+             archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+             hardcode_libdir_flag_spec_CXX='-R$libdir'
+             whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+             compiler_needs_object_CXX=yes
+
+             # Not sure whether something based on
+             # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+             # would be better.
+             output_verbose_link_cmd='func_echo_all'
+
+             # Archives containing C++ object files must be created using
+             # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+             # necessary to make sure instantiated templates are included
+             # in the archive.
+             old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+       ld_shlibs_CXX=no
+       ;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+       ;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+         *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+       esac
+       ;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+         archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+         wlarc=
+         hardcode_libdir_flag_spec_CXX='-R$libdir'
+         hardcode_direct_CXX=yes
+         hardcode_shlibpath_var_CXX=no
+       fi
+       # Workaround some broken pre-1.5 toolchains
+       output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+       ;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+       ;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+       ld_shlibs_CXX=no
+       ;;
+
+      openbsd*)
+       if test -f /usr/libexec/ld.so; then
+         hardcode_direct_CXX=yes
+         hardcode_shlibpath_var_CXX=no
+         hardcode_direct_absolute_CXX=yes
+         archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+         hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+         if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+           archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+           export_dynamic_flag_spec_CXX='${wl}-E'
+           whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+         fi
+         output_verbose_link_cmd=func_echo_all
+       else
+         ld_shlibs_CXX=no
+       fi
+       ;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+           # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+           # KCC will only create a shared library if the output file
+           # ends with ".so" (or ".sl" for HP-UX), so rename the library
+           # to its proper name (with version) after linking.
+           archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+           hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+           hardcode_libdir_separator_CXX=:
+
+           # Archives containing C++ object files must be created using
+           # the KAI C++ compiler.
+           case $host in
+             osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+             *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+           esac
+           ;;
+          RCC*)
+           # Rational C++ 2.4.1
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          cxx*)
+           case $host in
+             osf3*)
+               allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+               archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+               ;;
+             *)
+               allow_undefined_flag_CXX=' -expect_unresolved \*'
+               archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+               archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                 echo "-hidden">> $lib.exp~
+                 $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+                 $RM $lib.exp'
+               hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+               ;;
+           esac
+
+           hardcode_libdir_separator_CXX=:
+
+           # Commands to make compiler produce verbose output that lists
+           # what "hidden" libraries, object files and flags are used when
+           # linking a shared library.
+           #
+           # There doesn't appear to be a way to prevent this compiler from
+           # explicitly linking system object files so we need to strip them
+           # from the output so that they don't get included in the library
+           # dependencies.
+           output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+           ;;
+         *)
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+             case $host in
+               osf3*)
+                 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+               *)
+                 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+                 ;;
+             esac
+
+             hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+             hardcode_libdir_separator_CXX=:
+
+             # Commands to make compiler produce verbose output that lists
+             # what "hidden" libraries, object files and flags are used when
+             # linking a shared library.
+             output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+           else
+             # FIXME: insert proper C++ library support
+             ld_shlibs_CXX=no
+           fi
+           ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+           # Sun C++ 4.x
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          lcc*)
+           # Lucid
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+           no_undefined_flag_CXX=' -zdefs'
+           archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+           archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+             $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+           hardcode_libdir_flag_spec_CXX='-R$libdir'
+           hardcode_shlibpath_var_CXX=no
+           case $host_os in
+             solaris2.[0-5] | solaris2.[0-5].*) ;;
+             *)
+               # The compiler driver will combine and reorder linker options,
+               # but understands `-z linker_flag'.
+               # Supported since Solaris 2.6 (maybe 2.5.1?)
+               whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+               ;;
+           esac
+           link_all_deplibs_CXX=yes
+
+           output_verbose_link_cmd='func_echo_all'
+
+           # Archives containing C++ object files must be created using
+           # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+           # necessary to make sure instantiated templates are included
+           # in the archive.
+           old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+           ;;
+          gcx*)
+           # Green Hills C++ Compiler
+           archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+           # The C++ compiler must be used to create the archive.
+           old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+           ;;
+          *)
+           # GNU C++ compiler with Solaris linker
+           if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+             no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+             if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+               archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             else
+               # g++ 2.7 appears to require `-G' NOT `-shared' on this
+               # platform.
+               archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+               archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                 $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+               # Commands to make compiler produce verbose output that lists
+               # what "hidden" libraries, object files and flags are used when
+               # linking a shared library.
+               output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+             fi
+
+             hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+             case $host_os in
+               solaris2.[0-5] | solaris2.[0-5].*) ;;
+               *)
+                 whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+                 ;;
+             esac
+           fi
+           ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+         archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+       *)
+         archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+         ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+       # Note: We can NOT use -z defs as we might desire, because we do not
+       # link with -lc, and that would cause any symbols used from libc to
+       # always be unresolved, which means just about no library would
+       # ever link correctly.  If we're not using GNU ld we use -z text
+       # though, which does catch some bad symbols but isn't as heavy-handed
+       # as -z defs.
+       no_undefined_flag_CXX='${wl}-z,text'
+       allow_undefined_flag_CXX='${wl}-z,nodefs'
+       archive_cmds_need_lc_CXX=no
+       hardcode_shlibpath_var_CXX=no
+       hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+       hardcode_libdir_separator_CXX=':'
+       link_all_deplibs_CXX=yes
+       export_dynamic_flag_spec_CXX='${wl}-Bexport'
+       runpath_var='LD_RUN_PATH'
+
+       case $cc_basename in
+          CC*)
+           archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+             '"$old_archive_cmds_CXX"
+           reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+             '"$reload_cmds_CXX"
+           ;;
+         *)
+           archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+           ;;
+       esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+           # NonStop-UX NCC 3.20
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+          *)
+           # FIXME: insert proper C++ library support
+           ld_shlibs_CXX=no
+           ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+        prev=$p
+        continue
+       else
+        prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+        case $p in
+        -L* | -R*)
+          # Internal compiler library paths should come after those
+          # provided the user.  The postdeps already come after the
+          # user supplied libs so there is no need to process them.
+          if test -z "$compiler_lib_search_path_CXX"; then
+            compiler_lib_search_path_CXX="${prev}${p}"
+          else
+            compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+          fi
+          ;;
+        # The "-l" case would never come before the object being
+        # linked, so don't bother handling this case.
+        esac
+       else
+        if test -z "$postdeps_CXX"; then
+          postdeps_CXX="${prev}${p}"
+        else
+          postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+        fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+        pre_test_object_deps_done=yes
+        continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+        if test -z "$predep_objects_CXX"; then
+          predep_objects_CXX="$p"
+        else
+          predep_objects_CXX="$predep_objects_CXX $p"
+        fi
+       else
+        if test -z "$postdep_objects_CXX"; then
+          postdep_objects_CXX="$p"
+        else
+          postdep_objects_CXX="$postdep_objects_CXX $p"
+        fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+       # AIX 5 now supports IA64 processor
+       lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+       lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+       ;;
+      *)
+       lt_prog_compiler_pic_CXX='-fPIC'
+       ;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+       # All AIX code is PIC.
+       if test "$host_cpu" = ia64; then
+         # AIX 5 now supports IA64 processor
+         lt_prog_compiler_static_CXX='-Bstatic'
+       else
+         lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+       fi
+       ;;
+      chorus*)
+       case $cc_basename in
+       cxch68*)
+         # Green Hills C++ Compiler
+         # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+         ;;
+       esac
+       ;;
+      dgux*)
+       case $cc_basename in
+         ec++*)
+           lt_prog_compiler_pic_CXX='-KPIC'
+           ;;
+         ghcx*)
+           # Green Hills C++ Compiler
+           lt_prog_compiler_pic_CXX='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      freebsd* | dragonfly*)
+       # FreeBSD uses GNU C++
+       ;;
+      hpux9* | hpux10* | hpux11*)
+       case $cc_basename in
+         CC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+           if test "$host_cpu" != ia64; then
+             lt_prog_compiler_pic_CXX='+Z'
+           fi
+           ;;
+         aCC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+           case $host_cpu in
+           hppa*64*|ia64*)
+             # +Z the default
+             ;;
+           *)
+             lt_prog_compiler_pic_CXX='+Z'
+             ;;
+           esac
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      interix*)
+       # This is c89, which is MS Visual C++ (no shared libs)
+       # Anyone wants to do a port?
+       ;;
+      irix5* | irix6* | nonstopux*)
+       case $cc_basename in
+         CC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_static_CXX='-non_shared'
+           # CC pic flag -KPIC is the default.
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+       case $cc_basename in
+         KCC*)
+           # KAI C++ Compiler
+           lt_prog_compiler_wl_CXX='--backend -Wl,'
+           lt_prog_compiler_pic_CXX='-fPIC'
+           ;;
+         ecpc* )
+           # old Intel C++ for x86_64 which still supported -KPIC.
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-KPIC'
+           lt_prog_compiler_static_CXX='-static'
+           ;;
+         icpc* )
+           # Intel C++, used to be incompatible with GCC.
+           # ICC 10 doesn't accept -KPIC any more.
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-fPIC'
+           lt_prog_compiler_static_CXX='-static'
+           ;;
+         pgCC* | pgcpp*)
+           # Portland Group C++ compiler
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-fpic'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           ;;
+         cxx*)
+           # Compaq C++
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           lt_prog_compiler_pic_CXX=
+           lt_prog_compiler_static_CXX='-non_shared'
+           ;;
+         xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+           # IBM XL 8.0, 9.0 on PPC and BlueGene
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-qpic'
+           lt_prog_compiler_static_CXX='-qstaticlink'
+           ;;
+         *)
+           case `$CC -V 2>&1 | sed 5q` in
+           *Sun\ C*)
+             # Sun C++ 5.9
+             lt_prog_compiler_pic_CXX='-KPIC'
+             lt_prog_compiler_static_CXX='-Bstatic'
+             lt_prog_compiler_wl_CXX='-Qoption ld '
+             ;;
+           esac
+           ;;
+       esac
+       ;;
+      lynxos*)
+       ;;
+      m88k*)
+       ;;
+      mvs*)
+       case $cc_basename in
+         cxx*)
+           lt_prog_compiler_pic_CXX='-W c,exportall'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      netbsd*)
+       ;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+       case $cc_basename in
+         KCC*)
+           lt_prog_compiler_wl_CXX='--backend -Wl,'
+           ;;
+         RCC*)
+           # Rational C++ 2.4.1
+           lt_prog_compiler_pic_CXX='-pic'
+           ;;
+         cxx*)
+           # Digital/Compaq C++
+           lt_prog_compiler_wl_CXX='-Wl,'
+           # Make sure the PIC flag is empty.  It appears that all Alpha
+           # Linux and Compaq Tru64 Unix objects are PIC.
+           lt_prog_compiler_pic_CXX=
+           lt_prog_compiler_static_CXX='-non_shared'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      psos*)
+       ;;
+      solaris*)
+       case $cc_basename in
+         CC*)
+           # Sun C++ 4.2, 5.x and Centerline C++
+           lt_prog_compiler_pic_CXX='-KPIC'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           lt_prog_compiler_wl_CXX='-Qoption ld '
+           ;;
+         gcx*)
+           # Green Hills C++ Compiler
+           lt_prog_compiler_pic_CXX='-PIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sunos4*)
+       case $cc_basename in
+         CC*)
+           # Sun C++ 4.x
+           lt_prog_compiler_pic_CXX='-pic'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           ;;
+         lcc*)
+           # Lucid
+           lt_prog_compiler_pic_CXX='-pic'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+       case $cc_basename in
+         CC*)
+           lt_prog_compiler_wl_CXX='-Wl,'
+           lt_prog_compiler_pic_CXX='-KPIC'
+           lt_prog_compiler_static_CXX='-Bstatic'
+           ;;
+       esac
+       ;;
+      tandem*)
+       case $cc_basename in
+         NCC*)
+           # NonStop-UX NCC 3.20
+           lt_prog_compiler_pic_CXX='-KPIC'
+           ;;
+         *)
+           ;;
+       esac
+       ;;
+      vxworks*)
+       ;;
+      *)
+       lt_prog_compiler_can_build_shared_CXX=no
+       ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_prog_compiler_pic_CXX" >&6; }
+
+
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if test "${lt_cv_archive_cmds_need_lc_CXX+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+       if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+         soname=conftest
+         lib=conftest
+         libobjs=conftest.$ac_objext
+         deplibs=
+         wl=$lt_prog_compiler_wl_CXX
+         pic_flag=$lt_prog_compiler_pic_CXX
+         compiler_flags=-v
+         linker_flags=-v
+         verstring=
+         output_objdir=.
+         libname=conftest
+         lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+         allow_undefined_flag_CXX=
+         if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+         then
+           lt_cv_archive_cmds_need_lc_CXX=no
+         else
+           lt_cv_archive_cmds_need_lc_CXX=yes
+         fi
+         allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+       else
+         cat conftest.err 1>&5
+       fi
+       $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+          echo ' yes '
+          echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+       :
+      else
+       can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+       if test "$lt_cv_prog_gnu_ld" = yes; then
+               version_type=linux
+       else
+               version_type=irix
+       fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+        LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+       shlibpath_overrides_runpath=no
+       ;;
+      *)
+       shlibpath_overrides_runpath=yes
+       ;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+       ;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+
+
+ac_config_headers="$ac_config_headers target-config.h"
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if test "${ac_cv_sizeof_int+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_int" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "cannot compute sizeof (int)
+See \`config.log' for more details." "$LINENO" 5; }; }
+   else
+     ac_cv_sizeof_int=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5
+$as_echo_n "checking size of void*... " >&6; }
+if test "${ac_cv_sizeof_voidp+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_voidp" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ as_fn_set_status 77
+as_fn_error "cannot compute sizeof (void*)
+See \`config.log' for more details." "$LINENO" 5; }; }
+   else
+     ac_cv_sizeof_voidp=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5
+$as_echo "$ac_cv_sizeof_voidp" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOIDP $ac_cv_sizeof_voidp
+_ACEOF
+
+
+
+# Must be last
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LINUX_LINKER_SCRIPT_TRUE}" && test -z "${LINUX_LINKER_SCRIPT_FALSE}"; then
+  as_fn_error "conditional \"LINUX_LINKER_SCRIPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAC_LINKER_SCRIPT_TRUE}" && test -z "${MAC_LINKER_SCRIPT_FALSE}"; then
+  as_fn_error "conditional \"MAC_LINKER_SCRIPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by phsa HSAIL runtime library $as_me 1.0, which was
+generated by GNU Autoconf 2.64.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <pekka.jaaskelainen@parmance.com>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+phsa HSAIL runtime library config.status 1.0
+configured by $0, generated by GNU Autoconf 2.64,
+  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2009 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+fix_srcfile_path_CXX='`$ECHO "$fix_srcfile_path_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+AR \
+AR_FLAGS \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_wl \
+lt_prog_compiler_pic \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_flag_spec_ld \
+hardcode_libdir_separator \
+fix_srcfile_path \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_flag_spec_ld_CXX \
+hardcode_libdir_separator_CXX \
+fix_srcfile_path_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "target-config.h") CONFIG_HEADERS="$CONFIG_HEADERS target-config.h" ;;
+
+  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || as_fn_error "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_t"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[    ]*#[    ]*define[       ][      ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+    } >"$tmp/config.h" \
+      || as_fn_error "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file" \
+       || as_fn_error "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$_am_arg" : 'X\(//\)[^/]' \| \
+        X"$_am_arg" : 'X\(//\)$' \| \
+        X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $* ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+}
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[^=]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$@"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1+=\$2"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$1=\$$1\$2"
+}
+
+_LT_EOF
+    ;;
+  esac
+
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit $?
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/libhsail-rt/configure.ac b/libhsail-rt/configure.ac
new file mode 100644 (file)
index 0000000..796e109
--- /dev/null
@@ -0,0 +1,151 @@
+# Starting point copied from libcilkrts:
+#
+#  @copyright
+#  Copyright (C) 2011-2013, Intel Corporation
+#  All rights reserved.
+#
+#  @copyright
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+#
+#    * Redistributions of source code must retain the above copyright
+#      notice, this list of conditions and the following disclaimer.
+#    * Redistributions in binary form must reproduce the above copyright
+#      notice, this list of conditions and the following disclaimer in
+#      the documentation and/or other materials provided with the
+#      distribution.
+#    * Neither the name of Intel Corporation nor the names of its
+#      contributors may be used to endorse or promote products derived
+#      from this software without specific prior written permission.
+#
+#  @copyright
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+#  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+#  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+#  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+#  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+#  WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+#  POSSIBILITY OF SUCH DAMAGE.
+
+AC_INIT([phsa HSAIL runtime library], [1.0], [pekka.jaaskelainen@parmance.com])
+AC_CONFIG_MACRO_DIR([m4])
+
+AC_PREREQ([2.64])
+
+# Needed to define ${target}.  Needs to be very early to avoid annoying
+# warning about calling AC_ARG_PROGRAM before AC_CANONICAL_SYSTEM
+AC_CANONICAL_SYSTEM
+target_alias=${target_alias-$host_alias}
+AC_SUBST(target_alias)
+AM_INIT_AUTOMAKE([1.11.6 foreign no-dist])
+
+AM_MAINTAINER_MODE
+
+AC_PROG_CC
+AC_PROG_CXX
+# AC_PROG_LIBTOOL
+AC_CONFIG_FILES([Makefile])
+
+if test "${multilib}" = "yes"; then
+  multilib_arg="--enable-multilib"
+else
+  multilib_arg=
+fi
+
+AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
+AC_ARG_ENABLE([version-specific-runtime-libs],
+  AC_HELP_STRING([--enable-version-specific-runtime-libs],
+                 [Specify that runtime libraries should be installed in a compi
+ler-specific directory]),
+  [case "$enableval" in
+    yes) enable_version_specific_runtime_libs=yes ;;
+    no)  enable_version_specific_runtime_libs=no ;;
+    *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs
+]);;
+   esac],
+  [enable_version_specific_runtime_libs=no])
+AC_MSG_RESULT($enable_version_specific_runtime_libs)
+
+# Calculate toolexeclibdir
+# Also toolexecdir, though it's only used in toolexeclibdir
+case ${enable_version_specific_runtime_libs} in
+  yes)
+    # Need the gcc compiler version to know where to install libraries
+    # and header files if --enable-version-specific-runtime-libs option
+    # is selected.
+    toolexecdir='$(libdir)/gcc/$(target_alias)'
+    toolexeclibdir='$(toolexecdir)/$(gcc_version)$(MULTISUBDIR)'
+    ;;
+  no)
+    if test -n "$with_cross_host" &&
+       test x"$with_cross_host" != x"no"; then
+      # Install a library built with a cross compiler in tooldir, not libdir.
+      toolexecdir='$(exec_prefix)/$(target_alias)'
+      toolexeclibdir='$(toolexecdir)/lib'
+    else
+      toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+      toolexeclibdir='$(libdir)'
+    fi
+    multi_os_directory=`$CC -print-multi-os-directory`
+    case $multi_os_directory in
+      .) ;; # Avoid trailing /.
+      *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+    esac
+    ;;
+esac
+
+# Set config_dir based on the target.  config_dir specifies where to get
+# target-specific files.  The generic implementation is incomplete, but
+# contains information on what's needed
+case "${target}" in
+
+  x86_64-*-*)
+    config_dir="x86"
+    ;;
+
+  i?86-*-*)
+    config_dir="x86"
+    ;;
+
+  *)
+    config_dir="generic"
+    ;;
+
+esac
+AC_SUBST(config_dir)
+
+# We have linker scripts for appropriate operating systems
+linux_linker_script=no
+case "${host}" in
+    *-*-linux*)
+        linux_linker_script=yes
+        ;;
+esac
+AM_CONDITIONAL(LINUX_LINKER_SCRIPT, test "$linux_linker_script" = "yes")
+
+mac_linker_script=no
+case "${host}" in
+    *-*-apple*)
+        mac_linker_script=yes
+        ;;
+esac
+AM_CONDITIONAL(MAC_LINKER_SCRIPT, test "$mac_linker_script" = "yes")
+
+AC_LIBTOOL_DLOPEN
+AM_PROG_LIBTOOL
+AC_SUBST(toolexecdir)
+AC_SUBST(toolexeclibdir)
+
+AC_CONFIG_HEADER(target-config.h)
+
+AC_CHECK_SIZEOF([int])
+AC_CHECK_SIZEOF([void*])
+
+# Must be last
+AC_OUTPUT
diff --git a/libhsail-rt/include/internal/fibers.h b/libhsail-rt/include/internal/fibers.h
new file mode 100644 (file)
index 0000000..033146c
--- /dev/null
@@ -0,0 +1,99 @@
+/* fibers.h -- an extremely simple lightweight thread (fiber) implementation
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef PHSA_RT_FIBERS_H
+#define PHSA_RT_FIBERS_H
+
+#include <ucontext.h>
+
+typedef enum
+{
+  /* Ready to run.  */
+  FIBER_STATUS_READY,
+  /* Exited by calling fiber_thread_exit.  */
+  FIBER_STATUS_EXITED,
+  /* Joined by the main thread.  */
+  FIBER_STATUS_JOINED
+} fiber_status_t;
+
+/* A light weight thread (fiber).  */
+struct fiber_s
+{
+  ucontext_t context;
+  volatile fiber_status_t status;
+  struct fiber_s *next;
+  struct fiber_s *prev;
+};
+
+typedef struct fiber_s fiber_t;
+
+typedef void (*fiber_function_t)(int, int);
+
+/* Initializes the fiber with the start function given as the first
+   argument, and the argument to pass to the start function,
+   as the second.  The allocated stack size is given as the last argument.  */
+void
+fiber_init (fiber_t *fiber, fiber_function_t start_function, void *arg,
+           size_t stack_size, size_t stack_align);
+
+/* Terminates the fiber execution from within the fiber itself.  */
+void
+fiber_exit ();
+
+/* Blocks until the given fiber returns.  Frees the resources allocated
+   for the fiber.  After join returns, the fiber itself can be deleted.  */
+void
+fiber_join (fiber_t *fiber);
+
+/* Co-operatively transfer execution turn to other fibers.  */
+void
+fiber_yield ();
+
+/* A multi-entry barrier.  After the last fiber has reached the
+   barrier, it is automatically re-initialized to the threshold.  */
+typedef struct
+{
+  /* The barrier participant count.  */
+  volatile size_t threshold;
+  /* Number of fibers that have reached the barrier.  */
+  volatile size_t reached;
+  /* Number of fibers that are waiting at the barrier.  */
+  volatile size_t waiting_count;
+} fiber_barrier_t;
+
+/* Reach the given barrier.  Blocks (co-operatively switches the execution
+   fibers) until all other parties have reached it.  Returns 0 only in case
+   the calling fiber was the first one to return from the barrier.  */
+size_t
+fiber_barrier_reach (fiber_barrier_t *barrier);
+
+/* Initializes the given barrier.  */
+void
+fiber_barrier_init (fiber_barrier_t *barrier, size_t threshold);
+
+void *
+fiber_int_args_to_ptr (int arg0, int arg1);
+
+#endif
diff --git a/libhsail-rt/include/internal/phsa-queue-interface.h b/libhsail-rt/include/internal/phsa-queue-interface.h
new file mode 100644 (file)
index 0000000..646cee4
--- /dev/null
@@ -0,0 +1,60 @@
+/* phsa_queue_interface.h -- Definition for a minimalistic generic in-memory
+   representation of a user mode queue to be used with the phsa/gccbrig
+   implementation.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef PHSA_QUEUE_INTERFACE_H
+#define PHSA_QUEUE_INTERFACE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include "hsa.h"
+
+typedef __attribute__ ((aligned (64))) struct phsa_queue_s
+{
+  /* An HSA Architectured Queue object.  Must be in the beginning
+     of the struct to enable direct pointer casting between hsa_queue_
+     and phsa_queue_t.  */
+  hsa_queue_t hsa_queue;
+
+  volatile uint64_t write_index;
+  volatile uint64_t read_index;
+
+  /* True if global mem addresses are 64b.  */
+  uint64_t is_ptr64 : 1;
+
+} phsa_queue_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/libhsail-rt/include/internal/phsa-rt.h b/libhsail-rt/include/internal/phsa-rt.h
new file mode 100644 (file)
index 0000000..40813cb
--- /dev/null
@@ -0,0 +1,94 @@
+/* phsa-rt.h -- Data structures and functions of the PHSA device side runtime
+   scheduler, and HSAIL built-ins.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef PHSA_RT_H
+#define PHSA_RT_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "hsa.h"
+
+#define PHSA_MAX_WG_SIZE 1024 * 10
+
+/* Pointer type for the public facing kernel launcher function generated
+   by gccbrig.  This launches the actual kernel for all work groups and
+   work items in the grid.  */
+typedef void (*gccbrigKernelLauncherFunc) (void *context, void *);
+
+/* Pointer type for kernel functions produced by gccbrig from the HSAIL.
+   This is private from outside the device binary and only called by
+   the launcher.  */
+typedef void (*gccbrigKernelFunc) (unsigned char *, void *, void *, void *);
+
+/* Context data that is passed to the kernel function, initialized
+   by the runtime to the current launch information.  The data is
+   used by different id functions etc.
+
+   The struct is used by both the launcher and the targeted device,
+   thus the fields must have the same alignment/padding in both sides.
+*/
+typedef struct
+{
+
+  /* Data set by the HSA Runtime's kernel launcher.  */
+  hsa_kernel_dispatch_packet_t *dp;
+
+  size_t packet_id;
+
+  /* Data set by the device-side launcher.  */
+  gccbrigKernelFunc kernel;
+
+  /* The range of a work groups this dispatch should execute.  */
+  size_t wg_min_x;
+  size_t wg_min_y;
+  size_t wg_min_z;
+
+  size_t wg_max_x;
+  size_t wg_max_y;
+  size_t wg_max_z;
+
+  /* The barrier used to synch the work-items before executing a new WG.  */
+  void *wg_start_barrier;
+
+  /* The barrier to wait at after executing a work-group.  */
+  void *wg_completion_barrier;
+
+  /* The barrier used to synchronize WIs in case of the 'barrier' HSAIL
+     instruction.  */
+  void *wg_sync_barrier;
+
+  /* This should be set to the flat address of the beginning of the group
+     segment.  */
+  size_t group_segment_start_addr;
+
+  /* This must be set to the correct aligned flat address space location from
+     where the kernel can actually read its arguments.  Might point to the
+     original global kernarg space.  */
+  void *kernarg_addr;
+} PHSAKernelLaunchData;
+
+#endif
diff --git a/libhsail-rt/include/internal/workitems.h b/libhsail-rt/include/internal/workitems.h
new file mode 100644 (file)
index 0000000..6c96b2e
--- /dev/null
@@ -0,0 +1,107 @@
+/* workitems.h -- Types for context data passed as hidden parameters to special
+   built-ins.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef PHSA_RT_WORKITEMS_H
+#define PHSA_RT_WORKITEMS_H
+
+/* As the simple fibers implementation relies only on ucontext, we can
+   assume is found by default as it is part of glibc.  However, for partial
+   HSAIL support on platforms without having it available, the following define
+   can be undefined.  */
+#define HAVE_FIBERS
+
+#ifdef HAVE_FIBERS
+#include "fibers.h"
+#endif
+
+#include <stdint.h>
+#include "phsa-rt.h"
+
+/* Data identifying a single work-group instance.  */
+
+typedef struct
+{
+  /* The group id of the currently executed WG.  */
+  size_t x;
+  size_t y;
+  size_t z;
+
+  /* This is 1 in case there are more work groups to execute.
+     If 0, the work-item threads should finish themselves.  */
+  int more_wgs;
+
+  /* If the local size does not evenly divide the grid size, will have
+     leftover WIs in the last execution.  */
+  int leftover_wg;
+  int last_wg;
+
+  /* (Flat) pointer to the beginning of the group segment allocated
+     to the work-group.  */
+  void *group_base_ptr;
+
+  /* Similarly to the private segment that gets space allocated for all
+     WIs in the work-group.  */
+  void *private_base_ptr;
+  uint32_t private_segment_total_size;
+
+  /* The first flat address of the group segment allocated for
+     the given work group.  */
+  uint64_t group_segment_base_addr;
+
+  /* Offset from the beginning of the private segment to the start of
+     the previously allocated chunk of dynamic work-item memory (alloca)
+     by any WI in the WG.
+
+     Initially set to private_segment_total_size to denote no dynamic
+     allocations have been made.  The dynamic allocations are done downwards
+     from the private segment end.  */
+  uint32_t alloca_stack_p;
+  /* The position of the first word in the current function's alloca
+     stack frame.  Initialized to point outside the private segment.  */
+  uint32_t alloca_frame_p;
+
+} PHSAWorkGroup;
+
+/* Data identifying a single work-item, passed to the work-item thread in case
+   of a fiber based work-group execution.  */
+
+typedef struct
+{
+  PHSAKernelLaunchData *launch_data;
+  /* Identifies and keeps book of the currently executed WG of the WI swarm.  */
+  volatile PHSAWorkGroup *wg;
+  /* The local id of the current WI.  */
+  size_t x;
+  size_t y;
+  size_t z;
+#ifdef HAVE_FIBERS
+  fiber_t fiber;
+#endif
+} PHSAWorkItem;
+
+
+#endif
diff --git a/libhsail-rt/rt/arithmetic.c b/libhsail-rt/rt/arithmetic.c
new file mode 100644 (file)
index 0000000..6749752
--- /dev/null
@@ -0,0 +1,475 @@
+/* arithmetic.c -- Builtins for HSAIL arithmetic instructions for which
+   there is no feasible direct gcc GENERIC expression.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdio.h>
+#include <stdint.h>
+#include <limits.h>
+#include <math.h>
+#include <float.h>
+
+/* HSAIL defines INT_MIN % -1 to be 0 while with C it's undefined,
+   and causes an overflow exception at least with gcc and C on IA-32.  */
+
+int32_t
+__hsail_rem_s32 (int32_t dividend, int32_t divisor)
+{
+  if (dividend == INT_MIN && divisor == -1)
+    return 0;
+  else
+    return dividend % divisor;
+}
+
+int64_t
+__hsail_rem_s64 (int64_t dividend, int64_t divisor)
+{
+  if (dividend == INT64_MIN && divisor == -1)
+    return 0;
+  else
+    return dividend % divisor;
+}
+
+/* HSAIL has defined behavior for min and max when one of the operands is
+   NaN: in that case the other operand is returned.  In C and with gcc's
+   MIN_EXPR/MAX_EXPR, the returned operand is undefined.  */
+
+float
+__hsail_min_f32 (float a, float b)
+{
+  if (isnan (a))
+    return b;
+  else if (isnan (b))
+    return a;
+  else if (a == 0.0f && b == 0.0f)
+    return signbit (a) ? a : b;
+  else if (a > b)
+    return b;
+  else
+    return a;
+}
+
+double
+__hsail_min_f64 (double a, double b)
+{
+  if (isnan (a))
+    return b;
+  else if (isnan (b))
+    return a;
+  else if (a > b)
+    return b;
+  else
+    return a;
+}
+
+float
+__hsail_max_f32 (float a, float b)
+{
+  if (isnan (a))
+    return b;
+  else if (isnan (b))
+    return a;
+  else if (a == 0.0f && b == 0.0f && signbit (a))
+    return b;
+  else if (a < b)
+    return b;
+  else
+    return a;
+}
+
+double
+__hsail_max_f64 (double a, double b)
+{
+  if (isnan (a))
+    return b;
+  else if (isnan (b))
+    return a;
+  else if (a == 0.0 && b == 0.0 && signbit (a))
+    return b;
+  else if (a < b)
+    return b;
+  else
+    return a;
+}
+
+uint8_t
+__hsail_cvt_zeroi_sat_u8_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) UINT8_MAX)
+    return UINT8_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint8_t) a;
+}
+
+int8_t
+__hsail_cvt_zeroi_sat_s8_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) INT8_MAX)
+    return INT8_MAX;
+  if (a <= (float) INT8_MIN)
+    return INT8_MIN;
+  return (int8_t) a;
+}
+
+uint16_t
+__hsail_cvt_zeroi_sat_u16_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) UINT16_MAX)
+    return UINT16_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint16_t) a;
+}
+
+int16_t
+__hsail_cvt_zeroi_sat_s16_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) INT16_MAX)
+    return INT16_MAX;
+  if (a <= (float) INT16_MIN)
+    return INT16_MIN;
+  return (int16_t) a;
+}
+
+uint32_t
+__hsail_cvt_zeroi_sat_u32_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) UINT32_MAX)
+    return UINT32_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint32_t) a;
+}
+
+int32_t
+__hsail_cvt_zeroi_sat_s32_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) INT32_MAX)
+    return INT32_MAX;
+  if (a <= (float) INT32_MIN)
+    return INT32_MIN;
+  return (int32_t) a;
+}
+
+uint64_t
+__hsail_cvt_zeroi_sat_u64_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) UINT64_MAX)
+    return UINT64_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint64_t) a;
+}
+
+int64_t
+__hsail_cvt_zeroi_sat_s64_f32 (float a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (float) INT64_MAX)
+    return INT64_MAX;
+  if (a <= (float) INT64_MIN)
+    return INT64_MIN;
+  return (int64_t) a;
+}
+
+uint8_t
+__hsail_cvt_zeroi_sat_u8_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) UINT8_MAX)
+    return UINT8_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint8_t) a;
+}
+
+int8_t
+__hsail_cvt_zeroi_sat_s8_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) INT8_MAX)
+    return INT8_MAX;
+  if (a <= (double) INT8_MIN)
+    return INT8_MIN;
+  return (int8_t) a;
+}
+
+uint16_t
+__hsail_cvt_zeroi_sat_u16_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) UINT16_MAX)
+    return UINT16_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint16_t) a;
+}
+
+int16_t
+__hsail_cvt_zeroi_sat_s16_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) INT16_MAX)
+    return INT16_MAX;
+  if (a <= (double) INT16_MIN)
+    return INT16_MIN;
+  return (int16_t) a;
+}
+
+uint32_t
+__hsail_cvt_zeroi_sat_u32_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) UINT32_MAX)
+    return UINT32_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint32_t) a;
+}
+
+int32_t
+__hsail_cvt_zeroi_sat_s32_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) INT32_MAX)
+    return INT32_MAX;
+  if (a <= (double) INT32_MIN)
+    return INT32_MIN;
+  return (int32_t) a;
+}
+
+uint64_t
+__hsail_cvt_zeroi_sat_u64_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) UINT64_MAX)
+    return UINT64_MAX;
+  else if (a <= 0.0f)
+    return 0;
+  return (uint64_t) a;
+}
+
+int64_t
+__hsail_cvt_zeroi_sat_s64_f64 (double a)
+{
+  if (isnan (a))
+    return 0;
+  if (a >= (double) INT64_MAX)
+    return INT64_MAX;
+  if (a <= (double) INT64_MIN)
+    return INT64_MIN;
+  return (int64_t) a;
+}
+
+
+/* Flush the operand to zero in case it's a denormalized number.
+   Do not cause any exceptions in case of NaNs.  */
+
+float
+__hsail_ftz_f32 (float a)
+{
+  if (isnan (a) || isinf (a) || a == 0.0f)
+    return a;
+
+  if (a < 0.0f)
+    {
+      if (-a < FLT_MIN)
+       return -0.0f;
+    }
+  else
+    {
+      if (a < FLT_MIN)
+       return 0.0f;
+    }
+  return a;
+}
+
+#define F16_MIN (6.10e-5)
+
+/* Flush the single precision operand to zero in case it's considered
+   a denormalized number in case it was a f16.  Do not cause any exceptions
+   in case of NaNs.  */
+
+float
+__hsail_ftz_f32_f16 (float a)
+{
+  if (isnan (a) || isinf (a) || a == 0.0f)
+    return a;
+
+  if (a < 0.0f)
+    {
+      if (-a < F16_MIN)
+       return -0.0f;
+    }
+  else
+    {
+      if (a < F16_MIN)
+       return 0.0f;
+    }
+  return a;
+}
+
+double
+__hsail_ftz_f64 (double a)
+{
+  if (isnan (a) || isinf (a) || a == 0.0d)
+    return a;
+
+  if (a < 0.0d)
+    {
+      if (-a < DBL_MIN)
+       return -0.0d;
+    }
+  else
+    {
+      if (a < DBL_MIN)
+       return 0.0d;
+    }
+  return a;
+}
+
+uint32_t
+__hsail_borrow_u32 (uint32_t a, uint32_t b)
+{
+  uint64_t c = (uint64_t) a - (uint64_t) b;
+  if (c > UINT32_MAX)
+    return 1;
+  else
+    return 0;
+}
+
+uint64_t
+__hsail_borrow_u64 (uint64_t a, uint64_t b)
+{
+  __uint128_t c = (__uint128_t) a - (__uint128_t) b;
+  if (c > UINT64_MAX)
+    return 1;
+  else
+    return 0;
+}
+
+uint32_t
+__hsail_carry_u32 (uint32_t a, uint32_t b)
+{
+  uint64_t c = (uint64_t) a + (uint64_t) b;
+  if (c > UINT32_MAX)
+    return 1;
+  else
+    return 0;
+}
+
+uint64_t
+__hsail_carry_u64 (uint64_t a, uint64_t b)
+{
+  __uint128_t c = (__uint128_t) a + (__uint128_t) b;
+  if (c > UINT64_MAX)
+    return 1;
+  else
+    return 0;
+}
+
+float
+__hsail_fract_f32 (float a)
+{
+  int exp;
+  if (isinf (a))
+    return signbit (a) == 0 ? 0.0f : -0.0f;
+  if (isnan (a) || a == 0.0f)
+    return a;
+  else
+    return fminf (a - floorf (a), 0x1.fffffep-1f);
+}
+
+double
+__hsail_fract_f64 (double a)
+{
+  int exp;
+  if (isinf (a))
+    return 0.0f * isinf (a);
+  if (isnan (a) || a == 0.0f)
+    return a;
+  else
+    return fmin (a - floor (a), 0x1.fffffffffffffp-1d);
+}
+
+uint32_t
+__hsail_class_f32 (float a, uint32_t flags)
+{
+  return (flags & 0x0001 && isnan (a) && !(*(uint32_t *) &a & 0x40000000))
+        || (flags & 0x0002 && isnan (a) && (*(uint32_t *) &a & 0x40000000))
+        || (flags & 0x0004 && isinf (a) && a < 0.0f)
+        || (flags & 0x0008 && isnormal (a) && signbit (a))
+        || (flags & 0x0010 && a < 0.0f && a > -FLT_MIN)
+        || (flags & 0x0020 && a == 0.0f && signbit (a))
+        || (flags & 0x0040 && a == 0.0f && !signbit (a))
+        || (flags & 0x0080 && a > 0.0f && a < FLT_MIN)
+        || (flags & 0x0100 && isnormal (a) && !signbit (a))
+        || (flags & 0x0200 && isinf (a) && a >= 0.0f);
+}
+
+/* 'class' for a f32-converted f16 which should otherwise be treated like f32
+ except for its limits.  */
+
+uint32_t
+__hsail_class_f32_f16 (float a, uint32_t flags)
+{
+  return (flags & 0x0001 && isnan (a) && !(*(uint32_t *) &a & 0x40000000))
+        || (flags & 0x0002 && isnan (a) && (*(uint32_t *) &a & 0x40000000))
+        || (flags & 0x0004 && isinf (a) && a < 0.0f)
+        || (flags & 0x0008 && a != 0.0f && !isinf (a) && !isnan (a)
+            && a <= -F16_MIN)
+        || (flags & 0x0010 && a != 0.0f && !isinf (a) && !isnan (a) && a < 0.0f
+            && a > -F16_MIN)
+        || (flags & 0x0020 && a == 0.0f && signbit (a))
+        || (flags & 0x0040 && a == 0.0f && !signbit (a))
+        || (flags & 0x0080 && a != 0.0f && !isinf (a) && !isnan (a) && a > 0.0f
+            && a < F16_MIN)
+        || (flags & 0x0100 && a != 0.0f && !isinf (a) && !isnan (a)
+            && a >= F16_MIN)
+        || (flags & 0x0200 && isinf (a) && a >= 0.0f);
+}
diff --git a/libhsail-rt/rt/atomics.c b/libhsail-rt/rt/atomics.c
new file mode 100644 (file)
index 0000000..04f02f0
--- /dev/null
@@ -0,0 +1,115 @@
+/* atomic.c -- Builtins for HSAIL atomic instructions for which
+   there is no feasible direct gcc GENERIC expression.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdint.h>
+#include <stdio.h>
+
+#define DO_ATOMICALLY(T, OPERATION)                                    \
+  int done = 0;                                                                \
+  T old_value;                                                         \
+  T new_value;                                                         \
+  while (!done)                                                                \
+    {                                                                  \
+      old_value = *ptr;                                                        \
+      new_value = OPERATION;                                           \
+      done = __sync_bool_compare_and_swap (ptr, old_value, new_value); \
+    }                                                                  \
+  return old_value
+
+int32_t
+__hsail_atomic_min_s32 (int32_t *ptr, int32_t a)
+{
+  DO_ATOMICALLY (int32_t, (old_value < a) ? old_value : a);
+}
+
+int64_t
+__hsail_atomic_min_s64 (int64_t *ptr, int64_t a)
+{
+  DO_ATOMICALLY (int64_t, (old_value < a) ? old_value : a);
+}
+
+uint32_t
+__hsail_atomic_min_u32 (uint32_t *ptr, uint32_t a)
+{
+  DO_ATOMICALLY (uint32_t, (old_value < a) ? old_value : a);
+}
+
+uint64_t
+__hsail_atomic_min_u64 (uint64_t *ptr, uint64_t a)
+{
+  DO_ATOMICALLY (uint64_t, (old_value < a) ? old_value : a);
+}
+
+uint32_t
+__hsail_atomic_max_u32 (uint32_t *ptr, uint32_t a)
+{
+  DO_ATOMICALLY (uint32_t, (old_value > a) ? old_value : a);
+}
+
+int32_t
+__hsail_atomic_max_s32 (int32_t *ptr, int32_t a)
+{
+  DO_ATOMICALLY (int32_t, (old_value > a) ? old_value : a);
+}
+
+uint64_t
+__hsail_atomic_max_u64 (uint64_t *ptr, uint64_t a)
+{
+  DO_ATOMICALLY (uint64_t, (old_value > a) ? old_value : a);
+}
+
+int64_t
+__hsail_atomic_max_s64 (int64_t *ptr, int64_t a)
+{
+  DO_ATOMICALLY (int64_t, (old_value > a) ? old_value : a);
+}
+
+uint32_t
+__hsail_atomic_wrapinc_u32 (uint32_t *ptr, uint32_t a)
+{
+  DO_ATOMICALLY (uint32_t, (old_value >= a) ? 0 : (old_value + 1));
+}
+
+uint64_t
+__hsail_atomic_wrapinc_u64 (uint64_t *ptr, uint64_t a)
+{
+  DO_ATOMICALLY (uint64_t, (old_value >= a) ? 0 : (old_value + 1));
+}
+
+uint32_t
+__hsail_atomic_wrapdec_u32 (uint32_t *ptr, uint32_t a)
+{
+  DO_ATOMICALLY (uint32_t,
+                ((old_value == 0) || (old_value > a)) ? a : (old_value - 1));
+}
+
+uint64_t
+__hsail_atomic_wrapdec_u64 (uint64_t *ptr, uint64_t a)
+{
+  DO_ATOMICALLY (uint64_t,
+                ((old_value == 0) || (old_value > a)) ? a : (old_value - 1));
+}
diff --git a/libhsail-rt/rt/bitstring.c b/libhsail-rt/rt/bitstring.c
new file mode 100644 (file)
index 0000000..44d9b0a
--- /dev/null
@@ -0,0 +1,190 @@
+/* bitstring.c -- Builtins for HSAIL bitstring instructions.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdint.h>
+#include <limits.h>
+
+#define BITEXTRACT(DEST_TYPE, SRC0, SRC1, SRC2)                                \
+  uint32_t offset = SRC1 & (sizeof (DEST_TYPE) * 8 - 1);               \
+  uint32_t width = SRC2 & (sizeof (DEST_TYPE) * 8 - 1);                        \
+  if (width == 0)                                                      \
+    return 0;                                                          \
+  else                                                                 \
+    return (SRC0 << (sizeof (DEST_TYPE) * 8 - width - offset))         \
+      >> (sizeof (DEST_TYPE) * 8 - width)
+
+uint32_t
+__hsail_bitextract_u32 (uint32_t src0, uint32_t src1, uint32_t src2)
+{
+  BITEXTRACT (uint32_t, src0, src1, src2);
+}
+
+int32_t
+__hsail_bitextract_s32 (int32_t src0, uint32_t src1, uint32_t src2)
+{
+  BITEXTRACT (int32_t, src0, src1, src2);
+}
+
+uint64_t
+__hsail_bitextract_u64 (uint64_t src0, uint32_t src1, uint32_t src2)
+{
+  BITEXTRACT (uint64_t, src0, src1, src2);
+}
+
+int64_t
+__hsail_bitextract_s64 (int64_t src0, uint32_t src1, uint32_t src2)
+{
+  BITEXTRACT (int64_t, src0, src1, src2);
+}
+
+#define BITINSERT(DEST_TYPE, SRC0, SRC1, SRC2, SRC3)                   \
+  uint32_t offset = SRC2 & (sizeof (DEST_TYPE) * 8 - 1);               \
+  uint32_t width = SRC3 & (sizeof (DEST_TYPE) * 8 - 1);                        \
+  DEST_TYPE mask = ((DEST_TYPE) 1 << width) - 1;                       \
+  return (SRC0 & ~(mask << offset)) | ((SRC1 & mask) << offset)
+
+uint32_t
+__hsail_bitinsert_u32 (uint32_t src0, uint32_t src1, uint32_t src2,
+                             uint32_t src3)
+{
+  BITINSERT (uint32_t, src0, src1, src2, src3);
+}
+
+int64_t
+__hsail_bitinsert_u64 (uint64_t src0, uint64_t src1, uint32_t src2,
+                             uint32_t src3)
+{
+  BITINSERT (uint64_t, src0, src1, src2, src3);
+}
+
+#define BITMASK(DEST_TYPE, SRC0, SRC1)                                 \
+  uint32_t offset = SRC0 & (sizeof (DEST_TYPE) * 8 - 1);               \
+  uint32_t width = SRC1 & (sizeof (DEST_TYPE) * 8 - 1);                        \
+  DEST_TYPE mask = ((DEST_TYPE) 1 << width) - 1;                       \
+  return mask << offset
+
+uint32_t
+__hsail_bitmask_u32 (uint32_t src0, uint32_t src1)
+{
+  BITMASK (uint32_t, src0, src1);
+}
+
+uint64_t
+__hsail_bitmask_u64 (uint32_t src0, uint32_t src1)
+{
+  BITMASK (uint64_t, src0, src1);
+}
+
+/* The dummy, but readable version from
+   http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious
+   This (also) often maps to a single instruction in DSPs.  */
+
+#define BITREV(DEST_TYPE, SRC)                                         \
+  DEST_TYPE v = SRC;                                                   \
+  DEST_TYPE r = v;                                                     \
+  int s = sizeof (SRC) * CHAR_BIT - 1;                                 \
+                                                                       \
+  for (v >>= 1; v; v >>= 1)                                            \
+    {                                                                  \
+      r <<= 1;                                                         \
+      r |= v & 1;                                                      \
+      s--;                                                             \
+    }                                                                  \
+  return r << s
+
+uint32_t
+__hsail_bitrev_u32 (uint32_t src0)
+{
+  BITREV (uint32_t, src0);
+}
+
+uint64_t
+__hsail_bitrev_u64 (uint64_t src0)
+{
+  BITREV (uint64_t, src0);
+}
+
+uint32_t
+__hsail_bitselect_u32 (uint32_t src0, uint32_t src1, uint32_t src2)
+{
+  return (src1 & src0) | (src2 & ~src0);
+}
+
+uint64_t
+__hsail_bitselect_u64 (uint64_t src0, uint64_t src1, uint64_t src2)
+{
+  return (src1 & src0) | (src2 & ~src0);
+}
+
+/* Due to the defined behavior with 0, we cannot use the gcc builtin
+   __builtin_clz* () directly. __builtin_ffs () has defined behavior, but
+   returns 0 while HSAIL requires to return -1.  */
+
+uint32_t
+__hsail_firstbit_u32 (uint32_t src0)
+{
+  if (src0 == 0)
+    return -1;
+  return __builtin_clz (src0);
+}
+
+uint32_t
+__hsail_firstbit_s32 (int32_t src0)
+{
+  uint32_t converted = src0 >= 0 ? src0 : ~src0;
+  return __hsail_firstbit_u32 (converted);
+}
+
+uint32_t
+__hsail_firstbit_u64 (uint64_t src0)
+{
+  if (src0 == 0)
+    return -1;
+  return __builtin_clzl (src0);
+}
+
+uint32_t
+__hsail_firstbit_s64 (int64_t src0)
+{
+  uint64_t converted = src0 >= 0 ? src0 : ~src0;
+  return __hsail_firstbit_u64 (converted);
+}
+
+uint32_t
+__hsail_lastbit_u32 (uint32_t src0)
+{
+  if (src0 == 0)
+    return -1;
+  return __builtin_ctz (src0);
+}
+
+uint32_t
+__hsail_lastbit_u64 (uint64_t src0)
+{
+  if (src0 == 0)
+    return -1;
+  return __builtin_ctzl (src0);
+}
diff --git a/libhsail-rt/rt/fbarrier.c b/libhsail-rt/rt/fbarrier.c
new file mode 100644 (file)
index 0000000..608cec9
--- /dev/null
@@ -0,0 +1,87 @@
+/* fbarrier.c -- HSAIL fbarrier built-ins.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdlib.h>
+#include <signal.h>
+
+#include "workitems.h"
+#include "phsa-rt.h"
+
+#ifdef HAVE_FIBERS
+#include "fibers.h"
+
+typedef fiber_barrier_t fbarrier;
+
+void
+__hsail_initfbar (uint32_t addr, PHSAWorkItem *wi)
+{
+  fbarrier *fbar = (fbarrier *) (wi->wg->group_base_ptr + addr);
+  fbar->threshold = 0;
+  fbar->reached = 0;
+  fbar->waiting_count = 0;
+}
+
+void
+__hsail_releasefbar (uint32_t addr, PHSAWorkItem *wi)
+{
+  fbarrier *fbar = (fbarrier *) (wi->wg->group_base_ptr + addr);
+  fbar->threshold = 0;
+  fbar->reached = 0;
+  fbar->waiting_count = 0;
+}
+
+void
+__hsail_joinfbar (uint32_t addr, PHSAWorkItem *wi)
+{
+  fbarrier *fbar = (fbarrier *) (wi->wg->group_base_ptr + addr);
+  ++fbar->threshold;
+}
+
+void
+__hsail_leavefbar (uint32_t addr, PHSAWorkItem *wi)
+{
+  fbarrier *fbar = (fbarrier *) (wi->wg->group_base_ptr + addr);
+  --fbar->threshold;
+}
+
+void
+__hsail_waitfbar (uint32_t addr, PHSAWorkItem *wi)
+{
+  fbarrier *fbar = (fbarrier *) (wi->wg->group_base_ptr + addr);
+  fiber_barrier_reach (fbar);
+}
+
+void
+__hsail_arrivefbar (uint32_t addr, PHSAWorkItem *wi)
+{
+  fbarrier *fbar = (fbarrier *) (wi->wg->group_base_ptr + addr);
+  ++fbar->reached;
+  if (fbar->reached == fbar->threshold)
+    fbar->reached = 0;
+}
+
+#endif
+
diff --git a/libhsail-rt/rt/fibers.c b/libhsail-rt/rt/fibers.c
new file mode 100644 (file)
index 0000000..a3056a9
--- /dev/null
@@ -0,0 +1,220 @@
+/* fibers.c -- extremely simple lightweight thread (fiber) implementation
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+
+#include "target-config.h"
+
+#include "fibers.h"
+
+void
+phsa_fatal_error (int code);
+
+ucontext_t main_context;
+
+/* The last fiber in the linked list.  */
+static fiber_t *tail_fiber = NULL;
+/* The first fiber in the linked list.  */
+static fiber_t *head_fiber = NULL;
+/* The fiber currently being executed.  */
+static fiber_t *current_fiber = NULL;
+
+/* Makecontext accepts only integer arguments.  We need to split the
+   pointer argument in case pointer does not fit into int.  This helper
+   function can be used to restore the pointer from the arguments.  */
+
+void *
+fiber_int_args_to_ptr (int arg0, int arg1)
+{
+  void *ptr = NULL;
+#if SIZEOF_VOIDP == 8 && SIZEOF_INT == 4
+  ptr = (void*)(((uint64_t) arg0 & (uint64_t) 0xFFFFFFFF)
+               | ((uint64_t) arg1 << 32));
+#elif SIZEOF_VOIDP == 4 && SIZEOF_INT == 4
+  ptr = (void*)arg0;
+#else
+# error Unsupported pointer/int size.
+#endif
+  return ptr;
+}
+
+void
+fiber_init (fiber_t *fiber, fiber_function_t start_function, void *arg,
+           size_t stack_size, size_t stack_align)
+{
+  int arg0, arg1;
+  if (getcontext (&fiber->context) != 0)
+    phsa_fatal_error (3);
+  if (posix_memalign (&fiber->context.uc_stack.ss_sp, stack_align, stack_size)
+      != 0)
+    phsa_fatal_error (4);
+  fiber->context.uc_stack.ss_size = stack_size;
+  fiber->context.uc_link = &main_context;
+
+  /* makecontext () accepts only integer arguments.  Split the
+     pointer argument to two args in the case pointer does not fit
+     into one int.  */
+#if SIZEOF_VOIDP == 8 && SIZEOF_INT == 4
+  arg0 = (int32_t) 0xFFFFFFFF & (uint64_t)arg;
+  arg1 = (int32_t) 0xFFFFFFFF & ((uint64_t)arg >> 32);
+#elif SIZEOF_VOIDP == 4 && SIZEOF_INT == 4
+  arg0 = (int)arg;
+  arg1 = 0;
+#else
+# error Unsupported pointer/int size.
+#endif
+
+  makecontext (&fiber->context, (void*)start_function, 2, arg0, arg1);
+
+  fiber->status = FIBER_STATUS_READY;
+  fiber->next = NULL;
+  fiber->prev = NULL;
+
+  /* Create a linked list of the created fibers.  Append the new one at
+     the end.  */
+  if (tail_fiber == NULL)
+    tail_fiber = fiber;
+  else
+    {
+      tail_fiber->next = fiber;
+      fiber->prev = tail_fiber;
+      tail_fiber = fiber;
+    }
+
+  if (head_fiber == NULL)
+    head_fiber = fiber;
+}
+
+void
+fiber_exit ()
+{
+  fiber_status_t old_status = current_fiber->status;
+  current_fiber->status = FIBER_STATUS_EXITED;
+  if (old_status == FIBER_STATUS_JOINED)
+    /* In case this thread has been joined, return back to the joiner.  */
+    swapcontext (&current_fiber->context, &main_context);
+  else
+    /* In case the thread exited while being yielded from another thread,
+       switch back to another fiber.  */
+    fiber_yield ();
+}
+
+void
+fiber_join (fiber_t *fiber)
+{
+  fiber_t *next_ready_fiber = NULL;
+  current_fiber = fiber;
+  if (fiber->status != FIBER_STATUS_EXITED)
+    {
+      fiber->status = FIBER_STATUS_JOINED;
+      while (fiber->status != FIBER_STATUS_EXITED)
+       swapcontext (&main_context, &fiber->context);
+    }
+
+  /* Remove the successfully joined fiber from the linked list so we won't
+     access it later (the fiber itself might be freed after the join).  */
+  if (fiber->prev != NULL)
+    fiber->prev->next = fiber->next;
+
+  if (fiber->next != NULL)
+    fiber->next->prev = fiber->prev;
+
+  if (head_fiber == fiber)
+    head_fiber = fiber->next;
+
+  if (tail_fiber == fiber)
+    tail_fiber = fiber->prev;
+
+  free (fiber->context.uc_stack.ss_sp);
+}
+
+void
+fiber_yield ()
+{
+  fiber_t *next_ready_fiber = current_fiber;
+
+  if (current_fiber == head_fiber
+      && current_fiber == tail_fiber)
+    {
+      /* If the last fiber exits independently, there is no
+        fiber to switch to.  Switch to the main context in that
+        case.  */
+      if (current_fiber->status == FIBER_STATUS_EXITED)
+       swapcontext (&current_fiber->context, &main_context);
+    }
+
+  do {
+    next_ready_fiber = next_ready_fiber->next != NULL
+      ? next_ready_fiber->next : head_fiber;
+  } while (next_ready_fiber != current_fiber
+          && next_ready_fiber->status == FIBER_STATUS_EXITED);
+
+  fiber_t *old_current_fiber = current_fiber;
+  current_fiber = next_ready_fiber;
+  swapcontext (&old_current_fiber->context, &next_ready_fiber->context);
+}
+
+size_t
+fiber_barrier_reach (fiber_barrier_t *barrier)
+{
+  /* Yield once to ensure that there are no fibers waiting for
+     a previous triggering of the barrier in the waiting_count
+     loop.  This should release them before we update the reached
+     counter again.  */
+  fiber_yield ();
+
+  barrier->reached++;
+  ++barrier->waiting_count;
+  while (barrier->reached < barrier->threshold)
+    fiber_yield ();
+  --barrier->waiting_count;
+
+  /* Wait until all the fibers have reached this point.  */
+  while (barrier->waiting_count > 0)
+    fiber_yield ();
+
+  /* Now all fibers have been released from the barrier waiting
+     loop.  We can now safely reset the reach count for new triggering.  */
+  if (barrier->reached > 0)
+    {
+      barrier->reached = 0;
+      return 0;
+    }
+  return 1;
+}
+
+void
+fiber_barrier_init (fiber_barrier_t *barrier, size_t threshold)
+{
+  barrier->threshold = threshold;
+  barrier->waiting_count = 0;
+  barrier->reached = 0;
+}
diff --git a/libhsail-rt/rt/fp16.c b/libhsail-rt/rt/fp16.c
new file mode 100644 (file)
index 0000000..01cb1e0
--- /dev/null
@@ -0,0 +1,135 @@
+/* Half-float conversion routines.  Code mostly borrowed from the ARM's
+   builtin function.
+
+   Copyright (C) 2008-2015 Free Software Foundation, Inc.
+   Contributed by CodeSourcery.
+
+   This file 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 3, or (at your option) any
+   later version.
+
+   This file 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.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+static inline unsigned short
+__gnu_f2h_internal (unsigned int a, int ieee)
+{
+  unsigned short sign = (a >> 16) & 0x8000;
+  int aexp = (a >> 23) & 0xff;
+  unsigned int mantissa = a & 0x007fffff;
+  unsigned int mask;
+  unsigned int increment;
+
+  if (aexp == 0xff)
+    {
+      if (!ieee)
+       return sign;
+      if (mantissa == 0)
+       return sign | 0x7c00; /* Infinity.  */
+      /* Remaining cases are NaNs.  Convert SNaN to QNaN.  */
+      return sign | 0x7e00 | (mantissa >> 13);
+    }
+
+  if (aexp == 0 && mantissa == 0)
+    return sign;
+
+  aexp -= 127;
+
+  /* Decimal point between bits 22 and 23.  */
+  mantissa |= 0x00800000;
+  if (aexp < -14)
+    {
+      mask = 0x00ffffff;
+      if (aexp >= -25)
+       mask >>= 25 + aexp;
+    }
+  else
+    mask = 0x00001fff;
+
+  /* Round.  */
+  if (mantissa & mask)
+    {
+      increment = (mask + 1) >> 1;
+      if ((mantissa & mask) == increment)
+       increment = mantissa & (increment << 1);
+      mantissa += increment;
+      if (mantissa >= 0x01000000)
+       {
+         mantissa >>= 1;
+         aexp++;
+       }
+    }
+
+  if (ieee)
+    {
+      if (aexp > 15)
+       return sign | 0x7c00;
+    }
+  else
+    {
+      if (aexp > 16)
+       return sign | 0x7fff;
+    }
+
+  if (aexp < -24)
+    return sign;
+
+  if (aexp < -14)
+    {
+      mantissa >>= -14 - aexp;
+      aexp = -14;
+    }
+
+  /* We leave the leading 1 in the mantissa, and subtract one
+     from the exponent bias to compensate.  */
+  return sign | (((aexp + 14) << 10) + (mantissa >> 13));
+}
+
+static unsigned int
+__gnu_h2f_internal (unsigned short a, int ieee)
+{
+  unsigned int sign = (unsigned int) (a & 0x8000) << 16;
+  int aexp = (a >> 10) & 0x1f;
+  unsigned int mantissa = a & 0x3ff;
+
+  if (aexp == 0x1f && ieee)
+    return sign | 0x7f800000 | (mantissa << 13);
+
+  if (aexp == 0)
+    {
+      int shift;
+
+      if (mantissa == 0)
+       return sign;
+
+      shift = __builtin_clz (mantissa) - 21;
+      mantissa <<= shift;
+      aexp = -shift;
+    }
+
+  return sign | (((aexp + 0x70) << 23) + (mantissa << 13));
+}
+
+unsigned short
+__hsail_f32_to_f16 (unsigned int a)
+{
+  return __gnu_f2h_internal (a, 1);
+}
+
+unsigned int
+__hsail_f16_to_f32 (unsigned short a)
+{
+  return __gnu_h2f_internal (a, 1);
+}
diff --git a/libhsail-rt/rt/misc.c b/libhsail-rt/rt/misc.c
new file mode 100644 (file)
index 0000000..547734e
--- /dev/null
@@ -0,0 +1,89 @@
+/* misc.c -- Builtins for HSAIL misc instructions.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdint.h>
+#include <time.h>
+
+#include "workitems.h"
+
+/* Return the monotonic clock as nanoseconds.  */
+
+uint64_t
+__hsail_clock ()
+{
+  struct timespec t;
+  clock_gettime (CLOCK_MONOTONIC, &t);
+  return (uint64_t) t.tv_sec * 1000000000 + (uint64_t) t.tv_nsec;
+}
+
+uint32_t
+__hsail_cuid (PHSAWorkItem *wi)
+{
+  /* All WIs are executed with a single compute unit (core/thread)
+     for now.  */
+  return 0;
+}
+
+uint32_t
+__hsail_maxcuid (PHSAWorkItem *wi)
+{
+  /* All WIs are executed with a single compute unit (core/thread)
+     for now.  */
+  return 0;
+}
+
+void
+__hsail_debugtrap (uint32_t src, PHSAWorkItem *wi)
+{
+  /* Could we produce a SIGTRAP signal here to drop to gdb
+     console, or similar?  In any case, the execution of the
+     kernel should halt.
+  */
+  return;
+}
+
+uint32_t
+__hsail_groupbaseptr (PHSAWorkItem *wi)
+{
+  return (uint32_t) (uint64_t) (wi->wg->group_base_ptr
+                               - wi->launch_data->group_segment_start_addr);
+}
+
+uint64_t
+__hsail_kernargbaseptr_u64 (PHSAWorkItem *wi)
+{
+  /* For now assume only a single kernarg allocation at a time.
+     Proper kernarg memory management to do.  */
+  return (uint64_t) wi->launch_data->kernarg_addr;
+}
+
+uint32_t
+__hsail_kernargbaseptr_u32 (PHSAWorkItem *wi)
+{
+  /* For now assume only a single kernarg allocation at a time.
+     Proper kernarg memory management to do.  */
+  return 0;
+}
diff --git a/libhsail-rt/rt/multimedia.c b/libhsail-rt/rt/multimedia.c
new file mode 100644 (file)
index 0000000..31125ed
--- /dev/null
@@ -0,0 +1,135 @@
+/* multimedia.c -- Builtins for HSAIL multimedia instructions.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <math.h>
+#include <stdint.h>
+
+uint32_t
+__hsail_bitalign (uint64_t lower, uint64_t upper, uint32_t shift_amount)
+{
+  shift_amount = shift_amount & 31;
+  uint64_t packed_value = (upper << 32) | lower;
+  return (packed_value >> shift_amount) & 0xFFFFFFFF;
+}
+
+uint32_t
+__hsail_bytealign (uint64_t lower, uint64_t upper, uint32_t shift_amount)
+{
+  shift_amount = (shift_amount & 3) * 8;
+  uint64_t packed_value = (upper << 32) | lower;
+  return (packed_value >> shift_amount) & 0xFFFFFFFF;
+}
+
+uint32_t
+__hsail_lerp (uint32_t a, uint32_t b, uint32_t c)
+{
+  uint32_t e3
+    = (((((a >> 24) & 0xff) + ((b >> 24) & 0xff) + ((c >> 24) & 0x1)) / 2)
+       & 0xff)
+      << 24;
+  uint32_t e2
+    = (((((a >> 16) & 0xff) + ((b >> 16) & 0xff) + ((c >> 16) & 0x1)) / 2)
+       & 0xff)
+      << 16;
+  uint32_t e1
+    = (((((a >> 8) & 0xff) + ((b >> 8) & 0xff) + ((c >> 8) & 0x1)) / 2) & 0xff)
+      << 8;
+  uint32_t e0 = (((a & 0xff) + (b & 0xff) + (c & 0x1)) / 2) & 0xff;
+
+  return e3 | e2 | e1 | e0;
+}
+
+static uint8_t
+cvt_neari_sat_u8_f32 (float a)
+{
+  if (isinf (a))
+    {
+      if (signbit (a)) return 0;
+      else return 255;
+    }
+  else if (isnan (a)) return 0;
+  else if (a < 0.0)
+    return 0;
+  else if (a > 255.0)
+    return 255;
+  else
+    return (uint8_t) a;
+}
+
+uint32_t
+__hsail_packcvt (float a, float b, float c, float d)
+{
+  return (uint32_t) cvt_neari_sat_u8_f32 (a)
+        | (uint32_t) cvt_neari_sat_u8_f32 (b) << 8
+        | (uint32_t) cvt_neari_sat_u8_f32 (c) << 16
+        | (uint32_t) cvt_neari_sat_u8_f32 (d) << 24;
+}
+
+float
+__hsail_unpackcvt (uint32_t val, uint32_t index)
+{
+  return (float) ((val >> (index * 8)) & 0xff);
+}
+
+static uint32_t
+abs_diff (uint32_t a, uint32_t b)
+{
+  if (a < b)
+    return b - a;
+  else
+    return a - b;
+}
+
+uint32_t
+__hsail_sad_u8x4 (uint32_t a, uint32_t b, uint32_t add)
+{
+  return abs_diff ((a >> 24) & 0xff, (b >> 24) & 0xff)
+        + abs_diff ((a >> 16) & 0xff, (b >> 16) & 0xff)
+        + abs_diff ((a >> 8) & 0xff, (b >> 8) & 0xff)
+        + abs_diff ((a >> 0) & 0xff, (b >> 0) & 0xff) + add;
+}
+
+uint32_t
+__hsail_sad_u16x2 (uint32_t a, uint32_t b, uint32_t add)
+{
+  return abs_diff ((a >> 16) & 0xffff, (b >> 16) & 0xffff)
+        + abs_diff ((a >> 0) & 0xffff, (b >> 0) & 0xffff) + add;
+}
+
+uint32_t
+__hsail_sad_u32 (uint32_t a, uint32_t b, uint32_t add)
+{
+  return abs_diff (a, b) + add;
+}
+
+uint32_t
+__hsail_sadhi_u16x2_u8x4 (uint32_t a, uint32_t b, uint32_t add)
+{
+  return (abs_diff ((a >> 24) & 0xff, (b >> 24) & 0xff) << 16)
+        + (abs_diff ((a >> 16) & 0xff, (b >> 16) & 0xff) << 16)
+        + (abs_diff ((a >> 8) & 0xff, (b >> 8) & 0xff) << 16)
+        + (abs_diff ((a >> 0) & 0xff, (b >> 0) & 0xff) << 16) + add;
+}
diff --git a/libhsail-rt/rt/queue.c b/libhsail-rt/rt/queue.c
new file mode 100644 (file)
index 0000000..3d7ff76
--- /dev/null
@@ -0,0 +1,71 @@
+/* queue.c -- Builtins for HSAIL queue related instructions.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "phsa-queue-interface.h"
+
+uint64_t
+__hsail_ldqueuereadindex (uint64_t queue_addr)
+{
+  phsa_queue_t *queue = (phsa_queue_t *) queue_addr;
+  return queue->read_index;
+}
+
+uint64_t
+__hsail_ldqueuewriteindex (uint64_t queue_addr)
+{
+  phsa_queue_t *queue = (phsa_queue_t *) queue_addr;
+  return queue->write_index;
+}
+
+uint64_t
+__hsail_addqueuewriteindex (uint64_t queue_addr, uint64_t value)
+{
+  phsa_queue_t *queue = (phsa_queue_t *) queue_addr;
+  return __sync_fetch_and_add (&queue->write_index, value);
+}
+
+uint64_t
+__hsail_casqueuewriteindex (uint64_t queue_addr, uint64_t cmp_value,
+                                  uint64_t new_value)
+{
+  phsa_queue_t *queue = (phsa_queue_t *) queue_addr;
+  return __sync_val_compare_and_swap (&queue->write_index, cmp_value,
+                                     new_value);
+}
+
+void
+__hsail_stqueuereadindex (uint64_t queue_addr, uint64_t value)
+{
+  phsa_queue_t *queue = (phsa_queue_t *) queue_addr;
+  queue->read_index = value;
+}
+
+void
+__hsail_stqueuewriteindex (uint64_t queue_addr, uint64_t value)
+{
+  phsa_queue_t *queue = (phsa_queue_t *) queue_addr;
+  queue->write_index = value;
+}
diff --git a/libhsail-rt/rt/sat_arithmetic.c b/libhsail-rt/rt/sat_arithmetic.c
new file mode 100644 (file)
index 0000000..3e40245
--- /dev/null
@@ -0,0 +1,299 @@
+/* sat_arithmetic.c -- Builtins for HSAIL saturating arithmetic instructions.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdint.h>
+
+uint8_t
+__hsail_sat_add_u8 (uint8_t a, uint8_t b)
+{
+  uint16_t c = (uint16_t) a + (uint16_t) b;
+  if (c > UINT8_MAX)
+    return UINT8_MAX;
+  else
+    return c;
+}
+
+uint16_t
+__hsail_sat_add_u16 (uint16_t a, uint16_t b)
+{
+  uint32_t c = (uint32_t) a + (uint32_t) b;
+  if (c > UINT16_MAX)
+    return UINT16_MAX;
+  else
+    return c;
+}
+
+uint32_t
+__hsail_sat_add_u32 (uint32_t a, uint32_t b)
+{
+  uint64_t c = (uint64_t) a + (uint64_t) b;
+  if (c > UINT32_MAX)
+    return UINT32_MAX;
+  else
+    return c;
+}
+
+uint64_t
+__hsail_sat_add_u64 (uint64_t a, uint64_t b)
+{
+  __uint128_t c = (__uint128_t) a + (__uint128_t) b;
+  if (c > UINT64_MAX)
+    return UINT64_MAX;
+  else
+    return c;
+}
+
+int8_t
+__hsail_sat_add_s8 (int8_t a, int8_t b)
+{
+  int16_t c = (int16_t) a + (int16_t) b;
+  if (c > INT8_MAX)
+    return INT8_MAX;
+  else if (c < INT8_MIN)
+    return INT8_MIN;
+  else
+    return c;
+}
+
+int16_t
+__hsail_sat_add_s16 (int16_t a, int16_t b)
+{
+  int32_t c = (int32_t) a + (int32_t) b;
+  if (c > INT16_MAX)
+    return INT16_MAX;
+  else if (c < INT16_MIN)
+    return INT16_MIN;
+  else
+    return c;
+}
+
+int32_t
+__hsail_sat_add_s32 (int32_t a, int32_t b)
+{
+  int64_t c = (int64_t) a + (int64_t) b;
+  if (c > INT32_MAX)
+    return INT32_MAX;
+  else if (c < INT32_MIN)
+    return INT32_MIN;
+  else
+    return c;
+}
+
+int64_t
+__hsail_sat_add_s64 (int64_t a, int64_t b)
+{
+  __int128_t c = (__int128_t) a + (__int128_t) b;
+  if (c > INT64_MAX)
+    return INT64_MAX;
+  else if (c < INT64_MIN)
+    return INT64_MIN;
+  else
+    return c;
+}
+
+uint8_t
+__hsail_sat_sub_u8 (uint8_t a, uint8_t b)
+{
+  int16_t c = (uint16_t) a - (uint16_t) b;
+  if (c < 0)
+    return 0;
+  else if (c > UINT8_MAX)
+    return UINT8_MAX;
+  else
+    return c;
+}
+
+uint16_t
+__hsail_sat_sub_u16 (uint16_t a, uint16_t b)
+{
+  int32_t c = (uint32_t) a - (uint32_t) b;
+  if (c < 0)
+    return 0;
+  else if (c > UINT16_MAX)
+    return UINT16_MAX;
+  else
+    return c;
+}
+
+uint32_t
+__hsail_sat_sub_u32 (uint32_t a, uint32_t b)
+{
+  int64_t c = (uint64_t) a - (uint64_t) b;
+  if (c < 0)
+    return 0;
+  else if (c > UINT32_MAX)
+    return UINT32_MAX;
+  else
+    return c;
+}
+
+uint64_t
+__hsail_sat_sub_u64 (uint64_t a, uint64_t b)
+{
+  __int128_t c = (__uint128_t) a - (__uint128_t) b;
+  if (c < 0)
+    return 0;
+  else if (c > UINT64_MAX)
+    return UINT64_MAX;
+  else
+    return c;
+}
+
+int8_t
+__hsail_sat_sub_s8 (int8_t a, int8_t b)
+{
+  int16_t c = (int16_t) a - (int16_t) b;
+  if (c > INT8_MAX)
+    return INT8_MAX;
+  else if (c < INT8_MIN)
+    return INT8_MIN;
+  else
+    return c;
+}
+
+int16_t
+__hsail_sat_sub_s16 (int16_t a, int16_t b)
+{
+  int32_t c = (int32_t) a - (int32_t) b;
+  if (c > INT16_MAX)
+    return INT16_MAX;
+  else if (c < INT16_MIN)
+    return INT16_MIN;
+  else
+    return c;
+}
+
+int32_t
+__hsail_sat_sub_s32 (int32_t a, int32_t b)
+{
+  int64_t c = (int64_t) a - (int64_t) b;
+  if (c > INT32_MAX)
+    return INT32_MAX;
+  else if (c < INT32_MIN)
+    return INT32_MIN;
+  else
+    return c;
+}
+
+int64_t
+__hsail_sat_sub_s64 (int64_t a, int64_t b)
+{
+  __int128_t c = (__int128_t) a - (__int128_t) b;
+  if (c > INT64_MAX)
+    return INT64_MAX;
+  else if (c < INT64_MIN)
+    return INT64_MIN;
+  else
+    return c;
+}
+
+uint8_t
+__hsail_sat_mul_u8 (uint8_t a, uint8_t b)
+{
+  uint16_t c = (uint16_t) a * (uint16_t) b;
+  if (c > UINT8_MAX)
+    return UINT8_MAX;
+  else
+    return c;
+}
+
+uint16_t
+__hsail_sat_mul_u16 (uint16_t a, uint16_t b)
+{
+  uint32_t c = (uint32_t) a * (uint32_t) b;
+  if (c > UINT16_MAX)
+    return UINT16_MAX;
+  else
+    return c;
+}
+
+uint32_t
+__hsail_sat_mul_u32 (uint32_t a, uint32_t b)
+{
+  uint64_t c = (uint64_t) a * (uint64_t) b;
+  if (c > UINT32_MAX)
+    return UINT32_MAX;
+  else
+    return c;
+}
+
+uint64_t
+__hsail_sat_mul_u64 (uint64_t a, uint64_t b)
+{
+  __uint128_t c = (__uint128_t) a * (__uint128_t) b;
+  if (c > UINT64_MAX)
+    return UINT64_MAX;
+  else
+    return c;
+}
+
+int8_t
+__hsail_sat_mul_s8 (int8_t a, int8_t b)
+{
+  int16_t c = (int16_t) a * (int16_t) b;
+  if (c > INT8_MAX)
+    return INT8_MAX;
+  else if (c < INT8_MIN)
+    return INT8_MIN;
+  else
+    return c;
+}
+
+int16_t
+__hsail_sat_mul_s16 (int16_t a, int16_t b)
+{
+  int32_t c = (int32_t) a * (int32_t) b;
+  if (c > INT16_MAX)
+    return INT16_MAX;
+  else if (c < INT16_MIN)
+    return INT16_MIN;
+  else
+    return c;
+}
+
+int32_t
+__hsail_sat_mul_s32 (int32_t a, int32_t b)
+{
+  int64_t c = (int64_t) a * (int64_t) b;
+  if (c > INT32_MAX)
+    return INT32_MAX;
+  else if (c < INT32_MIN)
+    return INT32_MIN;
+  else
+    return c;
+}
+
+int64_t
+__hsail_sat_mul_s64 (int64_t a, int64_t b)
+{
+  __int128_t c = (__int128_t) a * (__int128_t) b;
+  if (c > INT64_MAX)
+    return INT64_MAX;
+  else if (c < INT64_MIN)
+    return INT64_MIN;
+  else
+    return c;
+}
diff --git a/libhsail-rt/rt/segment.c b/libhsail-rt/rt/segment.c
new file mode 100644 (file)
index 0000000..a1d2c84
--- /dev/null
@@ -0,0 +1,57 @@
+/* segment.c -- Builtins for HSAIL segment related instructions.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "workitems.h"
+
+uint32_t
+__hsail_segmentp_private (uint64_t flat_addr, PHSAWorkItem *wi)
+{
+  if (flat_addr == 0)
+    return 1;
+  else
+    return (void *) flat_addr >= wi->wg->private_base_ptr
+          && (void *) flat_addr
+               < wi->wg->private_base_ptr + wi->wg->private_segment_total_size;
+}
+
+uint32_t
+__hsail_segmentp_group (uint64_t flat_addr, PHSAWorkItem *wi)
+{
+  if (flat_addr == 0)
+    return 1;
+  else
+    return (void *) flat_addr >= wi->wg->group_base_ptr
+          && (void *) flat_addr < wi->wg->group_base_ptr
+                                    + wi->launch_data->dp->group_segment_size;
+}
+
+uint32_t
+__hsail_segmentp_global (uint64_t flat_addr, PHSAWorkItem *wi)
+{
+  return (flat_addr == 0
+         || (!__hsail_segmentp_private (flat_addr, wi)
+             && !__hsail_segmentp_group (flat_addr, wi)));
+}
diff --git a/libhsail-rt/rt/workitems.c b/libhsail-rt/rt/workitems.c
new file mode 100644 (file)
index 0000000..80bcadd
--- /dev/null
@@ -0,0 +1,952 @@
+/* workitems.c -- The main runtime entry that performs work-item execution in
+   various ways and the builtin functions closely related to the
+   implementation.
+
+   Copyright (C) 2015-2016 Free Software Foundation, Inc.
+   Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+   for General Processor Tech.
+
+   Permission is hereby granted, free of charge, to any person obtaining a
+   copy of this software and associated documentation files
+   (the "Software"), to deal in the Software without restriction, including
+   without limitation the rights to use, copy, modify, merge, publish,
+   distribute, sublicense, and/or sell copies of the Software, and to
+   permit persons to whom the Software is furnished to do so, subject to
+   the following conditions:
+
+   The above copyright notice and this permission notice shall be included
+   in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+   DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+   USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+/* The fiber based multiple work-item work-group execution uses ucontext
+   based user mode threading.  However, if gccbrig is able to optimize the
+   kernel to a much faster work-group function that implements the multiple
+   WI execution using loops instead of fibers requiring slow context switches,
+   the fiber-based implementation won't be called.
+ */
+
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+
+#include "workitems.h"
+#include "phsa-rt.h"
+
+#ifdef HAVE_FIBERS
+#include "fibers.h"
+#endif
+
+#ifdef BENCHMARK_PHSA_RT
+#include <stdio.h>
+#include <time.h>
+
+static uint64_t wi_count = 0;
+static uint64_t wis_skipped = 0;
+static uint64_t wi_total = 0;
+static clock_t start_time;
+
+#endif
+
+#ifdef DEBUG_PHSA_RT
+#include <stdio.h>
+#endif
+
+#define PRIVATE_SEGMENT_ALIGN 256
+#define FIBER_STACK_SIZE (64*1024)
+#define GROUP_SEGMENT_ALIGN 256
+
+/* HSA requires WGs to be executed in flat work-group id order.  Enabling
+   the following macro can reveal test cases that rely on the ordering,
+   but is not useful for much else.  */
+
+uint32_t __hsail_workitemabsid (uint32_t dim, PHSAWorkItem *context);
+
+uint32_t __hsail_workitemid (uint32_t dim, PHSAWorkItem *context);
+
+uint32_t __hsail_gridgroups (uint32_t dim, PHSAWorkItem *context);
+
+uint32_t __hsail_currentworkgroupsize (uint32_t dim, PHSAWorkItem *wi);
+
+uint32_t __hsail_workgroupsize (uint32_t dim, PHSAWorkItem *wi);
+
+void
+phsa_fatal_error (int code)
+{
+  exit (code);
+}
+
+#ifdef HAVE_FIBERS
+/* ucontext-based work-item thread implementation.  Runs all work-items in
+   separate fibers.  */
+
+static void
+phsa_work_item_thread (int arg0, int arg1)
+{
+  void *arg = fiber_int_args_to_ptr (arg0, arg1);
+
+  PHSAWorkItem *wi = (PHSAWorkItem *) arg;
+  volatile PHSAWorkGroup *wg = wi->wg;
+  PHSAKernelLaunchData *l_data = wi->launch_data;
+
+  do
+    {
+      int retcode
+       = fiber_barrier_reach ((fiber_barrier_t *) l_data->wg_start_barrier);
+
+      /* At this point the threads can assume that either more_wgs is 0 or
+        the current_work_group_* is set to point to the WG executed next.  */
+      if (!wi->wg->more_wgs)
+       break;
+#ifdef DEBUG_PHSA_RT
+      printf (
+       "Running work-item %lu/%lu/%lu for wg %lu/%lu/%lu / %lu/%lu/%lu...\n",
+       wi->x, wi->y, wi->z, wg->x, wg->y, wg->z, l_data->wg_max_x,
+       l_data->wg_max_y, l_data->wg_max_z);
+#endif
+
+      if (wi->x < __hsail_currentworkgroupsize (0, wi)
+         && wi->y < __hsail_currentworkgroupsize (1, wi)
+         && wi->z < __hsail_currentworkgroupsize (2, wi))
+       {
+         l_data->kernel (l_data->kernarg_addr, wi, wg->group_base_ptr,
+                         wg->private_base_ptr);
+#ifdef DEBUG_PHSA_RT
+         printf ("done.\n");
+#endif
+#ifdef BENCHMARK_PHSA_RT
+         wi_count++;
+#endif
+       }
+      else
+       {
+#ifdef DEBUG_PHSA_RT
+         printf ("skipped (partial WG).\n");
+#endif
+#ifdef BENCHMARK_PHSA_RT
+         wis_skipped++;
+#endif
+       }
+
+      retcode
+       = fiber_barrier_reach ((fiber_barrier_t *)
+                              l_data->wg_completion_barrier);
+
+      /* The first thread updates the WG to execute next etc.  */
+
+      if (retcode == 0)
+       {
+#ifdef EXECUTE_WGS_BACKWARDS
+         if (wg->x == l_data->wg_min_x)
+           {
+             wg->x = l_data->wg_max_x - 1;
+             if (wg->y == l_data->wg_min_y)
+               {
+                 wg->y = l_data->wg_max_y - 1;
+                 if (wg->z == l_data->wg_min_z)
+                   wg->more_wgs = 0;
+                 else
+                   wg->z--;
+               }
+             else
+               wg->y--;
+           }
+         else
+           wg->x--;
+#else
+         if (wg->x + 1 >= l_data->wg_max_x)
+           {
+             wg->x = l_data->wg_min_x;
+             if (wg->y + 1 >= l_data->wg_max_y)
+               {
+                 wg->y = l_data->wg_min_y;
+                 if (wg->z + 1 >= l_data->wg_max_z)
+                   wg->more_wgs = 0;
+                 else
+                   wg->z++;
+               }
+             else
+               wg->y++;
+           }
+         else
+           wg->x++;
+#endif
+
+         /* Reinitialize the work-group barrier according to the new WG's
+            size, which might not be the same as the previous ones, due
+            to "partial WGs".  */
+         size_t wg_size = __hsail_currentworkgroupsize (0, wi)
+                          * __hsail_currentworkgroupsize (1, wi)
+                          * __hsail_currentworkgroupsize (2, wi);
+
+#ifdef DEBUG_PHSA_RT
+         printf ("Reinitializing the WG barrier to %lu.\n", wg_size);
+#endif
+         fiber_barrier_init ((fiber_barrier_t *)
+                             wi->launch_data->wg_sync_barrier,
+                             wg_size);
+
+#ifdef BENCHMARK_PHSA_RT
+         if (wi_count % 1000 == 0)
+           {
+             clock_t spent_time = clock () - start_time;
+             double spent_time_sec = (double) spent_time / CLOCKS_PER_SEC;
+             double wis_per_sec = wi_count / spent_time_sec;
+             uint64_t eta_sec
+               = (wi_total - wi_count - wis_skipped) / wis_per_sec;
+
+             printf ("%lu WIs executed %lu skipped in %lus (%lu WIs/s, ETA in "
+                     "%lu s)\n",
+                     wi_count, wis_skipped, (uint64_t) spent_time_sec,
+                     (uint64_t) wis_per_sec, (uint64_t) eta_sec);
+           }
+#endif
+       }
+    }
+  while (1);
+
+  fiber_exit ();
+}
+#endif
+
+#define MIN(a, b) ((a < b) ? a : b)
+#define MAX(a, b) ((a > b) ? a : b)
+
+#ifdef HAVE_FIBERS
+/* Spawns a given number of work-items to execute a set of work-groups,
+   blocks until their completion.  */
+
+static void
+phsa_execute_wi_gang (PHSAKernelLaunchData *context, void *group_base_ptr,
+                     size_t wg_size_x, size_t wg_size_y, size_t wg_size_z)
+{
+  PHSAWorkItem *wi_threads = NULL;
+  PHSAWorkGroup wg;
+  size_t flat_wi_id = 0, x, y, z, max_x, max_y, max_z;
+  fiber_barrier_t wg_start_barrier;
+  fiber_barrier_t wg_completion_barrier;
+  fiber_barrier_t wg_sync_barrier;
+
+  max_x = wg_size_x == 0 ? 1 : wg_size_x;
+  max_y = wg_size_y == 0 ? 1 : wg_size_y;
+  max_z = wg_size_z == 0 ? 1 : wg_size_z;
+
+  size_t wg_size = max_x * max_y * max_z;
+  if (wg_size > PHSA_MAX_WG_SIZE)
+    phsa_fatal_error (2);
+
+  wg.private_segment_total_size = context->dp->private_segment_size * wg_size;
+  if (wg.private_segment_total_size > 0
+      && posix_memalign (&wg.private_base_ptr, PRIVATE_SEGMENT_ALIGN,
+                        wg.private_segment_total_size)
+          != 0)
+    phsa_fatal_error (3);
+
+  wg.alloca_stack_p = wg.private_segment_total_size;
+  wg.alloca_frame_p = wg.alloca_stack_p;
+
+#ifdef EXECUTE_WGS_BACKWARDS
+  wg.x = context->wg_max_x - 1;
+  wg.y = context->wg_max_y - 1;
+  wg.z = context->wg_max_z - 1;
+#else
+  wg.x = context->wg_min_x;
+  wg.y = context->wg_min_y;
+  wg.z = context->wg_min_z;
+#endif
+
+  fiber_barrier_init (&wg_sync_barrier, wg_size);
+  fiber_barrier_init (&wg_start_barrier, wg_size);
+  fiber_barrier_init (&wg_completion_barrier, wg_size);
+
+  context->wg_start_barrier = &wg_start_barrier;
+  context->wg_sync_barrier = &wg_sync_barrier;
+  context->wg_completion_barrier = &wg_completion_barrier;
+
+  wg.more_wgs = 1;
+  wg.group_base_ptr = group_base_ptr;
+
+#ifdef BENCHMARK_PHSA_RT
+  wi_count = 0;
+  wis_skipped = 0;
+  start_time = clock ();
+#endif
+  wi_threads = malloc (sizeof (PHSAWorkItem) * max_x * max_y * max_z);
+  for (x = 0; x < max_x; ++x)
+    for (y = 0; y < max_y; ++y)
+      for (z = 0; z < max_z; ++z)
+       {
+         PHSAWorkItem *wi = &wi_threads[flat_wi_id];
+         wi->launch_data = context;
+         wi->wg = &wg;
+         wi->x = x;
+         wi->y = y;
+         wi->z = z;
+
+         /* TODO: set the stack size according to the private
+                  segment size.  Too big stack consumes huge amount of
+                  memory in case of huge number of WIs and a too small stack
+                  will fail in mysterious and potentially dangerous ways.  */
+
+         fiber_init (&wi->fiber, phsa_work_item_thread, wi,
+                     FIBER_STACK_SIZE, PRIVATE_SEGMENT_ALIGN);
+         ++flat_wi_id;
+       }
+
+  do
+    {
+      --flat_wi_id;
+      fiber_join (&wi_threads[flat_wi_id].fiber);
+    }
+  while (flat_wi_id > 0);
+
+  if (wg.private_segment_total_size > 0)
+    free (wg.private_base_ptr);
+
+  free (wi_threads);
+}
+
+/* Spawn the work-item threads to execute work-groups and let
+   them execute all the WGs, including a potential partial WG.  */
+
+static void
+phsa_spawn_work_items (PHSAKernelLaunchData *context, void *group_base_ptr)
+{
+  hsa_kernel_dispatch_packet_t *dp = context->dp;
+  size_t x, y, z;
+
+  /* TO DO: host-side memory management of group and private segment
+     memory.  Agents in general are less likely to support efficient dynamic mem
+     allocation.  */
+  if (dp->group_segment_size > 0
+      && posix_memalign (&group_base_ptr, PRIVATE_SEGMENT_ALIGN,
+                        dp->group_segment_size) != 0)
+    phsa_fatal_error (3);
+
+  context->group_segment_start_addr = (size_t) group_base_ptr;
+
+  /* HSA seems to allow the WG size to be larger than the grid size.  We need to
+     saturate the effective WG size to the grid size to prevent the extra WIs
+     from executing.  */
+  size_t sat_wg_size_x, sat_wg_size_y, sat_wg_size_z, sat_wg_size;
+  sat_wg_size_x = MIN (dp->workgroup_size_x, dp->grid_size_x);
+  sat_wg_size_y = MIN (dp->workgroup_size_y, dp->grid_size_y);
+  sat_wg_size_z = MIN (dp->workgroup_size_z, dp->grid_size_z);
+  sat_wg_size = sat_wg_size_x * sat_wg_size_y * sat_wg_size_z;
+
+#ifdef BENCHMARK_PHSA_RT
+  wi_total = (uint64_t) dp->grid_size_x
+            * (dp->grid_size_y > 0 ? dp->grid_size_y : 1)
+            * (dp->grid_size_z > 0 ? dp->grid_size_z : 1);
+#endif
+
+  /* For now execute all work groups in a single coarse thread (does not utilize
+     multicore/multithread).  */
+  context->wg_min_x = context->wg_min_y = context->wg_min_z = 0;
+
+  int dims = dp->setup & 0x3;
+
+  context->wg_max_x = ((uint64_t) dp->grid_size_x + dp->workgroup_size_x - 1)
+                     / dp->workgroup_size_x;
+
+  context->wg_max_y
+    = dims < 2 ? 1 : ((uint64_t) dp->grid_size_y + dp->workgroup_size_y - 1)
+                      / dp->workgroup_size_y;
+
+  context->wg_max_z
+    = dims < 3 ? 1 : ((uint64_t) dp->grid_size_z + dp->workgroup_size_z - 1)
+                      / dp->workgroup_size_z;
+
+#ifdef DEBUG_PHSA_RT
+  printf ("### launching work-groups %lu/%lu/%lu to %lu/%lu/%lu with "
+         "wg size %lu/%lu/%lu grid size %u/%u/%u\n",
+         context->wg_min_x, context->wg_min_y, context->wg_min_z,
+         context->wg_max_x, context->wg_max_y, context->wg_max_z,
+         sat_wg_size_x, sat_wg_size_y, sat_wg_size_z, dp->grid_size_x,
+         dp->grid_size_y, dp->grid_size_z);
+#endif
+
+  phsa_execute_wi_gang (context, group_base_ptr, sat_wg_size_x, sat_wg_size_y,
+                       sat_wg_size_z);
+
+  if (dp->group_segment_size > 0)
+    free (group_base_ptr);
+}
+#endif
+
+/* Executes the given work-group function for all work groups in the grid.
+
+   A work-group function is a version of the original kernel which executes
+   the kernel for all work-items in a work-group.  It is produced by gccbrig
+   if it can handle the kernel's barrier usage and is much faster way to
+   execute massive numbers of work-items in a non-SPMD machine than fibers
+   (easily 100x faster).  */
+static void
+phsa_execute_work_groups (PHSAKernelLaunchData *context, void *group_base_ptr)
+{
+  hsa_kernel_dispatch_packet_t *dp = context->dp;
+  size_t x, y, z, wg_x, wg_y, wg_z;
+
+  /* TODO: host-side memory management of group and private segment
+     memory.  Agents in general are less likely to support efficient dynamic mem
+     allocation.  */
+  if (dp->group_segment_size > 0
+      && posix_memalign (&group_base_ptr, GROUP_SEGMENT_ALIGN,
+                        dp->group_segment_size) != 0)
+    phsa_fatal_error (3);
+
+  context->group_segment_start_addr = (size_t) group_base_ptr;
+
+  /* HSA seems to allow the WG size to be larger than the grid size.  We need
+     to saturate the effective WG size to the grid size to prevent the extra WIs
+     from executing.  */
+  size_t sat_wg_size_x, sat_wg_size_y, sat_wg_size_z, sat_wg_size;
+  sat_wg_size_x = MIN (dp->workgroup_size_x, dp->grid_size_x);
+  sat_wg_size_y = MIN (dp->workgroup_size_y, dp->grid_size_y);
+  sat_wg_size_z = MIN (dp->workgroup_size_z, dp->grid_size_z);
+  sat_wg_size = sat_wg_size_x * sat_wg_size_y * sat_wg_size_z;
+
+#ifdef BENCHMARK_PHSA_RT
+  wi_total = (uint64_t) dp->grid_size_x
+            * (dp->grid_size_y > 0 ? dp->grid_size_y : 1)
+            * (dp->grid_size_z > 0 ? dp->grid_size_z : 1);
+#endif
+
+  context->wg_min_x = context->wg_min_y = context->wg_min_z = 0;
+
+  int dims = dp->setup & 0x3;
+
+  context->wg_max_x = ((uint64_t) dp->grid_size_x + dp->workgroup_size_x - 1)
+                     / dp->workgroup_size_x;
+
+  context->wg_max_y
+    = dims < 2 ? 1 : ((uint64_t) dp->grid_size_y + dp->workgroup_size_y - 1)
+                      / dp->workgroup_size_y;
+
+  context->wg_max_z
+    = dims < 3 ? 1 : ((uint64_t) dp->grid_size_z + dp->workgroup_size_z - 1)
+                      / dp->workgroup_size_z;
+
+#ifdef DEBUG_PHSA_RT
+  printf ("### launching work-groups %lu/%lu/%lu to %lu/%lu/%lu with "
+         "wg size %lu/%lu/%lu grid size %u/%u/%u\n",
+         context->wg_min_x, context->wg_min_y, context->wg_min_z,
+         context->wg_max_x, context->wg_max_y, context->wg_max_z,
+         sat_wg_size_x, sat_wg_size_y, sat_wg_size_z, dp->grid_size_x,
+         dp->grid_size_y, dp->grid_size_z);
+#endif
+
+  PHSAWorkItem wi;
+  PHSAWorkGroup wg;
+  wi.wg = &wg;
+  wi.x = wi.y = wi.z = 0;
+  wi.launch_data = context;
+
+#ifdef BENCHMARK_PHSA_RT
+  start_time = clock ();
+  uint64_t wg_count = 0;
+#endif
+
+  size_t wg_size = __hsail_workgroupsize (0, &wi)
+                  * __hsail_workgroupsize (1, &wi)
+                  * __hsail_workgroupsize (2, &wi);
+
+  void *private_base_ptr = NULL;
+  if (dp->private_segment_size > 0
+      && posix_memalign (&private_base_ptr, PRIVATE_SEGMENT_ALIGN,
+                        dp->private_segment_size * wg_size)
+          != 0)
+    phsa_fatal_error (3);
+
+  wg.alloca_stack_p = dp->private_segment_size * wg_size;
+  wg.alloca_frame_p = wg.alloca_stack_p;
+
+  wg.private_base_ptr = private_base_ptr;
+  wg.group_base_ptr = group_base_ptr;
+
+#ifdef DEBUG_PHSA_RT
+  printf ("priv seg size %u wg_size %lu @ %p\n", dp->private_segment_size,
+         wg_size, private_base_ptr);
+#endif
+
+  for (wg_z = context->wg_min_z; wg_z < context->wg_max_z; ++wg_z)
+    for (wg_y = context->wg_min_y; wg_y < context->wg_max_y; ++wg_y)
+      for (wg_x = context->wg_min_x; wg_x < context->wg_max_x; ++wg_x)
+       {
+         wi.wg->x = wg_x;
+         wi.wg->y = wg_y;
+         wi.wg->z = wg_z;
+
+         context->kernel (context->kernarg_addr, &wi, group_base_ptr,
+                          private_base_ptr);
+
+#if defined (BENCHMARK_PHSA_RT)
+         wg_count++;
+         if (wg_count % 1000000 == 0)
+           {
+             clock_t spent_time = clock () - start_time;
+             uint64_t wi_count = wg_x * sat_wg_size_x + wg_y * sat_wg_size_y
+                                 + wg_z * sat_wg_size_z;
+             double spent_time_sec = (double) spent_time / CLOCKS_PER_SEC;
+             double wis_per_sec = wi_count / spent_time_sec;
+             uint64_t eta_sec = (wi_total - wi_count) / wis_per_sec;
+
+             printf ("%lu WIs executed in %lus (%lu WIs/s, ETA in %lu s)\n",
+                     wi_count, (uint64_t) spent_time_sec,
+                     (uint64_t) wis_per_sec, (uint64_t) eta_sec);
+           }
+#endif
+       }
+
+#ifdef BENCHMARK_PHSA_RT
+  clock_t spent_time = clock () - start_time;
+  double spent_time_sec = (double) spent_time / CLOCKS_PER_SEC;
+  double wis_per_sec = wi_total / spent_time_sec;
+
+  printf ("### %lu WIs executed in %lu s (%lu WIs / s)\n", wi_total,
+         (uint64_t) spent_time_sec, (uint64_t) wis_per_sec);
+#endif
+
+  if (dp->group_segment_size > 0)
+    free (group_base_ptr);
+
+  free (private_base_ptr);
+  private_base_ptr = NULL;
+}
+
+/* gccbrig generates the following from each HSAIL kernel:
+
+   1) The actual kernel function (a single work-item kernel or a work-group
+      function) generated from HSAIL (BRIG).
+
+        static void _Kernel (void* args, void* context, void* group_base_ptr)
+        {
+          ...
+        }
+
+  2) A public facing kernel function that is called from the PHSA runtime:
+
+   a) A single work-item function (that requires fibers for multi-WI):
+
+      void Kernel (void* context)
+      {
+        __launch_launch_kernel (_Kernel, context);
+      }
+
+      or
+
+    b) a when gccbrig could generate a work-group function:
+
+      void Kernel (void* context)
+      {
+               __hsail_launch_wg_function (_Kernel, context);
+      }
+*/
+
+#ifdef HAVE_FIBERS
+
+void
+__hsail_launch_kernel (gccbrigKernelFunc kernel, PHSAKernelLaunchData *context,
+                      void *group_base_ptr)
+{
+  context->kernel = kernel;
+  phsa_spawn_work_items (context, group_base_ptr);
+}
+#endif
+
+void
+__hsail_launch_wg_function (gccbrigKernelFunc kernel,
+                           PHSAKernelLaunchData *context, void *group_base_ptr)
+{
+  context->kernel = kernel;
+  phsa_execute_work_groups (context, group_base_ptr);
+}
+
+uint32_t
+__hsail_workitemabsid (uint32_t dim, PHSAWorkItem *context)
+{
+  hsa_kernel_dispatch_packet_t *dp = context->launch_data->dp;
+
+  uint32_t id;
+  switch (dim)
+    {
+    default:
+    case 0:
+      /* Overflow semantics in the case of WG dim > grid dim.  */
+      id = ((uint64_t) context->wg->x * dp->workgroup_size_x + context->x)
+          % dp->grid_size_x;
+      break;
+    case 1:
+      id = ((uint64_t) context->wg->y * dp->workgroup_size_y + context->y)
+          % dp->grid_size_y;
+      break;
+    case 2:
+      id = ((uint64_t) context->wg->z * dp->workgroup_size_z + context->z)
+          % dp->grid_size_z;
+      break;
+    }
+  return id;
+}
+
+uint64_t
+__hsail_workitemabsid_u64 (uint32_t dim, PHSAWorkItem *context)
+{
+  hsa_kernel_dispatch_packet_t *dp = context->launch_data->dp;
+
+  uint64_t id;
+  switch (dim)
+    {
+    default:
+    case 0:
+      /* Overflow semantics in the case of WG dim > grid dim.  */
+      id = ((uint64_t) context->wg->x * dp->workgroup_size_x + context->x)
+          % dp->grid_size_x;
+      break;
+    case 1:
+      id = ((uint64_t) context->wg->y * dp->workgroup_size_y + context->y)
+          % dp->grid_size_y;
+      break;
+    case 2:
+      id = ((uint64_t) context->wg->z * dp->workgroup_size_z + context->z)
+          % dp->grid_size_z;
+      break;
+    }
+  return id;
+}
+
+
+uint32_t
+__hsail_workitemid (uint32_t dim, PHSAWorkItem *context)
+{
+  PHSAWorkItem *c = (PHSAWorkItem *) context;
+  hsa_kernel_dispatch_packet_t *dp = context->launch_data->dp;
+
+  /* The number of dimensions is in the two least significant bits.  */
+  int dims = dp->setup & 0x3;
+
+  uint32_t id;
+  switch (dim)
+    {
+    default:
+    case 0:
+      id = c->x;
+      break;
+    case 1:
+      id = dims < 2 ? 0 : c->y;
+      break;
+    case 2:
+      id = dims < 3 ? 0 : c->z;
+      break;
+    }
+  return id;
+}
+
+uint32_t
+__hsail_gridgroups (uint32_t dim, PHSAWorkItem *context)
+{
+  hsa_kernel_dispatch_packet_t *dp = context->launch_data->dp;
+  int dims = dp->setup & 0x3;
+
+  uint32_t id;
+  switch (dim)
+    {
+    default:
+    case 0:
+      id = (dp->grid_size_x + dp->workgroup_size_x - 1) / dp->workgroup_size_x;
+      break;
+    case 1:
+      id = dims < 2 ? 1 : (dp->grid_size_y + dp->workgroup_size_y - 1)
+                           / dp->workgroup_size_y;
+      break;
+    case 2:
+      id = dims < 3 ? 1 : (dp->grid_size_z + dp->workgroup_size_z - 1)
+                           / dp->workgroup_size_z;
+      break;
+    }
+  return id;
+}
+
+uint32_t
+__hsail_workitemflatid (PHSAWorkItem *c)
+{
+  hsa_kernel_dispatch_packet_t *dp = c->launch_data->dp;
+
+  return c->x + c->y * dp->workgroup_size_x
+        + c->z * dp->workgroup_size_x * dp->workgroup_size_y;
+}
+
+uint32_t
+__hsail_currentworkitemflatid (PHSAWorkItem *c)
+{
+  hsa_kernel_dispatch_packet_t *dp = c->launch_data->dp;
+
+  return c->x + c->y * __hsail_currentworkgroupsize (0, c)
+        + c->z * __hsail_currentworkgroupsize (0, c)
+            * __hsail_currentworkgroupsize (1, c);
+}
+
+void
+__hsail_setworkitemid (uint32_t dim, uint32_t id, PHSAWorkItem *context)
+{
+  switch (dim)
+    {
+    default:
+    case 0:
+      context->x = id;
+      break;
+    case 1:
+      context->y = id;
+      break;
+    case 2:
+      context->z = id;
+      break;
+    }
+}
+
+uint64_t
+__hsail_workitemflatabsid_u64 (PHSAWorkItem *context)
+{
+  PHSAWorkItem *c = (PHSAWorkItem *) context;
+  hsa_kernel_dispatch_packet_t *dp = context->launch_data->dp;
+
+  /* Work-item flattened absolute ID = ID0 + ID1 * max0 + ID2 * max0 * max1.  */
+  uint64_t id0 = __hsail_workitemabsid (0, context);
+  uint64_t id1 = __hsail_workitemabsid (1, context);
+  uint64_t id2 = __hsail_workitemabsid (2, context);
+
+  uint64_t max0 = dp->grid_size_x;
+  uint64_t max1 = dp->grid_size_y;
+  uint64_t id = id0 + id1 * max0 + id2 * max0 * max1;
+
+  return id;
+}
+
+uint32_t
+__hsail_workitemflatabsid_u32 (PHSAWorkItem *context)
+{
+  PHSAWorkItem *c = (PHSAWorkItem *) context;
+  hsa_kernel_dispatch_packet_t *dp = context->launch_data->dp;
+
+  /* work-item flattened absolute ID = ID0 + ID1 * max0 + ID2 * max0 * max1.  */
+  uint64_t id0 = __hsail_workitemabsid (0, context);
+  uint64_t id1 = __hsail_workitemabsid (1, context);
+  uint64_t id2 = __hsail_workitemabsid (2, context);
+
+  uint64_t max0 = dp->grid_size_x;
+  uint64_t max1 = dp->grid_size_y;
+  uint64_t id = id0 + id1 * max0 + id2 * max0 * max1;
+  return (uint32_t) id;
+}
+
+uint32_t
+__hsail_currentworkgroupsize (uint32_t dim, PHSAWorkItem *wi)
+{
+  hsa_kernel_dispatch_packet_t *dp = wi->launch_data->dp;
+  uint32_t wg_size = 0;
+  switch (dim)
+    {
+    default:
+    case 0:
+      if ((uint64_t) wi->wg->x < dp->grid_size_x / dp->workgroup_size_x)
+       wg_size = dp->workgroup_size_x; /* Full WG.  */
+      else
+       wg_size = dp->grid_size_x % dp->workgroup_size_x; /* Partial WG.  */
+      break;
+    case 1:
+      if ((uint64_t) wi->wg->y < dp->grid_size_y / dp->workgroup_size_y)
+       wg_size = dp->workgroup_size_y; /* Full WG.  */
+      else
+       wg_size = dp->grid_size_y % dp->workgroup_size_y; /* Partial WG.  */
+      break;
+    case 2:
+      if ((uint64_t) wi->wg->z < dp->grid_size_z / dp->workgroup_size_z)
+       wg_size = dp->workgroup_size_z; /* Full WG.  */
+      else
+       wg_size = dp->grid_size_z % dp->workgroup_size_z; /* Partial WG.  */
+      break;
+    }
+  return wg_size;
+}
+
+uint32_t
+__hsail_workgroupsize (uint32_t dim, PHSAWorkItem *wi)
+{
+  hsa_kernel_dispatch_packet_t *dp = wi->launch_data->dp;
+  switch (dim)
+    {
+    default:
+    case 0:
+      return dp->workgroup_size_x;
+    case 1:
+      return dp->workgroup_size_y;
+    case 2:
+      return dp->workgroup_size_z;
+    }
+}
+
+uint32_t
+__hsail_gridsize (uint32_t dim, PHSAWorkItem *wi)
+{
+  hsa_kernel_dispatch_packet_t *dp = wi->launch_data->dp;
+  switch (dim)
+    {
+    default:
+    case 0:
+      return dp->grid_size_x;
+    case 1:
+      return dp->grid_size_y;
+    case 2:
+      return dp->grid_size_z;
+    }
+}
+
+uint32_t
+__hsail_workgroupid (uint32_t dim, PHSAWorkItem *wi)
+{
+  switch (dim)
+    {
+    default:
+    case 0:
+      return wi->wg->x;
+    case 1:
+      return wi->wg->y;
+    case 2:
+      return wi->wg->z;
+    }
+}
+
+uint32_t
+__hsail_dim (PHSAWorkItem *wi)
+{
+  hsa_kernel_dispatch_packet_t *dp = wi->launch_data->dp;
+  return dp->setup & 0x3;
+}
+
+uint64_t
+__hsail_packetid (PHSAWorkItem *wi)
+{
+  return wi->launch_data->packet_id;
+}
+
+uint32_t
+__hsail_packetcompletionsig_sig32 (PHSAWorkItem *wi)
+{
+  return (uint32_t) wi->launch_data->dp->completion_signal.handle;
+}
+
+uint64_t
+__hsail_packetcompletionsig_sig64 (PHSAWorkItem *wi)
+{
+  return (uint64_t) (wi->launch_data->dp->completion_signal.handle);
+}
+
+#ifdef HAVE_FIBERS
+void
+__hsail_barrier (PHSAWorkItem *wi)
+{
+  fiber_barrier_reach ((fiber_barrier_t *) wi->launch_data->wg_sync_barrier);
+}
+#endif
+
+/* Return a 32b private segment address that points to a dynamically
+   allocated chunk of 'size' with 'align'.
+
+   Allocates the space from the end of the private segment allocated
+   for the whole work group.  In implementations with separate private
+   memories per WI, we will need to have a stack pointer per WI.  But in
+   the current implementation, the segment is shared, so we possibly
+   save some space in case all WIs do not call the alloca.
+
+   The "alloca frames" are organized as follows:
+
+   wg->alloca_stack_p points to the last allocated data (initially
+   outside the private segment)
+   wg->alloca_frame_p points to the first address _outside_ the current
+   function's allocations (initially to the same as alloca_stack_p)
+
+   The data is allocated downwards from the end of the private segment.
+
+   In the beginning of a new function which has allocas, a new alloca
+   frame is pushed which adds the current alloca_frame_p (the current
+   function's frame starting point) to the top of the alloca stack and
+   alloca_frame_p is set to the current stack position.
+
+   At the exit points of a function with allocas, the alloca frame
+   is popped before returning.  This involves popping the alloca_frame_p
+   to the one of the previous function in the call stack, and alloca_stack_p
+   similarly, to the position of the last word alloca'd by the previous
+   function.
+ */
+
+uint32_t
+__hsail_alloca (uint32_t size, uint32_t align, PHSAWorkItem *wi)
+{
+  volatile PHSAWorkGroup *wg = wi->wg;
+  uint32_t new_pos = wg->alloca_stack_p - size;
+  while (new_pos % align != 0)
+    new_pos--;
+  wg->alloca_stack_p = new_pos;
+
+#ifdef DEBUG_ALLOCA
+  printf ("--- alloca (%u, %u) sp @%u fp @%u\n", size, align,
+         wg->alloca_stack_p, wg->alloca_frame_p);
+#endif
+  return new_pos;
+}
+
+/* Initializes a new "alloca frame" in the private segment.
+   This should be called at all the function entry points in case
+   the function contains at least one call to alloca.  */
+
+void
+__hsail_alloca_push_frame (PHSAWorkItem *wi)
+{
+  volatile PHSAWorkGroup *wg = wi->wg;
+
+  /* Store the alloca_frame_p without any alignment padding so
+     we know exactly where the previous frame ended after popping
+     it.  */
+#ifdef DEBUG_ALLOCA
+  printf ("--- push frame ");
+#endif
+  uint32_t last_word_offs = __hsail_alloca (4, 1, wi);
+  memcpy (wg->private_base_ptr + last_word_offs,
+         (const void *) &wg->alloca_frame_p, 4);
+  wg->alloca_frame_p = last_word_offs;
+
+#ifdef DEBUG_ALLOCA
+  printf ("--- sp @%u fp @%u\n", wg->alloca_stack_p, wg->alloca_frame_p);
+#endif
+}
+
+/* Frees the current "alloca frame" and restores the frame
+   pointer.
+   This should be called at all the function return points in case
+   the function contains at least one call to alloca.  Restores the
+   alloca stack to the condition it was before pushing the frame
+   the last time.  */
+void
+__hsail_alloca_pop_frame (PHSAWorkItem *wi)
+{
+  volatile PHSAWorkGroup *wg = wi->wg;
+
+  wg->alloca_stack_p = wg->alloca_frame_p;
+  memcpy (&wg->alloca_frame_p,
+         (const void *) (wg->private_base_ptr + wg->alloca_frame_p), 4);
+  /* Now frame_p points to the beginning of the previous function's
+     frame and stack_p to its end.  */
+
+  wg->alloca_stack_p += 4;
+
+#ifdef DEBUG_ALLOCA
+  printf ("--- pop frame sp @%u fp @%u\n", wg->alloca_stack_p,
+         wg->alloca_frame_p);
+#endif
+}
diff --git a/libhsail-rt/target-config.h.in b/libhsail-rt/target-config.h.in
new file mode 100644 (file)
index 0000000..28aeaf3
--- /dev/null
@@ -0,0 +1,68 @@
+/* target-config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `void*', as computed by sizeof. */
+#undef SIZEOF_VOIDP
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION