summaryrefslogtreecommitdiff
path: root/mono
diff options
context:
space:
mode:
authorJo Shields <directhex@apebox.org>2014-02-19 22:12:43 +0000
committerJo Shields <directhex@apebox.org>2014-02-19 22:12:43 +0000
commit9972bf87b4f27d9c8f358ef8414ac1ab957a2f0f (patch)
tree5bb230c1d698659115f918e243c1d4b0aa4c7f51 /mono
parentd0a215f5626219ff7927f576588a777e5331c7be (diff)
downloadmono-9972bf87b4f27d9c8f358ef8414ac1ab957a2f0f.tar.gz
Imported Upstream version 3.2.8+dfsgupstream/3.2.8+dfsg
Diffstat (limited to 'mono')
-rw-r--r--mono/Makefile.in67
-rw-r--r--mono/arch/Makefile.in87
-rw-r--r--mono/arch/amd64/Makefile.in67
-rw-r--r--mono/arch/amd64/amd64-codegen.h4
-rw-r--r--mono/arch/arm/Makefile.in67
-rw-r--r--mono/arch/ia64/Makefile.in14
-rw-r--r--mono/arch/mips/Makefile.in46
-rw-r--r--mono/arch/mips/mips-codegen.h2
-rw-r--r--mono/arch/ppc/Makefile.in46
-rw-r--r--mono/arch/s390x/Makefile.in67
-rw-r--r--mono/arch/sparc/Makefile.in67
-rw-r--r--mono/arch/x86/Makefile.in67
-rw-r--r--mono/arch/x86/x86-codegen.h2
-rw-r--r--mono/benchmark/Makefile.in14
-rw-r--r--mono/cil/Makefile.in15
-rw-r--r--mono/cil/opcode.def3
-rw-r--r--mono/dis/Makefile.in40
-rw-r--r--mono/interpreter/Makefile.in52
-rw-r--r--mono/io-layer/Makefile.in67
-rwxr-xr-xmono/io-layer/io.c103
-rw-r--r--mono/io-layer/processes.c18
-rw-r--r--mono/io-layer/shared.c3
-rw-r--r--mono/io-layer/sockets.c3
-rw-r--r--mono/metadata/Makefile.am30
-rw-r--r--mono/metadata/Makefile.am.in30
-rw-r--r--mono/metadata/Makefile.in484
-rw-r--r--mono/metadata/appdomain.c69
-rw-r--r--mono/metadata/assembly.c82
-rw-r--r--mono/metadata/attach.c6
-rw-r--r--mono/metadata/boehm-gc.c40
-rw-r--r--mono/metadata/cil-coff.h7
-rw-r--r--mono/metadata/class.c97
-rw-r--r--mono/metadata/class.h6
-rw-r--r--mono/metadata/cominterop.c4
-rw-r--r--mono/metadata/console-unix.c13
-rw-r--r--mono/metadata/culture-info-tables.h2877
-rw-r--r--mono/metadata/debug-helpers.c2
-rw-r--r--mono/metadata/domain-internals.h31
-rw-r--r--mono/metadata/domain.c337
-rw-r--r--mono/metadata/exception.c2
-rw-r--r--mono/metadata/gc-internal.h13
-rw-r--r--mono/metadata/gc-memfuncs.c230
-rw-r--r--mono/metadata/gc.c172
-rw-r--r--mono/metadata/icall-def.h57
-rw-r--r--mono/metadata/icall.c240
-rw-r--r--mono/metadata/image.c45
-rw-r--r--mono/metadata/loader.c25
-rw-r--r--mono/metadata/locales.c223
-rw-r--r--mono/metadata/locales.h3
-rw-r--r--mono/metadata/lock-tracer.c18
-rw-r--r--mono/metadata/lock-tracer.h12
-rw-r--r--mono/metadata/marshal.c63
-rw-r--r--mono/metadata/metadata-internals.h11
-rw-r--r--mono/metadata/metadata.c21
-rw-r--r--mono/metadata/metadata.h3
-rw-r--r--mono/metadata/method-builder.c3
-rw-r--r--mono/metadata/monitor.c4
-rw-r--r--mono/metadata/mono-cq.c6
-rw-r--r--mono/metadata/mono-debug-debugger.c212
-rw-r--r--mono/metadata/mono-debug-debugger.h82
-rw-r--r--mono/metadata/mono-debug.c52
-rw-r--r--mono/metadata/mono-debug.h10
-rw-r--r--mono/metadata/mono-hash.h2
-rw-r--r--mono/metadata/mono-ptr-array.h4
-rw-r--r--mono/metadata/mono-wsq.c2
-rw-r--r--mono/metadata/null-gc.c6
-rw-r--r--mono/metadata/object-internals.h21
-rw-r--r--mono/metadata/object.c47
-rw-r--r--mono/metadata/object.h19
-rw-r--r--mono/metadata/reflection.c99
-rw-r--r--mono/metadata/sgen-alloc.c25
-rwxr-xr-xmono/metadata/sgen-archdep.h14
-rw-r--r--mono/metadata/sgen-bridge.c109
-rw-r--r--mono/metadata/sgen-cardtable.c6
-rw-r--r--mono/metadata/sgen-copy-object.h4
-rw-r--r--mono/metadata/sgen-debug.c18
-rw-r--r--mono/metadata/sgen-descriptor.h13
-rw-r--r--mono/metadata/sgen-gc.c207
-rw-r--r--mono/metadata/sgen-gc.h72
-rw-r--r--mono/metadata/sgen-internal.c1
-rw-r--r--mono/metadata/sgen-los.c6
-rwxr-xr-xmono/metadata/sgen-marksweep.c65
-rw-r--r--mono/metadata/sgen-memory-governor.c10
-rw-r--r--mono/metadata/sgen-nursery-allocator.c4
-rw-r--r--mono/metadata/sgen-os-mach.c12
-rw-r--r--mono/metadata/sgen-os-posix.c71
-rwxr-xr-xmono/metadata/sgen-os-win32.c39
-rw-r--r--mono/metadata/sgen-protocol.c28
-rw-r--r--mono/metadata/sgen-qsort.c78
-rwxr-xr-xmono/metadata/sgen-stw.c37
-rw-r--r--mono/metadata/sgen-toggleref.c2
-rw-r--r--mono/metadata/socket-io.c51
-rw-r--r--mono/metadata/test-gc-memfuncs.c104
-rw-r--r--mono/metadata/test-sgen-qsort.c103
-rw-r--r--mono/metadata/threads-types.h22
-rwxr-xr-xmono/metadata/threads.c1038
-rw-r--r--mono/metadata/tpool-epoll.c2
-rw-r--r--mono/metadata/tpool-kqueue.c2
-rw-r--r--mono/mini/Makefile.am23
-rwxr-xr-xmono/mini/Makefile.am.in23
-rw-r--r--mono/mini/Makefile.in354
-rw-r--r--mono/mini/abcremoval.c10
-rw-r--r--mono/mini/alias-analysis.c339
-rwxr-xr-xmono/mini/aot-compiler.c308
-rw-r--r--mono/mini/aot-runtime.c308
-rw-r--r--mono/mini/arrays.cs15
-rw-r--r--mono/mini/basic-float.cs13
-rw-r--r--mono/mini/cpu-amd64.md21
-rw-r--r--mono/mini/cpu-arm.md28
-rw-r--r--mono/mini/cpu-mips.md1
-rw-r--r--mono/mini/cpu-x86.md12
-rw-r--r--mono/mini/debug-debugger.c614
-rw-r--r--mono/mini/debug-debugger.h155
-rw-r--r--mono/mini/debug-mini.c555
-rw-r--r--mono/mini/debug-mini.h62
-rwxr-xr-xmono/mini/debugger-agent.c246
-rw-r--r--mono/mini/declsec.c26
-rw-r--r--mono/mini/decompose.c69
-rw-r--r--mono/mini/driver.c264
-rw-r--r--mono/mini/dwarfwriter.c90
-rw-r--r--mono/mini/dwarfwriter.h2
-rw-r--r--mono/mini/exceptions-amd64.c134
-rw-r--r--mono/mini/exceptions-arm.c53
-rw-r--r--mono/mini/exceptions-ia64.c2
-rw-r--r--mono/mini/exceptions-mips.c14
-rw-r--r--mono/mini/exceptions-ppc.c22
-rw-r--r--mono/mini/exceptions-s390x.c6
-rw-r--r--mono/mini/exceptions-x86.c112
-rw-r--r--mono/mini/exceptions.cs22
-rw-r--r--mono/mini/graph.c10
-rw-r--r--mono/mini/gshared.cs41
-rw-r--r--mono/mini/iltests.il.in11
-rw-r--r--mono/mini/image-writer.c227
-rw-r--r--mono/mini/ir-emit.h15
-rw-r--r--mono/mini/jit-icalls.c5
-rw-r--r--mono/mini/liveness.c3
-rw-r--r--mono/mini/mdb-debug-info32-darwin.s14
-rw-r--r--mono/mini/mdb-debug-info32.s13
-rw-r--r--mono/mini/mdb-debug-info64.s15
-rw-r--r--mono/mini/method-to-ir.c547
-rw-r--r--mono/mini/mini-amd64.c545
-rw-r--r--mono/mini/mini-amd64.h32
-rw-r--r--mono/mini/mini-arm.c519
-rw-r--r--mono/mini/mini-arm.h45
-rw-r--r--mono/mini/mini-codegen.c55
-rw-r--r--mono/mini/mini-exceptions.c317
-rwxr-xr-xmono/mini/mini-gc.c22
-rw-r--r--mono/mini/mini-generic-sharing.c9
-rw-r--r--mono/mini/mini-ia64.c6
-rw-r--r--mono/mini/mini-llvm-cpp.cpp49
-rw-r--r--mono/mini/mini-llvm.c275
-rw-r--r--mono/mini/mini-llvm.h9
-rw-r--r--mono/mini/mini-mips.c28
-rw-r--r--mono/mini/mini-ops.h20
-rw-r--r--mono/mini/mini-posix.c70
-rw-r--r--mono/mini/mini-ppc.c42
-rw-r--r--mono/mini/mini-ppc.h3
-rw-r--r--mono/mini/mini-s390x.c44
-rw-r--r--mono/mini/mini-sparc.c5
-rw-r--r--mono/mini/mini-trampolines.c127
-rw-r--r--mono/mini/mini-unwind.h2
-rwxr-xr-xmono/mini/mini-x86.c824
-rw-r--r--mono/mini/mini-x86.h13
-rw-r--r--mono/mini/mini.c401
-rw-r--r--mono/mini/mini.h165
-rw-r--r--mono/mini/optflags-def.h1
-rw-r--r--mono/mini/patch-info.h4
-rw-r--r--mono/mini/regalloc2.c81
-rw-r--r--mono/mini/ssa.c113
-rw-r--r--mono/mini/tasklets.c6
-rw-r--r--mono/mini/trace.c10
-rw-r--r--mono/mini/tramp-amd64.c62
-rw-r--r--mono/mini/tramp-arm.c63
-rw-r--r--mono/mini/tramp-mips.c11
-rw-r--r--mono/mini/tramp-ppc.c16
-rw-r--r--mono/mini/tramp-s390x.c26
-rw-r--r--mono/mini/tramp-sparc.c17
-rw-r--r--mono/mini/tramp-x86.c40
-rw-r--r--mono/mini/unwind.c226
-rw-r--r--mono/mini/version.h2
-rw-r--r--mono/mini/xdebug.c12
-rw-r--r--mono/monograph/Makefile.am7
-rw-r--r--mono/monograph/Makefile.in56
-rw-r--r--mono/profiler/Makefile.in46
-rwxr-xr-xmono/profiler/ptestrunner.pl20
-rw-r--r--mono/profiler/test-busy.cs1
-rw-r--r--mono/tests/Makefile.am85
-rw-r--r--mono/tests/Makefile.in175
-rw-r--r--mono/tests/assemblyresolve/Makefile.in14
-rw-r--r--mono/tests/cas/Makefile.in67
-rw-r--r--mono/tests/cas/assembly/Makefile.in13
-rw-r--r--mono/tests/cas/demand/Makefile.in13
-rw-r--r--mono/tests/cas/inheritance/Makefile.in13
-rw-r--r--mono/tests/cas/linkdemand/Makefile.in13
-rw-r--r--mono/tests/cas/threads/Makefile.in13
-rw-r--r--mono/tests/finalizer-exception.cs4
-rw-r--r--mono/tests/gc-descriptors/Makefile.in14
-rw-r--r--mono/tests/libtest.c78
-rw-r--r--mono/tests/marshal.cs23
-rw-r--r--mono/tests/marshal7.cs54
-rw-r--r--mono/tests/pinvoke2.cs55
-rw-r--r--mono/tests/sgen-bridge-xref.cs52
-rw-r--r--mono/tests/sgen-descriptors.cs15
-rw-r--r--mono/tests/sgen-new-threads-dont-join-stw.cs95
-rw-r--r--mono/tests/thread_static_gc_layout.cs26
-rw-r--r--mono/utils/Makefile.am4
-rw-r--r--mono/utils/Makefile.in94
-rwxr-xr-xmono/utils/atomic.c381
-rwxr-xr-xmono/utils/atomic.h514
-rw-r--r--mono/utils/dlmalloc.c2
-rw-r--r--mono/utils/mach-support-arm.c5
-rw-r--r--mono/utils/mono-compiler.h1
-rw-r--r--mono/utils/mono-hwcap-arm.c20
-rw-r--r--mono/utils/mono-hwcap-arm.h2
-rw-r--r--mono/utils/mono-hwcap-sparc.c4
-rw-r--r--mono/utils/mono-membar.h58
-rw-r--r--mono/utils/mono-proclib.c2
-rw-r--r--mono/utils/mono-semaphore.c3
-rw-r--r--mono/utils/mono-signal-handler.h29
-rw-r--r--mono/utils/mono-stack-unwinding.h8
-rw-r--r--mono/utils/mono-threads.c109
-rw-r--r--mono/utils/mono-threads.h67
-rw-r--r--mono/utils/mono-tls.c37
-rw-r--r--mono/utils/mono-tls.h19
-rw-r--r--mono/utils/monobitset.c26
225 files changed, 11275 insertions, 9069 deletions
diff --git a/mono/Makefile.in b/mono/Makefile.in
index a7c32304e3..28bdcbcd60 100644
--- a/mono/Makefile.in
+++ b/mono/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -51,8 +52,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +70,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -365,11 +365,11 @@ clean-libtool:
-rm -rf .libs _libs
# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-# (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
@@ -433,10 +433,6 @@ ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
-cscopelist-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
- done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -500,20 +496,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -673,23 +655,22 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
- cscopelist-recursive ctags-recursive install-am install-strip \
- tags-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+ install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am check check-am clean clean-generic clean-libtool \
- cscopelist cscopelist-recursive ctags ctags-recursive \
- distclean distclean-generic distclean-libtool distclean-tags \
- distdir 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 installcheck installcheck-am installdirs \
- installdirs-am maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
- ps ps-am tags tags-recursive uninstall uninstall-am
+ ctags ctags-recursive distclean distclean-generic \
+ distclean-libtool distclean-tags distdir 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 installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am
@CROSS_COMPILING_FALSE@@INSTALL_MONOTOUCH_TRUE@monotouch-do-build:
diff --git a/mono/arch/Makefile.in b/mono/arch/Makefile.in
index 0371e4a066..c1c7d922f4 100644
--- a/mono/arch/Makefile.in
+++ b/mono/arch/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/arch
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -86,7 +86,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -96,10 +96,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_la_SOURCES)
DIST_SOURCES = $(am__libmonoarch_la_SOURCES_DIST)
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -392,14 +392,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch.la: $(libmonoarch_la_OBJECTS) $(libmonoarch_la_DEPENDENCIES) $(EXTRA_libmonoarch_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(am_libmonoarch_la_rpath) $(libmonoarch_la_OBJECTS) $(libmonoarch_la_LIBADD) $(LIBS)
@@ -442,11 +440,11 @@ clean-libtool:
-rm -rf .libs _libs
# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-# (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
@@ -510,10 +508,6 @@ ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
-cscopelist-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
- done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -577,20 +571,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -755,24 +735,23 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
- cscopelist-recursive ctags-recursive install-am install-strip \
- tags-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+ install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am check check-am clean clean-generic clean-libtool \
- clean-noinstLTLIBRARIES cscopelist cscopelist-recursive ctags \
- ctags-recursive distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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 installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-recursive uninstall uninstall-am
+ clean-noinstLTLIBRARIES ctags ctags-recursive distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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 installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/mono/arch/amd64/Makefile.in b/mono/arch/amd64/Makefile.in
index bcffbb1442..fa59651b3f 100644
--- a/mono/arch/amd64/Makefile.in
+++ b/mono/arch/amd64/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/arch/amd64
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -84,7 +84,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -94,10 +94,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_amd64_la_SOURCES)
DIST_SOURCES = $(libmonoarch_amd64_la_SOURCES)
am__can_run_installinfo = \
@@ -347,14 +347,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch-amd64.la: $(libmonoarch_amd64_la_OBJECTS) $(libmonoarch_amd64_la_DEPENDENCIES) $(EXTRA_libmonoarch_amd64_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libmonoarch_amd64_la_OBJECTS) $(libmonoarch_amd64_la_LIBADD) $(LIBS)
@@ -445,20 +443,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -600,18 +584,17 @@ uninstall-am:
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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 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
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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 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
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/mono/arch/amd64/amd64-codegen.h b/mono/arch/amd64/amd64-codegen.h
index 9dd3269774..3c40d9de52 100644
--- a/mono/arch/amd64/amd64-codegen.h
+++ b/mono/arch/amd64/amd64-codegen.h
@@ -1054,6 +1054,10 @@ typedef union {
#define amd64_sse_cvtsi2sd_reg_reg(inst,dreg,reg) amd64_sse_cvtsi2sd_reg_reg_size ((inst), (dreg), (reg), 8)
+#define amd64_sse_cvtsi2ss_reg_reg_size(inst,dreg,reg,size) emit_sse_reg_reg_size ((inst), (dreg), (reg), 0xf3, 0x0f, 0x2a, (size))
+
+#define amd64_sse_cvtsi2ss_reg_reg(inst,dreg,reg) amd64_sse_cvtsi2ss_reg_reg_size ((inst), (dreg), (reg), 8)
+
#define amd64_sse_cvtsd2ss_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5a)
#define amd64_sse_cvtss2sd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf3, 0x0f, 0x5a)
diff --git a/mono/arch/arm/Makefile.in b/mono/arch/arm/Makefile.in
index 0df4775aea..f140d46614 100644
--- a/mono/arch/arm/Makefile.in
+++ b/mono/arch/arm/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/arch/arm
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -86,7 +86,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -96,10 +96,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_arm_la_SOURCES)
DIST_SOURCES = $(libmonoarch_arm_la_SOURCES)
am__can_run_installinfo = \
@@ -360,14 +360,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch-arm.la: $(libmonoarch_arm_la_OBJECTS) $(libmonoarch_arm_la_DEPENDENCIES) $(EXTRA_libmonoarch_arm_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libmonoarch_arm_la_OBJECTS) $(libmonoarch_arm_la_LIBADD) $(LIBS)
@@ -459,20 +457,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -618,18 +602,17 @@ uninstall-am:
.MAKE: all check install install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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 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
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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 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
arm_dpimacros.h: dpiops.sh mov_macros.th dpi_macros.th cmp_macros.th
diff --git a/mono/arch/ia64/Makefile.in b/mono/arch/ia64/Makefile.in
index cc689526eb..cf0962a440 100644
--- a/mono/arch/ia64/Makefile.in
+++ b/mono/arch/ia64/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -51,8 +52,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/arch/ia64
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +70,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -327,8 +327,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/arch/mips/Makefile.in b/mono/arch/mips/Makefile.in
index f32449b248..3b0dc3f203 100644
--- a/mono/arch/mips/Makefile.in
+++ b/mono/arch/mips/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -54,8 +55,7 @@ host_triplet = @host@
target_triplet = @target@
noinst_PROGRAMS = test$(EXEEXT)
subdir = mono/arch/mips
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -90,7 +90,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -100,10 +100,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_mips_la_SOURCES) test.c
DIST_SOURCES = $(libmonoarch_mips_la_SOURCES) test.c
am__can_run_installinfo = \
@@ -353,14 +353,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch-mips.la: $(libmonoarch_mips_la_OBJECTS) $(libmonoarch_mips_la_DEPENDENCIES) $(EXTRA_libmonoarch_mips_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libmonoarch_mips_la_OBJECTS) $(libmonoarch_mips_la_LIBADD) $(LIBS)
@@ -463,20 +461,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -619,7 +603,7 @@ uninstall-am:
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
- cscopelist ctags distclean distclean-compile distclean-generic \
+ ctags distclean distclean-compile distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-dvi install-dvi-am install-exec \
diff --git a/mono/arch/mips/mips-codegen.h b/mono/arch/mips/mips-codegen.h
index dc4df7d8a6..1dbd1c6e27 100644
--- a/mono/arch/mips/mips-codegen.h
+++ b/mono/arch/mips/mips-codegen.h
@@ -334,7 +334,7 @@ enum {
/* misc and coprocessor ops */
#define mips_move(c,dest,src) mips_addu(c,dest,src,mips_zero)
#define mips_dmove(c,dest,src) mips_daddu(c,dest,src,mips_zero)
-#define mips_nop(c) mips_sll(c,0,0,0)
+#define mips_nop(c) mips_or(c,mips_at,mips_at,0)
#define mips_break(c,code) mips_emit32(c, ((code)<<6)|13)
#define mips_mfhi(c,dest) mips_format_r(c,0,0,0,dest,0,16)
#define mips_mflo(c,dest) mips_format_r(c,0,0,0,dest,0,18)
diff --git a/mono/arch/ppc/Makefile.in b/mono/arch/ppc/Makefile.in
index 780d7cb533..e21e112540 100644
--- a/mono/arch/ppc/Makefile.in
+++ b/mono/arch/ppc/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -54,8 +55,7 @@ host_triplet = @host@
target_triplet = @target@
@INTERP_SUPPORTED_TRUE@noinst_PROGRAMS = test$(EXEEXT)
subdir = mono/arch/ppc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -92,7 +92,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -102,10 +102,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_ppc_la_SOURCES) test.c
DIST_SOURCES = $(am__libmonoarch_ppc_la_SOURCES_DIST) test.c
am__can_run_installinfo = \
@@ -355,14 +355,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch-ppc.la: $(libmonoarch_ppc_la_OBJECTS) $(libmonoarch_ppc_la_DEPENDENCIES) $(EXTRA_libmonoarch_ppc_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(am_libmonoarch_ppc_la_rpath) $(libmonoarch_ppc_la_OBJECTS) $(libmonoarch_ppc_la_LIBADD) $(LIBS)
@@ -466,20 +464,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -622,7 +606,7 @@ uninstall-am:
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
- cscopelist ctags distclean distclean-compile distclean-generic \
+ ctags distclean distclean-compile distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-dvi install-dvi-am install-exec \
diff --git a/mono/arch/s390x/Makefile.in b/mono/arch/s390x/Makefile.in
index 74c27631c9..33d83d0f84 100644
--- a/mono/arch/s390x/Makefile.in
+++ b/mono/arch/s390x/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/arch/s390x
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -84,7 +84,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -94,10 +94,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_s390x_la_SOURCES)
DIST_SOURCES = $(libmonoarch_s390x_la_SOURCES)
am__can_run_installinfo = \
@@ -347,14 +347,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch-s390x.la: $(libmonoarch_s390x_la_OBJECTS) $(libmonoarch_s390x_la_DEPENDENCIES) $(EXTRA_libmonoarch_s390x_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libmonoarch_s390x_la_OBJECTS) $(libmonoarch_s390x_la_LIBADD) $(LIBS)
@@ -445,20 +443,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -600,18 +584,17 @@ uninstall-am:
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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 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
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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 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
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/mono/arch/sparc/Makefile.in b/mono/arch/sparc/Makefile.in
index d207c27267..fe7248cb2b 100644
--- a/mono/arch/sparc/Makefile.in
+++ b/mono/arch/sparc/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/arch/sparc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -84,7 +84,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -94,10 +94,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_sparc_la_SOURCES)
DIST_SOURCES = $(libmonoarch_sparc_la_SOURCES)
am__can_run_installinfo = \
@@ -347,14 +347,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch-sparc.la: $(libmonoarch_sparc_la_OBJECTS) $(libmonoarch_sparc_la_DEPENDENCIES) $(EXTRA_libmonoarch_sparc_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libmonoarch_sparc_la_OBJECTS) $(libmonoarch_sparc_la_LIBADD) $(LIBS)
@@ -445,20 +443,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -600,18 +584,17 @@ uninstall-am:
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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 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
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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 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
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/mono/arch/x86/Makefile.in b/mono/arch/x86/Makefile.in
index 110d25802d..13584f3869 100644
--- a/mono/arch/x86/Makefile.in
+++ b/mono/arch/x86/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/arch/x86
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -86,7 +86,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -96,10 +96,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoarch_x86_la_SOURCES)
DIST_SOURCES = $(am__libmonoarch_x86_la_SOURCES_DIST)
am__can_run_installinfo = \
@@ -349,14 +349,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoarch-x86.la: $(libmonoarch_x86_la_OBJECTS) $(libmonoarch_x86_la_DEPENDENCIES) $(EXTRA_libmonoarch_x86_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(am_libmonoarch_x86_la_rpath) $(libmonoarch_x86_la_OBJECTS) $(libmonoarch_x86_la_LIBADD) $(LIBS)
@@ -447,20 +445,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -602,18 +586,17 @@ uninstall-am:
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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 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
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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 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
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/mono/arch/x86/x86-codegen.h b/mono/arch/x86/x86-codegen.h
index ced466eaf1..ad6282f640 100644
--- a/mono/arch/x86/x86-codegen.h
+++ b/mono/arch/x86/x86-codegen.h
@@ -1039,7 +1039,7 @@ typedef union {
} else { \
x86_codegen_pre(&(inst), 6); \
*(inst)++ = (unsigned char)0x69; \
- x86_reg_emit ((inst), (reg), (mem)); \
+ x86_mem_emit ((inst), (reg), (mem)); \
x86_imm_emit32 ((inst), (imm)); \
} \
} while (0)
diff --git a/mono/benchmark/Makefile.in b/mono/benchmark/Makefile.in
index 315e9fe05b..20fa031bc8 100644
--- a/mono/benchmark/Makefile.in
+++ b/mono/benchmark/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -51,8 +52,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/benchmark
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +70,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -372,8 +372,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/cil/Makefile.in b/mono/cil/Makefile.in
index 03a67d67a2..cbde840083 100644
--- a/mono/cil/Makefile.in
+++ b/mono/cil/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,8 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/cil
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs ChangeLog TODO
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog \
+ TODO
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -71,7 +72,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -403,8 +404,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/cil/opcode.def b/mono/cil/opcode.def
index 95ce8a8c26..e9d998f1dd 100644
--- a/mono/cil/opcode.def
+++ b/mono/cil/opcode.def
@@ -305,13 +305,14 @@ OPDEF(CEE_MONO_SAVE_LMF, "mono_save_lmf", Pop0, Push0, InlineNone, X, 2, 0xF0, 0
OPDEF(CEE_MONO_RESTORE_LMF, "mono_restore_lmf", Pop0, Push0, InlineNone, X, 2, 0xF0, 0x0A, NEXT)
OPDEF(CEE_MONO_CLASSCONST, "mono_classconst", Pop0, PushI, InlineI, X, 2, 0xF0, 0x0B, NEXT)
OPDEF(CEE_MONO_NOT_TAKEN, "mono_not_taken", Pop0, Push0, InlineNone, X, 2, 0xF0, 0x0C, NEXT)
+/* The argument should be one of the TLS_KEY values defined in mono-tls.h */
OPDEF(CEE_MONO_TLS, "mono_tls", Pop0, PushI, InlineI, X, 2, 0xF0, 0x0D, NEXT)
OPDEF(CEE_MONO_ICALL_ADDR, "mono_icall_addr", Pop0, PushI, InlineI, X, 2, 0xF0, 0x0E, NEXT)
OPDEF(CEE_MONO_DYN_CALL, "mono_dyn_call", Pop0, PushI, InlineI, X, 2, 0xF0, 0x0F, NEXT)
OPDEF(CEE_MONO_MEMORY_BARRIER, "mono_memory_barrier", Pop0, Push0, InlineI, X, 2, 0xF0, 0x10, NEXT)
OPDEF(CEE_MONO_JIT_ATTACH, "mono_jit_attach", Pop0, Push0, InlineNone, X, 2, 0xF0, 0x11, NEXT)
OPDEF(CEE_MONO_JIT_DETACH, "mono_jit_detach", Pop0, Push0, InlineNone, X, 2, 0xF0, 0x12, NEXT)
-OPDEF(CEE_MONO_JIT_ICALL_ADDR, "mono_jit_icall_addr", Pop0, PushI, InlineI, X, 2, 0xF0, 0x13, NEXT)
+OPDEF(CEE_MONO_JIT_ICALL_ADDR, "mono_jit_icall_addr", Pop0, Push0, InlineNone, X, 2, 0xF0, 0x13, NEXT)
#ifndef OPALIAS
#define _MONO_CIL_OPALIAS_DEFINED_
#define OPALIAS(a,s,r)
diff --git a/mono/dis/Makefile.in b/mono/dis/Makefile.in
index 801783e638..245836647d 100644
--- a/mono/dis/Makefile.in
+++ b/mono/dis/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -54,8 +55,7 @@ host_triplet = @host@
target_triplet = @target@
@DISABLE_EXECUTABLES_FALSE@@DISABLE_LIBRARIES_FALSE@@SUPPORT_BOEHM_TRUE@bin_PROGRAMS = monodis$(EXEEXT)
subdir = mono/dis
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs ChangeLog \
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog \
TODO
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
@@ -76,7 +76,7 @@ LIBRARIES = $(noinst_LIBRARIES)
ARFLAGS = cru
AM_V_AR = $(am__v_AR_@AM_V@)
am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
-am__v_AR_0 = @echo " AR " $@;
+am__v_AR_0 = @echo " AR " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -119,17 +119,17 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonodis_a_SOURCES) $(monodis_SOURCES)
DIST_SOURCES = $(libmonodis_a_SOURCES) $(monodis_SOURCES)
am__can_run_installinfo = \
@@ -633,20 +633,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -657,10 +643,10 @@ distdir: $(DISTFILES)
if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
if test -n "$$list" && \
grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
- echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \
+ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
- echo " typically 'make maintainer-clean' will remove them" >&2; \
+ echo " typically \`make maintainer-clean' will remove them" >&2; \
exit 1; \
else :; fi; \
else :; fi
@@ -806,8 +792,8 @@ uninstall-man: uninstall-man1
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libtool clean-noinstLIBRARIES cscopelist \
- ctags distclean distclean-compile distclean-generic \
+ clean-generic clean-libtool clean-noinstLIBRARIES ctags \
+ distclean distclean-compile distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-binPROGRAMS \
install-data install-data-am install-dvi install-dvi-am \
diff --git a/mono/interpreter/Makefile.in b/mono/interpreter/Makefile.in
index 0a12ee696f..0099f303a9 100644
--- a/mono/interpreter/Makefile.in
+++ b/mono/interpreter/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -56,8 +57,7 @@ target_triplet = @target@
@INTERP_SUPPORTED_TRUE@bin_PROGRAMS = mint$(EXEEXT)
subdir = mono/interpreter
DIST_COMMON = $(libmintinclude_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -128,7 +128,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -138,10 +138,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmint_la_SOURCES) $(mint_SOURCES)
DIST_SOURCES = $(libmint_la_SOURCES) $(mint_SOURCES)
am__can_run_installinfo = \
@@ -460,14 +460,12 @@ uninstall-libLTLIBRARIES:
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(lib_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
libmint.la: $(libmint_la_OBJECTS) $(libmint_la_DEPENDENCIES) $(EXTRA_libmint_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(am_libmint_la_rpath) $(libmint_la_OBJECTS) $(libmint_la_LIBADD) $(LIBS)
install-binPROGRAMS: $(bin_PROGRAMS)
@@ -674,20 +672,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -698,10 +682,10 @@ distdir: $(DISTFILES)
if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
if test -n "$$list" && \
grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
- echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \
+ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
- echo " typically 'make maintainer-clean' will remove them" >&2; \
+ echo " typically \`make maintainer-clean' will remove them" >&2; \
exit 1; \
else :; fi; \
else :; fi
@@ -850,8 +834,8 @@ uninstall-man: uninstall-man1
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libLTLIBRARIES clean-libtool cscopelist \
- ctags distclean distclean-compile distclean-generic \
+ clean-generic clean-libLTLIBRARIES clean-libtool ctags \
+ distclean distclean-compile distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-binPROGRAMS \
install-data install-data-am install-dvi install-dvi-am \
diff --git a/mono/io-layer/Makefile.in b/mono/io-layer/Makefile.in
index fa616562db..e349119b28 100644
--- a/mono/io-layer/Makefile.in
+++ b/mono/io-layer/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/io-layer
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -109,7 +109,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -119,10 +119,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libwapi_la_SOURCES)
DIST_SOURCES = $(am__libwapi_la_SOURCES_DIST)
am__can_run_installinfo = \
@@ -485,14 +485,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libwapi.la: $(libwapi_la_OBJECTS) $(libwapi_la_DEPENDENCIES) $(EXTRA_libwapi_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libwapi_la_OBJECTS) $(libwapi_la_LIBADD) $(LIBS)
@@ -607,20 +605,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -762,18 +746,17 @@ uninstall-am:
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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 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
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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 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
$(OTHER_SRC)
diff --git a/mono/io-layer/io.c b/mono/io-layer/io.c
index 579c48dd89..37166faa53 100755
--- a/mono/io-layer/io.c
+++ b/mono/io-layer/io.c
@@ -240,6 +240,43 @@ static void io_ops_init (void)
/* Some utility functions.
*/
+/*
+ * Check if a file is writable by the current user.
+ *
+ * This is is a best effort kind of thing. It assumes a reasonable sane set
+ * of permissions by the underlying OS.
+ *
+ * We assume that basic unix permission bits are authoritative. Which might not
+ * be the case under systems with extended permissions systems (posix ACLs, SELinux, OSX/iOS sandboxing, etc)
+ *
+ * The choice of access as the fallback is due to the expected lower overhead compared to trying to open the file.
+ *
+ * The only expected problem with using access are for root, setuid or setgid programs as access is not consistent
+ * under those situations. It's to be expected that this should not happen in practice as those bits are very dangerous
+ * and should not be used with a dynamic runtime.
+ */
+static gboolean
+is_file_writable (struct stat *st, const char *path)
+{
+ /* Is it globally writable? */
+ if (st->st_mode & S_IWOTH)
+ return 1;
+
+ /* Am I the owner? */
+ if ((st->st_uid == geteuid ()) && (st->st_mode & S_IWUSR))
+ return 1;
+
+ /* Am I in the same group? */
+ if ((st->st_gid == getegid ()) && (st->st_mode & S_IWGRP))
+ return 1;
+
+ /* Fallback to using access(2). It's not ideal as it might not take into consideration euid/egid
+ * but it's the only sane option we have on unix.
+ */
+ return access (path, W_OK) == 0;
+}
+
+
static guint32 _wapi_stat_to_file_attributes (const gchar *pathname,
struct stat *buf,
struct stat *lbuf)
@@ -259,14 +296,14 @@ static guint32 _wapi_stat_to_file_attributes (const gchar *pathname,
if (S_ISDIR (buf->st_mode)) {
attrs = FILE_ATTRIBUTE_DIRECTORY;
- if (!(buf->st_mode & S_IWUSR)) {
+ if (!is_file_writable (buf, pathname)) {
attrs |= FILE_ATTRIBUTE_READONLY;
}
if (filename[0] == '.') {
attrs |= FILE_ATTRIBUTE_HIDDEN;
}
} else {
- if (!(buf->st_mode & S_IWUSR)) {
+ if (!is_file_writable (buf, pathname)) {
attrs = FILE_ATTRIBUTE_READONLY;
if (filename[0] == '.') {
@@ -523,7 +560,7 @@ static guint32 file_seek(gpointer handle, gint32 movedistance,
{
struct _WapiHandle_file *file_handle;
gboolean ok;
- off_t offset, newpos;
+ gint64 offset, newpos;
int whence, fd;
guint32 ret;
@@ -578,15 +615,15 @@ static guint32 file_seek(gpointer handle, gint32 movedistance,
offset=movedistance;
#endif
-#ifdef HAVE_LARGE_FILE_SUPPORT
DEBUG ("%s: moving handle %p by %lld bytes from %d", __func__,
- handle, offset, whence);
-#else
- DEBUG ("%s: moving handle %p fd %d by %ld bytes from %d", __func__,
- handle, offset, whence);
-#endif
+ handle, (long long)offset, whence);
+#ifdef PLATFORM_ANDROID
+ /* bionic doesn't support -D_FILE_OFFSET_BITS=64 */
+ newpos=lseek64(fd, offset, whence);
+#else
newpos=lseek(fd, offset, whence);
+#endif
if(newpos==-1) {
DEBUG("%s: lseek on handle %p returned error %s",
__func__, handle, strerror(errno));
@@ -595,11 +632,7 @@ static guint32 file_seek(gpointer handle, gint32 movedistance,
return(INVALID_SET_FILE_POINTER);
}
-#ifdef HAVE_LARGE_FILE_SUPPORT
DEBUG ("%s: lseek returns %lld", __func__, newpos);
-#else
- DEBUG ("%s: lseek returns %ld", __func__, newpos);
-#endif
#ifdef HAVE_LARGE_FILE_SUPPORT
ret=newpos & 0xFFFFFFFF;
@@ -1362,6 +1395,43 @@ static gboolean share_allows_open (struct stat *statbuf, guint32 sharemode,
return(TRUE);
}
+
+static gboolean
+share_allows_delete (struct stat *statbuf, struct _WapiFileShare **share_info)
+{
+ gboolean file_already_shared;
+ guint32 file_existing_share, file_existing_access;
+
+ file_already_shared = _wapi_handle_get_or_set_share (statbuf->st_dev, statbuf->st_ino, FILE_SHARE_DELETE, GENERIC_READ, &file_existing_share, &file_existing_access, share_info);
+
+ if (file_already_shared) {
+ /* The reference to this share info was incremented
+ * when we looked it up, so be careful to put it back
+ * if we conclude we can't use this file.
+ */
+ if (file_existing_share == 0) {
+ /* Quick and easy, no possibility to share */
+ DEBUG ("%s: Share mode prevents open: requested access: 0x%x, file has sharing = NONE", __func__, fileaccess);
+
+ _wapi_handle_share_release (*share_info);
+
+ return(FALSE);
+ }
+
+ if (!(file_existing_share & FILE_SHARE_DELETE)) {
+ /* New access mode doesn't match up */
+ DEBUG ("%s: Share mode prevents open: requested access: 0x%x, file has sharing: 0x%x", __func__, fileaccess, file_existing_share);
+
+ _wapi_handle_share_release (*share_info);
+
+ return(FALSE);
+ }
+ } else {
+ DEBUG ("%s: New file!", __func__);
+ }
+
+ return(TRUE);
+}
static gboolean share_check (struct stat *statbuf, guint32 sharemode,
guint32 fileaccess,
struct _WapiFileShare **share_info, int fd)
@@ -1744,15 +1814,14 @@ gboolean MoveFile (const gunichar2 *name, const gunichar2 *dest_name)
}
}
- /* Check to make sure sharing allows us to open the file for
- * writing. See bug 377049.
+ /* Check to make that we have delete sharing permission.
+ * See https://bugzilla.xamarin.com/show_bug.cgi?id=17009
*
* Do the checks that don't need an open file descriptor, for
* simplicity's sake. If we really have to do the full checks
* then we can implement that later.
*/
- if (share_allows_open (&stat_src, 0, GENERIC_WRITE,
- &shareinfo) == FALSE) {
+ if (share_allows_delete (&stat_src, &shareinfo) == FALSE) {
SetLastError (ERROR_SHARING_VIOLATION);
return FALSE;
}
diff --git a/mono/io-layer/processes.c b/mono/io-layer/processes.c
index d29ea3c185..3fbff353f2 100644
--- a/mono/io-layer/processes.c
+++ b/mono/io-layer/processes.c
@@ -76,6 +76,7 @@
#include <mono/utils/mono-time.h>
#include <mono/utils/mono-membar.h>
#include <mono/utils/mono-mutex.h>
+#include <mono/utils/mono-signal-handler.h>
/* The process' environment strings */
#if defined(__APPLE__) && !defined (__arm__)
@@ -329,10 +330,7 @@ gboolean ShellExecuteEx (WapiShellExecuteInfo *sei)
return FALSE;
#ifdef PLATFORM_MACOSX
- if (is_macos_10_5_or_higher ())
- handler = g_strdup ("/usr/bin/open -W");
- else
- handler = g_strdup ("/usr/bin/open");
+ handler = g_strdup ("/usr/bin/open");
#else
/*
* On Linux, try: xdg-open, the FreeDesktop standard way of doing it,
@@ -382,6 +380,9 @@ gboolean ShellExecuteEx (WapiShellExecuteInfo *sei)
SetLastError (ERROR_INVALID_DATA);
return FALSE;
}
+ /* Shell exec should not return a process handle when it spawned a GUI thing, like a browser. */
+ CloseHandle (process_info.hProcess);
+ process_info.hProcess = NULL;
}
if (sei->fMask & SEE_MASK_NOCLOSEPROCESS) {
@@ -1714,10 +1715,11 @@ static GSList *load_modules (void)
slide = _dyld_get_image_vmaddr_slide (i);
name = _dyld_get_image_name (i);
- hdr = _dyld_get_image_header (i);
#if SIZEOF_VOID_P == 8
+ hdr = (const struct mach_header_64*)_dyld_get_image_header (i);
sec = getsectbynamefromheader_64 (hdr, SEG_DATA, SECT_DATA);
#else
+ hdr = _dyld_get_image_header (i);
sec = getsectbynamefromheader (hdr, SEG_DATA, SECT_DATA);
#endif
@@ -2118,9 +2120,11 @@ static gchar *get_process_name_from_proc (pid_t pid)
size_t size;
struct kinfo_proc2 *pi;
#elif defined(PLATFORM_MACOSX)
+#if !(!defined (__mono_ppc__) && defined (TARGET_OSX))
size_t size;
struct kinfo_proc *pi;
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid };
+#endif
#else
FILE *fp;
gchar *filename = NULL;
@@ -2828,8 +2832,7 @@ process_close (gpointer handle, gpointer data)
}
#if HAVE_SIGACTION
-static void
-mono_sigchld_signal_handler (int _dummy, siginfo_t *info, void *context)
+MONO_SIGNAL_HANDLER_FUNC (static, mono_sigchld_signal_handler, (int _dummy, siginfo_t *info, void *context))
{
int status;
int pid;
@@ -2870,6 +2873,7 @@ mono_sigchld_signal_handler (int _dummy, siginfo_t *info, void *context)
fprintf (stdout, "SIG CHILD handler: done looping.");
#endif
}
+
#endif
static void process_add_sigchld_handler (void)
diff --git a/mono/io-layer/shared.c b/mono/io-layer/shared.c
index ce1d9bc525..1800f9b74a 100644
--- a/mono/io-layer/shared.c
+++ b/mono/io-layer/shared.c
@@ -254,7 +254,8 @@ static gchar *
_wapi_shm_file (_wapi_shm_t type)
{
static gchar file[_POSIX_PATH_MAX];
- gchar *name = NULL, *filename, *wapi_dir;
+ gchar *name = NULL, *filename;
+ const gchar *wapi_dir;
name = _wapi_shm_base_name (type);
diff --git a/mono/io-layer/sockets.c b/mono/io-layer/sockets.c
index a659d3763e..27ee96d4e3 100644
--- a/mono/io-layer/sockets.c
+++ b/mono/io-layer/sockets.c
@@ -778,6 +778,7 @@ int _wapi_setsockopt(guint32 fd, int level, int optname,
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
const void *tmp_val;
+ int bufsize = 0;
struct timeval tv;
if (startup_count == 0) {
@@ -805,7 +806,7 @@ int _wapi_setsockopt(guint32 fd, int level, int optname,
* buffer sizes "to allow space for bookkeeping
* overhead."
*/
- int bufsize = *((int *) optval);
+ bufsize = *((int *) optval);
bufsize /= 2;
tmp_val = &bufsize;
diff --git a/mono/metadata/Makefile.am b/mono/metadata/Makefile.am
index c4d7c9c562..0b47ca6093 100644
--- a/mono/metadata/Makefile.am
+++ b/mono/metadata/Makefile.am
@@ -117,6 +117,7 @@ common_sources = \
filewatcher.c \
filewatcher.h \
gc-internal.h \
+ gc-memfuncs.c \
icall.c \
icall-def.h \
image.c \
@@ -253,7 +254,8 @@ sgen_sources = \
sgen-stw.c \
sgen-fin-weak-hash.c \
sgen-layout-stats.c \
- sgen-layout-stats.h
+ sgen-layout-stats.h \
+ sgen-qsort.c
libmonoruntime_la_SOURCES = $(common_sources) $(gc_dependent_sources) $(boehm_sources)
libmonoruntime_la_CFLAGS = $(BOEHM_DEFINES)
@@ -331,3 +333,29 @@ else
Makefile.am: Makefile.am.in
cp $< $@
endif
+
+if !HOST_WIN32
+if SUPPORT_BOEHM
+
+test_sgen_qsort_SOURCES = test-sgen-qsort.c
+test_sgen_qsort_CFLAGS = $(SGEN_DEFINES)
+test_sgen_qsort_LDADD = libmonoruntimesgen.la ../io-layer/libwapi.la ../utils/libmonoutils.la \
+ $(LIBGC_LIBS) $(GLIB_LIBS) -lm $(LIBICONV)
+if PLATFORM_DARWIN
+test_sgen_qsort_LDFLAGS=-framework CoreFoundation
+endif
+
+test_gc_memfuncs_SOURCES = test-gc-memfuncs.c
+test_gc_memfuncs_CFLAGS = $(SGEN_DEFINES)
+test_gc_memfuncs_LDADD = libmonoruntimesgen.la ../io-layer/libwapi.la ../utils/libmonoutils.la \
+ $(LIBGC_LIBS) $(GLIB_LIBS) -lm $(LIBICONV)
+if PLATFORM_DARWIN
+test_gc_memfuncs_LDFLAGS=-framework CoreFoundation
+endif
+
+noinst_PROGRAMS = test-sgen-qsort test-gc-memfuncs
+
+TESTS = test-sgen-qsort test-gc-memfuncs
+
+endif SUPPORT_BOEHM
+endif !HOST_WIN32
diff --git a/mono/metadata/Makefile.am.in b/mono/metadata/Makefile.am.in
index c4d7c9c562..0b47ca6093 100644
--- a/mono/metadata/Makefile.am.in
+++ b/mono/metadata/Makefile.am.in
@@ -117,6 +117,7 @@ common_sources = \
filewatcher.c \
filewatcher.h \
gc-internal.h \
+ gc-memfuncs.c \
icall.c \
icall-def.h \
image.c \
@@ -253,7 +254,8 @@ sgen_sources = \
sgen-stw.c \
sgen-fin-weak-hash.c \
sgen-layout-stats.c \
- sgen-layout-stats.h
+ sgen-layout-stats.h \
+ sgen-qsort.c
libmonoruntime_la_SOURCES = $(common_sources) $(gc_dependent_sources) $(boehm_sources)
libmonoruntime_la_CFLAGS = $(BOEHM_DEFINES)
@@ -331,3 +333,29 @@ else
Makefile.am: Makefile.am.in
cp $< $@
endif
+
+if !HOST_WIN32
+if SUPPORT_BOEHM
+
+test_sgen_qsort_SOURCES = test-sgen-qsort.c
+test_sgen_qsort_CFLAGS = $(SGEN_DEFINES)
+test_sgen_qsort_LDADD = libmonoruntimesgen.la ../io-layer/libwapi.la ../utils/libmonoutils.la \
+ $(LIBGC_LIBS) $(GLIB_LIBS) -lm $(LIBICONV)
+if PLATFORM_DARWIN
+test_sgen_qsort_LDFLAGS=-framework CoreFoundation
+endif
+
+test_gc_memfuncs_SOURCES = test-gc-memfuncs.c
+test_gc_memfuncs_CFLAGS = $(SGEN_DEFINES)
+test_gc_memfuncs_LDADD = libmonoruntimesgen.la ../io-layer/libwapi.la ../utils/libmonoutils.la \
+ $(LIBGC_LIBS) $(GLIB_LIBS) -lm $(LIBICONV)
+if PLATFORM_DARWIN
+test_gc_memfuncs_LDFLAGS=-framework CoreFoundation
+endif
+
+noinst_PROGRAMS = test-sgen-qsort test-gc-memfuncs
+
+TESTS = test-sgen-qsort test-gc-memfuncs
+
+endif SUPPORT_BOEHM
+endif !HOST_WIN32
diff --git a/mono/metadata/Makefile.in b/mono/metadata/Makefile.in
index 1b295ccbf8..b98dc582c5 100644
--- a/mono/metadata/Makefile.in
+++ b/mono/metadata/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -54,10 +55,13 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
@SHARED_MONO_TRUE@@SUPPORT_BOEHM_TRUE@bin_PROGRAMS = pedump$(EXEEXT)
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@noinst_PROGRAMS = test-sgen-qsort$(EXEEXT) \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ test-gc-memfuncs$(EXEEXT)
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@TESTS = test-sgen-qsort$(EXEEXT) \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ test-gc-memfuncs$(EXEEXT)
subdir = mono/metadata
DIST_COMMON = $(libmonoruntimeinclude_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
- $(top_srcdir)/mkinstalldirs ChangeLog TODO
+ $(srcdir)/Makefile.in ChangeLog TODO
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -83,23 +87,24 @@ am__libmonoruntime_static_la_SOURCES_DIST = console-unix.c \
debug-mono-symfile.h debug-mono-symfile.c decimal.c decimal.h \
domain-internals.h environment.c environment.h exception.c \
exception.h file-io.c file-io.h filewatcher.c filewatcher.h \
- gc-internal.h icall.c icall-def.h image.c loader.c locales.c \
- locales.h lock-tracer.c lock-tracer.h marshal.c marshal.h \
- mempool.c mempool.h mempool-internals.h metadata.c \
- metadata-verify.c metadata-internals.h method-builder.h \
- method-builder.c mono-basic-block.c mono-basic-block.h \
- mono-config.c mono-cq.c mono-cq.h mono-debug.h mono-debug.c \
- mono-debug-debugger.h mono-debug-debugger.c mono-endian.c \
- mono-endian.h mono-hash.h mono-mlist.c mono-mlist.h \
- mono-perfcounters.c mono-perfcounters.h \
- mono-perfcounters-def.h mono-ptr-array.h mono-wsq.c mono-wsq.h \
- monitor.h nacl-stub.c normalization-tables.h null-gc.c \
- number-formatter.h object-internals.h opcodes.c socket-io.c \
- socket-io.h process.c process.h profiler.c profiler-private.h \
- rand.h rand.c runtime.c security.c security.h \
- security-core-clr.c security-core-clr.h security-manager.c \
- security-manager.h string-icalls.c string-icalls.h sysmath.h \
- sysmath.c tabledefs.h threads.c threads-types.h threadpool.c \
+ gc-internal.h gc-memfuncs.c icall.c icall-def.h image.c \
+ loader.c locales.c locales.h lock-tracer.c lock-tracer.h \
+ marshal.c marshal.h mempool.c mempool.h mempool-internals.h \
+ metadata.c metadata-verify.c metadata-internals.h \
+ method-builder.h method-builder.c mono-basic-block.c \
+ mono-basic-block.h mono-config.c mono-cq.c mono-cq.h \
+ mono-debug.h mono-debug.c mono-debug-debugger.h \
+ mono-debug-debugger.c mono-endian.c mono-endian.h mono-hash.h \
+ mono-mlist.c mono-mlist.h mono-perfcounters.c \
+ mono-perfcounters.h mono-perfcounters-def.h mono-ptr-array.h \
+ mono-wsq.c mono-wsq.h monitor.h nacl-stub.c \
+ normalization-tables.h null-gc.c number-formatter.h \
+ object-internals.h opcodes.c socket-io.c socket-io.h process.c \
+ process.h profiler.c profiler-private.h rand.h rand.c \
+ runtime.c security.c security.h security-core-clr.c \
+ security-core-clr.h security-manager.c security-manager.h \
+ string-icalls.c string-icalls.h sysmath.h sysmath.c \
+ tabledefs.h threads.c threads-types.h threadpool.c \
threadpool.h threadpool-internals.h verify.c \
verify-internals.h wrapper-types.h appdomain.c domain.c gc.c \
monitor.c mono-hash.c object.c reflection.c boehm-gc.c
@@ -121,6 +126,7 @@ am__objects_4 = $(am__objects_3) libmonoruntime_static_la-assembly.lo \
libmonoruntime_static_la-exception.lo \
libmonoruntime_static_la-file-io.lo \
libmonoruntime_static_la-filewatcher.lo \
+ libmonoruntime_static_la-gc-memfuncs.lo \
libmonoruntime_static_la-icall.lo \
libmonoruntime_static_la-image.lo \
libmonoruntime_static_la-loader.lo \
@@ -184,24 +190,24 @@ am__libmonoruntime_la_SOURCES_DIST = console-unix.c console-win32.c \
culture-info-tables.h debug-helpers.c debug-mono-symfile.h \
debug-mono-symfile.c decimal.c decimal.h domain-internals.h \
environment.c environment.h exception.c exception.h file-io.c \
- file-io.h filewatcher.c filewatcher.h gc-internal.h icall.c \
- icall-def.h image.c loader.c locales.c locales.h lock-tracer.c \
- lock-tracer.h marshal.c marshal.h mempool.c mempool.h \
- mempool-internals.h metadata.c metadata-verify.c \
- metadata-internals.h method-builder.h method-builder.c \
- mono-basic-block.c mono-basic-block.h mono-config.c mono-cq.c \
- mono-cq.h mono-debug.h mono-debug.c mono-debug-debugger.h \
- mono-debug-debugger.c mono-endian.c mono-endian.h mono-hash.h \
- mono-mlist.c mono-mlist.h mono-perfcounters.c \
- mono-perfcounters.h mono-perfcounters-def.h mono-ptr-array.h \
- mono-wsq.c mono-wsq.h monitor.h nacl-stub.c \
- normalization-tables.h null-gc.c number-formatter.h \
- object-internals.h opcodes.c socket-io.c socket-io.h process.c \
- process.h profiler.c profiler-private.h rand.h rand.c \
- runtime.c security.c security.h security-core-clr.c \
- security-core-clr.h security-manager.c security-manager.h \
- string-icalls.c string-icalls.h sysmath.h sysmath.c \
- tabledefs.h threads.c threads-types.h threadpool.c \
+ file-io.h filewatcher.c filewatcher.h gc-internal.h \
+ gc-memfuncs.c icall.c icall-def.h image.c loader.c locales.c \
+ locales.h lock-tracer.c lock-tracer.h marshal.c marshal.h \
+ mempool.c mempool.h mempool-internals.h metadata.c \
+ metadata-verify.c metadata-internals.h method-builder.h \
+ method-builder.c mono-basic-block.c mono-basic-block.h \
+ mono-config.c mono-cq.c mono-cq.h mono-debug.h mono-debug.c \
+ mono-debug-debugger.h mono-debug-debugger.c mono-endian.c \
+ mono-endian.h mono-hash.h mono-mlist.c mono-mlist.h \
+ mono-perfcounters.c mono-perfcounters.h \
+ mono-perfcounters-def.h mono-ptr-array.h mono-wsq.c mono-wsq.h \
+ monitor.h nacl-stub.c normalization-tables.h null-gc.c \
+ number-formatter.h object-internals.h opcodes.c socket-io.c \
+ socket-io.h process.c process.h profiler.c profiler-private.h \
+ rand.h rand.c runtime.c security.c security.h \
+ security-core-clr.c security-core-clr.h security-manager.c \
+ security-manager.h string-icalls.c string-icalls.h sysmath.h \
+ sysmath.c tabledefs.h threads.c threads-types.h threadpool.c \
threadpool.h threadpool-internals.h verify.c \
verify-internals.h wrapper-types.h appdomain.c domain.c gc.c \
monitor.c mono-hash.c object.c reflection.c boehm-gc.c
@@ -216,7 +222,8 @@ am__objects_11 = $(am__objects_10) libmonoruntime_la-assembly.lo \
libmonoruntime_la-debug-mono-symfile.lo \
libmonoruntime_la-decimal.lo libmonoruntime_la-environment.lo \
libmonoruntime_la-exception.lo libmonoruntime_la-file-io.lo \
- libmonoruntime_la-filewatcher.lo libmonoruntime_la-icall.lo \
+ libmonoruntime_la-filewatcher.lo \
+ libmonoruntime_la-gc-memfuncs.lo libmonoruntime_la-icall.lo \
libmonoruntime_la-image.lo libmonoruntime_la-loader.lo \
libmonoruntime_la-locales.lo libmonoruntime_la-lock-tracer.lo \
libmonoruntime_la-marshal.lo libmonoruntime_la-mempool.lo \
@@ -263,23 +270,24 @@ am__libmonoruntimesgen_static_la_SOURCES_DIST = console-unix.c \
debug-mono-symfile.h debug-mono-symfile.c decimal.c decimal.h \
domain-internals.h environment.c environment.h exception.c \
exception.h file-io.c file-io.h filewatcher.c filewatcher.h \
- gc-internal.h icall.c icall-def.h image.c loader.c locales.c \
- locales.h lock-tracer.c lock-tracer.h marshal.c marshal.h \
- mempool.c mempool.h mempool-internals.h metadata.c \
- metadata-verify.c metadata-internals.h method-builder.h \
- method-builder.c mono-basic-block.c mono-basic-block.h \
- mono-config.c mono-cq.c mono-cq.h mono-debug.h mono-debug.c \
- mono-debug-debugger.h mono-debug-debugger.c mono-endian.c \
- mono-endian.h mono-hash.h mono-mlist.c mono-mlist.h \
- mono-perfcounters.c mono-perfcounters.h \
- mono-perfcounters-def.h mono-ptr-array.h mono-wsq.c mono-wsq.h \
- monitor.h nacl-stub.c normalization-tables.h null-gc.c \
- number-formatter.h object-internals.h opcodes.c socket-io.c \
- socket-io.h process.c process.h profiler.c profiler-private.h \
- rand.h rand.c runtime.c security.c security.h \
- security-core-clr.c security-core-clr.h security-manager.c \
- security-manager.h string-icalls.c string-icalls.h sysmath.h \
- sysmath.c tabledefs.h threads.c threads-types.h threadpool.c \
+ gc-internal.h gc-memfuncs.c icall.c icall-def.h image.c \
+ loader.c locales.c locales.h lock-tracer.c lock-tracer.h \
+ marshal.c marshal.h mempool.c mempool.h mempool-internals.h \
+ metadata.c metadata-verify.c metadata-internals.h \
+ method-builder.h method-builder.c mono-basic-block.c \
+ mono-basic-block.h mono-config.c mono-cq.c mono-cq.h \
+ mono-debug.h mono-debug.c mono-debug-debugger.h \
+ mono-debug-debugger.c mono-endian.c mono-endian.h mono-hash.h \
+ mono-mlist.c mono-mlist.h mono-perfcounters.c \
+ mono-perfcounters.h mono-perfcounters-def.h mono-ptr-array.h \
+ mono-wsq.c mono-wsq.h monitor.h nacl-stub.c \
+ normalization-tables.h null-gc.c number-formatter.h \
+ object-internals.h opcodes.c socket-io.c socket-io.h process.c \
+ process.h profiler.c profiler-private.h rand.h rand.c \
+ runtime.c security.c security.h security-core-clr.c \
+ security-core-clr.h security-manager.c security-manager.h \
+ string-icalls.c string-icalls.h sysmath.h sysmath.c \
+ tabledefs.h threads.c threads-types.h threadpool.c \
threadpool.h threadpool-internals.h verify.c \
verify-internals.h wrapper-types.h appdomain.c domain.c gc.c \
monitor.c mono-hash.c object.c reflection.c sgen-os-posix.c \
@@ -297,7 +305,8 @@ am__libmonoruntimesgen_static_la_SOURCES_DIST = console-unix.c \
sgen-descriptor.c sgen-descriptor.h sgen-alloc.c sgen-debug.c \
sgen-simple-nursery.c sgen-split-nursery.c \
sgen-memory-governor.c sgen-memory-governor.h sgen-stw.c \
- sgen-fin-weak-hash.c sgen-layout-stats.c sgen-layout-stats.h
+ sgen-fin-weak-hash.c sgen-layout-stats.c sgen-layout-stats.h \
+ sgen-qsort.c
@HOST_WIN32_FALSE@am__objects_14 = libmonoruntimesgen_static_la-console-unix.lo
@HOST_WIN32_TRUE@am__objects_15 = libmonoruntimesgen_static_la-console-win32.lo
@HOST_WIN32_FALSE@am__objects_16 = $(am__objects_14)
@@ -315,6 +324,7 @@ am__objects_17 = $(am__objects_16) \
libmonoruntimesgen_static_la-exception.lo \
libmonoruntimesgen_static_la-file-io.lo \
libmonoruntimesgen_static_la-filewatcher.lo \
+ libmonoruntimesgen_static_la-gc-memfuncs.lo \
libmonoruntimesgen_static_la-icall.lo \
libmonoruntimesgen_static_la-image.lo \
libmonoruntimesgen_static_la-loader.lo \
@@ -385,7 +395,8 @@ am__objects_19 = libmonoruntimesgen_static_la-sgen-os-posix.lo \
libmonoruntimesgen_static_la-sgen-memory-governor.lo \
libmonoruntimesgen_static_la-sgen-stw.lo \
libmonoruntimesgen_static_la-sgen-fin-weak-hash.lo \
- libmonoruntimesgen_static_la-sgen-layout-stats.lo
+ libmonoruntimesgen_static_la-sgen-layout-stats.lo \
+ libmonoruntimesgen_static_la-sgen-qsort.lo
am__objects_20 = $(am__objects_17) $(am__objects_18) $(am__objects_19)
am_libmonoruntimesgen_static_la_OBJECTS = $(am__objects_20)
libmonoruntimesgen_static_la_OBJECTS = \
@@ -404,23 +415,24 @@ am__libmonoruntimesgen_la_SOURCES_DIST = console-unix.c \
debug-mono-symfile.h debug-mono-symfile.c decimal.c decimal.h \
domain-internals.h environment.c environment.h exception.c \
exception.h file-io.c file-io.h filewatcher.c filewatcher.h \
- gc-internal.h icall.c icall-def.h image.c loader.c locales.c \
- locales.h lock-tracer.c lock-tracer.h marshal.c marshal.h \
- mempool.c mempool.h mempool-internals.h metadata.c \
- metadata-verify.c metadata-internals.h method-builder.h \
- method-builder.c mono-basic-block.c mono-basic-block.h \
- mono-config.c mono-cq.c mono-cq.h mono-debug.h mono-debug.c \
- mono-debug-debugger.h mono-debug-debugger.c mono-endian.c \
- mono-endian.h mono-hash.h mono-mlist.c mono-mlist.h \
- mono-perfcounters.c mono-perfcounters.h \
- mono-perfcounters-def.h mono-ptr-array.h mono-wsq.c mono-wsq.h \
- monitor.h nacl-stub.c normalization-tables.h null-gc.c \
- number-formatter.h object-internals.h opcodes.c socket-io.c \
- socket-io.h process.c process.h profiler.c profiler-private.h \
- rand.h rand.c runtime.c security.c security.h \
- security-core-clr.c security-core-clr.h security-manager.c \
- security-manager.h string-icalls.c string-icalls.h sysmath.h \
- sysmath.c tabledefs.h threads.c threads-types.h threadpool.c \
+ gc-internal.h gc-memfuncs.c icall.c icall-def.h image.c \
+ loader.c locales.c locales.h lock-tracer.c lock-tracer.h \
+ marshal.c marshal.h mempool.c mempool.h mempool-internals.h \
+ metadata.c metadata-verify.c metadata-internals.h \
+ method-builder.h method-builder.c mono-basic-block.c \
+ mono-basic-block.h mono-config.c mono-cq.c mono-cq.h \
+ mono-debug.h mono-debug.c mono-debug-debugger.h \
+ mono-debug-debugger.c mono-endian.c mono-endian.h mono-hash.h \
+ mono-mlist.c mono-mlist.h mono-perfcounters.c \
+ mono-perfcounters.h mono-perfcounters-def.h mono-ptr-array.h \
+ mono-wsq.c mono-wsq.h monitor.h nacl-stub.c \
+ normalization-tables.h null-gc.c number-formatter.h \
+ object-internals.h opcodes.c socket-io.c socket-io.h process.c \
+ process.h profiler.c profiler-private.h rand.h rand.c \
+ runtime.c security.c security.h security-core-clr.c \
+ security-core-clr.h security-manager.c security-manager.h \
+ string-icalls.c string-icalls.h sysmath.h sysmath.c \
+ tabledefs.h threads.c threads-types.h threadpool.c \
threadpool.h threadpool-internals.h verify.c \
verify-internals.h wrapper-types.h appdomain.c domain.c gc.c \
monitor.c mono-hash.c object.c reflection.c sgen-os-posix.c \
@@ -438,7 +450,8 @@ am__libmonoruntimesgen_la_SOURCES_DIST = console-unix.c \
sgen-descriptor.c sgen-descriptor.h sgen-alloc.c sgen-debug.c \
sgen-simple-nursery.c sgen-split-nursery.c \
sgen-memory-governor.c sgen-memory-governor.h sgen-stw.c \
- sgen-fin-weak-hash.c sgen-layout-stats.c sgen-layout-stats.h
+ sgen-fin-weak-hash.c sgen-layout-stats.c sgen-layout-stats.h \
+ sgen-qsort.c
@HOST_WIN32_FALSE@am__objects_21 = \
@HOST_WIN32_FALSE@ libmonoruntimesgen_la-console-unix.lo
@HOST_WIN32_TRUE@am__objects_22 = \
@@ -456,6 +469,7 @@ am__objects_24 = $(am__objects_23) libmonoruntimesgen_la-assembly.lo \
libmonoruntimesgen_la-exception.lo \
libmonoruntimesgen_la-file-io.lo \
libmonoruntimesgen_la-filewatcher.lo \
+ libmonoruntimesgen_la-gc-memfuncs.lo \
libmonoruntimesgen_la-icall.lo libmonoruntimesgen_la-image.lo \
libmonoruntimesgen_la-loader.lo \
libmonoruntimesgen_la-locales.lo \
@@ -523,7 +537,8 @@ am__objects_26 = libmonoruntimesgen_la-sgen-os-posix.lo \
libmonoruntimesgen_la-sgen-memory-governor.lo \
libmonoruntimesgen_la-sgen-stw.lo \
libmonoruntimesgen_la-sgen-fin-weak-hash.lo \
- libmonoruntimesgen_la-sgen-layout-stats.lo
+ libmonoruntimesgen_la-sgen-layout-stats.lo \
+ libmonoruntimesgen_la-sgen-qsort.lo
am_libmonoruntimesgen_la_OBJECTS = $(am__objects_24) $(am__objects_25) \
$(am__objects_26)
libmonoruntimesgen_la_OBJECTS = $(am_libmonoruntimesgen_la_OBJECTS)
@@ -535,7 +550,7 @@ libmonoruntimesgen_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
@DISABLE_EXECUTABLES_TRUE@@SUPPORT_SGEN_TRUE@am_libmonoruntimesgen_la_rpath =
am__installdirs = "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(libmonoruntimeincludedir)"
-PROGRAMS = $(bin_PROGRAMS)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
am__pedump_SOURCES_DIST = pedump.c
@SHARED_MONO_TRUE@@SUPPORT_BOEHM_TRUE@am_pedump_OBJECTS = \
@SHARED_MONO_TRUE@@SUPPORT_BOEHM_TRUE@ pedump.$(OBJEXT)
@@ -553,6 +568,34 @@ am__DEPENDENCIES_1 =
pedump_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(pedump_LDFLAGS) $(LDFLAGS) -o $@
+am__test_gc_memfuncs_SOURCES_DIST = test-gc-memfuncs.c
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@am_test_gc_memfuncs_OBJECTS = test_gc_memfuncs-test-gc-memfuncs.$(OBJEXT)
+test_gc_memfuncs_OBJECTS = $(am_test_gc_memfuncs_OBJECTS)
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_gc_memfuncs_DEPENDENCIES = \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ libmonoruntimesgen.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ ../io-layer/libwapi.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ ../utils/libmonoutils.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(am__DEPENDENCIES_1) \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(am__DEPENDENCIES_1) \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(am__DEPENDENCIES_1)
+test_gc_memfuncs_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(test_gc_memfuncs_CFLAGS) $(CFLAGS) \
+ $(test_gc_memfuncs_LDFLAGS) $(LDFLAGS) -o $@
+am__test_sgen_qsort_SOURCES_DIST = test-sgen-qsort.c
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@am_test_sgen_qsort_OBJECTS = test_sgen_qsort-test-sgen-qsort.$(OBJEXT)
+test_sgen_qsort_OBJECTS = $(am_test_sgen_qsort_OBJECTS)
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_sgen_qsort_DEPENDENCIES = \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ libmonoruntimesgen.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ ../io-layer/libwapi.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ ../utils/libmonoutils.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(am__DEPENDENCIES_1) \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(am__DEPENDENCIES_1) \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(am__DEPENDENCIES_1)
+test_sgen_qsort_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(test_sgen_qsort_CFLAGS) $(CFLAGS) $(test_sgen_qsort_LDFLAGS) \
+ $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@@ -561,7 +604,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -571,19 +614,22 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoruntime_static_la_SOURCES) \
$(libmonoruntime_la_SOURCES) \
$(libmonoruntimesgen_static_la_SOURCES) \
- $(libmonoruntimesgen_la_SOURCES) $(pedump_SOURCES)
+ $(libmonoruntimesgen_la_SOURCES) $(pedump_SOURCES) \
+ $(test_gc_memfuncs_SOURCES) $(test_sgen_qsort_SOURCES)
DIST_SOURCES = $(am__libmonoruntime_static_la_SOURCES_DIST) \
$(am__libmonoruntime_la_SOURCES_DIST) \
$(am__libmonoruntimesgen_static_la_SOURCES_DIST) \
$(am__libmonoruntimesgen_la_SOURCES_DIST) \
- $(am__pedump_SOURCES_DIST)
+ $(am__pedump_SOURCES_DIST) \
+ $(am__test_gc_memfuncs_SOURCES_DIST) \
+ $(am__test_sgen_qsort_SOURCES_DIST)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -619,6 +665,8 @@ am__uninstall_files_from_dir = { \
HEADERS = $(libmonoruntimeinclude_HEADERS)
ETAGS = etags
CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -890,6 +938,7 @@ common_sources = \
filewatcher.c \
filewatcher.h \
gc-internal.h \
+ gc-memfuncs.c \
icall.c \
icall-def.h \
image.c \
@@ -1027,7 +1076,8 @@ sgen_sources = \
sgen-stw.c \
sgen-fin-weak-hash.c \
sgen-layout-stats.c \
- sgen-layout-stats.h
+ sgen-layout-stats.h \
+ sgen-qsort.c
libmonoruntime_la_SOURCES = $(common_sources) $(gc_dependent_sources) $(boehm_sources)
libmonoruntime_la_CFLAGS = $(BOEHM_DEFINES)
@@ -1078,6 +1128,18 @@ libmonoruntimeinclude_HEADERS = \
EXTRA_DIST = make-bundle.pl sample-bundle $(win32_sources) $(unix_sources) $(null_sources) runtime.h \
tpool-poll.c tpool-epoll.c tpool-kqueue.c Makefile.am.in
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_sgen_qsort_SOURCES = test-sgen-qsort.c
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_sgen_qsort_CFLAGS = $(SGEN_DEFINES)
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_sgen_qsort_LDADD = libmonoruntimesgen.la ../io-layer/libwapi.la ../utils/libmonoutils.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(LIBGC_LIBS) $(GLIB_LIBS) -lm $(LIBICONV)
+
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@@SUPPORT_BOEHM_TRUE@test_sgen_qsort_LDFLAGS = -framework CoreFoundation
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_gc_memfuncs_SOURCES = test-gc-memfuncs.c
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_gc_memfuncs_CFLAGS = $(SGEN_DEFINES)
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@test_gc_memfuncs_LDADD = libmonoruntimesgen.la ../io-layer/libwapi.la ../utils/libmonoutils.la \
+@HOST_WIN32_FALSE@@SUPPORT_BOEHM_TRUE@ $(LIBGC_LIBS) $(GLIB_LIBS) -lm $(LIBICONV)
+
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@@SUPPORT_BOEHM_TRUE@test_gc_memfuncs_LDFLAGS = -framework CoreFoundation
all: all-am
.SUFFIXES:
@@ -1115,14 +1177,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoruntime-static.la: $(libmonoruntime_static_la_OBJECTS) $(libmonoruntime_static_la_DEPENDENCIES) $(EXTRA_libmonoruntime_static_la_DEPENDENCIES)
$(AM_V_CCLD)$(libmonoruntime_static_la_LINK) $(am_libmonoruntime_static_la_rpath) $(libmonoruntime_static_la_OBJECTS) $(libmonoruntime_static_la_LIBADD) $(LIBS)
libmonoruntime.la: $(libmonoruntime_la_OBJECTS) $(libmonoruntime_la_DEPENDENCIES) $(EXTRA_libmonoruntime_la_DEPENDENCIES)
@@ -1177,9 +1237,24 @@ clean-binPROGRAMS:
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
pedump$(EXEEXT): $(pedump_OBJECTS) $(pedump_DEPENDENCIES) $(EXTRA_pedump_DEPENDENCIES)
@rm -f pedump$(EXEEXT)
$(AM_V_CCLD)$(pedump_LINK) $(pedump_OBJECTS) $(pedump_LDADD) $(LIBS)
+test-gc-memfuncs$(EXEEXT): $(test_gc_memfuncs_OBJECTS) $(test_gc_memfuncs_DEPENDENCIES) $(EXTRA_test_gc_memfuncs_DEPENDENCIES)
+ @rm -f test-gc-memfuncs$(EXEEXT)
+ $(AM_V_CCLD)$(test_gc_memfuncs_LINK) $(test_gc_memfuncs_OBJECTS) $(test_gc_memfuncs_LDADD) $(LIBS)
+test-sgen-qsort$(EXEEXT): $(test_sgen_qsort_OBJECTS) $(test_sgen_qsort_DEPENDENCIES) $(EXTRA_test_sgen_qsort_DEPENDENCIES)
+ @rm -f test-sgen-qsort$(EXEEXT)
+ $(AM_V_CCLD)$(test_sgen_qsort_LINK) $(test_sgen_qsort_OBJECTS) $(test_sgen_qsort_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -1204,6 +1279,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_la-exception.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_la-file-io.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_la-filewatcher.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_la-gc-memfuncs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_la-gc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_la-icall.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_la-image.Plo@am__quote@
@@ -1261,6 +1337,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_static_la-exception.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_static_la-file-io.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_static_la-filewatcher.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_static_la-gc-memfuncs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_static_la-gc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_static_la-icall.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntime_static_la-image.Plo@am__quote@
@@ -1317,6 +1394,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-exception.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-file-io.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-filewatcher.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-gc-memfuncs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-gc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-icall.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-image.Plo@am__quote@
@@ -1375,6 +1453,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-sgen-pinning-stats.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-sgen-pinning.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-sgen-protocol.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-sgen-qsort.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-sgen-simple-nursery.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-sgen-split-nursery.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_la-sgen-stw.Plo@am__quote@
@@ -1402,6 +1481,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-exception.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-file-io.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-filewatcher.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-gc-memfuncs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-gc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-icall.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-image.Plo@am__quote@
@@ -1460,6 +1540,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-sgen-pinning-stats.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-sgen-pinning.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-sgen-protocol.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-sgen-qsort.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-sgen-simple-nursery.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-sgen-split-nursery.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-sgen-stw.Plo@am__quote@
@@ -1472,6 +1553,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-threads.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmonoruntimesgen_static_la-verify.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pedump.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gc_memfuncs-test-gc-memfuncs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sgen_qsort-test-sgen-qsort.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -1595,6 +1678,13 @@ libmonoruntime_static_la-filewatcher.lo: filewatcher.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_static_la_CFLAGS) $(CFLAGS) -c -o libmonoruntime_static_la-filewatcher.lo `test -f 'filewatcher.c' || echo '$(srcdir)/'`filewatcher.c
+libmonoruntime_static_la-gc-memfuncs.lo: gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_static_la_CFLAGS) $(CFLAGS) -MT libmonoruntime_static_la-gc-memfuncs.lo -MD -MP -MF $(DEPDIR)/libmonoruntime_static_la-gc-memfuncs.Tpo -c -o libmonoruntime_static_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntime_static_la-gc-memfuncs.Tpo $(DEPDIR)/libmonoruntime_static_la-gc-memfuncs.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gc-memfuncs.c' object='libmonoruntime_static_la-gc-memfuncs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_static_la_CFLAGS) $(CFLAGS) -c -o libmonoruntime_static_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+
libmonoruntime_static_la-icall.lo: icall.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_static_la_CFLAGS) $(CFLAGS) -MT libmonoruntime_static_la-icall.lo -MD -MP -MF $(DEPDIR)/libmonoruntime_static_la-icall.Tpo -c -o libmonoruntime_static_la-icall.lo `test -f 'icall.c' || echo '$(srcdir)/'`icall.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntime_static_la-icall.Tpo $(DEPDIR)/libmonoruntime_static_la-icall.Plo
@@ -1994,6 +2084,13 @@ libmonoruntime_la-filewatcher.lo: filewatcher.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_la_CFLAGS) $(CFLAGS) -c -o libmonoruntime_la-filewatcher.lo `test -f 'filewatcher.c' || echo '$(srcdir)/'`filewatcher.c
+libmonoruntime_la-gc-memfuncs.lo: gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_la_CFLAGS) $(CFLAGS) -MT libmonoruntime_la-gc-memfuncs.lo -MD -MP -MF $(DEPDIR)/libmonoruntime_la-gc-memfuncs.Tpo -c -o libmonoruntime_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntime_la-gc-memfuncs.Tpo $(DEPDIR)/libmonoruntime_la-gc-memfuncs.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gc-memfuncs.c' object='libmonoruntime_la-gc-memfuncs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_la_CFLAGS) $(CFLAGS) -c -o libmonoruntime_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+
libmonoruntime_la-icall.lo: icall.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntime_la_CFLAGS) $(CFLAGS) -MT libmonoruntime_la-icall.lo -MD -MP -MF $(DEPDIR)/libmonoruntime_la-icall.Tpo -c -o libmonoruntime_la-icall.lo `test -f 'icall.c' || echo '$(srcdir)/'`icall.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntime_la-icall.Tpo $(DEPDIR)/libmonoruntime_la-icall.Plo
@@ -2393,6 +2490,13 @@ libmonoruntimesgen_static_la-filewatcher.lo: filewatcher.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_static_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_static_la-filewatcher.lo `test -f 'filewatcher.c' || echo '$(srcdir)/'`filewatcher.c
+libmonoruntimesgen_static_la-gc-memfuncs.lo: gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_static_la_CFLAGS) $(CFLAGS) -MT libmonoruntimesgen_static_la-gc-memfuncs.lo -MD -MP -MF $(DEPDIR)/libmonoruntimesgen_static_la-gc-memfuncs.Tpo -c -o libmonoruntimesgen_static_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntimesgen_static_la-gc-memfuncs.Tpo $(DEPDIR)/libmonoruntimesgen_static_la-gc-memfuncs.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gc-memfuncs.c' object='libmonoruntimesgen_static_la-gc-memfuncs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_static_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_static_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+
libmonoruntimesgen_static_la-icall.lo: icall.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_static_la_CFLAGS) $(CFLAGS) -MT libmonoruntimesgen_static_la-icall.lo -MD -MP -MF $(DEPDIR)/libmonoruntimesgen_static_la-icall.Tpo -c -o libmonoruntimesgen_static_la-icall.lo `test -f 'icall.c' || echo '$(srcdir)/'`icall.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntimesgen_static_la-icall.Tpo $(DEPDIR)/libmonoruntimesgen_static_la-icall.Plo
@@ -2890,6 +2994,13 @@ libmonoruntimesgen_static_la-sgen-layout-stats.lo: sgen-layout-stats.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_static_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_static_la-sgen-layout-stats.lo `test -f 'sgen-layout-stats.c' || echo '$(srcdir)/'`sgen-layout-stats.c
+libmonoruntimesgen_static_la-sgen-qsort.lo: sgen-qsort.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_static_la_CFLAGS) $(CFLAGS) -MT libmonoruntimesgen_static_la-sgen-qsort.lo -MD -MP -MF $(DEPDIR)/libmonoruntimesgen_static_la-sgen-qsort.Tpo -c -o libmonoruntimesgen_static_la-sgen-qsort.lo `test -f 'sgen-qsort.c' || echo '$(srcdir)/'`sgen-qsort.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntimesgen_static_la-sgen-qsort.Tpo $(DEPDIR)/libmonoruntimesgen_static_la-sgen-qsort.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sgen-qsort.c' object='libmonoruntimesgen_static_la-sgen-qsort.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_static_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_static_la-sgen-qsort.lo `test -f 'sgen-qsort.c' || echo '$(srcdir)/'`sgen-qsort.c
+
libmonoruntimesgen_la-console-unix.lo: console-unix.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -MT libmonoruntimesgen_la-console-unix.lo -MD -MP -MF $(DEPDIR)/libmonoruntimesgen_la-console-unix.Tpo -c -o libmonoruntimesgen_la-console-unix.lo `test -f 'console-unix.c' || echo '$(srcdir)/'`console-unix.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntimesgen_la-console-unix.Tpo $(DEPDIR)/libmonoruntimesgen_la-console-unix.Plo
@@ -2988,6 +3099,13 @@ libmonoruntimesgen_la-filewatcher.lo: filewatcher.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_la-filewatcher.lo `test -f 'filewatcher.c' || echo '$(srcdir)/'`filewatcher.c
+libmonoruntimesgen_la-gc-memfuncs.lo: gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -MT libmonoruntimesgen_la-gc-memfuncs.lo -MD -MP -MF $(DEPDIR)/libmonoruntimesgen_la-gc-memfuncs.Tpo -c -o libmonoruntimesgen_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntimesgen_la-gc-memfuncs.Tpo $(DEPDIR)/libmonoruntimesgen_la-gc-memfuncs.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gc-memfuncs.c' object='libmonoruntimesgen_la-gc-memfuncs.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_la-gc-memfuncs.lo `test -f 'gc-memfuncs.c' || echo '$(srcdir)/'`gc-memfuncs.c
+
libmonoruntimesgen_la-icall.lo: icall.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -MT libmonoruntimesgen_la-icall.lo -MD -MP -MF $(DEPDIR)/libmonoruntimesgen_la-icall.Tpo -c -o libmonoruntimesgen_la-icall.lo `test -f 'icall.c' || echo '$(srcdir)/'`icall.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntimesgen_la-icall.Tpo $(DEPDIR)/libmonoruntimesgen_la-icall.Plo
@@ -3485,6 +3603,41 @@ libmonoruntimesgen_la-sgen-layout-stats.lo: sgen-layout-stats.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_la-sgen-layout-stats.lo `test -f 'sgen-layout-stats.c' || echo '$(srcdir)/'`sgen-layout-stats.c
+libmonoruntimesgen_la-sgen-qsort.lo: sgen-qsort.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -MT libmonoruntimesgen_la-sgen-qsort.lo -MD -MP -MF $(DEPDIR)/libmonoruntimesgen_la-sgen-qsort.Tpo -c -o libmonoruntimesgen_la-sgen-qsort.lo `test -f 'sgen-qsort.c' || echo '$(srcdir)/'`sgen-qsort.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmonoruntimesgen_la-sgen-qsort.Tpo $(DEPDIR)/libmonoruntimesgen_la-sgen-qsort.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sgen-qsort.c' object='libmonoruntimesgen_la-sgen-qsort.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmonoruntimesgen_la_CFLAGS) $(CFLAGS) -c -o libmonoruntimesgen_la-sgen-qsort.lo `test -f 'sgen-qsort.c' || echo '$(srcdir)/'`sgen-qsort.c
+
+test_gc_memfuncs-test-gc-memfuncs.o: test-gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gc_memfuncs_CFLAGS) $(CFLAGS) -MT test_gc_memfuncs-test-gc-memfuncs.o -MD -MP -MF $(DEPDIR)/test_gc_memfuncs-test-gc-memfuncs.Tpo -c -o test_gc_memfuncs-test-gc-memfuncs.o `test -f 'test-gc-memfuncs.c' || echo '$(srcdir)/'`test-gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_gc_memfuncs-test-gc-memfuncs.Tpo $(DEPDIR)/test_gc_memfuncs-test-gc-memfuncs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-gc-memfuncs.c' object='test_gc_memfuncs-test-gc-memfuncs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gc_memfuncs_CFLAGS) $(CFLAGS) -c -o test_gc_memfuncs-test-gc-memfuncs.o `test -f 'test-gc-memfuncs.c' || echo '$(srcdir)/'`test-gc-memfuncs.c
+
+test_gc_memfuncs-test-gc-memfuncs.obj: test-gc-memfuncs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gc_memfuncs_CFLAGS) $(CFLAGS) -MT test_gc_memfuncs-test-gc-memfuncs.obj -MD -MP -MF $(DEPDIR)/test_gc_memfuncs-test-gc-memfuncs.Tpo -c -o test_gc_memfuncs-test-gc-memfuncs.obj `if test -f 'test-gc-memfuncs.c'; then $(CYGPATH_W) 'test-gc-memfuncs.c'; else $(CYGPATH_W) '$(srcdir)/test-gc-memfuncs.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_gc_memfuncs-test-gc-memfuncs.Tpo $(DEPDIR)/test_gc_memfuncs-test-gc-memfuncs.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-gc-memfuncs.c' object='test_gc_memfuncs-test-gc-memfuncs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_gc_memfuncs_CFLAGS) $(CFLAGS) -c -o test_gc_memfuncs-test-gc-memfuncs.obj `if test -f 'test-gc-memfuncs.c'; then $(CYGPATH_W) 'test-gc-memfuncs.c'; else $(CYGPATH_W) '$(srcdir)/test-gc-memfuncs.c'; fi`
+
+test_sgen_qsort-test-sgen-qsort.o: test-sgen-qsort.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_sgen_qsort_CFLAGS) $(CFLAGS) -MT test_sgen_qsort-test-sgen-qsort.o -MD -MP -MF $(DEPDIR)/test_sgen_qsort-test-sgen-qsort.Tpo -c -o test_sgen_qsort-test-sgen-qsort.o `test -f 'test-sgen-qsort.c' || echo '$(srcdir)/'`test-sgen-qsort.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_sgen_qsort-test-sgen-qsort.Tpo $(DEPDIR)/test_sgen_qsort-test-sgen-qsort.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-sgen-qsort.c' object='test_sgen_qsort-test-sgen-qsort.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_sgen_qsort_CFLAGS) $(CFLAGS) -c -o test_sgen_qsort-test-sgen-qsort.o `test -f 'test-sgen-qsort.c' || echo '$(srcdir)/'`test-sgen-qsort.c
+
+test_sgen_qsort-test-sgen-qsort.obj: test-sgen-qsort.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_sgen_qsort_CFLAGS) $(CFLAGS) -MT test_sgen_qsort-test-sgen-qsort.obj -MD -MP -MF $(DEPDIR)/test_sgen_qsort-test-sgen-qsort.Tpo -c -o test_sgen_qsort-test-sgen-qsort.obj `if test -f 'test-sgen-qsort.c'; then $(CYGPATH_W) 'test-sgen-qsort.c'; else $(CYGPATH_W) '$(srcdir)/test-sgen-qsort.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_sgen_qsort-test-sgen-qsort.Tpo $(DEPDIR)/test_sgen_qsort-test-sgen-qsort.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-sgen-qsort.c' object='test_sgen_qsort-test-sgen-qsort.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_sgen_qsort_CFLAGS) $(CFLAGS) -c -o test_sgen_qsort-test-sgen-qsort.obj `if test -f 'test-sgen-qsort.c'; then $(CYGPATH_W) 'test-sgen-qsort.c'; else $(CYGPATH_W) '$(srcdir)/test-sgen-qsort.c'; fi`
+
mostlyclean-libtool:
-rm -f *.lo
@@ -3561,23 +3714,102 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ $(am__tty_colors); \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=XPASS; \
+ ;; \
+ *) \
+ col=$$grn; res=PASS; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xfail=`expr $$xfail + 1`; \
+ col=$$lgn; res=XFAIL; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=FAIL; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ col=$$blu; res=SKIP; \
+ fi; \
+ echo "$${col}$$res$${std}: $$tst"; \
+ done; \
+ if test "$$all" -eq 1; then \
+ tests="test"; \
+ All=""; \
+ else \
+ tests="tests"; \
+ All="All "; \
+ fi; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="$$All$$all $$tests passed"; \
+ else \
+ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all $$tests failed"; \
+ else \
+ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ if test "$$skip" -eq 1; then \
+ skipped="($$skip test was not run)"; \
+ else \
+ skipped="($$skip tests were not run)"; \
+ fi; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ if test "$$failed" -eq 0; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ fi; \
+ echo "$${col}$$dashes$${std}"; \
+ echo "$${col}$$banner$${std}"; \
+ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+ test -z "$$report" || echo "$${col}$$report$${std}"; \
+ echo "$${col}$$dashes$${std}"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -3609,6 +3841,7 @@ distdir: $(DISTFILES)
fi; \
done
check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
check: check-am
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
installdirs:
@@ -3649,7 +3882,7 @@ maintainer-clean-generic:
clean: clean-am
clean-am: clean-binPROGRAMS clean-generic clean-libtool \
- clean-noinstLTLIBRARIES mostlyclean-am
+ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
@@ -3718,22 +3951,23 @@ ps-am:
uninstall-am: uninstall-binPROGRAMS \
uninstall-libmonoruntimeincludeHEADERS
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libtool clean-noinstLTLIBRARIES cscopelist \
- ctags distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-binPROGRAMS \
- 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-libmonoruntimeincludeHEADERS install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- 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-binPROGRAMS \
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES clean-noinstPROGRAMS ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS 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-libmonoruntimeincludeHEADERS \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip 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-binPROGRAMS \
uninstall-libmonoruntimeincludeHEADERS
@HOST_WIN32_TRUE@export HOST_CC
diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c
index 20ccd0c489..068a1df275 100644
--- a/mono/metadata/appdomain.c
+++ b/mono/metadata/appdomain.c
@@ -62,6 +62,7 @@
#include <mono/utils/mono-error-internals.h>
#include <mono/utils/atomic.h>
#include <mono/utils/mono-memory-model.h>
+#include <mono/utils/mono-threads.h>
#ifdef HOST_WIN32
#include <direct.h>
#endif
@@ -77,7 +78,7 @@
* Changes which are already detected at runtime, like the addition
* of icalls, do not require an increment.
*/
-#define MONO_CORLIB_VERSION 110
+#define MONO_CORLIB_VERSION 111
typedef struct
{
@@ -476,7 +477,6 @@ mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup *
shadow_location = get_shadow_assembly_location_base (data, &error);
if (!mono_error_ok (&error))
mono_error_raise_exception (&error);
- mono_debugger_event_create_appdomain (data, shadow_location);
g_free (shadow_location);
#endif
@@ -1609,6 +1609,7 @@ mono_make_shadow_copy (const char *filename)
gchar *sibling_source, *sibling_target;
gint sibling_source_len, sibling_target_len;
guint16 *orig, *dest;
+ guint32 attrs;
char *shadow;
gboolean copy_result;
MonoException *exc;
@@ -1661,6 +1662,16 @@ mono_make_shadow_copy (const char *filename)
orig = g_utf8_to_utf16 (filename, strlen (filename), NULL, NULL, NULL);
dest = g_utf8_to_utf16 (shadow, strlen (shadow), NULL, NULL, NULL);
DeleteFile (dest);
+
+ /* Fix for bug #17066 - make sure we can read the file. if not then don't error but rather
+ * let the assembly fail to load. This ensures you can do Type.GetType("NS.T, NonExistantAssembly)
+ * and not have it runtime error" */
+ attrs = GetFileAttributes (orig);
+ if (attrs == INVALID_FILE_ATTRIBUTES) {
+ g_free (shadow);
+ return (char *)filename;
+ }
+
copy_result = CopyFile (orig, dest, FALSE);
/* Fix for bug #556884 - make sure the files have the correct mode so that they can be
@@ -1945,7 +1956,9 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad, MonoString *assRef,
if (!parsed) {
/* This is a parse error... */
- return NULL;
+ if (!refOnly)
+ refass = mono_try_assembly_resolve (domain, assRef, refOnly);
+ return refass;
}
ass = mono_assembly_load_full_nosearch (&aname, NULL, &status, refOnly);
@@ -2176,7 +2189,7 @@ zero_static_data (MonoVTable *vtable)
void *data;
if (klass->has_static_refs && (data = mono_vtable_get_static_field_data (vtable)))
- mono_gc_bzero (data, mono_class_data_size (klass));
+ mono_gc_bzero_aligned (data, mono_class_data_size (klass));
}
typedef struct unload_data {
@@ -2201,23 +2214,6 @@ unload_data_unref (unload_data *data)
}
static void
-deregister_reflection_info_roots_nspace_table (gpointer key, gpointer value, gpointer image)
-{
- guint32 index = GPOINTER_TO_UINT (value);
- MonoClass *class = mono_class_get (image, MONO_TOKEN_TYPE_DEF | index);
-
- g_assert (class);
-
- mono_class_free_ref_info (class);
-}
-
-static void
-deregister_reflection_info_roots_name_space (gpointer key, gpointer value, gpointer user_data)
-{
- g_hash_table_foreach (value, deregister_reflection_info_roots_nspace_table, user_data);
-}
-
-static void
deregister_reflection_info_roots_from_list (MonoImage *image)
{
GSList *list = image->reflection_info_unregister_classes;
@@ -2230,7 +2226,6 @@ deregister_reflection_info_roots_from_list (MonoImage *image)
list = list->next;
}
- g_slist_free (image->reflection_info_unregister_classes);
image->reflection_info_unregister_classes = NULL;
}
@@ -2239,29 +2234,28 @@ deregister_reflection_info_roots (MonoDomain *domain)
{
GSList *list;
- mono_loader_lock ();
mono_domain_assemblies_lock (domain);
for (list = domain->domain_assemblies; list; list = list->next) {
MonoAssembly *assembly = list->data;
MonoImage *image = assembly->image;
int i;
- /*No need to take the image lock here since dynamic images are appdomain bound and at this point the mutator is gone.*/
- if (image->dynamic && image->name_cache)
- g_hash_table_foreach (image->name_cache, deregister_reflection_info_roots_name_space, image);
- deregister_reflection_info_roots_from_list (image);
+
+ /*
+ * No need to take the image lock here since dynamic images are appdomain bound and
+ * at this point the mutator is gone. Taking the image lock here would mean
+ * promoting it from a simple lock to a complex lock, which we better avoid if
+ * possible.
+ */
+ if (image->dynamic)
+ deregister_reflection_info_roots_from_list (image);
+
for (i = 0; i < image->module_count; ++i) {
MonoImage *module = image->modules [i];
- if (module) {
- if (module->dynamic && module->name_cache) {
- g_hash_table_foreach (module->name_cache,
- deregister_reflection_info_roots_name_space, module);
- }
+ if (module && module->dynamic)
deregister_reflection_info_roots_from_list (module);
- }
}
}
mono_domain_assemblies_unlock (domain);
- mono_loader_unlock ();
}
static guint32 WINAPI
@@ -2390,7 +2384,6 @@ void
mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
{
HANDLE thread_handle;
- gsize tid;
MonoAppDomainState prev_state;
MonoMethod *method;
unload_data *thread_data;
@@ -2417,8 +2410,6 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
}
}
- mono_debugger_event_unload_appdomain (domain);
-
mono_domain_set (domain, FALSE);
/* Notify OnDomainUnload listeners */
method = mono_class_get_method_from_name (domain->domain->mbr.obj.vtable->klass, "DoDomainUnload", -1);
@@ -2451,9 +2442,9 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
* http://bugzilla.ximian.com/show_bug.cgi?id=27663
*/
#if 0
- thread_handle = mono_create_thread (NULL, 0, unload_thread_main, &thread_data, 0, &tid);
+ thread_handle = mono_threads_create_thread (unload_thread_main, thread_data, 0, 0, NULL);
#else
- thread_handle = mono_create_thread (NULL, 0, (LPTHREAD_START_ROUTINE)unload_thread_main, thread_data, CREATE_SUSPENDED, &tid);
+ thread_handle = mono_threads_create_thread ((LPTHREAD_START_ROUTINE)unload_thread_main, thread_data, 0, CREATE_SUSPENDED, NULL);
if (thread_handle == NULL) {
return;
}
diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c
index ad349dd860..31d6f35894 100644
--- a/mono/metadata/assembly.c
+++ b/mono/metadata/assembly.c
@@ -33,8 +33,10 @@
#include <mono/utils/mono-path.h>
#include <mono/metadata/reflection.h>
#include <mono/metadata/coree.h>
+#include <mono/metadata/cil-coff.h>
#include <mono/utils/mono-io-portability.h>
#include <mono/utils/atomic.h>
+#include <mono/utils/mono-mutex.h>
#ifndef HOST_WIN32
#include <sys/types.h>
@@ -175,6 +177,8 @@ static CRITICAL_SECTION assemblies_mutex;
/* If defined, points to the bundled assembly information */
const MonoBundledAssembly **bundles;
+static mono_mutex_t assembly_binding_mutex;
+
/* Loaded assembly binding info */
static GSList *loaded_assembly_bindings = NULL;
@@ -734,6 +738,19 @@ mono_assemblies_init (void)
check_extra_gac_path_env ();
InitializeCriticalSection (&assemblies_mutex);
+ mono_mutex_init (&assembly_binding_mutex);
+}
+
+static void
+mono_assembly_binding_lock (void)
+{
+ mono_locks_mutex_acquire (&assembly_binding_mutex, AssemblyBindingLock);
+}
+
+static void
+mono_assembly_binding_unlock (void)
+{
+ mono_locks_mutex_release (&assembly_binding_mutex, AssemblyBindingLock);
}
gboolean
@@ -741,6 +758,7 @@ mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname)
{
MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLY];
guint32 cols [MONO_ASSEMBLY_SIZE];
+ gint32 machine, flags;
if (!t->rows)
return FALSE;
@@ -785,6 +803,31 @@ mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname)
else
aname->public_key = 0;
+ machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;
+ flags = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags;
+ switch (machine) {
+ case COFF_MACHINE_I386:
+ /* https://bugzilla.xamarin.com/show_bug.cgi?id=17632 */
+ if (flags & (CLI_FLAGS_32BITREQUIRED|CLI_FLAGS_PREFERRED32BIT))
+ aname->arch = MONO_PROCESSOR_ARCHITECTURE_X86;
+ else if ((flags & 0x70) == 0x70)
+ aname->arch = MONO_PROCESSOR_ARCHITECTURE_NONE;
+ else
+ aname->arch = MONO_PROCESSOR_ARCHITECTURE_MSIL;
+ break;
+ case COFF_MACHINE_IA64:
+ aname->arch = MONO_PROCESSOR_ARCHITECTURE_IA64;
+ break;
+ case COFF_MACHINE_AMD64:
+ aname->arch = MONO_PROCESSOR_ARCHITECTURE_AMD64;
+ break;
+ case COFF_MACHINE_ARM:
+ aname->arch = MONO_PROCESSOR_ARCHITECTURE_ARM;
+ break;
+ default:
+ break;
+ }
+
return TRUE;
}
@@ -891,7 +934,7 @@ remap_keys (MonoAssemblyName *aname)
memcpy (aname->public_key_token, entry->to, MONO_PUBLIC_KEY_TOKEN_LENGTH);
- mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_ASSEMBLY,
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY,
"Remapped public key token of retargetable assembly %s from %s to %s",
aname->name, entry->from, entry->to);
return;
@@ -927,7 +970,7 @@ mono_assembly_remap_version (MonoAssemblyName *aname, MonoAssemblyName *dest_ana
remap_keys (dest_aname);
- mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_ASSEMBLY,
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY,
"The request to load the retargetable assembly %s v%d.%d.%d.%d was remapped to %s v%d.%d.%d.%d",
aname->name,
aname->major, aname->minor, aname->build, aname->revision,
@@ -2449,7 +2492,7 @@ mono_assembly_bind_version (MonoAssemblyBindingInfo *info, MonoAssemblyName *ana
return dest_name;
}
-/* LOCKING: Assumes that we are already locked */
+/* LOCKING: assembly_binding lock must be held */
static MonoAssemblyBindingInfo*
search_binding_loaded (MonoAssemblyName *aname)
{
@@ -2526,16 +2569,23 @@ assembly_binding_info_parsed (MonoAssemblyBindingInfo *info, void *user_data)
domain->assembly_bindings = g_slist_append_mempool (domain->mp, domain->assembly_bindings, info_copy);
}
+static int
+get_version_number (int major, int minor)
+{
+ return major * 256 + minor;
+}
+
static inline gboolean
info_major_minor_in_range (MonoAssemblyBindingInfo *info, MonoAssemblyName *aname)
{
+ int aname_version_number = get_version_number (aname->major, aname->minor);
if (!info->has_old_version_bottom)
return FALSE;
- if (info->old_version_bottom.major > aname->major || info->old_version_bottom.minor > aname->minor)
+ if (get_version_number (info->old_version_bottom.major, info->old_version_bottom.minor) > aname_version_number)
return FALSE;
- if (info->has_old_version_top && (info->old_version_top.major < aname->major || info->old_version_top.minor < aname->minor))
+ if (info->has_old_version_top && get_version_number (info->old_version_top.major, info->old_version_top.minor) < aname_version_number)
return FALSE;
/* This is not the nicest way to do it, but it's a by-product of the way parsing is done */
@@ -2585,15 +2635,17 @@ mono_assembly_apply_binding (MonoAssemblyName *aname, MonoAssemblyName *dest_nam
return aname;
domain = mono_domain_get ();
- mono_loader_lock ();
+
+ mono_assembly_binding_lock ();
info = search_binding_loaded (aname);
+ mono_assembly_binding_unlock ();
+
if (!info) {
mono_domain_lock (domain);
info = get_per_domain_assembly_binding_info (domain, aname);
mono_domain_unlock (domain);
}
- mono_loader_unlock ();
if (info) {
if (!check_policy_versions (info, aname))
return aname;
@@ -2617,10 +2669,7 @@ mono_assembly_apply_binding (MonoAssemblyName *aname, MonoAssemblyName *dest_nam
g_free (domain_config_file_name);
g_free (domain_config_file_path);
}
- mono_domain_unlock (domain);
- mono_loader_lock ();
- mono_domain_lock (domain);
info2 = get_per_domain_assembly_binding_info (domain, aname);
if (info2) {
@@ -2631,7 +2680,6 @@ mono_assembly_apply_binding (MonoAssemblyName *aname, MonoAssemblyName *dest_nam
}
mono_domain_unlock (domain);
- mono_loader_unlock ();
}
if (!info) {
@@ -2655,7 +2703,7 @@ mono_assembly_apply_binding (MonoAssemblyName *aname, MonoAssemblyName *dest_nam
g_strlcpy ((char *)info->public_key_token, (const char *)aname->public_key_token, MONO_PUBLIC_KEY_TOKEN_LENGTH);
}
- mono_loader_lock ();
+ mono_assembly_binding_lock ();
info2 = search_binding_loaded (aname);
if (info2) {
/* This binding was added by another thread
@@ -2667,7 +2715,7 @@ mono_assembly_apply_binding (MonoAssemblyName *aname, MonoAssemblyName *dest_nam
} else
loaded_assembly_bindings = g_slist_prepend (loaded_assembly_bindings, info);
- mono_loader_unlock ();
+ mono_assembly_binding_unlock ();
if (!info->is_valid || !check_policy_versions (info, aname))
return aname;
@@ -3079,6 +3127,7 @@ mono_assemblies_cleanup (void)
GSList *l;
DeleteCriticalSection (&assemblies_mutex);
+ mono_mutex_destroy (&assembly_binding_mutex);
for (l = loaded_assembly_bindings; l; l = l->next) {
MonoAssemblyBindingInfo *info = l->data;
@@ -3093,12 +3142,14 @@ mono_assemblies_cleanup (void)
free_assembly_preload_hooks ();
}
-/*LOCKING assumes loader lock is held*/
+/*LOCKING takes the assembly_binding lock*/
void
mono_assembly_cleanup_domain_bindings (guint32 domain_id)
{
- GSList **iter = &loaded_assembly_bindings;
+ GSList **iter;
+ mono_assembly_binding_lock ();
+ iter = &loaded_assembly_bindings;
while (*iter) {
GSList *l = *iter;
MonoAssemblyBindingInfo *info = l->data;
@@ -3112,6 +3163,7 @@ mono_assembly_cleanup_domain_bindings (guint32 domain_id)
iter = &l->next;
}
}
+ mono_assembly_binding_unlock ();
}
/*
diff --git a/mono/metadata/attach.c b/mono/metadata/attach.c
index b14709aeab..86a83c3a62 100644
--- a/mono/metadata/attach.c
+++ b/mono/metadata/attach.c
@@ -31,13 +31,13 @@
#include <netdb.h>
#include <unistd.h>
-
#include <mono/metadata/assembly.h>
#include <mono/metadata/metadata.h>
#include <mono/metadata/class-internals.h>
#include <mono/metadata/object-internals.h>
#include <mono/metadata/threads-types.h>
#include <mono/metadata/gc-internal.h>
+#include <mono/utils/mono-threads.h>
#include "attach.h"
/*
@@ -473,14 +473,12 @@ transport_send (int fd, guint8 *data, int len)
static void
transport_start_receive (void)
{
- gsize tid;
-
transport_connect ();
if (!listen_fd)
return;
- receiver_thread_handle = mono_create_thread (NULL, 0, receiver_thread, NULL, 0, &tid);
+ receiver_thread_handle = mono_threads_create_thread (receiver_thread, NULL, 0, 0, NULL);
g_assert (receiver_thread_handle);
}
diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c
index 26665e50f5..a1b4b73cb4 100644
--- a/mono/metadata/boehm-gc.c
+++ b/mono/metadata/boehm-gc.c
@@ -21,11 +21,14 @@
#include <mono/metadata/metadata-internals.h>
#include <mono/metadata/marshal.h>
#include <mono/metadata/runtime.h>
+#include <mono/utils/atomic.h>
#include <mono/utils/mono-logger-internal.h>
+#include <mono/utils/mono-memory-model.h>
#include <mono/utils/mono-time.h>
#include <mono/utils/mono-threads.h>
#include <mono/utils/dtrace.h>
#include <mono/utils/gc_wrapper.h>
+#include <mono/utils/mono-mutex.h>
#if HAVE_BOEHM_GC
@@ -46,6 +49,7 @@ void *pthread_get_stackaddr_np(pthread_t);
#define MIN_BOEHM_MAX_HEAP_SIZE (MIN_BOEHM_MAX_HEAP_SIZE_IN_MB << 20)
static gboolean gc_initialized = FALSE;
+static mono_mutex_t mono_gc_lock;
static void*
boehm_thread_register (MonoThreadInfo* info, void *baseptr);
@@ -185,6 +189,7 @@ mono_gc_base_init (void)
#endif
mono_threads_init (&cb, sizeof (MonoThreadInfo));
+ mono_mutex_init (&mono_gc_lock);
mono_gc_enable_events ();
gc_initialized = TRUE;
@@ -614,7 +619,7 @@ mono_gc_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* va
void
mono_gc_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int count)
{
- mono_gc_memmove (dest_ptr, src_ptr, count * sizeof (gpointer));
+ mono_gc_memmove_aligned (dest_ptr, src_ptr, count * sizeof (gpointer));
}
void
@@ -624,6 +629,12 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
}
void
+mono_gc_wbarrier_generic_store_atomic (gpointer ptr, MonoObject *value)
+{
+ InterlockedWritePointer (ptr, value);
+}
+
+void
mono_gc_wbarrier_generic_nostore (gpointer ptr)
{
}
@@ -631,14 +642,14 @@ mono_gc_wbarrier_generic_nostore (gpointer ptr)
void
mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass)
{
- mono_gc_memmove (dest, src, count * mono_class_value_size (klass, NULL));
+ mono_gc_memmove_atomic (dest, src, count * mono_class_value_size (klass, NULL));
}
void
mono_gc_wbarrier_object_copy (MonoObject* obj, MonoObject *src)
{
/* do not copy the sync state */
- mono_gc_memmove ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
+ mono_gc_memmove_aligned ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
mono_object_class (obj)->instance_size - sizeof (MonoObject));
}
@@ -680,7 +691,7 @@ enum {
};
static MonoMethod*
-create_allocator (int atype, int offset)
+create_allocator (int atype, int tls_key)
{
int index_var, bytes_var, my_fl_var, my_entry_var;
guint32 no_freelist_branch, not_small_enough_branch = 0;
@@ -759,7 +770,7 @@ create_allocator (int atype, int offset)
/* my_fl = ((GC_thread)tsd) -> ptrfree_freelists + index; */
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
mono_mb_emit_byte (mb, 0x0D); /* CEE_MONO_TLS */
- mono_mb_emit_i4 (mb, offset);
+ mono_mb_emit_i4 (mb, tls_key);
if (atype == ATYPE_FREEPTR || atype == ATYPE_FREEPTR_FOR_BOX || atype == ATYPE_STRING)
mono_mb_emit_icon (mb, G_STRUCT_OFFSET (struct GC_Thread_Rep, ptrfree_freelists));
else if (atype == ATYPE_NORMAL)
@@ -966,11 +977,22 @@ mono_gc_get_managed_allocator_by_type (int atype)
MonoMethod *res;
MONO_THREAD_VAR_OFFSET (GC_thread_tls, offset);
- mono_loader_lock ();
+ mono_tls_key_set_offset (TLS_KEY_BOEHM_GC_THREAD, offset);
+
res = alloc_method_cache [atype];
- if (!res)
- res = alloc_method_cache [atype] = create_allocator (atype, offset);
- mono_loader_unlock ();
+ if (res)
+ return res;
+
+ res = create_allocator (atype, TLS_KEY_BOEHM_GC_THREAD);
+ mono_mutex_lock (&mono_gc_lock);
+ if (alloc_method_cache [atype]) {
+ mono_free_method (res);
+ res = alloc_method_cache [atype];
+ } else {
+ mono_memory_barrier ();
+ alloc_method_cache [atype] = res;
+ }
+ mono_mutex_unlock (&mono_gc_lock);
return res;
}
diff --git a/mono/metadata/cil-coff.h b/mono/metadata/cil-coff.h
index 8d6fdcf4d8..26b4782ca5 100644
--- a/mono/metadata/cil-coff.h
+++ b/mono/metadata/cil-coff.h
@@ -37,6 +37,12 @@ typedef struct {
char msdos_header2 [64];
} MonoMSDOSHeader;
+/* Possible values for coff_machine */
+#define COFF_MACHINE_I386 332
+#define COFF_MACHINE_IA64 512
+#define COFF_MACHINE_AMD64 34404
+#define COFF_MACHINE_ARM 452
+
/* 20 bytes */
typedef struct {
guint16 coff_machine;
@@ -289,6 +295,7 @@ typedef struct {
#define CLI_FLAGS_ILONLY 0x01
#define CLI_FLAGS_32BITREQUIRED 0x02
#define CLI_FLAGS_STRONGNAMESIGNED 0x8
+#define CLI_FLAGS_PREFERRED32BIT 0x10
#define CLI_FLAGS_TRACKDEBUGDATA 0x00010000
guint32 ch_flags;
diff --git a/mono/metadata/class.c b/mono/metadata/class.c
index 06cec52aae..4660902e68 100644
--- a/mono/metadata/class.c
+++ b/mono/metadata/class.c
@@ -71,7 +71,6 @@ static void mono_generic_class_setup_parent (MonoClass *klass, MonoClass *gklass
void (*mono_debugger_class_init_func) (MonoClass *klass) = NULL;
-void (*mono_debugger_class_loaded_methods_func) (MonoClass *klass) = NULL;
/*
@@ -2169,9 +2168,6 @@ mono_class_setup_methods (MonoClass *class)
class->methods = methods;
- if (mono_debugger_class_loaded_methods_func)
- mono_debugger_class_loaded_methods_func (class);
-
mono_loader_unlock ();
}
@@ -2923,9 +2919,12 @@ get_implicit_generic_array_interfaces (MonoClass *class, int *num, int *is_enume
* We collect the types needed to build the
* instantiations in interfaces at intervals of 3/5, because 3/5 are
* the generic interfaces needed to implement.
+ *
+ * On 4.5, as an optimization, we don't expand ref classes for the variant generic interfaces
+ * (IEnumerator, IReadOnlyList and IReadOnlyColleciton). The regular dispatch code can handle those cases.
*/
- nifaces = generic_ireadonlylist_class ? 5 : 3;
if (eclass->valuetype) {
+ nifaces = generic_ireadonlylist_class ? 5 : 3;
fill_valuetype_array_derived_types (valuetype_types, eclass, original_rank);
/* IList, ICollection, IEnumerable, IReadOnlyList`1 */
@@ -2947,6 +2946,7 @@ get_implicit_generic_array_interfaces (MonoClass *class, int *num, int *is_enume
int idepth = eclass->idepth;
if (!internal_enumerator)
idepth--;
+ nifaces = generic_ireadonlylist_class ? 2 : 3;
// FIXME: This doesn't seem to work/required for generic params
if (!(eclass->this_arg.type == MONO_TYPE_VAR || eclass->this_arg.type == MONO_TYPE_MVAR || (eclass->image->dynamic && !eclass->wastypebuilder)))
@@ -3010,10 +3010,16 @@ get_implicit_generic_array_interfaces (MonoClass *class, int *num, int *is_enume
interfaces [i + 0] = inflate_class_one_arg (mono_defaults.generic_ilist_class, iface);
interfaces [i + 1] = inflate_class_one_arg (generic_icollection_class, iface);
- interfaces [i + 2] = inflate_class_one_arg (generic_ienumerable_class, iface);
- if (generic_ireadonlylist_class) {
- interfaces [i + 3] = inflate_class_one_arg (generic_ireadonlylist_class, iface);
- interfaces [i + 4] = inflate_class_one_arg (generic_ireadonlycollection_class, iface);
+
+ if (eclass->valuetype) {
+ interfaces [i + 2] = inflate_class_one_arg (generic_ienumerable_class, iface);
+ if (generic_ireadonlylist_class) {
+ interfaces [i + 3] = inflate_class_one_arg (generic_ireadonlylist_class, iface);
+ interfaces [i + 4] = inflate_class_one_arg (generic_ireadonlycollection_class, iface);
+ }
+ } else {
+ if (!generic_ireadonlylist_class)
+ interfaces [i + 2] = inflate_class_one_arg (generic_ienumerable_class, iface);
}
}
if (internal_enumerator) {
@@ -3607,10 +3613,6 @@ mono_class_setup_vtable_full (MonoClass *class, GList *in_setup)
if (class->vtable)
return;
- if (mono_debug_using_mono_debugger ())
- /* The debugger currently depends on this */
- mono_class_setup_methods (class);
-
if (MONO_CLASS_IS_INTERFACE (class)) {
/* This sets method->slot for all methods if this is an interface */
mono_class_setup_methods (class);
@@ -5484,7 +5486,7 @@ mono_class_setup_parent (MonoClass *class, MonoClass *parent)
* - supertypes: array of classes: each element has a class in the hierarchy
* starting from @class up to System.Object
*
- * LOCKING: this assumes the loader lock is held
+ * LOCKING: This function is atomic, in case of contention we waste memory.
*/
void
mono_class_setup_supertypes (MonoClass *class)
@@ -5492,7 +5494,8 @@ mono_class_setup_supertypes (MonoClass *class)
int ms;
MonoClass **supertypes;
- if (class->supertypes)
+ mono_atomic_load_acquire (supertypes, void*, &class->supertypes);
+ if (supertypes)
return;
if (class->parent && !class->parent->supertypes)
@@ -6637,6 +6640,9 @@ mono_class_data_size (MonoClass *klass)
{
if (!klass->inited)
mono_class_init (klass);
+ /* This can happen with dynamically created types */
+ if (!klass->fields_inited)
+ mono_class_setup_fields_locking (klass);
/* in arrays, sizes.class_size is unioned with element_size
* and arrays have no static fields
@@ -8003,6 +8009,10 @@ mono_class_implement_interface_slow (MonoClass *target, MonoClass *candidate)
}
} else {
/*setup_interfaces don't mono_class_init anything*/
+ /*FIXME this doesn't handle primitive type arrays.
+ ICollection<sbyte> x byte [] won't work because candidate->interfaces, for byte[], won't have IList<sbyte>.
+ A possible way to fix this would be to move that to setup_interfaces from setup_interface_offsets.
+ */
mono_class_setup_interfaces (candidate, &error);
if (!mono_error_ok (&error)) {
mono_error_cleanup (&error);
@@ -8048,7 +8058,34 @@ mono_class_is_assignable_from_slow (MonoClass *target, MonoClass *candidate)
if (target->delegate && mono_class_has_variant_generic_params (target))
return mono_class_is_variant_compatible (target, candidate, FALSE);
- /*FIXME properly handle nullables and arrays */
+ if (target->rank) {
+ MonoClass *eclass, *eoclass;
+
+ if (target->rank != candidate->rank)
+ return FALSE;
+
+ /* vectors vs. one dimensional arrays */
+ if (target->byval_arg.type != candidate->byval_arg.type)
+ return FALSE;
+
+ eclass = target->cast_class;
+ eoclass = candidate->cast_class;
+
+ /*
+ * a is b does not imply a[] is b[] when a is a valuetype, and
+ * b is a reference type.
+ */
+
+ if (eoclass->valuetype) {
+ if ((eclass == mono_defaults.enum_class) ||
+ (eclass == mono_defaults.enum_class->parent) ||
+ (eclass == mono_defaults.object_class))
+ return FALSE;
+ }
+
+ return mono_class_is_assignable_from_slow (target->cast_class, candidate->cast_class);
+ }
+ /*FIXME properly handle nullables */
/*FIXME properly handle (M)VAR */
return FALSE;
}
@@ -8654,7 +8691,7 @@ mono_class_get_virtual_methods (MonoClass* klass, gpointer *iter)
MonoMethod** method;
if (!iter)
return NULL;
- if (klass->methods || !MONO_CLASS_HAS_STATIC_METADATA (klass) || mono_debug_using_mono_debugger ()) {
+ if (klass->methods || !MONO_CLASS_HAS_STATIC_METADATA (klass)) {
if (!*iter) {
mono_class_setup_methods (klass);
/*
@@ -8901,6 +8938,32 @@ mono_class_get_nested_types (MonoClass* klass, gpointer *iter)
return NULL;
}
+
+/**
+ * mono_class_is_delegate
+ * @klass: the MonoClass to act on
+ *
+ * Returns: true if the MonoClass represents a System.Delegate.
+ */
+mono_bool
+mono_class_is_delegate (MonoClass *klass)
+{
+ return klass->delegate;
+}
+
+/**
+ * mono_class_implements_interface
+ * @klass: The MonoClass to act on
+ * @interface: The interface to check if @klass implements.
+ *
+ * Returns: true if @klass implements @interface.
+ */
+mono_bool
+mono_class_implements_interface (MonoClass* klass, MonoClass* iface)
+{
+ return mono_class_is_assignable_from (iface, klass);
+}
+
/**
* mono_field_get_name:
* @field: the MonoClassField to act on
diff --git a/mono/metadata/class.h b/mono/metadata/class.h
index 27710839cd..a65bd4565e 100644
--- a/mono/metadata/class.h
+++ b/mono/metadata/class.h
@@ -189,6 +189,12 @@ mono_class_get_interfaces (MonoClass* klass, void **iter);
MONO_API MonoClass*
mono_class_get_nested_types (MonoClass* klass, void **iter);
+MONO_API mono_bool
+mono_class_is_delegate (MonoClass* klass);
+
+MONO_API mono_bool
+mono_class_implements_interface (MonoClass* klass, MonoClass* iface);
+
/* MonoClassField accessors */
MONO_API const char*
mono_field_get_name (MonoClassField *field);
diff --git a/mono/metadata/cominterop.c b/mono/metadata/cominterop.c
index 4260195412..8503fbf3f4 100644
--- a/mono/metadata/cominterop.c
+++ b/mono/metadata/cominterop.c
@@ -2000,11 +2000,9 @@ cominterop_get_ccw (MonoObject* object, MonoClass* itf)
cominterop_setup_marshal_context (&m, adjust_method);
m.mb = mb;
mono_marshal_emit_managed_wrapper (mb, sig_adjusted, mspecs, &m, adjust_method, 0);
- mono_loader_lock ();
mono_cominterop_lock ();
wrapper_method = mono_mb_create_method (mb, m.csig, m.csig->param_count + 16);
mono_cominterop_unlock ();
- mono_loader_unlock ();
vtable [vtable_index--] = mono_compile_method (wrapper_method);
@@ -2208,11 +2206,9 @@ cominterop_get_managed_wrapper_adjusted (MonoMethod *method)
mono_mb_emit_byte (mb, CEE_RET);
- mono_loader_lock ();
mono_cominterop_lock ();
res = mono_mb_create_method (mb, sig_native, sig_native->param_count + 16);
mono_cominterop_unlock ();
- mono_loader_unlock ();
mono_mb_free (mb);
diff --git a/mono/metadata/console-unix.c b/mono/metadata/console-unix.c
index 4df34eb413..b8987c9ec3 100644
--- a/mono/metadata/console-unix.c
+++ b/mono/metadata/console-unix.c
@@ -31,6 +31,7 @@
#include <mono/metadata/gc-internal.h>
#include <mono/metadata/metadata.h>
#include <mono/metadata/threadpool.h>
+#include <mono/utils/mono-signal-handler.h>
/* On solaris, curses.h must come before both termios.h and term.h */
#ifdef HAVE_CURSES_H
@@ -272,8 +273,8 @@ mono_console_handle_async_ops (void)
}
static gboolean in_sigint;
-static void
-sigint_handler (int signo)
+
+MONO_SIGNAL_HANDLER_FUNC (static, sigint_handler, (int signo))
{
int save_errno;
MONO_ARCH_SAVE_REGS;
@@ -291,8 +292,7 @@ sigint_handler (int signo)
static struct sigaction save_sigcont, save_sigint, save_sigwinch;
-static void
-sigcont_handler (int signo, void *the_siginfo, void *data)
+MONO_SIGNAL_HANDLER_FUNC (static, sigcont_handler, (int signo, void *the_siginfo, void *data))
{
int unused;
// Ignore error, there is not much we can do in the sigcont handler.
@@ -308,8 +308,7 @@ sigcont_handler (int signo, void *the_siginfo, void *data)
(*save_sigcont.sa_sigaction) (signo, the_siginfo, data);
}
-static void
-sigwinch_handler (int signo, void *the_siginfo, void *data)
+MONO_SIGNAL_HANDLER_FUNC (static, sigwinch_handler, (int signo, void *the_siginfo, void *data))
{
int dims = terminal_get_dimensions ();
if (dims != -1)
@@ -358,7 +357,7 @@ console_set_signal_handlers ()
sigaction (SIGCONT, &sigcont, &save_sigcont);
// Interrupt handler
- sigint.sa_handler = sigint_handler;
+ sigint.sa_handler = (void *) sigint_handler;
sigint.sa_flags = 0;
sigemptyset (&sigint.sa_mask);
sigaction (SIGINT, &sigint, &save_sigint);
diff --git a/mono/metadata/culture-info-tables.h b/mono/metadata/culture-info-tables.h
index c331662aec..f833b941bf 100644
--- a/mono/metadata/culture-info-tables.h
+++ b/mono/metadata/culture-info-tables.h
@@ -10,1397 +10,1397 @@
static const DateTimeFormatEntry datetime_format_entries [] = {
{1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{1,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {289, 308, 323, 338, 350, 55, 366, 378, {390, 403, 424, 439, 450, 469, 480}, {493, 498, 503, 508, 513, 518, 523}, {528, 531, 534, 537, 540, 531, 537}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, 2, 1, 763, 241, {308,765,781,797,0,0,0,0,0,0,0,0,0,0},{289,814,832,857,0,0,0,0},{338,881,0,0,0,0,0,0,0,0,0,0},{323,892,0,0,0,0,0,0,0}},
- {906, 243, 280, 274, 932, 55, 946, 951, {956, 965, 973, 981, 990, 997, 1007}, {1016, 1019, 1022, 1025, 1028, 1031, 1034}, {1037, 1039, 1041, 1043, 1045, 1047, 1049}, {1051, 1057, 1064, 1070, 1076, 1081, 1086, 1093, 1099, 1108, 1116, 1125, 0}, {1134, 1143, 1153, 1162, 1172, 1180, 1188, 1198, 1208, 1220, 1232, 1244, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, 2, 1, 239, 241, {243,14,1301,1312,1320,1327,1336,0,0,0,0,0,0,0},{906,1345,1361,0,0,0,0,0},{274,1377,1382,0,0,0,0,0,0,0,0,0},{280,1394,1402,0,0,0,0,0,0}},
- {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
- {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 55, 1992, 1997, {2002, 2010, 2020, 2028, 2036, 2045, 2052}, {2059, 2062, 2065, 2069, 2072, 2076, 2080}, {2083, 2085, 2087, 2090, 2092, 2085, 2090}, {2095, 2101, 2107, 2115, 2121, 2129, 2137, 2147, 2153, 2161, 2169, 2178, 0}, {2187, 2193, 2200, 2208, 2214, 2222, 2230, 2240, 2153, 2246, 2254, 2264, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, 2, 1, 763, 241, {1973,2312,1301,1796,1836,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{1377,274,2319,2327,0,0,0,0,0,0,0,0},{1394,280,2332,2343,0,0,0,0,0}},
- {1960, 2351, 280, 274, 1982, 2362, 2370, 2375, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {2433, 2438, 2442, 2446, 2450, 2454, 2458}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,2883,1336,2895,2903,1973,1301,0,0,0,0,0,0,0},{2628,1960,2910,0,0,0,0,0},{274,1377,2327,2922,0,0,0,0,0,0,0,0},{280,2933,2947,2962,0,0,0,0,0}},
- {2969, 2987, 2996, 3007, 1982, 55, 3015, 3022, {3029, 3044, 3059, 3070, 3085, 3098, 3117}, {3132, 3139, 3146, 3153, 3160, 3167, 3174}, {3181, 3184, 3187, 3187, 3190, 3190, 3193}, {3196, 3217, 3240, 3255, 3272, 3283, 3298, 3313, 3332, 3355, 3374, 3393, 0}, {3414, 3435, 3458, 3473, 3490, 3501, 3516, 3531, 3550, 3573, 3592, 3611, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, 2, 1, 239, 241, {2987,243,1320,14,3720,1301,0,0,0,0,0,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {4005, 243, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 4130, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,2883,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,1382,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
- {4280, 1973, 1394, 1377, 1982, 4297, 4309, 4313, {4317, 4329, 4341, 4351, 4365, 4375, 4387}, {4398, 4401, 4404, 4407, 4410, 4413, 4416}, {2090, 2463, 2465, 4419, 2465, 2085, 2471}, {4421, 4430, 4439, 4449, 4458, 4467, 4476, 4486, 4493, 4501, 4509, 4519, 0}, {4528, 4539, 4550, 4562, 4573, 4584, 4595, 4607, 4616, 4626, 4636, 4648, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{4280,4730,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 0, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {5007, 243, 280, 274, 1982, 55, 5025, 5038, {5049, 5067, 5081, 5099, 5117, 5135, 5151}, {5165, 5177, 5189, 5201, 5213, 5225, 5237}, {5244, 5247, 5250, 5253, 5256, 5259, 5262}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, 0, 0, 239, 241, {243,5487,14,1,1327,2351,5500,1301,5513,5530,0,0,0,0},{5007,5487,5540,5562,5513,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}},
- {5583, 5597, 1394, 1377, 5609, 5620, 5628, 5632, {5636, 5646, 5654, 5659, 5666, 5679, 5687}, {4134, 5695, 4419, 5697, 5701, 2085, 5704}, {4134, 5695, 4419, 5708, 5701, 2085, 5708}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,5857,1301,5871,0,0,0,0,0,0,0,0,0,0},{5583,0,0,0,0,0,0,0},{1377,274,3007,0,0,0,0,0,0,0,0,0},{1394,280,2996,0,0,0,0,0,0}},
- {1960, 1973, 280, 274, 1982, 2362, 5880, 5885, {5890, 5901, 5912, 5926, 5940, 5952, 5964}, {5976, 5980, 5985, 5990, 5995, 5999, 6004}, {1049, 6008, 6010, 6008, 6013, 6013, 1039}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, 2, 1, 763, 241, {1973,1336,6110,6122,1301,6136,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 55, 6145, 6148, {6151, 6160, 6168, 6177, 6188, 6197, 6206}, {4104, 4108, 2565, 6213, 6217, 6221, 6225}, {2752, 2471, 2463, 2463, 6229, 4134, 2090}, {6231, 6239, 6248, 6254, 6261, 6268, 6275, 6282, 6289, 6299, 6307, 6316, 0}, {6325, 6333, 4150, 6342, 6349, 6356, 6363, 4173, 6370, 6380, 1116, 6388, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, 2, 1, 239, 241, {243,3720,14,6421,1320,1301,0,0,0,0,0,0,0,0},{4748,6429,3732,0,0,0,0,0},{274,1377,2327,4983,0,0,0,0,0,0,0,0},{280,2343,6438,0,0,0,0,0,0}},
- {1422, 1814, 1394, 1377, 1453, 1469, 6447, 6454, {6461, 6471, 6481, 6491, 6501, 6511, 6521}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1814,1857,1843,1444,6582,6601,6618,1301,0,0,0,0,0,0},{1422,6639,6663,6690,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
- {6719, 1301, 1937, 1920, 6748, 6765, 6779, 6786, {6793, 6803, 6813, 6823, 6833, 6843, 6853}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1301,5871,1836,1796,0,0,0,0,0,0,0,0,0,0},{6719,6954,6978,7005,7027,7058,0,0},{1920,1928,1377,274,0,0,0,0,0,0,0,0},{1937,1948,1394,280,0,0,0,0,0}},
- {4748, 7084, 1394, 1377, 1982, 55, 946, 951, {7093, 7100, 7108, 7116, 7125, 7135, 7143}, {7152, 4401, 7155, 7158, 7161, 7164, 7167}, {7170, 2463, 2752, 3872, 2752, 4134, 7170}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {7084,2312,1327,14,1336,2883,1301,0,0,0,0,0,0,0},{4748,6429,3732,4974,0,0,0,0},{1377,274,2327,7212,7224,0,0,0,0,0,0,0},{1394,280,7236,7251,0,0,0,0,0}},
- {1960, 2647, 280, 274, 1982, 2362, 946, 951, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {7266, 7271, 7275, 7279, 7283, 7287, 7291}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 0, 0, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
- {3732, 1301, 280, 274, 1982, 4765, 3781, 3784, {7321, 7331, 7345, 7352, 7359, 7368, 2052}, {7376, 7383, 7388, 7392, 7397, 7402, 7406}, {2083, 2085, 3872, 7411, 7414, 2085, 2090}, {7416, 7425, 7430, 7437, 2500, 7447, 7456, 7463, 7473, 7483, 2169, 7496, 0}, {7506, 7515, 7522, 7528, 7537, 7542, 7550, 7556, 7565, 7575, 7589, 7599, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {7648, 243, 280, 274, 4034, 7676, 3781, 3784, {4049, 7689, 7703, 7716, 7729, 7742, 4096}, {4104, 7754, 7758, 7762, 7766, 7770, 4125}, {2752, 2090, 2465, 7774, 7774, 2090, 2090}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, 0, 0, 239, 241, {243,14,2987,1320,1327,2351,2312,7084,1336,2647,2883,2903,1973,1301},{7648,4258,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {2969, 243, 280, 274, 1982, 55, 7865, 7868, {7871, 7880, 4787, 7890, 7898, 7906, 7915}, {7921, 7924, 4401, 7928, 7931, 7935, 2080}, {2752, 6229, 2463, 2463, 6229, 4134, 2090}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, 2, 1, 239, 241, {243,14,1312,8038,1320,243,1301,0,0,0,0,0,0,0},{2969,3732,4974,0,0,0,0,0},{274,1377,8046,8058,8069,8077,8087,8096,2922,8102,8110,8115},{280,1394,8118,8133,2947,2933,8147,8160,2962}},
- {3732, 2647, 280, 274, 1982, 4765, 3781, 3784, {8172, 8182, 8187, 8194, 8203, 8207, 8214}, {8225, 8228, 8231, 2740, 8234, 8237, 8240}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, 0, 1, 763, 241, {2647,1973,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {814, 2647, 1394, 1377, 1982, 3773, 8356, 8376, {8402, 8425, 424, 8448, 8459, 8474, 8489}, {8504, 8509, 8514, 8519, 8524, 8529, 8534}, {8539, 8542, 8539, 8545, 8548, 8542, 8545}, {8551, 8564, 8579, 8588, 8601, 8608, 8617, 8626, 8639, 8656, 8671, 8684, 0}, {8699, 8712, 8727, 8738, 8751, 8758, 8767, 8776, 8791, 8808, 8823, 8836, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{814,289,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {8921, 8935, 1394, 1377, 44, 2362, 3781, 3784, {8945, 8954, 8966, 8973, 8981, 8991, 8997}, {9004, 9008, 9012, 9016, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {9042, 9052, 9061, 9069, 9077, 9085, 9092, 9099, 9107, 2169, 9113, 9121, 0}, {9130, 9140, 9149, 9157, 9165, 9173, 9180, 9187, 9196, 7589, 9202, 9212, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, 0, 1, 763, 241, {8935,9263,6110,9271,9283,9293,9303,1301,0,0,0,0,0,0},{8921,9315,9330,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 9350, 1394, 1377, 1982, 55, 9361, 9372, {9383, 9391, 9400, 9407, 9414, 9423, 2052}, {2059, 2062, 9430, 2069, 9433, 9437, 2080}, {2083, 2085, 9440, 2090, 9442, 2085, 2090}, {5711, 5719, 9445, 6032, 9451, 6085, 6090, 2514, 2521, 5790, 2539, 2548, 0}, {9456, 9465, 7522, 9475, 9483, 9489, 9495, 9501, 9509, 9519, 9528, 9537, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 9546, 241, {9350,1973,9549,2903,2647,1336,1301,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{1377,274,2327,0,0,0,0,0,0,0,0,0},{1394,280,2343,0,0,0,0,0,0}},
- {1301, 1301, 9558, 9569, 9577, 3773, 9585, 9588, {9591, 9598, 9607, 9616, 9628, 9636, 9645}, {9655, 9659, 3928, 9664, 9669, 9673, 9677}, {2752, 5695, 2463, 2463, 9681, 2085, 2090}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, 0, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0},{9569,274,0,0,0,0,0,0,0,0,0,0},{9558,280,0,0,0,0,0,0,0}},
- {9790, 1301, 280, 274, 1982, 9808, 9821, 9824, {9827, 9835, 9843, 2403, 2410, 2418, 9850}, {9858, 9863, 9868, 2446, 2450, 2454, 9872}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{9790,9885,0,0,0,0,0,0},{274,1377,9908,0,0,0,0,0,0,0,0,0},{280,1394,9918,0,0,0,0,0,0}},
- {3732, 2987, 1394, 1377, 1982, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {2987,1320,14,243,9931,9942,1301,0,0,0,0,0,0,0},{3732,9954,9970,0,0,0,0,0},{1377,274,3007,35,0,0,0,0,0,0,0,0},{1394,280,2996,23,0,0,0,0,0}},
- {10012, 2647, 280, 274, 1982, 55, 3781, 3784, {10030, 10036, 10046, 10052, 10063, 10073, 10078}, {10088, 10092, 10096, 10100, 10105, 10109, 10113}, {2085, 2085, 2090, 10117, 2085, 7414, 7414}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10012,5487,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {3991, 243, 2996, 3007, 44, 55, 10243, 10248, {10255, 10266, 10273, 10282, 10289, 10302, 10311}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {5487, 243, 1394, 1377, 1982, 55, 3781, 3784, {10440, 10447, 10453, 10460, 10465, 10471, 10477}, {10483, 10487, 10491, 10495, 10499, 10503, 10507}, {2463, 2090, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {10565, 2647, 1394, 1377, 10583, 4765, 10599, 10604, {10609, 10622, 10641, 10658, 10671, 10684, 10701}, {10714, 8509, 8514, 8519, 8524, 8529, 8534}, {10719, 8542, 8539, 8545, 8548, 8542, 8545}, {10722, 10735, 10746, 10763, 10778, 10793, 10808, 10821, 10836, 10853, 10868, 10885, 0}, {10900, 10911, 10924, 10939, 10952, 10965, 10978, 10989, 11002, 11017, 11030, 11049, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10565,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 2647, 1394, 1377, 1982, 4765, 11146, 11159, {11172, 11187, 11208, 11223, 11236, 11249, 11264}, {493, 498, 11277, 508, 11282, 518, 523}, {528, 531, 11287, 537, 540, 531, 537}, {11290, 11307, 11316, 11331, 11348, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11290, 11307, 11316, 11331, 593, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, 0, 0, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 1992, 11560, {11565, 11573, 11584, 11590, 11596, 11605, 2052}, {9004, 9008, 2450, 11611, 9020, 9025, 11615}, {9033, 9035, 1041, 1049, 9039, 9035, 1049}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {11653, 11672, 1394, 1377, 11682, 2362, 11698, 11703, {11708, 11719, 11730, 11741, 11752, 11763, 11769}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, 2, 1, 763, 241, {11672,2647,1336,1301,0,0,0,0,0,0,0,0,0,0},{11653,11861,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {11881, 5597, 1394, 1377, 5609, 2362, 11908, 11925, {11939, 11950, 11960, 11969, 11980, 11992, 12003}, {12013, 12016, 12019, 12022, 12025, 12028, 12031}, {2090, 2085, 2467, 2465, 7414, 2085, 2090}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,12146,1301,0,0,0,0,0,0,0,0,0,0,0},{11881,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {12156, 1825, 280, 274, 12178, 12193, 12205, 11560, {12211, 12223, 12235, 12247, 12261, 12276, 12289}, {12303, 12016, 12306, 12022, 12309, 12312, 12315}, {2090, 2085, 12319, 2465, 4419, 2085, 9442}, {12321, 12328, 12336, 12342, 12351, 12360, 12370, 12376, 12387, 12397, 12404, 12414, 0}, {12422, 12429, 12437, 12443, 12452, 12461, 12471, 12477, 12488, 12498, 12505, 12515, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, 2, 1, 763, 241, {1825,1301,0,0,0,0,0,0,0,0,0,0,0,0},{12156,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {3732, 1336, 1394, 1377, 1982, 3773, 12592, 12604, {12616, 12631, 12646, 12661, 12678, 12697, 12708}, {12719, 12726, 12733, 12740, 12747, 12754, 12761}, {0, 0, 0, 0, 0, 0, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 0, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {3744, 3956, 23, 35, 44, 3773, 12932, 12952, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {13061, 13064, 13067, 13070, 13073, 13076, 13079}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13210, 13225, 13106, 13115, 13238, 13131, 13245, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, 0, 6, 239, 241, {3956,3947,0,0,0,0,0,0,0,0,0,0,0,0},{3744,3977,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {5487, 243, 2996, 3007, 1982, 55, 13258, 13261, {13264, 13277, 13287, 13296, 13306, 13317, 13328}, {13340, 13343, 13348, 13353, 13358, 13363, 13368}, {13340, 13373, 13376, 13379, 13382, 13385, 13388}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, 0, 1, 239, 241, {243,14,1327,2351,1301,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {13628, 2647, 1394, 1377, 44, 4765, 13641, 13649, {13657, 13670, 13691, 13710, 13731, 13750, 13763}, {13774, 13781, 13788, 13795, 13802, 13809, 13816}, {0, 0, 0, 0, 0, 0, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, 0, 1, 763, 241, {2647,1336,14083,243,14093,3720,1301,0,0,0,0,0,0,0},{13628,2969,14104,5487,14123,14134,14146,14163},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {14181, 14187, 14201, 14224, 14238, 14254, 14261}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 0, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {14399, 1814, 1394, 274, 14426, 3773, 3781, 3784, {14442, 14450, 14461, 14471, 14482, 14491, 14500}, {14510, 14513, 14516, 14519, 14522, 14525, 14528}, {14531, 2463, 12319, 2471, 12319, 2467, 14531}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, 2, 1, 239, 241, {1814,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14399,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
- {14104, 2647, 280, 274, 1982, 55, 14666, 14687, {14704, 403, 424, 8448, 14717, 14734, 14745}, {14758, 14766, 14774, 14780, 14788, 14796, 14804}, {528, 531, 534, 537, 540, 531, 537}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 0, 0, {14904, 14911, 14922, 14931, 14940, 14947, 14958}, {14968, 14972, 14976, 14980, 14984, 14987, 14991}, {0, 0, 0, 0, 0, 0, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 0, 0, {15160, 15165, 15171, 15181, 15193, 15201, 15212}, {15221, 15225, 15229, 15233, 15237, 15241, 15245}, {0, 0, 0, 0, 0, 0, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 3781, 3784, {15351, 15357, 15368, 15181, 15378, 15201, 15212}, {15387, 15391, 15395, 15233, 15237, 15241, 15245}, {2090, 2463, 15399, 2465, 2090, 5695, 2463}, {15401, 15411, 15422, 15429, 15438, 15444, 15450, 15458, 15466, 15477, 15487, 15496, 0}, {15505, 15259, 15514, 15520, 15283, 2785, 15288, 15295, 15527, 15311, 15319, 15327, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 15541, 15545, {15549, 15556, 15564, 15572, 15581, 15591, 15598}, {2731, 8231, 2737, 15607, 2743, 15610, 2749}, {2090, 2463, 2752, 3872, 2752, 4134, 2090}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {1814,1857,1301,15659,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {15671, 2647, 1394, 1377, 1982, 15703, 15709, 15725, {15747, 15763, 15788, 15816, 15844, 15872, 15900}, {15919, 15929, 15939, 15949, 15959, 15969, 15979}, {15989, 15993, 15997, 15993, 16001, 16005, 16009}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{15671,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 2351, 280, 274, 1982, 2362, 16403, 16408, {5890, 16413, 16424, 16434, 16444, 16454, 16468}, {5976, 5980, 16480, 16485, 16489, 16494, 16499}, {2090, 2463, 2465, 2463, 5695, 2469, 2471}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{274,4983,0,0,0,0,0,0,0,0,0,0},{280,6438,0,0,0,0,0,0,0}},
- {5487, 2351, 280, 274, 44, 55, 16503, 16531, {16553, 16572, 16591, 16613, 16632, 16666, 16691}, {16710, 16721, 16732, 16746, 16757, 16768, 16785}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {17040, 243, 280, 274, 1982, 17065, 17079, 17082, {17085, 17094, 17103, 17113, 17123, 17133, 17145}, {17153, 17158, 17162, 17166, 17170, 17175, 17180}, {17184, 2465, 2465, 9681, 17184, 17187, 2090}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, 0, 0, 239, 241, {243,1301,17306,7084,2987,0,0,0,0,0,0,0,0,0},{17040,17315,9942,0,0,0,0,0},{274,3007,1377,35,0,0,0,0,0,0,0,0},{280,2996,1394,23,0,0,0,0,0}},
- {17334, 2647, 280, 274, 1982, 17352, 17366, 17371, {17376, 17388, 17399, 17413, 17425, 17435, 17445}, {17456, 17461, 17466, 17471, 17476, 17481, 17486}, {2090, 4134, 2463, 6229, 2752, 15399, 2471}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,0,0,0,0,0,0,0,0,0,0},{17334,0,0,0,0,0,0,0},{274,1377,4983,0,0,0,0,0,0,0,0,0},{280,1394,6438,0,0,0,0,0,0}},
- {3732, 243, 280, 274, 1982, 55, 946, 951, {17719, 17733, 17743, 17754, 17768, 17779, 17790}, {17803, 17808, 17813, 17820, 17826, 17832, 17838}, {2752, 2471, 2463, 7414, 2752, 12319, 2090}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, 2, 1, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{3732,5487,9942,9931,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {5487, 243, 1394, 1377, 1982, 55, 18012, 18015, {18019, 18024, 10453, 10460, 18030, 18037, 10477}, {18044, 18048, 10491, 10495, 18052, 10503, 10507}, {12319, 14531, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {18080, 2647, 1394, 1377, 1982, 4765, 0, 0, {18098, 18113, 18130, 18147, 18162, 18179, 18188}, {18199, 18205, 18211, 18217, 18223, 18229, 18235}, {6555, 0, 0, 6561, 6563, 6565, 6567}, {18241, 18254, 18265, 18278, 18289, 18300, 18313, 18324, 18335, 18352, 18363, 18376, 0}, {18241, 18395, 18265, 18278, 18289, 18300, 18313, 18324, 18335, 18352, 18363, 18376, 0}, {18406, 18414, 18422, 18430, 18438, 18446, 18454, 18462, 18470, 18478, 18486, 18494, 0}, {18406, 18414, 18422, 18430, 18438, 18446, 18454, 18462, 18470, 18478, 18486, 18494, 0}, 0, 0, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18080,18504,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {18523, 1336, 1394, 1377, 18543, 4765, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{18523,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 18559, 18567, {18575, 18584, 18593, 18601, 18610, 18619, 18626}, {18635, 18638, 18641, 18644, 18647, 18651, 18654}, {6557, 6559, 6561, 6563, 12319, 14531, 6555}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {18696, 18714, 280, 274, 1982, 18725, 0, 0, {18732, 18747, 18762, 18777, 18794, 18811, 18820}, {18831, 18838, 18845, 18852, 18859, 18866, 18873}, {18880, 18883, 8545, 8548, 8542, 18886, 18889}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 0, 239, 241, {18714,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18696,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {5487, 1327, 6438, 4983, 44, 55, 18892, 18920, {18942, 18961, 18980, 19005, 19024, 19058, 19083}, {19102, 19112, 19122, 19138, 19148, 19173, 19189}, {19199, 19203, 19210, 19214, 19221, 19228, 19235}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 1, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
- {10012, 1327, 1948, 1928, 44, 55, 19525, 19557, {19589, 19605, 19624, 19646, 19665, 19684, 19712}, {19740, 19748, 19759, 19773, 19784, 19795, 19812}, {19826, 19830, 19837, 19844, 19854, 19861, 19874}, {19881, 19897, 19916, 19929, 19948, 19955, 19965, 19981, 19994, 20010, 20029, 20045, 0}, {19881, 19897, 19916, 19929, 19948, 19955, 19965, 19981, 19994, 20010, 20029, 20045, 0}, {6555, 6557, 6559, 6561, 19948, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 19948, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{10012,3732,0,0,0,0,0,0},{1928,1920,1377,274,0,0,0,0,0,0,0,0},{1948,1937,1394,280,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 20061, 20102, {20143, 20162, 20181, 20203, 20222, 20244, 20269}, {20288, 20298, 20308, 20321, 20331, 20344, 20360}, {20370, 20374, 20381, 20388, 20395, 20402, 20409}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 7865, 20743, {20746, 20765, 20784, 20809, 20828, 20850, 20875}, {20894, 20904, 20914, 20930, 20940, 20953, 20969}, {20979, 20983, 20990, 20994, 21001, 21008, 21015}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 2351, 280, 274, 1982, 55, 21262, 21287, {21312, 21331, 21353, 21378, 21394, 21416, 21435}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21603, 21622, 21653, 21678, 21700, 0}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21725, 21622, 21653, 21678, 21700, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 21843, 21874, {21899, 21921, 21943, 21968, 21990, 22015, 22043}, {22065, 22075, 22085, 22098, 22108, 22121, 22137}, {22147, 22151, 22158, 22162, 22169, 22176, 22183}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 3781, 3784, {22460, 22479, 22498, 22520, 22539, 22561, 22586}, {22605, 22610, 22618, 22626, 22634, 22642, 22650}, {22661, 22665, 22672, 22679, 22686, 22693, 22700}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 6438, 4983, 44, 55, 22938, 22957, {22988, 23013, 23044, 23072, 23097, 23125, 23159}, {23184, 23203, 23228, 23244, 23263, 23282, 23301}, {23311, 23318, 23325, 23332, 23339, 23352, 23359}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
- {23774, 2351, 1937, 1920, 23793, 55, 23801, 23829, {23851, 23870, 23889, 23914, 23933, 23967, 23992}, {24011, 19112, 19122, 19138, 24021, 24046, 19189}, {0, 0, 0, 0, 0, 0, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, 0, 0, 2601, 241, {2351,0,0,0,0,0,0,0,0,0,0,0,0,0},{23774,0,0,0,0,0,0,0},{1920,1928,0,0,0,0,0,0,0,0,0,0},{1937,1948,0,0,0,0,0,0,0}},
- {5487, 2351, 280, 274, 44, 55, 3781, 3784, {16553, 16572, 24363, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {24812, 24833, 1394, 1377, 24842, 4765, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 763, 241, {24833,1301,0,0,0,0,0,0,0,0,0,0,0,0},{24812,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {25177, 1444, 280, 274, 25220, 25227, 25253, 25275, {25300, 25328, 25356, 25393, 25424, 25458, 25483}, {25517, 25533, 25549, 25574, 25593, 25615, 25634}, {25656, 25663, 25670, 25677, 25684, 25691, 25695}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,0,0,0,0,0},{25177,26320,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {5487, 243, 280, 274, 1982, 55, 0, 0, {26368, 26377, 26387, 26399, 26412, 26421, 26433}, {26445, 26449, 26454, 26458, 26462, 26466, 26470}, {2090, 2471, 2463, 2463, 14531, 6229, 2090}, {26474, 26481, 26490, 26497, 2781, 26504, 26512, 26523, 26528, 26533, 26540, 26549, 0}, {26474, 26481, 26490, 26497, 2781, 26504, 26557, 26523, 26528, 26533, 26540, 26549, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
- {3732, 1301, 280, 26602, 26610, 26645, 26681, 26697, {26713, 26747, 26778, 26809, 26831, 26874, 26902}, {26927, 26934, 26938, 26942, 26949, 26959, 26966}, {0, 0, 0, 0, 0, 0, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, 0, 0, 2601, 241, {1301,0,0,0,0,0,0,0,0,0,0,0,0,0},{3732,9954,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {5487, 243, 280, 26602, 1982, 55, 27216, 27241, {27266, 27291, 27310, 27338, 27357, 27382, 27401}, {27423, 27431, 27436, 27441, 27446, 27454, 27462}, {0, 0, 0, 0, 0, 0, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {4005, 243, 1394, 1377, 4034, 55, 946, 951, {27783, 27791, 27796, 27803, 27813, 27819, 27826}, {27834, 27838, 3928, 27842, 27847, 27851, 27855}, {2752, 2471, 2463, 2463, 4130, 4134, 2090}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, 2, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,35,1382,0,0,0,0,0,0,0,0},{1394,280,23,1402,0,0,0,0,0}},
- {5487, 2351, 280, 274, 44, 55, 27956, 27968, {27980, 16572, 28008, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {0, 0, 0, 0, 0, 0, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {28093, 1301, 2996, 3007, 28141, 3773, 28151, 28163, {28172, 28188, 28204, 28232, 28248, 28291, 28316}, {28344, 28354, 28364, 28371, 28381, 28397, 28410}, {28420, 28424, 28428, 28432, 28436, 28449, 28456}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, 0, 1, 2601, 241, {1301,1814,1857,243,14,0,0,0,0,0,0,0,0,0},{28093,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {28816, 2987, 2996, 3007, 1982, 28848, 28862, 28872, {28885, 28895, 28902, 28915, 28925, 28935, 28945}, {28885, 28895, 28955, 28915, 28925, 28935, 28945}, {28965, 28969, 28973, 28977, 28981, 28985, 28989}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, 0, 0, 239, 241, {2987,1301,0,0,0,0,0,0,0,0,0,0,0,0},{28816,0,0,0,0,0,0,0},{3007,0,0,0,0,0,0,0,0,0,0,0},{2996,0,0,0,0,0,0,0,0}},
- {3991, 2351, 1394, 1377, 44, 55, 29235, 29245, {29258, 29265, 29271, 29278, 29284, 29290, 29298}, {29308, 29312, 29316, 29320, 29324, 29328, 29332}, {12319, 12319, 12319, 12319, 12319, 12319, 12319}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, 0, 0, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,29470,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 29476, 3773, 29486, 29527, {29568, 29587, 29606, 29631, 29650, 29672, 29697}, {29716, 24417, 29726, 24440, 29742, 24463, 24479}, {29755, 29759, 29763, 29767, 29771, 29775, 29779}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {243, 14, 2996, 3007, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,30168,0,0,0,0},{3007,1377,0,0,0,0,0,0,0,0,0,0},{2996,1394,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {30186, 30193, 27796, 30199, 30210, 30218, 30227}, {30234, 27838, 3928, 30238, 30242, 30246, 10507}, {2471, 2471, 2463, 2463, 5695, 15399, 2090}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {3744, 2987, 2996, 3007, 44, 3773, 0, 0, {30345, 30352, 30360, 30367, 30374, 30382, 30390}, {30397, 30400, 30403, 30406, 30409, 30412, 30415}, {2471, 2471, 2465, 2471, 12319, 4132, 12319}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {3744, 2987, 2996, 3007, 44, 3773, 30512, 30523, {30533, 30551, 30566, 30588, 30601, 30615, 30632}, {30656, 30664, 30669, 30588, 30601, 30681, 30688}, {0, 0, 0, 0, 0, 0, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 0, 0, {31018, 31026, 14922, 14931, 14940, 31037, 31047}, {15387, 14972, 14976, 14980, 14984, 15241, 31056}, {0, 0, 0, 0, 0, 0, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {1960, 2351, 280, 274, 1982, 2362, 31154, 31159, {31164, 31171, 31186, 31200, 31216, 31231, 31247}, {6225, 31262, 2565, 31266, 31270, 31274, 31278}, {2090, 12319, 2463, 2085, 2090, 2465, 12319}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 0, 0, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {3744, 2987, 2996, 3007, 44, 3773, 31351, 31356, {31361, 31377, 31385, 31393, 31402, 31414, 31424}, {31434, 31440, 31446, 31450, 31454, 31462, 3868}, {0, 0, 0, 0, 0, 0, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {31576, 1444, 1394, 1920, 31600, 31617, 31631, 31638, {31645, 31655, 31665, 31675, 31685, 31695, 31705}, {31715, 31722, 31729, 31736, 31743, 31750, 31757}, {31764, 31768, 31772, 31776, 31780, 31784, 31788}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,0,0,0,0,0,0,0,0},{31576,31882,31912,0,0,0,0,0},{1920,1377,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 4765, 0, 0, {26445, 27838, 31942, 31949, 31959, 31964, 31971}, {31978, 4108, 31982, 4839, 31987, 31992, 31997}, {4398, 32002, 32005, 32008, 32011, 32014, 32017}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {32124, 243, 280, 274, 1982, 4765, 0, 0, {32152, 32160, 32167, 32175, 32185, 32193, 1007}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{32124,0,0,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 4765, 32251, 32256, {32261, 32269, 32279, 32289, 32298, 32308, 32316}, {32326, 32330, 32335, 32339, 32343, 32347, 32351}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 32355, 32364, 32375, 32384, 32394, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 32355, 32364, 32375, 32384, 32394, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 0, 0, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {32404, 32422, 1394, 1377, 32433, 3773, 32449, 32454, {32459, 32484, 32513, 32538, 32551, 32566, 32583}, {32598, 32603, 32608, 32613, 32618, 32623, 8534}, {32628, 32628, 32631, 8545, 8548, 32628, 8545}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, 0, 1, 763, 241, {32422,32988,2903,3947,32997,0,0,0,0,0,0,0,0,0},{32404,33008,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 0, 0, {33027, 33039, 33050, 33062, 33074, 33084, 33096}, {33111, 33116, 33121, 33126, 33131, 33136, 33141}, {0, 0, 0, 0, 0, 0, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {5487, 243, 280, 274, 1982, 55, 6008, 6013, {33302, 33315, 33323, 33332, 33342, 33352, 33361}, {33373, 33377, 33381, 33385, 33389, 33393, 33397}, {2752, 2471, 2463, 7414, 12319, 5695, 2090}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
+ {289, 308, 323, 331, 336, 352, 359, 371, {383, 396, 417, 432, 443, 462, 473}, {486, 491, 496, 501, 506, 511, 516}, {521, 524, 527, 530, 533, 524, 530}, {536, 549, 566, 575, 586, 593, 600, 607, 620, 639, 656, 671, 0}, {536, 549, 566, 575, 586, 593, 600, 607, 620, 639, 656, 671, 0}, {688, 694, 566, 704, 586, 593, 600, 712, 720, 730, 738, 748, 0}, {688, 694, 566, 704, 586, 593, 600, 712, 720, 730, 738, 748, 0}, 2, 1, 756, 241, {308,758,774,790,0,0,0,0,0,0,0,0,0,0},{289,807,825,850,0,0,0,0},{874,886,0,0,0,0,0,0,0,0,0,0},{897,912,0,0,0,0,0,0,0}},
+ {926, 243, 323, 331, 949, 352, 964, 969, {974, 983, 991, 999, 1008, 1015, 1025}, {1034, 1037, 1040, 1043, 1046, 1049, 1052}, {1055, 1057, 1059, 1061, 1063, 1065, 1067}, {1069, 1075, 1082, 1088, 1094, 1099, 1104, 1111, 1117, 1126, 1134, 1143, 0}, {1152, 1161, 1171, 1180, 1190, 1198, 1206, 1216, 1226, 1238, 1250, 1262, 0}, {1274, 1279, 1082, 1285, 1094, 1099, 1290, 1295, 1299, 1304, 1309, 1314, 0}, {1274, 1279, 1082, 1285, 1094, 1099, 1290, 1295, 1299, 1304, 1309, 1314, 0}, 2, 1, 239, 241, {243,14,1319,1330,1338,1345,1354,0,0,0,0,0,0,0},{1363,1389,1405,0,0,0,0,0},{274,331,1421,0,0,0,0,0,0,0,0,0},{280,323,1433,0,0,0,0,0,0}},
+ {1453, 1475, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {1597, 1604, 1611, 1618, 1625, 1632, 1639}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, 0, 0, 239, 241, {1475,1827,1836,1319,1845,1856,1867,1874,1881,1888,0,0,0,0},{1453,1897,1924,0,0,0,0,0},{331,274,1951,1959,0,0,0,0,0,0,0,0},{323,280,1968,1979,0,0,0,0,0}},
+ {1453, 1475, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {1597, 1604, 1611, 1618, 1625, 1632, 1639}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, 0, 0, 239, 241, {1475,1827,1836,1319,1845,1856,1867,1874,1881,1888,0,0,0,0},{1453,1897,1924,0,0,0,0,0},{331,274,1951,1959,0,0,0,0,0,0,0,0},{323,280,1968,1979,0,0,0,0,0}},
+ {1991, 2004, 323, 331, 2015, 2025, 2033, 2038, {2043, 2051, 2061, 2069, 2077, 2086, 2093}, {2100, 2103, 2106, 2110, 2113, 2117, 2121}, {2124, 2126, 2128, 2131, 2133, 2126, 2131}, {2136, 2142, 2148, 2156, 2162, 2170, 2178, 2188, 2194, 2202, 2210, 2219, 0}, {2228, 2234, 2241, 2249, 2255, 2263, 2271, 2281, 2194, 2287, 2295, 2305, 0}, {2314, 2317, 2320, 2323, 2326, 2329, 2332, 2335, 2338, 2341, 2345, 2349, 0}, {2314, 2317, 2320, 2323, 2326, 2329, 2332, 2335, 2338, 2341, 2345, 2349, 0}, 2, 1, 2353, 241, {2356,2365,1319,1827,1867,0,0,0,0,0,0,0,0,0},{1991,0,0,0,0,0,0,0},{331,274,2372,2380,0,0,0,0,0,0,0,0},{323,280,2385,2396,0,0,0,0,0}},
+ {1991, 2404, 280, 274, 2015, 2025, 2415, 2420, {2425, 2433, 2440, 2448, 2455, 2463, 2470}, {2478, 2483, 2487, 2491, 2495, 2499, 2503}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {2518, 2525, 2533, 2539, 2545, 2549, 2554, 2559, 2566, 2576, 2584, 2593, 0}, {2518, 2525, 2533, 2539, 2545, 2549, 2554, 2559, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 2646, 241, {2404,1345,1319,2648,0,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {2673, 2692, 280, 274, 2015, 2025, 2703, 2709, {2716, 2724, 2731, 2740, 2749, 2760, 2768}, {2776, 2779, 2782, 2785, 2788, 2791, 2794}, {2131, 2508, 2797, 2508, 2797, 2514, 2131}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, 2, 1, 756, 241, {2692,2928,1354,2940,2948,2356,1319,0,0,0,0,0,0,0},{2673,1991,2955,0,0,0,0,0},{274,331,2380,2967,0,0,0,0,0,0,0,0},{280,2978,2992,3007,0,0,0,0,0}},
+ {3014, 3032, 3041, 3052, 2015, 352, 3060, 3067, {3074, 3089, 3104, 3115, 3130, 3143, 3162}, {3177, 3184, 3191, 3198, 3205, 3212, 3219}, {3226, 3229, 3232, 3232, 3235, 3235, 3238}, {3241, 3262, 3285, 3300, 3317, 3328, 3343, 3358, 3377, 3400, 3419, 3438, 0}, {3459, 3480, 3503, 3518, 3535, 3546, 3561, 3576, 3595, 3618, 3637, 3656, 0}, {3677, 3684, 3691, 3698, 3705, 3712, 3721, 3730, 3737, 3744, 3751, 3758, 0}, {3677, 3684, 3691, 3698, 3705, 3712, 3721, 3730, 3737, 3744, 3751, 3758, 0}, 2, 1, 239, 241, {3032,243,1338,14,3765,1319,0,0,0,0,0,0,0,0},{3014,3777,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {3789, 3808, 3041, 3052, 2015, 3817, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {4068, 243, 323, 331, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 4189, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 1, 239, 241, {243,14,1330,1338,1345,1354,1319,2928,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{331,274,1421,0,0,0,0,0,0,0,0,0},{323,280,1433,0,0,0,0,0,0}},
+ {1991, 2356, 323, 331, 2015, 4368, 4378, 4382, {4386, 4398, 4410, 4420, 4434, 4444, 4456}, {4467, 4470, 4473, 4476, 4479, 4482, 4485}, {2131, 2508, 2510, 4488, 2510, 2126, 2516}, {4490, 4499, 4508, 4518, 4527, 4536, 4545, 4555, 4562, 4570, 4578, 4588, 0}, {4597, 4608, 4619, 4631, 4642, 4653, 4664, 4676, 4685, 4695, 4705, 4717, 0}, {4728, 4734, 4740, 4747, 4753, 4759, 4765, 4772, 4776, 4781, 4786, 4793, 0}, {4728, 4734, 4740, 4747, 4753, 4759, 4765, 4772, 4776, 4781, 4786, 4793, 0}, 2, 1, 756, 241, {2356,2692,2948,1319,0,0,0,0,0,0,0,0,0,0},{4799,4816,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 352, 3824, 3827, {4851, 4860, 4866, 4872, 4881, 4887, 4896}, {4903, 4908, 4913, 4918, 4923, 4928, 4933}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, 0, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{4834,5053,3777,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {5086, 243, 280, 274, 2015, 55, 5104, 5117, {5128, 5146, 5160, 5178, 5196, 5214, 5230}, {5244, 5256, 5268, 5280, 5292, 5304, 5316}, {5323, 5326, 5329, 5332, 5335, 5338, 5341}, {5344, 5355, 5368, 5375, 5386, 5393, 5402, 5411, 5424, 5437, 5452, 5465, 0}, {5344, 5355, 5368, 5375, 5386, 5393, 5402, 5411, 5424, 5437, 5452, 5465, 0}, {5476, 5485, 5368, 5494, 5386, 5503, 5512, 5521, 5530, 5539, 5548, 5557, 0}, {5476, 5485, 5368, 5494, 5386, 5503, 5512, 5521, 5530, 5539, 5548, 5557, 0}, 0, 0, 239, 241, {243,5566,14,1,1345,2404,5579,1319,5592,5609,0,0,0,0},{5086,5566,5619,5641,5592,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}},
+ {5662, 5676, 323, 331, 5688, 5699, 5707, 5711, {5715, 5725, 5733, 5738, 5745, 5758, 5766}, {4193, 5774, 4488, 5776, 5780, 2126, 5783}, {4193, 5774, 4488, 5787, 5780, 2126, 5787}, {5790, 5798, 5807, 5816, 5825, 5832, 5840, 5848, 5858, 5869, 2584, 2593, 0}, {5790, 5798, 5807, 5816, 5825, 5832, 5840, 5848, 5858, 5869, 2584, 2593, 0}, {5878, 1279, 5883, 5890, 5896, 5902, 5908, 5914, 5919, 5926, 1309, 5931, 0}, {5878, 1279, 5883, 5890, 5896, 5902, 5908, 5914, 5919, 5926, 1309, 5931, 0}, 0, 1, 756, 241, {5676,5936,1319,5950,0,0,0,0,0,0,0,0,0,0},{5662,0,0,0,0,0,0,0},{331,274,3052,0,0,0,0,0,0,0,0,0},{323,280,3041,0,0,0,0,0,0}},
+ {1991, 2356, 280, 274, 2015, 2025, 5959, 5964, {5969, 5980, 5991, 6005, 6019, 6031, 6043}, {6055, 6059, 6064, 6069, 6074, 6078, 6083}, {1067, 6087, 6089, 6087, 6092, 6092, 1057}, {6094, 6102, 4955, 6111, 6118, 6123, 6130, 6137, 2566, 5869, 6145, 6155, 0}, {6094, 6102, 4955, 6111, 6118, 6123, 6130, 6137, 2566, 5869, 6145, 6155, 0}, {2602, 2606, 2610, 2614, 6118, 6164, 6169, 6174, 2630, 2634, 6180, 6185, 0}, {2602, 2606, 2610, 2614, 6118, 6164, 6169, 6174, 2630, 2634, 6180, 6185, 0}, 2, 1, 756, 241, {2356,1354,6189,6201,1319,6215,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 352, 6224, 6227, {6230, 6239, 6247, 6256, 6267, 6276, 6285}, {4163, 4167, 2610, 6292, 6296, 6300, 6304}, {2797, 2516, 2508, 2508, 6308, 4193, 2131}, {6310, 6318, 6327, 6333, 6340, 6347, 6354, 6361, 6368, 6378, 6386, 6395, 0}, {6404, 6412, 4209, 6421, 6428, 6435, 6442, 4232, 6449, 6459, 1134, 6467, 0}, {6476, 2606, 2610, 2614, 6480, 6484, 6488, 4278, 6492, 6496, 2638, 4286, 0}, {6476, 2606, 2610, 2614, 6480, 6484, 6488, 4278, 6492, 6496, 2638, 4286, 0}, 2, 1, 239, 241, {243,3765,14,6500,1338,1319,0,0,0,0,0,0,0,0},{4834,6508,3777,0,0,0,0,0},{274,331,2380,5062,0,0,0,0,0,0,0,0},{280,2396,6517,0,0,0,0,0,0}},
+ {1453, 1845, 323, 331, 1484, 1500, 6526, 6533, {6540, 6550, 6560, 6570, 6580, 6590, 6600}, {1646, 6610, 6614, 6618, 6622, 6626, 6630}, {1646, 6610, 6614, 6618, 6622, 6626, 6630}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {1845,1888,1874,1475,6661,6680,6697,1319,0,0,0,0,0,0},{1453,6718,6742,6769,0,0,0,0},{331,274,1951,1959,0,0,0,0,0,0,0,0},{323,280,1968,1979,0,0,0,0,0}},
+ {6798, 1319, 1968, 1951, 6827, 6844, 6858, 6865, {6872, 6882, 6892, 6902, 6912, 6922, 6932}, {6942, 6946, 6950, 6954, 6958, 6962, 6966}, {6942, 6946, 6950, 6954, 6958, 6962, 6966}, {6970, 6975, 6980, 6985, 6990, 6995, 7000, 7005, 7010, 7015, 7021, 7027, 0}, {6970, 6975, 6980, 6985, 6990, 6995, 7000, 7005, 7010, 7015, 7021, 7027, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1319,5950,1867,1827,0,0,0,0,0,0,0,0,0,0},{6798,7033,7057,7084,7106,7137,0,0},{1951,1959,331,274,0,0,0,0,0,0,0,0},{1968,1979,323,280,0,0,0,0,0}},
+ {4834, 7163, 280, 274, 2015, 352, 964, 969, {7172, 7179, 7187, 7195, 7204, 7214, 7222}, {7231, 4470, 7234, 7237, 7240, 7243, 7246}, {7249, 2508, 2797, 3915, 2797, 4193, 7249}, {7251, 7259, 7268, 2539, 7274, 2549, 2554, 7278, 2566, 2576, 2584, 2593, 0}, {7251, 7259, 7268, 2539, 7274, 2549, 2554, 7278, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 7287, 2614, 7274, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 7287, 2614, 7274, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 2646, 241, {7163,2365,1345,14,1354,2928,1319,0,0,0,0,0,0,0},{4834,6508,3777,5053,0,0,0,0},{331,274,2380,7291,7303,0,0,0,0,0,0,0},{323,280,7315,7330,0,0,0,0,0}},
+ {1991, 2692, 280, 274, 2015, 2025, 964, 969, {2425, 2433, 2440, 2448, 2455, 2463, 2470}, {7345, 7350, 7354, 7358, 7362, 7366, 7370}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, 0, 0, 756, 241, {2692,1354,2948,1319,2928,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,7375,5062,0,0,0,0,0,0,0,0},{280,323,7386,6517,0,0,0,0,0}},
+ {3777, 1319, 280, 274, 2015, 352, 3824, 3827, {7400, 7410, 7424, 7431, 7438, 7447, 2093}, {7455, 7462, 7467, 7471, 7476, 7481, 7485}, {2124, 2126, 3915, 7490, 7493, 2126, 2131}, {7495, 7504, 7509, 7516, 2545, 7526, 7535, 7542, 7552, 7562, 2210, 7575, 0}, {7585, 7594, 7601, 7607, 7616, 7621, 7629, 7635, 7644, 7654, 7668, 7678, 0}, {7686, 7690, 2610, 7694, 2545, 7698, 7702, 7706, 7710, 7714, 7719, 7723, 0}, {7686, 7690, 2610, 7694, 2545, 7698, 7702, 7706, 7710, 7714, 7719, 7723, 0}, 2, 1, 2646, 241, {1319,5950,0,0,0,0,0,0,0,0,0,0,0,0},{3777,5566,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4068, 243, 280, 274, 949, 4096, 3824, 3827, {4108, 7727, 7741, 7754, 7767, 7780, 4155}, {4163, 7792, 7796, 7800, 7804, 7808, 4184}, {2797, 2131, 2510, 7812, 7812, 2131, 2131}, {7814, 7822, 7832, 1088, 7839, 7844, 7850, 4232, 7856, 7865, 7873, 7882, 0}, {7814, 7822, 7832, 1088, 7839, 7844, 7850, 4232, 7856, 7865, 7873, 7882, 0}, {2602, 7891, 2610, 4274, 4966, 2618, 2622, 4278, 6492, 7895, 2638, 7899, 0}, {2602, 7891, 2610, 4274, 4966, 2618, 2622, 4278, 6492, 7895, 2638, 7899, 0}, 0, 0, 239, 241, {243,14,3032,1338,1345,2404,2365,7163,1354,2692,2928,2948,2356,1319},{4068,4346,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {7903, 2404, 280, 274, 2015, 352, 7932, 7935, {7938, 7947, 4866, 7957, 7965, 7973, 7982}, {7988, 7991, 4470, 7995, 7998, 8002, 2121}, {2797, 6308, 2508, 2508, 6308, 4193, 2131}, {8005, 8013, 4955, 8020, 8027, 8032, 8042, 8050, 8056, 8066, 2584, 2593, 0}, {8005, 8013, 4955, 8020, 8027, 8032, 8042, 8050, 8056, 8066, 2584, 2593, 0}, {8074, 8081, 4955, 5030, 8027, 8087, 8094, 8050, 8099, 1304, 1309, 5931, 0}, {8074, 8081, 4955, 5030, 8027, 8087, 8094, 8050, 8099, 1304, 1309, 5931, 0}, 2, 1, 2646, 241, {243,14,1330,8105,1338,243,1319,0,0,0,0,0,0,0},{3014,3777,5053,0,0,0,0,0},{274,331,8113,8125,8136,8144,8154,8163,2967,8169,8177,8182},{280,323,8185,8200,2992,2978,8214,8227,3007}},
+ {3777, 2692, 323, 331, 2015, 352, 3824, 3827, {8239, 8249, 8254, 8261, 8270, 8274, 8281}, {8292, 8295, 8298, 2785, 8301, 8304, 8307}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {8311, 8320, 8330, 8337, 4966, 8345, 8351, 2559, 8357, 8368, 8378, 8388, 0}, {8311, 8320, 8330, 8337, 4966, 8345, 8351, 2559, 8357, 8368, 8378, 8388, 0}, {8398, 8403, 4913, 8408, 4966, 8413, 8418, 5914, 5041, 1304, 1309, 5931, 0}, {8398, 8403, 4913, 8408, 4966, 8413, 8418, 5914, 5041, 1304, 1309, 5931, 0}, 0, 1, 756, 241, {2692,2356,1319,0,0,0,0,0,0,0,0,0,0,0},{3777,0,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {807, 2692, 323, 331, 2015, 352, 8423, 8443, {8469, 8492, 417, 8515, 8526, 8541, 8556}, {8571, 8576, 8581, 8586, 8591, 8596, 8601}, {8606, 8609, 8606, 8612, 8615, 8609, 8612}, {8618, 8631, 8646, 8655, 8668, 8675, 8684, 8693, 8706, 8723, 8738, 8751, 0}, {8766, 8779, 8794, 8805, 8818, 8825, 8834, 8843, 8858, 8875, 8890, 8903, 0}, {8918, 8926, 8646, 8936, 8668, 8675, 8684, 8944, 8952, 8962, 8970, 8980, 0}, {8918, 8926, 8646, 8936, 8668, 8675, 8684, 8944, 8952, 8962, 8970, 8980, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{807,289,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 44, 2025, 3824, 3827, {9012, 9021, 9033, 9040, 9048, 9058, 9064}, {9071, 9075, 9079, 9083, 9087, 9092, 9096}, {9100, 9102, 9104, 1067, 9106, 9102, 1067}, {9109, 9119, 9128, 9136, 9144, 9152, 9159, 9166, 9174, 2210, 9180, 9188, 0}, {9197, 9207, 9216, 9224, 9232, 9240, 9247, 9254, 9263, 7668, 9269, 9279, 0}, {9288, 9292, 9297, 9302, 9306, 7702, 9310, 9314, 9318, 7719, 9322, 9326, 0}, {9288, 9292, 9297, 9302, 9306, 7702, 9310, 9314, 9318, 7719, 9322, 9326, 0}, 0, 1, 756, 241, {9002,9330,6189,9338,9350,9360,9370,1319,0,0,0,0,0,0},{8988,9382,9397,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2356, 323, 331, 2015, 2025, 9417, 9428, {9439, 9447, 9456, 9463, 9470, 9479, 2093}, {2100, 2103, 9486, 2110, 9489, 9493, 2121}, {2124, 2126, 9496, 2131, 9498, 2126, 2131}, {5790, 5798, 9501, 6111, 9507, 6164, 6169, 2559, 2566, 5869, 2584, 2593, 0}, {9512, 9521, 7601, 9531, 9539, 9545, 9551, 9557, 9565, 9575, 9584, 9593, 0}, {2602, 2606, 2610, 2614, 9507, 6164, 6169, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 9507, 6164, 6169, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 756, 241, {2004,2356,9602,2948,2692,1354,1319,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{331,274,2380,0,0,0,0,0,0,0,0,0},{323,280,2396,0,0,0,0,0,0}},
+ {3014, 2356, 280, 274, 2015, 352, 9611, 9614, {9617, 9624, 9633, 9642, 9654, 9662, 9671}, {9681, 9685, 3971, 9690, 9695, 9699, 9703}, {2797, 5774, 2508, 2508, 9707, 2126, 2131}, {9709, 9715, 4955, 9722, 2545, 9728, 9736, 9743, 9749, 9757, 9763, 9771, 0}, {9709, 9715, 4955, 9722, 2545, 9728, 9736, 9743, 9749, 9757, 9763, 9771, 0}, {2883, 9779, 3971, 9783, 9787, 9791, 9795, 9799, 9703, 9803, 9807, 9812, 0}, {2883, 9779, 3971, 9783, 9787, 9791, 9795, 9799, 9703, 9803, 9807, 9812, 0}, 0, 1, 756, 241, {1319,5950,0,0,0,0,0,0,0,0,0,0,0,0},{1319,0,0,0,0,0,0,0},{9816,274,0,0,0,0,0,0,0,0,0,0},{9824,280,0,0,0,0,0,0,0}},
+ {9835, 1319, 280, 274, 2015, 9853, 9866, 9869, {9872, 9880, 9888, 2448, 2455, 2463, 9895}, {9903, 9908, 9913, 2491, 2495, 2499, 9917}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {7251, 7259, 4955, 2539, 2545, 2549, 2554, 9922, 2566, 2576, 2584, 2593, 0}, {7251, 7259, 4955, 2539, 2545, 2549, 2554, 9922, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 2646, 241, {1319,5950,0,0,0,0,0,0,0,0,0,0,0,0},{9835,9930,0,0,0,0,0,0},{274,331,9953,0,0,0,0,0,0,0,0,0},{280,323,9963,0,0,0,0,0,0}},
+ {3777, 3032, 323, 331, 2015, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {3032,1338,14,243,9976,9987,1319,0,0,0,0,0,0,0},{3777,9999,10015,0,0,0,0,0},{331,274,3052,35,0,0,0,0,0,0,0,0},{323,280,3041,23,0,0,0,0,0}},
+ {10057, 2356, 280, 274, 2015, 352, 3824, 3827, {10074, 10080, 10090, 10096, 10107, 10117, 10122}, {10132, 10136, 10140, 10144, 10149, 10153, 10157}, {2126, 2126, 2131, 10161, 2126, 7493, 7493}, {10164, 10169, 10176, 10181, 10187, 10194, 10202, 10209, 10218, 10225, 10230, 10237, 0}, {10164, 10169, 10176, 10181, 10187, 10194, 10202, 10209, 10218, 10225, 10230, 10237, 0}, {10245, 10249, 3971, 10254, 3940, 10258, 10262, 10266, 10271, 10275, 10279, 10283, 0}, {10245, 10249, 3971, 10254, 3940, 10258, 10262, 10266, 10271, 10275, 10279, 10283, 0}, 0, 1, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{10287,5566,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {4054, 243, 3041, 3052, 44, 55, 10305, 10310, {10317, 10328, 10335, 10344, 10351, 10364, 10373}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10382, 10393, 10404, 10413, 10424, 10429, 10436, 10447, 10456, 10467, 10480, 10491, 0}, {10382, 10393, 10404, 10413, 10424, 10429, 10436, 10447, 10456, 10467, 10480, 10491, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {5566, 243, 323, 331, 2015, 55, 3824, 3827, {10502, 10509, 10515, 10522, 10527, 10533, 10539}, {10545, 10549, 10553, 10557, 10561, 10565, 10569}, {2508, 2131, 2131, 10573, 4488, 4191, 2131}, {10575, 10583, 10592, 2820, 10598, 2830, 2835, 10602, 2847, 2857, 2865, 10610, 0}, {10575, 10583, 10592, 2820, 10598, 2830, 2835, 10602, 2847, 2857, 2865, 10610, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 10619, 2912, 2916, 2920, 10623, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 10619, 2912, 2916, 2920, 10623, 0}, 0, 0, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {10627, 2692, 323, 331, 10645, 352, 10661, 10666, {10671, 10684, 10703, 10720, 10733, 10746, 10763}, {10776, 8576, 8581, 8586, 8591, 8596, 8601}, {10781, 8609, 8606, 8612, 8615, 8609, 8612}, {10784, 10797, 10808, 10825, 10840, 10855, 10870, 10883, 10898, 10915, 10930, 10947, 0}, {10962, 10973, 10986, 11001, 11014, 11027, 11040, 11051, 11064, 11079, 11092, 11111, 0}, {11124, 11131, 11138, 11145, 11152, 11159, 11166, 11173, 11180, 11187, 11194, 11201, 0}, {11124, 11131, 11138, 11145, 11152, 11159, 11166, 11173, 11180, 11187, 11194, 11201, 0}, 0, 1, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{10627,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {3777, 1354, 280, 274, 2015, 352, 11208, 11221, {11234, 11249, 11270, 11285, 11298, 11311, 11326}, {486, 491, 11339, 501, 11344, 511, 516}, {521, 524, 11349, 530, 533, 524, 530}, {11352, 11369, 11378, 11393, 11410, 11425, 11440, 11453, 11468, 11485, 11506, 11523, 0}, {11352, 11369, 11378, 11393, 586, 11425, 11440, 11453, 11468, 11485, 11506, 11523, 0}, {11538, 11545, 11552, 11559, 11566, 11573, 11580, 11587, 11594, 11601, 11608, 11615, 0}, {11538, 11545, 11552, 11559, 11566, 11573, 11580, 11587, 11594, 11601, 11608, 11615, 0}, 0, 0, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{3777,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2356, 323, 331, 2015, 2025, 2033, 11622, {11627, 11635, 11646, 11652, 11658, 11667, 2093}, {9071, 9075, 2495, 11673, 9087, 9092, 11677}, {9100, 9102, 1059, 1067, 9106, 9102, 1067}, {2518, 2525, 9501, 2539, 2545, 11681, 11687, 11693, 2566, 2576, 2584, 2593, 0}, {2518, 2525, 9501, 2539, 2545, 11681, 11687, 11693, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 11715, 323, 331, 2015, 11725, 11734, 11739, {11744, 11755, 11766, 11777, 11788, 11799, 11805}, {2126, 9707, 2510, 4488, 2124, 10573, 2516}, {2126, 9707, 2510, 4488, 2124, 10573, 2516}, {11814, 11822, 11831, 11838, 4966, 11845, 11851, 2559, 2566, 11857, 2584, 11866, 0}, {11814, 11822, 11831, 11838, 4966, 11845, 11851, 2559, 2566, 11857, 2584, 11866, 0}, {11876, 11881, 11831, 2614, 4966, 11845, 11851, 2626, 11887, 2634, 2638, 11892, 0}, {11876, 11881, 11831, 2614, 4966, 11845, 11851, 2626, 11887, 2634, 2638, 11892, 0}, 2, 1, 756, 241, {11715,2692,1354,1319,0,0,0,0,0,0,0,0,0,0},{11897,11916,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {11936, 9338, 323, 331, 11963, 2025, 11981, 11998, {12012, 12023, 12033, 12042, 12053, 12065, 12076}, {12086, 12089, 12092, 12095, 12098, 12101, 12104}, {2131, 2126, 2512, 2510, 7493, 2126, 2131}, {12107, 12117, 2533, 12128, 12137, 12143, 12151, 12159, 12167, 12178, 12187, 12197, 0}, {12107, 12117, 2533, 12128, 12137, 12143, 12151, 12159, 12167, 12178, 12187, 12197, 0}, {5017, 1279, 2533, 8408, 12137, 12207, 12213, 5914, 5041, 5926, 1309, 5931, 0}, {5017, 1279, 2533, 8408, 12137, 12207, 12213, 5914, 5041, 5926, 1309, 5931, 0}, 0, 1, 756, 241, {5676,12219,1319,0,0,0,0,0,0,0,0,0,0,0},{11936,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {12229, 1319, 280, 274, 12251, 12266, 12278, 11622, {12284, 12296, 12308, 12320, 12334, 12349, 12362}, {12376, 12089, 12379, 12095, 12382, 12385, 12388}, {2131, 2126, 12392, 2510, 4488, 2126, 9498}, {12394, 12401, 12409, 12415, 12424, 12433, 12443, 12449, 12460, 12470, 12477, 12487, 0}, {12495, 12502, 12510, 12516, 12525, 12534, 12544, 12550, 12561, 12571, 12578, 12588, 0}, {12596, 12602, 12607, 12612, 12617, 12622, 12627, 12633, 12639, 12645, 12651, 12658, 0}, {12596, 12602, 12607, 12612, 12617, 12622, 12627, 12633, 12639, 12645, 12651, 12658, 0}, 2, 1, 2646, 241, {1856,1319,0,0,0,0,0,0,0,0,0,0,0,0},{12229,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {12665, 2692, 280, 274, 2015, 55, 12683, 12695, {12707, 12722, 12737, 12752, 12769, 12788, 12799}, {12810, 12817, 12824, 12831, 12838, 12845, 12852}, {0, 0, 0, 0, 0, 0, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, 0, 0, 756, 241, {1354,1319,0,0,0,0,0,0,0,0,0,0,0,0},{3777,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {13023, 243, 23, 35, 44, 352, 13042, 13062, {13079, 13092, 13105, 13121, 13138, 13153, 13162}, {13079, 13092, 13105, 13121, 13138, 13153, 13162}, {13171, 13174, 13177, 13180, 13183, 13186, 13189}, {13192, 13205, 13216, 13225, 13236, 13241, 13250, 13261, 13268, 13283, 13294, 13307, 0}, {13320, 13335, 13216, 13225, 13348, 13241, 13355, 13261, 13268, 13283, 13294, 13307, 0}, {13192, 13205, 13216, 13225, 13236, 13241, 13250, 13261, 13268, 13283, 13294, 13307, 0}, {13192, 13205, 13216, 13225, 13236, 13241, 13250, 13261, 13268, 13283, 13294, 13307, 0}, 0, 6, 239, 241, {3999,3990,0,0,0,0,0,0,0,0,0,0,0,0},{4020,4040,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {5566, 243, 3041, 3052, 2015, 55, 13368, 13371, {13374, 13387, 13397, 13406, 13416, 13427, 13438}, {13450, 13453, 13458, 13463, 13468, 13473, 13478}, {13450, 13483, 13486, 13489, 13492, 13495, 13498}, {13501, 13514, 13525, 13535, 13546, 13558, 13570, 13583, 13595, 13608, 13623, 13644, 0}, {13501, 13514, 13525, 13535, 13546, 13558, 13570, 13583, 13595, 13608, 13623, 13644, 0}, {13663, 13669, 13675, 13681, 13687, 13693, 13699, 13705, 13711, 13717, 13724, 13731, 0}, {13663, 13669, 13675, 13681, 13687, 13693, 13699, 13705, 13711, 13717, 13724, 13731, 0}, 0, 1, 239, 241, {243,14,1345,2404,1319,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {13738, 2692, 280, 274, 44, 352, 13751, 13759, {13767, 13780, 13801, 13820, 13841, 13860, 13873}, {13884, 13891, 13898, 13905, 13912, 13919, 13926}, {0, 0, 0, 0, 0, 0, 0}, {13933, 13948, 13963, 13972, 13983, 13994, 14007, 14020, 14035, 14054, 14073, 14090, 0}, {13933, 13948, 13963, 13972, 13983, 13994, 14007, 14020, 14035, 14054, 14073, 14090, 0}, {14109, 14116, 14123, 14130, 14137, 14144, 14151, 14158, 14165, 14172, 14179, 14186, 0}, {14109, 14116, 14123, 14130, 14137, 14144, 14151, 14158, 14165, 14172, 14179, 14186, 0}, 0, 1, 756, 241, {2692,1354,14193,243,14203,3765,1319,0,0,0,0,0,0,0},{13738,3014,13023,5566,14214,14225,14237,14254},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {14272, 2692, 280, 274, 2015, 352, 0, 0, {14294, 14300, 14314, 14337, 14351, 14367, 14374}, {14383, 14386, 14391, 14397, 14401, 7493, 14406}, {6646, 6634, 6636, 6638, 6640, 6642, 6644}, {14410, 14417, 10176, 14424, 3940, 14430, 14436, 14442, 14449, 14458, 14466, 14473, 0}, {14410, 14417, 10176, 14424, 3940, 14430, 14436, 14442, 14449, 14458, 14466, 14473, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, 0, 0, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{3777,5566,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {14512, 1845, 323, 331, 14545, 14562, 3824, 3827, {14577, 14585, 14596, 14606, 14617, 14626, 14635}, {14645, 14648, 14651, 14654, 14657, 14660, 14663}, {14666, 2508, 12392, 2516, 12392, 2512, 14666}, {14668, 14678, 14686, 14694, 14702, 14710, 14717, 14725, 14733, 14740, 14746, 14753, 0}, {14668, 14678, 14686, 14694, 14702, 14710, 14717, 14725, 14733, 14740, 14746, 14753, 0}, {14761, 14765, 2610, 14769, 4966, 14773, 14777, 14781, 14785, 14789, 14793, 14797, 0}, {14761, 14765, 2610, 14769, 4966, 14773, 14777, 14781, 14785, 14789, 14793, 14797, 0}, 2, 1, 239, 241, {1845,1319,0,0,0,0,0,0,0,0,0,0,0,0},{14801,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{323,280,1433,0,0,0,0,0,0}},
+ {13023, 2692, 280, 274, 2015, 352, 14828, 14849, {14866, 396, 417, 8515, 14879, 14896, 14907}, {14920, 14928, 14936, 14942, 14950, 14958, 14966}, {521, 524, 527, 530, 533, 524, 530}, {14974, 549, 566, 575, 14989, 14996, 15005, 607, 620, 639, 656, 671, 0}, {14974, 549, 566, 575, 14989, 14996, 15005, 607, 620, 639, 656, 671, 0}, {15014, 15022, 15030, 704, 14989, 15038, 15046, 712, 720, 730, 738, 15054, 0}, {15014, 15022, 15030, 704, 14989, 15038, 15046, 712, 720, 730, 738, 15054, 0}, 0, 1, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{13023,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {5566, 14, 23, 35, 2015, 352, 0, 0, {15066, 15073, 15084, 15093, 15102, 15109, 15120}, {15130, 15134, 15138, 15142, 15146, 15149, 15153}, {0, 0, 0, 0, 0, 0, 0}, {15157, 15167, 15176, 15184, 15193, 15206, 15218, 15225, 15232, 15239, 15249, 15261, 0}, {15157, 15167, 15176, 15184, 15193, 15206, 15218, 15225, 15232, 15239, 15249, 15261, 0}, {15274, 15278, 15282, 15286, 15290, 15294, 15298, 15302, 15306, 15310, 15314, 15318, 0}, {15274, 15278, 15282, 15286, 15290, 15294, 15298, 15302, 15306, 15310, 15314, 15318, 0}, 0, 0, 239, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {5566, 1845, 23, 35, 2015, 352, 0, 0, {15322, 15327, 15333, 15343, 15355, 15363, 15374}, {15383, 15387, 15391, 15395, 15399, 15403, 15407}, {0, 0, 0, 0, 0, 0, 0}, {15411, 15421, 15431, 15438, 15445, 2830, 15450, 15457, 15464, 15473, 15481, 15489, 0}, {15411, 15421, 15431, 15438, 15445, 2830, 15450, 15457, 15464, 15473, 15481, 15489, 0}, {2883, 2887, 15153, 15497, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, {2883, 2887, 15153, 15497, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, 0, 0, 239, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {5566, 2404, 23, 35, 2015, 352, 3824, 3827, {15513, 15519, 15530, 15343, 15540, 15363, 15374}, {15549, 15553, 15557, 15395, 15399, 15403, 15407}, {2131, 2508, 15561, 2510, 2131, 5774, 2508}, {15563, 15573, 15584, 15591, 15600, 15606, 15612, 15620, 15628, 15639, 15649, 15658, 0}, {15667, 15421, 15676, 15682, 15445, 2830, 15450, 15457, 15689, 15473, 15481, 15489, 0}, {2883, 2887, 15699, 2896, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, {2883, 2887, 15699, 2896, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, 0, 0, 2646, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {5566, 1845, 23, 35, 2015, 352, 15703, 15707, {15711, 15718, 15726, 15734, 15743, 15753, 15760}, {2776, 8298, 2782, 15769, 2788, 15772, 2794}, {2131, 2508, 2797, 3915, 2797, 4193, 2131}, {15775, 15784, 15794, 2820, 10598, 15800, 15806, 15812, 2847, 2857, 2865, 10610, 0}, {15775, 15784, 15794, 2820, 10598, 15800, 15806, 15812, 2847, 2857, 2865, 10610, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 2908, 2912, 2916, 2920, 10623, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 2908, 2912, 2916, 2920, 10623, 0}, 0, 0, 239, 241, {1845,1888,1319,15821,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {15833, 2692, 323, 331, 2015, 352, 15867, 15883, {15905, 15921, 15946, 15974, 16002, 16030, 16058}, {16077, 16087, 16097, 16107, 16117, 16127, 16137}, {16147, 16151, 16155, 16151, 16159, 16163, 16167}, {16171, 16193, 16221, 16237, 16256, 16272, 16291, 16307, 16329, 16360, 16388, 16413, 0}, {16171, 16193, 16221, 16237, 16256, 16272, 16291, 16307, 16329, 16360, 16388, 16413, 0}, {16441, 16451, 16461, 16471, 16481, 16491, 16501, 16511, 16521, 16531, 16541, 16551, 0}, {16441, 16451, 16461, 16471, 16481, 16491, 16501, 16511, 16521, 16531, 16541, 16551, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{16561,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2404, 280, 274, 2015, 352, 16593, 16598, {5969, 16603, 16614, 16624, 16634, 16644, 16658}, {6055, 6059, 16670, 16675, 16679, 16684, 16689}, {2131, 2508, 2510, 2508, 5774, 2514, 2516}, {2518, 2525, 4955, 6111, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2518, 2525, 4955, 6111, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, 2, 1, 2646, 241, {2404,1345,1319,0,0,0,0,0,0,0,0,0,0,0},{1991,0,0,0,0,0,0,0},{274,5062,0,0,0,0,0,0,0,0,0,0},{280,6517,0,0,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 44, 55, 16693, 16721, {16743, 16762, 16781, 16803, 16822, 16856, 16881}, {16900, 16911, 16922, 16936, 16947, 16958, 16975}, {16986, 16990, 16997, 17004, 17011, 17018, 17025}, {17029, 17045, 17061, 17077, 17096, 17103, 17113, 17129, 17145, 17167, 17189, 17208, 0}, {17029, 17045, 17061, 17077, 17096, 17103, 17113, 17129, 17145, 17167, 17189, 17208, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {17230, 243, 280, 274, 2015, 17255, 17269, 17272, {17275, 17284, 17293, 17303, 17313, 17323, 17335}, {17343, 17348, 17352, 17356, 17360, 17365, 17370}, {17374, 2510, 2510, 9707, 17374, 17377, 2131}, {17380, 17387, 17392, 2820, 17398, 17404, 17411, 17417, 17425, 17435, 17443, 17452, 0}, {17380, 17387, 17392, 2820, 17398, 17404, 17411, 17417, 17425, 17435, 17443, 17452, 0}, {2883, 17462, 3971, 2896, 17466, 17470, 17475, 17479, 17483, 17487, 2920, 17491, 0}, {2883, 17462, 3971, 2896, 17466, 17470, 17475, 17479, 17483, 17487, 2920, 17491, 0}, 0, 0, 239, 241, {243,1319,17496,7163,3032,0,0,0,0,0,0,0,0,0},{17230,17505,9987,0,0,0,0,0},{274,3052,331,35,0,0,0,0,0,0,0,0},{280,3041,323,23,0,0,0,0,0}},
+ {17524, 2692, 280, 274, 2015, 17548, 17561, 17566, {17571, 17583, 17594, 17608, 17620, 17630, 17640}, {17651, 17656, 17661, 17666, 17671, 17676, 17681}, {2131, 4193, 2508, 6308, 2797, 15561, 2516}, {17686, 17703, 17716, 17730, 17743, 17756, 17769, 17783, 17795, 17809, 17823, 17837, 0}, {17686, 17703, 17716, 17730, 17743, 17756, 17769, 17783, 17795, 17809, 17823, 17837, 0}, {17850, 17857, 17862, 17867, 17871, 17876, 17881, 17886, 17891, 17898, 17903, 17909, 0}, {17850, 17857, 17862, 17867, 17871, 17876, 17881, 17886, 17891, 17898, 17903, 17909, 0}, 2, 1, 756, 241, {2692,1354,2948,1319,0,0,0,0,0,0,0,0,0,0},{17914,0,0,0,0,0,0,0},{274,331,5062,0,0,0,0,0,0,0,0,0},{280,323,6517,0,0,0,0,0,0}},
+ {3777, 243, 280, 274, 2015, 352, 964, 969, {17932, 17946, 17956, 17967, 17981, 17992, 18003}, {18016, 18021, 18026, 18033, 18039, 18045, 18051}, {2797, 2516, 2508, 7493, 2797, 12392, 2131}, {18056, 18064, 18072, 18079, 18088, 18098, 18108, 18114, 18122, 18137, 18155, 18163, 0}, {18056, 18064, 18072, 18079, 18088, 18098, 18108, 18114, 18122, 18137, 18155, 18163, 0}, {18171, 18175, 18072, 18181, 18185, 18190, 18108, 18196, 18201, 18208, 18215, 18220, 0}, {18171, 18175, 18072, 18181, 18185, 18190, 18108, 18196, 18201, 18208, 18215, 18220, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{3777,5566,9987,9976,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {5566, 243, 323, 331, 2015, 55, 18225, 18228, {18232, 18237, 10515, 10522, 18243, 18250, 10539}, {18257, 18261, 10553, 10557, 18265, 10565, 10569}, {12392, 14666, 2131, 10573, 4488, 4191, 2131}, {10575, 10583, 18269, 2820, 10598, 2900, 18273, 18279, 2847, 2857, 2865, 18284, 0}, {10575, 10583, 18269, 2820, 10598, 2900, 18273, 18279, 2847, 2857, 2865, 18284, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18279, 2912, 2916, 2920, 15509, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18279, 2912, 2916, 2920, 15509, 0}, 0, 1, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {18293, 6508, 280, 274, 2015, 352, 0, 0, {18311, 18326, 18343, 18360, 18375, 18392, 18401}, {18412, 18418, 18424, 18430, 18436, 18442, 18448}, {6634, 0, 0, 6640, 6642, 6644, 6646}, {18454, 18467, 18478, 18491, 18502, 18513, 18526, 18537, 18548, 18565, 18576, 18589, 0}, {18454, 18608, 18478, 18491, 18502, 18513, 18526, 18537, 18548, 18565, 18576, 18589, 0}, {18619, 18627, 18635, 18643, 18651, 18659, 18667, 18675, 18683, 18691, 18699, 18707, 0}, {18619, 18627, 18635, 18643, 18651, 18659, 18667, 18675, 18683, 18691, 18699, 18707, 0}, 0, 0, 2646, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{18293,18717,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {18736, 18757, 280, 274, 18766, 18782, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 1, 2646, 241, {1354,1319,0,0,0,0,0,0,0,0,0,0,0,0},{18791,0,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 44, 18811, 18819, 18827, {18835, 18844, 18853, 18861, 18870, 18879, 18886}, {18895, 18898, 18901, 18904, 18907, 18911, 18914}, {6636, 6638, 6640, 6642, 12392, 14666, 6634}, {10575, 10583, 18917, 18923, 10598, 2830, 18273, 18930, 15464, 18937, 15481, 18944, 0}, {10575, 10583, 18917, 18923, 10598, 2830, 18273, 18930, 15464, 18937, 15481, 18944, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18952, 2912, 2916, 2920, 10623, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18952, 2912, 2916, 2920, 10623, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {18956, 2692, 280, 274, 2015, 18974, 0, 0, {18981, 18996, 19011, 19026, 19043, 19060, 19069}, {19080, 19087, 19094, 19101, 19108, 19115, 19122}, {19129, 19132, 8612, 8615, 8609, 19135, 19138}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, 0, 0, 756, 241, {19141,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{18956,3777,5566,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {5566, 1345, 6517, 5062, 44, 352, 19152, 19180, {19202, 19221, 19240, 19265, 19284, 19318, 19343}, {19362, 19372, 19382, 19398, 19408, 19433, 19449}, {19459, 19463, 19470, 19474, 19481, 19488, 19495}, {19499, 19527, 19561, 19577, 19596, 19603, 19613, 19629, 19645, 19676, 19698, 19720, 0}, {19499, 19527, 19561, 19577, 19596, 19603, 19613, 19629, 19645, 19676, 19698, 19720, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 1, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{5062,2380,19745,19754,0,0,0,0,0,0,0,0},{6517,2396,19762,19774,0,0,0,0,0}},
+ {10287, 1345, 1979, 1959, 44, 55, 19785, 19817, {19849, 19865, 19884, 19906, 19925, 19944, 19972}, {20000, 20008, 20019, 20033, 20044, 20055, 20072}, {20086, 20090, 20097, 20104, 20114, 20121, 20134}, {20141, 20157, 20176, 20189, 20208, 20215, 20225, 20241, 20254, 20270, 20289, 20305, 0}, {20141, 20157, 20176, 20189, 20208, 20215, 20225, 20241, 20254, 20270, 20289, 20305, 0}, {6634, 6636, 6638, 6640, 20208, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 20208, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{10287,3777,0,0,0,0,0,0},{1959,1951,331,274,0,0,0,0,0,0,0,0},{1979,1968,323,280,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 55, 20321, 20362, {20403, 20422, 20441, 20463, 20482, 20504, 20529}, {20548, 20558, 20568, 20581, 20591, 20604, 20620}, {20630, 20634, 20641, 20648, 20655, 20662, 20669}, {20673, 20701, 20729, 20745, 20764, 20771, 20781, 20797, 20813, 20841, 20863, 20885, 0}, {20673, 20701, 20729, 20745, 20764, 20771, 20781, 20797, 20813, 20841, 20863, 20885, 0}, {20910, 20929, 20729, 20745, 20764, 20771, 20781, 20797, 20948, 20964, 20980, 20990, 0}, {20910, 20929, 20729, 20745, 20764, 20771, 20781, 20797, 20948, 20964, 20980, 20990, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 55, 7932, 21003, {21006, 21025, 21044, 21069, 21088, 21110, 21135}, {21154, 21164, 21174, 21190, 21200, 21213, 21229}, {21239, 21243, 21250, 21254, 21261, 21268, 21275}, {21279, 21301, 21332, 21354, 21373, 21380, 21390, 21406, 21422, 21453, 21475, 21497, 0}, {21279, 21301, 21332, 21354, 21373, 21380, 21390, 21406, 21422, 21453, 21475, 21497, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 2015, 352, 21522, 21547, {21572, 21591, 21613, 21638, 21654, 21676, 21695}, {21705, 21712, 21719, 21726, 21733, 21740, 21747}, {21705, 21712, 21719, 21726, 21733, 21740, 21747}, {21751, 21767, 21792, 21811, 21830, 21837, 21850, 21863, 21882, 21913, 21938, 21960, 0}, {21751, 21767, 21792, 21811, 21830, 21837, 21850, 21985, 21882, 21913, 21938, 21960, 0}, {22004, 22012, 22026, 22040, 21830, 21837, 21850, 22051, 22059, 22073, 22084, 22092, 0}, {22004, 22012, 22026, 22040, 21830, 21837, 21850, 22051, 22059, 22073, 22084, 22092, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 3817, 22103, 22134, {22159, 22181, 22203, 22228, 22250, 22275, 22303}, {22325, 22335, 22345, 22358, 22368, 22381, 22397}, {22407, 22411, 22418, 22422, 22429, 22436, 22443}, {22447, 22463, 22488, 22507, 22529, 22536, 22549, 22562, 22581, 22612, 22637, 22656, 0}, {22447, 22463, 22488, 22507, 22529, 22536, 22549, 22562, 22581, 22612, 22637, 22656, 0}, {22681, 22688, 6638, 22704, 22529, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {22681, 22688, 6638, 22704, 22529, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 3817, 3824, 3827, {22720, 22739, 22758, 22780, 22799, 22821, 22846}, {22865, 22870, 22878, 22886, 22894, 22902, 22910}, {22921, 22925, 22932, 22939, 22946, 22953, 22960}, {22964, 22980, 23005, 23024, 23046, 23053, 23066, 23079, 23098, 23126, 23151, 23173, 0}, {22964, 22980, 23005, 23024, 23046, 23053, 23066, 23079, 23098, 23126, 23151, 23173, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 6517, 5062, 44, 18811, 23198, 23217, {23248, 23273, 23304, 23332, 23357, 23385, 23419}, {23444, 23463, 23488, 23504, 23523, 23542, 23561}, {23571, 23578, 23585, 23592, 23599, 23612, 23619}, {23623, 23642, 23670, 23698, 23723, 23736, 23752, 23765, 23790, 23827, 23855, 23877, 0}, {23623, 23642, 23670, 23698, 23723, 23736, 23752, 23765, 23790, 23827, 23855, 23877, 0}, {23902, 23912, 23931, 23947, 23723, 23736, 23752, 23963, 23970, 23995, 24011, 24021, 0}, {23902, 23912, 23931, 23947, 23723, 23736, 23752, 23963, 23970, 23995, 24011, 24021, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{5062,2380,19745,19754,0,0,0,0,0,0,0,0},{6517,2396,19762,19774,0,0,0,0,0}},
+ {24034, 2404, 1968, 1951, 24053, 352, 24061, 24089, {24111, 24130, 24149, 24174, 24193, 24227, 24252}, {24271, 19372, 19382, 19398, 24281, 24306, 19449}, {0, 0, 0, 0, 0, 0, 0}, {24322, 24347, 24378, 24394, 19596, 19603, 19613, 24413, 24429, 24460, 24482, 24504, 0}, {24322, 24347, 24378, 24394, 19596, 19603, 19613, 24413, 24429, 24460, 24482, 24504, 0}, {24529, 24542, 24378, 24394, 19596, 19603, 19613, 24561, 24568, 24584, 24600, 24610, 0}, {24529, 24542, 24378, 24394, 19596, 19603, 19613, 24561, 24568, 24584, 24600, 24610, 0}, 0, 0, 2646, 241, {2404,0,0,0,0,0,0,0,0,0,0,0,0,0},{24034,0,0,0,0,0,0,0},{1951,1959,0,0,0,0,0,0,0,0,0,0},{1968,1979,0,0,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 44, 55, 3824, 3827, {16743, 16762, 24623, 16803, 24645, 16856, 16881}, {24667, 24677, 24687, 24700, 24710, 24723, 24739}, {16986, 16990, 16997, 17004, 17011, 17018, 17025}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 24844, 24860, 24885, 24907, 24935, 0}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 24844, 24860, 24885, 24907, 24935, 0}, {24957, 24970, 17061, 24989, 24824, 17103, 24831, 25005, 25012, 6652, 25034, 25056, 0}, {24957, 24970, 17061, 24989, 24824, 17103, 24831, 25005, 25012, 6652, 25034, 25056, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {25072, 1319, 280, 274, 25126, 5699, 0, 0, {25145, 25152, 25163, 25176, 25189, 25200, 25213}, {25224, 25229, 25234, 25239, 25244, 25249, 25254}, {0, 0, 0, 0, 0, 0, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, 0, 0, 2646, 241, {25463,1319,0,0,0,0,0,0,0,0,0,0,0,0},{25472,0,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {25493, 1475, 280, 274, 25536, 25569, 25593, 25615, {25640, 25668, 25696, 25733, 25764, 25798, 25823}, {25857, 25873, 25889, 25914, 25933, 25955, 25974}, {25996, 26003, 26010, 26017, 26024, 26031, 26035}, {26045, 26079, 26116, 26150, 26184, 26215, 26252, 26289, 26329, 26363, 26397, 26446, 0}, {26045, 26079, 26116, 26150, 26184, 26215, 26252, 26289, 26329, 26363, 26397, 26446, 0}, {26495, 26508, 26521, 26534, 26547, 26560, 26573, 26586, 26599, 26612, 26628, 26644, 0}, {26495, 26508, 26521, 26534, 26547, 26560, 26573, 26586, 26599, 26612, 26628, 26644, 0}, 0, 0, 239, 241, {1475,1827,1836,1856,1319,1845,1867,1874,1881,0,0,0,0,0},{25493,26660,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {3777, 14, 280, 274, 2015, 352, 0, 0, {26708, 26717, 26727, 26739, 26752, 26761, 26773}, {26785, 26789, 26794, 26798, 26802, 26806, 26810}, {2131, 2516, 2508, 2508, 14666, 6308, 2131}, {26814, 26821, 26830, 26837, 2826, 26844, 26852, 26863, 26868, 26873, 26880, 26889, 0}, {26814, 26821, 26830, 26837, 2826, 26844, 26897, 26863, 26868, 26873, 26880, 26889, 0}, {26907, 26911, 26794, 26916, 2826, 26920, 26924, 26863, 26868, 26928, 26932, 26937, 0}, {26907, 26911, 26794, 26916, 2826, 26920, 26924, 26863, 26868, 26928, 26932, 26937, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,35,3052,0,0,0,0,0,0,0,0},{280,323,23,3041,0,0,0,0,0}},
+ {3777, 14, 280, 331, 26942, 352, 26977, 26993, {27009, 27043, 27074, 27105, 27127, 27170, 27198}, {27223, 27230, 27234, 27238, 27245, 27255, 27262}, {0, 0, 0, 0, 0, 0, 0}, {27266, 27279, 27298, 27311, 27324, 27337, 27356, 27375, 27388, 27404, 27417, 27442, 0}, {27266, 27279, 27298, 27311, 27324, 27337, 27356, 27375, 27388, 27404, 27417, 27442, 0}, {27455, 27459, 27463, 27467, 27471, 27475, 27479, 27483, 27487, 27491, 27498, 27505, 0}, {27455, 27459, 27463, 27467, 27471, 27475, 27479, 27483, 27487, 27491, 27498, 27505, 0}, 0, 0, 239, 241, {1319,0,0,0,0,0,0,0,0,0,0,0,0,0},{3777,9999,0,0,0,0,0,0},{27512,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {5566, 243, 280, 274, 2015, 352, 27520, 27545, {27570, 27595, 27614, 27642, 27661, 27686, 27705}, {27727, 27735, 27740, 27745, 27750, 27758, 27766}, {0, 0, 0, 0, 0, 0, 0}, {27771, 27790, 27806, 27819, 27832, 27854, 27873, 27895, 27911, 27927, 27940, 27956, 0}, {27771, 27790, 27806, 27819, 27832, 27854, 27873, 27895, 27911, 27927, 27940, 27956, 0}, {27972, 27981, 27990, 28002, 28012, 28021, 28033, 28042, 28051, 28060, 28069, 28078, 0}, {27972, 27981, 27990, 28002, 28012, 28021, 28033, 28042, 28051, 28060, 28069, 28078, 0}, 0, 0, 239, 241, {243,1319,0,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{27512,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {4290, 243, 323, 331, 949, 4096, 964, 969, {28087, 28095, 28100, 28107, 28117, 28123, 28130}, {28138, 28142, 3971, 28146, 28151, 28155, 28159}, {2797, 2516, 2508, 2508, 4189, 4193, 2131}, {28164, 28172, 6327, 28181, 28187, 28192, 28198, 6361, 28204, 28213, 28221, 28230, 0}, {28164, 28172, 6327, 28181, 28187, 28192, 28198, 6361, 28204, 28213, 28221, 28230, 0}, {28239, 2887, 3971, 28243, 2826, 28247, 28252, 18952, 17483, 28256, 2920, 3979, 0}, {28239, 2887, 3971, 28243, 2826, 28247, 28252, 18952, 17483, 28256, 2920, 3979, 0}, 2, 1, 239, 241, {243,14,1330,1338,1345,1354,1319,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{331,274,35,1421,0,0,0,0,0,0,0,0},{323,280,23,1433,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 44, 55, 28260, 28272, {28284, 16762, 28312, 16803, 24645, 16856, 16881}, {24667, 24677, 24687, 24700, 24710, 24723, 24739}, {0, 0, 0, 0, 0, 0, 0}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 28331, 28347, 28375, 24907, 24935, 0}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 28331, 28347, 28375, 24907, 24935, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {28397, 1319, 1968, 1951, 28445, 18811, 28455, 28467, {28476, 28492, 28508, 28536, 28552, 28595, 28620}, {28648, 28658, 28668, 28675, 28685, 28701, 28714}, {28724, 28728, 28732, 28736, 28740, 28753, 28760}, {28767, 28786, 28811, 28830, 28855, 28868, 28881, 28894, 28916, 28950, 28975, 29003, 0}, {28767, 28786, 28811, 28830, 28855, 28868, 28881, 28894, 28916, 28950, 28975, 29003, 0}, {29031, 29038, 29048, 28830, 28855, 28868, 28881, 29061, 29071, 29084, 29094, 29107, 0}, {29031, 29038, 29048, 28830, 28855, 28868, 28881, 29061, 29071, 29084, 29094, 29107, 0}, 0, 1, 2646, 241, {1319,1845,1888,243,14,0,0,0,0,0,0,0,0,0},{28397,0,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {29120, 3032, 3041, 3052, 2015, 29152, 29168, 29178, {29191, 29201, 29208, 29221, 29231, 29241, 29251}, {29191, 29201, 29261, 29221, 29231, 29241, 29251}, {29271, 29275, 29279, 29283, 29287, 29291, 29295}, {29299, 29315, 29331, 29341, 29354, 29361, 29368, 29378, 29391, 29410, 29429, 29445, 0}, {29299, 29315, 29331, 29341, 29354, 29361, 29368, 29378, 29391, 29410, 29429, 29445, 0}, {29461, 29471, 29331, 29481, 29354, 29361, 29368, 29491, 29501, 29511, 29521, 29531, 0}, {29461, 29471, 29331, 29481, 29354, 29361, 29368, 29491, 29501, 29511, 29521, 29531, 0}, 0, 0, 239, 241, {3032,1319,0,0,0,0,0,0,0,0,0,0,0,0},{29120,0,0,0,0,0,0,0},{3052,0,0,0,0,0,0,0,0,0,0,0},{3041,0,0,0,0,0,0,0,0}},
+ {4054, 2404, 323, 331, 44, 352, 29541, 29551, {29564, 29571, 29577, 29584, 29590, 29596, 29604}, {29614, 29618, 29622, 29626, 29630, 29634, 29638}, {12392, 12392, 12392, 12392, 12392, 12392, 12392}, {29644, 29653, 29662, 29667, 29673, 29679, 29685, 29692, 29698, 29707, 29716, 29724, 0}, {29644, 29653, 29662, 29667, 29673, 29679, 29685, 29692, 29698, 29707, 29716, 29724, 0}, {29733, 29737, 3971, 29741, 3940, 29745, 29749, 29753, 29758, 29762, 29768, 29772, 0}, {29733, 29737, 3971, 29741, 3940, 29745, 29749, 29753, 29758, 29762, 29768, 29772, 0}, 0, 0, 2646, 241, {2404,1345,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{331,274,29776,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 29782, 55, 29792, 29833, {29874, 29893, 29912, 29937, 29956, 29978, 30003}, {30022, 24677, 30032, 24700, 30048, 24723, 24739}, {30061, 30065, 30069, 30073, 30077, 30081, 30085}, {17029, 30089, 17061, 30117, 24824, 30136, 17113, 17129, 30146, 30177, 30199, 30224, 0}, {17029, 30089, 17061, 30117, 24824, 30136, 17113, 17129, 30146, 30177, 30199, 30224, 0}, {30249, 30256, 17061, 30266, 24824, 30136, 30282, 30295, 30302, 30318, 30334, 30347, 0}, {30249, 30256, 17061, 30266, 24824, 30136, 30282, 30295, 30302, 30318, 30334, 30347, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {30360, 1475, 3041, 3052, 2015, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30381, 30388, 30397, 30412, 30423, 30432, 30439, 30446, 30453, 30464, 30477, 30490, 0}, {30381, 30388, 30397, 30412, 30423, 30432, 30439, 30446, 30453, 30464, 30477, 30490, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,30495,0,0,0,0},{3052,331,0,0,0,0,0,0,0,0,0,0},{3041,323,0,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 44, 30513, 3824, 3827, {30519, 30526, 28100, 30532, 30543, 30551, 30560}, {30567, 28142, 3971, 30571, 30575, 30579, 10569}, {2516, 2516, 2508, 2508, 5774, 15561, 2131}, {30583, 30589, 30597, 28181, 30603, 30608, 30614, 6361, 30620, 30630, 30638, 30648, 0}, {30583, 30589, 30597, 28181, 30603, 30608, 30614, 6361, 30620, 30630, 30638, 30648, 0}, {30658, 30662, 3971, 28243, 3940, 30666, 30670, 18952, 17483, 2916, 30674, 15509, 0}, {30658, 30662, 3971, 28243, 3940, 30666, 30670, 18952, 17483, 2916, 30674, 15509, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {4020, 3032, 3041, 3052, 44, 352, 0, 0, {30678, 30685, 30693, 30700, 30707, 30715, 30723}, {30730, 30733, 30736, 30739, 30742, 30745, 30748}, {2516, 2516, 2510, 2516, 12392, 4191, 12392}, {30751, 30759, 30769, 30775, 30783, 30788, 30793, 30798, 30805, 18937, 30813, 30821, 0}, {30751, 30759, 30769, 30775, 30783, 30788, 30793, 30798, 30805, 18937, 30813, 30821, 0}, {2883, 30829, 3971, 30833, 3940, 29745, 29749, 30837, 3911, 2916, 30841, 15509, 0}, {2883, 30829, 3971, 30833, 3940, 29745, 29749, 30837, 3911, 2916, 30841, 15509, 0}, 0, 0, 239, 241, {3032,1338,14,243,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {254, 3032, 3041, 3052, 29782, 55, 30845, 30856, {30866, 30884, 30899, 30921, 30934, 30948, 30965}, {30989, 30997, 31002, 30921, 30934, 31014, 31021}, {0, 0, 0, 0, 0, 0, 0}, {31035, 31057, 31073, 31093, 31107, 31124, 31139, 31156, 31170, 31183, 31202, 31216, 0}, {31035, 31057, 31073, 31093, 31107, 31124, 31139, 31156, 31170, 31183, 31202, 31216, 0}, {31235, 31250, 31259, 31272, 31279, 31289, 31297, 31307, 31314, 31320, 31332, 31339, 0}, {31235, 31250, 31259, 31272, 31279, 31289, 31297, 31307, 31314, 31320, 31332, 31339, 0}, 0, 0, 239, 241, {3032,1338,14,243,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {5566, 14, 23, 35, 2015, 3817, 0, 0, {31351, 31359, 15084, 15093, 15102, 31370, 31380}, {15549, 15134, 15138, 15142, 15146, 15403, 31389}, {0, 0, 0, 0, 0, 0, 0}, {31393, 31402, 31412, 31420, 10598, 3944, 31428, 31434, 31443, 31452, 31461, 31470, 0}, {31393, 31402, 31412, 31420, 10598, 3944, 31428, 31434, 31443, 31452, 31461, 31470, 0}, {2883, 2887, 15153, 31479, 10598, 2900, 2904, 18952, 17483, 2916, 31483, 15509, 0}, {2883, 2887, 15153, 31479, 10598, 2900, 2904, 18952, 17483, 2916, 31483, 15509, 0}, 0, 0, 239, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {31487, 2404, 280, 274, 2015, 31506, 31519, 31524, {31529, 31536, 31551, 31565, 31581, 31596, 31612}, {6304, 31627, 2610, 31631, 31635, 31639, 31643}, {2131, 12392, 2508, 2126, 2131, 2510, 12392}, {7251, 7259, 31647, 31654, 31661, 2549, 2554, 31666, 31676, 31687, 31696, 31706, 0}, {7251, 7259, 31647, 31654, 31661, 2549, 2554, 31666, 31676, 31687, 31696, 31706, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 0, 0, 2646, 241, {2404,1345,1319,2648,0,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4020, 3032, 2385, 2372, 44, 352, 31716, 31721, {31726, 31742, 31750, 31758, 31767, 31779, 31789}, {31799, 31805, 31811, 31815, 31819, 31827, 3911}, {0, 0, 0, 0, 0, 0, 0}, {31834, 31847, 31861, 31870, 31876, 31880, 31885, 31893, 15464, 31906, 15481, 15489, 0}, {31834, 31847, 31861, 31870, 31876, 31880, 31885, 31893, 15464, 31906, 15481, 15489, 0}, {31915, 2887, 31919, 15497, 31876, 31923, 2904, 31927, 2912, 31935, 2920, 15509, 0}, {31915, 2887, 31919, 15497, 31876, 31923, 2904, 31927, 2912, 31935, 2920, 15509, 0}, 0, 0, 239, 241, {3032,1338,14,243,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {31941, 1475, 1968, 1951, 31965, 31982, 32009, 32016, {32023, 32033, 32043, 32053, 32063, 32073, 32083}, {32093, 32100, 32107, 32114, 32121, 32128, 32135}, {32142, 32146, 32150, 32154, 32158, 32162, 32166}, {32170, 32177, 32184, 32191, 32198, 32205, 32212, 32219, 32226, 32233, 32240, 32250, 0}, {32170, 32177, 32184, 32191, 32198, 32205, 32212, 32219, 32226, 32233, 32240, 32250, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {1475,1827,1836,1856,1319,1845,0,0,0,0,0,0,0,0},{31941,32260,32290,0,0,0,0,0},{1951,331,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 352, 0, 0, {26785, 28142, 32320, 32327, 32337, 32342, 32349}, {32356, 4167, 32360, 4918, 32365, 32370, 32375}, {4467, 32380, 32383, 32386, 32389, 32392, 32395}, {32398, 32405, 32320, 32416, 32422, 32426, 32435, 32442, 32447, 32456, 8292, 32461, 0}, {32398, 32405, 32320, 32416, 32422, 32426, 32435, 32442, 32447, 32456, 8292, 32461, 0}, {32467, 32471, 32478, 26916, 32422, 32483, 32488, 32442, 32493, 32456, 8292, 32498, 0}, {32467, 32471, 32478, 26916, 32422, 32483, 32488, 32442, 32493, 32456, 8292, 32498, 0}, 2, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{4834,5053,3777,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {32502, 243, 6517, 5068, 949, 352, 0, 0, {32524, 32532, 32539, 32547, 32557, 32565, 1025}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32576, 32584, 1082, 1088, 4966, 32593, 32598, 1111, 1117, 32605, 1134, 32614, 0}, {32576, 32584, 1082, 1088, 4966, 32593, 32598, 1111, 1117, 32605, 1134, 32614, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 2, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{32623,0,0,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 2025, 32651, 32656, {32661, 32669, 32679, 32689, 32698, 32708, 32716}, {32726, 32730, 32735, 32739, 32743, 32747, 32751}, {2131, 2508, 2797, 2508, 2797, 2514, 2131}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 32755, 32764, 32775, 32784, 32794, 0}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 32755, 32764, 32775, 32784, 32794, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, 0, 0, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{4834,5053,3777,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {32804, 2692, 323, 331, 32839, 32855, 32873, 32878, {32883, 32908, 32937, 32962, 32975, 32990, 33007}, {33022, 33027, 33032, 33037, 33042, 33047, 8601}, {33052, 33052, 33055, 8612, 8615, 33052, 8612}, {33058, 33077, 33092, 33114, 33134, 33150, 33166, 33180, 33206, 33230, 33247, 33264, 0}, {33058, 33077, 33092, 33114, 33134, 33150, 33166, 33180, 33206, 33230, 33247, 33264, 0}, {33281, 33290, 33299, 33313, 33327, 33339, 33351, 33361, 33377, 33391, 33398, 33405, 0}, {33281, 33290, 33299, 33313, 33327, 33339, 33351, 33361, 33377, 33391, 33398, 33405, 0}, 0, 1, 756, 241, {33412,33423,2948,3990,33432,0,0,0,0,0,0,0,0,0},{33443,33461,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {33480, 14193, 323, 331, 2015, 18811, 0, 0, {33500, 33512, 33523, 33535, 33547, 33557, 33569}, {33584, 33589, 33594, 33599, 33604, 33609, 33614}, {0, 0, 0, 0, 0, 0, 0}, {33619, 33628, 33640, 33648, 33653, 33663, 33670, 33679, 33686, 33692, 33701, 33712, 0}, {33619, 33628, 33640, 33648, 33653, 33663, 33670, 33679, 33686, 33692, 33701, 33712, 0}, {33720, 33725, 33730, 33735, 33740, 33745, 33750, 33604, 33755, 33760, 33765, 33770, 0}, {33720, 33725, 33730, 33735, 33740, 33745, 33750, 33604, 33755, 33760, 33765, 33770, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {5566, 243, 280, 274, 2015, 352, 6087, 6092, {33775, 33788, 33796, 33805, 33815, 33825, 33834}, {33846, 33850, 33854, 33858, 33862, 33866, 33870}, {2797, 2516, 2508, 7493, 12392, 5774, 2131}, {33874, 33888, 33899, 33908, 33919, 33931, 33945, 33957, 33970, 33983, 33995, 34008, 0}, {33874, 33888, 33899, 33908, 33919, 33931, 33945, 33957, 33970, 33983, 33995, 34008, 0}, {34022, 34027, 34033, 34039, 34044, 34050, 34056, 34061, 34067, 34072, 18215, 34078, 0}, {34022, 34027, 34033, 34039, 34044, 34050, 34056, 34061, 34067, 34072, 18215, 34078, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,35,3052,0,0,0,0,0,0,0,0},{280,323,23,3041,0,0,0,0,0}},
{1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{1,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {289, 308, 323, 338, 350, 55, 366, 378, {390, 403, 424, 439, 450, 469, 480}, {493, 498, 503, 508, 513, 518, 523}, {528, 531, 534, 537, 540, 531, 537}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, 2, 1, 763, 241, {308,765,781,797,0,0,0,0,0,0,0,0,0,0},{289,814,832,857,0,0,0,0},{338,881,0,0,0,0,0,0,0,0,0,0},{323,892,0,0,0,0,0,0,0}},
- {906, 243, 280, 274, 932, 55, 946, 951, {956, 965, 973, 981, 990, 997, 1007}, {1016, 1019, 1022, 1025, 1028, 1031, 1034}, {1037, 1039, 1041, 1043, 1045, 1047, 1049}, {1051, 1057, 1064, 1070, 1076, 1081, 1086, 1093, 1099, 1108, 1116, 1125, 0}, {1134, 1143, 1153, 1162, 1172, 1180, 1188, 1198, 1208, 1220, 1232, 1244, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, 2, 1, 239, 241, {243,14,1301,1312,1320,1327,1336,0,0,0,0,0,0,0},{906,1345,1361,0,0,0,0,0},{274,1377,1382,0,0,0,0,0,0,0,0,0},{280,1394,1402,0,0,0,0,0,0}},
- {1422, 1444, 1948, 1928, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {1444,1814,1301,0,0,0,0,0,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1928,1920,274,1377,0,0,0,0,0,0,0,0},{1948,1937,280,1394,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 55, 1992, 1997, {2002, 2010, 2020, 2028, 2036, 2045, 2052}, {2059, 2062, 2065, 2069, 2072, 2076, 2080}, {2083, 2085, 2087, 2090, 2092, 2085, 2090}, {2095, 2101, 2107, 2115, 2121, 2129, 2137, 2147, 2153, 2161, 2169, 2178, 0}, {2187, 2193, 2200, 2208, 2214, 2222, 2230, 2240, 2153, 2246, 2254, 2264, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, 2, 1, 763, 241, {1973,2312,1301,1796,1836,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{1377,274,2319,2327,0,0,0,0,0,0,0,0},{1394,280,2332,2343,0,0,0,0,0}},
- {1960, 2351, 280, 274, 1982, 2362, 2370, 2375, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {2433, 2438, 2442, 2446, 2450, 2454, 2458}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,2883,1336,2895,2903,1973,1301,0,0,0,0,0,0,0},{2628,1960,2910,0,0,0,0,0},{274,1377,2327,2922,0,0,0,0,0,0,0,0},{280,2933,2947,2962,0,0,0,0,0}},
- {2969, 2987, 2996, 3007, 1982, 55, 3015, 3022, {3029, 3044, 3059, 3070, 3085, 3098, 3117}, {3132, 3139, 3146, 3153, 3160, 3167, 3174}, {3181, 3184, 3187, 3187, 3190, 3190, 3193}, {3196, 3217, 3240, 3255, 3272, 3283, 3298, 3313, 3332, 3355, 3374, 3393, 0}, {3414, 3435, 3458, 3473, 3490, 3501, 3516, 3531, 3550, 3573, 3592, 3611, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, 2, 1, 239, 241, {2987,243,1320,14,3720,1301,0,0,0,0,0,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {4280, 1973, 1394, 1377, 1982, 4297, 4309, 4313, {4317, 4329, 4341, 4351, 4365, 4375, 4387}, {4398, 4401, 4404, 4407, 4410, 4413, 4416}, {2090, 2463, 2465, 4419, 2465, 2085, 2471}, {4421, 4430, 4439, 4449, 4458, 4467, 4476, 4486, 4493, 4501, 4509, 4519, 0}, {4528, 4539, 4550, 4562, 4573, 4584, 4595, 4607, 4616, 4626, 4636, 4648, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{4280,4730,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {5007, 243, 280, 274, 1982, 55, 5025, 5038, {5049, 5067, 5081, 5099, 5117, 5135, 5151}, {5165, 5177, 5189, 5201, 5213, 5225, 5237}, {5244, 5247, 5250, 5253, 5256, 5259, 5262}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, 0, 0, 239, 241, {243,5487,14,1,1327,2351,5500,1301,5513,5530,0,0,0,0},{5007,5487,5540,5562,5513,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}},
- {5583, 5597, 1394, 1377, 5609, 5620, 5628, 5632, {5636, 5646, 5654, 5659, 5666, 5679, 5687}, {4134, 5695, 4419, 5697, 5701, 2085, 5704}, {4134, 5695, 4419, 5708, 5701, 2085, 5708}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,5857,1301,5871,0,0,0,0,0,0,0,0,0,0},{5583,0,0,0,0,0,0,0},{1377,274,3007,0,0,0,0,0,0,0,0,0},{1394,280,2996,0,0,0,0,0,0}},
- {1960, 1973, 280, 274, 1982, 2362, 5880, 5885, {5890, 5901, 5912, 5926, 5940, 5952, 5964}, {5976, 5980, 5985, 5990, 5995, 5999, 6004}, {1049, 6008, 6010, 6008, 6013, 6013, 1039}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, 2, 1, 763, 241, {1973,1336,6110,6122,1301,6136,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 55, 6145, 6148, {6151, 6160, 6168, 6177, 6188, 6197, 6206}, {4104, 4108, 2565, 6213, 6217, 6221, 6225}, {2752, 2471, 2463, 2463, 6229, 4134, 2090}, {6231, 6239, 6248, 6254, 6261, 6268, 6275, 6282, 6289, 6299, 6307, 6316, 0}, {6325, 6333, 4150, 6342, 6349, 6356, 6363, 4173, 6370, 6380, 1116, 6388, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, 2, 1, 239, 241, {243,3720,14,6421,1320,1301,0,0,0,0,0,0,0,0},{4748,6429,3732,0,0,0,0,0},{274,1377,2327,4983,0,0,0,0,0,0,0,0},{280,2343,6438,0,0,0,0,0,0}},
- {1422, 1814, 1394, 1377, 1453, 1469, 6447, 6454, {6461, 6471, 6481, 6491, 6501, 6511, 6521}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1814,1857,1843,1444,6582,6601,6618,1301,0,0,0,0,0,0},{1422,6639,6663,6690,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
- {6719, 1301, 1937, 1920, 6748, 6765, 6779, 6786, {6793, 6803, 6813, 6823, 6833, 6843, 6853}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1301,5871,1836,1796,0,0,0,0,0,0,0,0,0,0},{6719,6954,6978,7005,7027,7058,0,0},{1920,1928,1377,274,0,0,0,0,0,0,0,0},{1937,1948,1394,280,0,0,0,0,0}},
- {4748, 7084, 1394, 1377, 1982, 55, 946, 951, {7093, 7100, 7108, 7116, 7125, 7135, 7143}, {7152, 4401, 7155, 7158, 7161, 7164, 7167}, {7170, 2463, 2752, 3872, 2752, 4134, 7170}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {7084,2312,1327,14,1336,2883,1301,0,0,0,0,0,0,0},{4748,6429,3732,4974,0,0,0,0},{1377,274,2327,7212,7224,0,0,0,0,0,0,0},{1394,280,7236,7251,0,0,0,0,0}},
- {1960, 2647, 280, 274, 1982, 2362, 946, 951, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {7266, 7271, 7275, 7279, 7283, 7287, 7291}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
- {3732, 1301, 280, 274, 1982, 4765, 3781, 3784, {7321, 7331, 7345, 7352, 7359, 7368, 2052}, {7376, 7383, 7388, 7392, 7397, 7402, 7406}, {2083, 2085, 3872, 7411, 7414, 2085, 2090}, {7416, 7425, 7430, 7437, 2500, 7447, 7456, 7463, 7473, 7483, 2169, 7496, 0}, {7506, 7515, 7522, 7528, 7537, 7542, 7550, 7556, 7565, 7575, 7589, 7599, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {7648, 243, 280, 274, 4034, 7676, 3781, 3784, {4049, 7689, 7703, 7716, 7729, 7742, 4096}, {4104, 7754, 7758, 7762, 7766, 7770, 4125}, {2752, 2090, 2465, 7774, 7774, 2090, 2090}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, 0, 0, 239, 241, {243,14,2987,1320,1327,2351,2312,7084,1336,2647,2883,2903,1973,1301},{7648,4258,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {2969, 243, 280, 274, 1982, 55, 7865, 7868, {7871, 7880, 4787, 7890, 7898, 7906, 7915}, {7921, 7924, 4401, 7928, 7931, 7935, 2080}, {2752, 6229, 2463, 2463, 6229, 4134, 2090}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, 2, 1, 239, 241, {243,14,1312,8038,1320,243,1301,0,0,0,0,0,0,0},{2969,3732,4974,0,0,0,0,0},{274,1377,8046,8058,8069,8077,8087,8096,2922,8102,8110,8115},{280,1394,8118,8133,2947,2933,8147,8160,2962}},
- {3732, 2647, 280, 274, 1982, 4765, 3781, 3784, {8172, 8182, 8187, 8194, 8203, 8207, 8214}, {8225, 8228, 8231, 2740, 8234, 8237, 8240}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, 0, 1, 763, 241, {2647,1973,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {814, 2647, 1394, 1377, 1982, 3773, 8356, 8376, {8402, 8425, 424, 8448, 8459, 8474, 8489}, {8504, 8509, 8514, 8519, 8524, 8529, 8534}, {8539, 8542, 8539, 8545, 8548, 8542, 8545}, {8551, 8564, 8579, 8588, 8601, 8608, 8617, 8626, 8639, 8656, 8671, 8684, 0}, {8699, 8712, 8727, 8738, 8751, 8758, 8767, 8776, 8791, 8808, 8823, 8836, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{814,289,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {8921, 8935, 1394, 1377, 44, 2362, 3781, 3784, {8945, 8954, 8966, 8973, 8981, 8991, 8997}, {9004, 9008, 9012, 9016, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {9042, 9052, 9061, 9069, 9077, 9085, 9092, 9099, 9107, 2169, 9113, 9121, 0}, {9130, 9140, 9149, 9157, 9165, 9173, 9180, 9187, 9196, 7589, 9202, 9212, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, 0, 1, 763, 241, {8935,9263,6110,9271,9283,9293,9303,1301,0,0,0,0,0,0},{8921,9315,9330,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 9350, 1394, 1377, 1982, 55, 9361, 9372, {9383, 9391, 9400, 9407, 9414, 9423, 2052}, {2059, 2062, 9430, 2069, 9433, 9437, 2080}, {2083, 2085, 9440, 2090, 9442, 2085, 2090}, {5711, 5719, 9445, 6032, 9451, 6085, 6090, 2514, 2521, 5790, 2539, 2548, 0}, {9456, 9465, 7522, 9475, 9483, 9489, 9495, 9501, 9509, 9519, 9528, 9537, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 9546, 241, {9350,1973,9549,2903,2647,1336,1301,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{1377,274,2327,0,0,0,0,0,0,0,0,0},{1394,280,2343,0,0,0,0,0,0}},
- {1301, 1301, 9558, 9569, 9577, 3773, 9585, 9588, {9591, 9598, 9607, 9616, 9628, 9636, 9645}, {9655, 9659, 3928, 9664, 9669, 9673, 9677}, {2752, 5695, 2463, 2463, 9681, 2085, 2090}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, 0, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0},{9569,274,0,0,0,0,0,0,0,0,0,0},{9558,280,0,0,0,0,0,0,0}},
- {9790, 1301, 280, 274, 1982, 9808, 9821, 9824, {9827, 9835, 9843, 2403, 2410, 2418, 9850}, {9858, 9863, 9868, 2446, 2450, 2454, 9872}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{9790,9885,0,0,0,0,0,0},{274,1377,9908,0,0,0,0,0,0,0,0,0},{280,1394,9918,0,0,0,0,0,0}},
- {3732, 2987, 1394, 1377, 1982, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {2987,1320,14,243,9931,9942,1301,0,0,0,0,0,0,0},{3732,9954,9970,0,0,0,0,0},{1377,274,3007,35,0,0,0,0,0,0,0,0},{1394,280,2996,23,0,0,0,0,0}},
- {10012, 2647, 280, 274, 1982, 55, 3781, 3784, {10030, 10036, 10046, 10052, 10063, 10073, 10078}, {10088, 10092, 10096, 10100, 10105, 10109, 10113}, {2085, 2085, 2090, 10117, 2085, 7414, 7414}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10012,5487,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {3991, 243, 2996, 3007, 44, 55, 10243, 10248, {10255, 10266, 10273, 10282, 10289, 10302, 10311}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {5487, 243, 1394, 1377, 1982, 55, 3781, 3784, {10440, 10447, 10453, 10460, 10465, 10471, 10477}, {10483, 10487, 10491, 10495, 10499, 10503, 10507}, {2463, 2090, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {10565, 2647, 1394, 1377, 10583, 4765, 10599, 10604, {10609, 10622, 10641, 10658, 10671, 10684, 10701}, {10714, 8509, 8514, 8519, 8524, 8529, 8534}, {10719, 8542, 8539, 8545, 8548, 8542, 8545}, {10722, 10735, 10746, 10763, 10778, 10793, 10808, 10821, 10836, 10853, 10868, 10885, 0}, {10900, 10911, 10924, 10939, 10952, 10965, 10978, 10989, 11002, 11017, 11030, 11049, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10565,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 2647, 1394, 1377, 1982, 4765, 11146, 11159, {11172, 11187, 11208, 11223, 11236, 11249, 11264}, {493, 498, 11277, 508, 11282, 518, 523}, {528, 531, 11287, 537, 540, 531, 537}, {11290, 11307, 11316, 11331, 11348, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11290, 11307, 11316, 11331, 593, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, 0, 0, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 1992, 11560, {11565, 11573, 11584, 11590, 11596, 11605, 2052}, {9004, 9008, 2450, 11611, 9020, 9025, 11615}, {9033, 9035, 1041, 1049, 9039, 9035, 1049}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {11653, 11672, 1394, 1377, 11682, 2362, 11698, 11703, {11708, 11719, 11730, 11741, 11752, 11763, 11769}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, 2, 1, 763, 241, {11672,2647,1336,1301,0,0,0,0,0,0,0,0,0,0},{11653,11861,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {11881, 5597, 1394, 1377, 5609, 2362, 11908, 11925, {11939, 11950, 11960, 11969, 11980, 11992, 12003}, {12013, 12016, 12019, 12022, 12025, 12028, 12031}, {2090, 2085, 2467, 2465, 7414, 2085, 2090}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,12146,1301,0,0,0,0,0,0,0,0,0,0,0},{11881,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {12156, 1825, 280, 274, 12178, 12193, 12205, 11560, {12211, 12223, 12235, 12247, 12261, 12276, 12289}, {12303, 12016, 12306, 12022, 12309, 12312, 12315}, {2090, 2085, 12319, 2465, 4419, 2085, 9442}, {12321, 12328, 12336, 12342, 12351, 12360, 12370, 12376, 12387, 12397, 12404, 12414, 0}, {12422, 12429, 12437, 12443, 12452, 12461, 12471, 12477, 12488, 12498, 12505, 12515, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, 2, 1, 763, 241, {1825,1301,0,0,0,0,0,0,0,0,0,0,0,0},{12156,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {3732, 1336, 1394, 1377, 1982, 3773, 12592, 12604, {12616, 12631, 12646, 12661, 12678, 12697, 12708}, {12719, 12726, 12733, 12740, 12747, 12754, 12761}, {0, 0, 0, 0, 0, 0, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {3744, 3956, 23, 35, 44, 3773, 12932, 12952, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {13061, 13064, 13067, 13070, 13073, 13076, 13079}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13210, 13225, 13106, 13115, 13238, 13131, 13245, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, 0, 6, 239, 241, {3956,3947,0,0,0,0,0,0,0,0,0,0,0,0},{3744,3977,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {5487, 243, 2996, 3007, 1982, 55, 13258, 13261, {13264, 13277, 13287, 13296, 13306, 13317, 13328}, {13340, 13343, 13348, 13353, 13358, 13363, 13368}, {13340, 13373, 13376, 13379, 13382, 13385, 13388}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, 0, 1, 239, 241, {243,14,1327,2351,1301,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {13628, 2647, 1394, 1377, 44, 4765, 13641, 13649, {13657, 13670, 13691, 13710, 13731, 13750, 13763}, {13774, 13781, 13788, 13795, 13802, 13809, 13816}, {0, 0, 0, 0, 0, 0, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, 0, 1, 763, 241, {2647,1336,14083,243,14093,3720,1301,0,0,0,0,0,0,0},{13628,2969,14104,5487,14123,14134,14146,14163},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {14181, 14187, 14201, 14224, 14238, 14254, 14261}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {14399, 1814, 1394, 274, 14426, 3773, 3781, 3784, {14442, 14450, 14461, 14471, 14482, 14491, 14500}, {14510, 14513, 14516, 14519, 14522, 14525, 14528}, {14531, 2463, 12319, 2471, 12319, 2467, 14531}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, 2, 1, 239, 241, {1814,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14399,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
- {14104, 2647, 280, 274, 1982, 55, 14666, 14687, {14704, 403, 424, 8448, 14717, 14734, 14745}, {14758, 14766, 14774, 14780, 14788, 14796, 14804}, {528, 531, 534, 537, 540, 531, 537}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 0, 0, {14904, 14911, 14922, 14931, 14940, 14947, 14958}, {14968, 14972, 14976, 14980, 14984, 14987, 14991}, {0, 0, 0, 0, 0, 0, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 0, 0, {15160, 15165, 15171, 15181, 15193, 15201, 15212}, {15221, 15225, 15229, 15233, 15237, 15241, 15245}, {0, 0, 0, 0, 0, 0, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 3781, 3784, {15351, 15357, 15368, 15181, 15378, 15201, 15212}, {15387, 15391, 15395, 15233, 15237, 15241, 15245}, {2090, 2463, 15399, 2465, 2090, 5695, 2463}, {15401, 15411, 15422, 15429, 15438, 15444, 15450, 15458, 15466, 15477, 15487, 15496, 0}, {15505, 15259, 15514, 15520, 15283, 2785, 15288, 15295, 15527, 15311, 15319, 15327, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 15541, 15545, {15549, 15556, 15564, 15572, 15581, 15591, 15598}, {2731, 8231, 2737, 15607, 2743, 15610, 2749}, {2090, 2463, 2752, 3872, 2752, 4134, 2090}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {1814,1857,1301,15659,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {15671, 2647, 1394, 1377, 1982, 15703, 15709, 15725, {15747, 15763, 15788, 15816, 15844, 15872, 15900}, {15919, 15929, 15939, 15949, 15959, 15969, 15979}, {15989, 15993, 15997, 15993, 16001, 16005, 16009}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{15671,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 2351, 280, 274, 1982, 2362, 16403, 16408, {5890, 16413, 16424, 16434, 16444, 16454, 16468}, {5976, 5980, 16480, 16485, 16489, 16494, 16499}, {2090, 2463, 2465, 2463, 5695, 2469, 2471}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{274,4983,0,0,0,0,0,0,0,0,0,0},{280,6438,0,0,0,0,0,0,0}},
- {5487, 2351, 280, 274, 44, 55, 16503, 16531, {16553, 16572, 16591, 16613, 16632, 16666, 16691}, {16710, 16721, 16732, 16746, 16757, 16768, 16785}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {17040, 243, 280, 274, 1982, 17065, 17079, 17082, {17085, 17094, 17103, 17113, 17123, 17133, 17145}, {17153, 17158, 17162, 17166, 17170, 17175, 17180}, {17184, 2465, 2465, 9681, 17184, 17187, 2090}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, 0, 0, 239, 241, {243,1301,17306,7084,2987,0,0,0,0,0,0,0,0,0},{17040,17315,9942,0,0,0,0,0},{274,3007,1377,35,0,0,0,0,0,0,0,0},{280,2996,1394,23,0,0,0,0,0}},
- {17334, 2647, 280, 274, 1982, 17352, 17366, 17371, {17376, 17388, 17399, 17413, 17425, 17435, 17445}, {17456, 17461, 17466, 17471, 17476, 17481, 17486}, {2090, 4134, 2463, 6229, 2752, 15399, 2471}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,0,0,0,0,0,0,0,0,0,0},{17334,0,0,0,0,0,0,0},{274,1377,4983,0,0,0,0,0,0,0,0,0},{280,1394,6438,0,0,0,0,0,0}},
- {5487, 243, 1394, 1377, 1982, 55, 18012, 18015, {18019, 18024, 10453, 10460, 18030, 18037, 10477}, {18044, 18048, 10491, 10495, 18052, 10503, 10507}, {12319, 14531, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {18523, 1336, 1394, 1377, 18543, 4765, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{18523,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 18559, 18567, {18575, 18584, 18593, 18601, 18610, 18619, 18626}, {18635, 18638, 18641, 18644, 18647, 18651, 18654}, {6557, 6559, 6561, 6563, 12319, 14531, 6555}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {18696, 18714, 280, 274, 1982, 18725, 0, 0, {33660, 33670, 33679, 33688, 33699, 33709, 33714}, {33721, 33727, 33732, 33737, 33742, 10109, 33746}, {33751, 2752, 2090, 7414, 2085, 7414, 2090}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, 0, 1, 239, 241, {18714,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18696,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {5487, 1327, 6438, 4983, 44, 55, 18892, 18920, {18942, 18961, 18980, 19005, 19024, 19058, 19083}, {19102, 19112, 19122, 19138, 19148, 19173, 19189}, {19199, 19203, 19210, 19214, 19221, 19228, 19235}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 20061, 20102, {20143, 20162, 20181, 20203, 20222, 20244, 20269}, {20288, 20298, 20308, 20321, 20331, 20344, 20360}, {20370, 20374, 20381, 20388, 20395, 20402, 20409}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 7865, 20743, {20746, 20765, 20784, 20809, 20828, 20850, 20875}, {20894, 20904, 20914, 20930, 20940, 20953, 20969}, {20979, 20983, 20990, 20994, 21001, 21008, 21015}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 2351, 280, 274, 1982, 55, 21262, 21287, {21312, 21331, 21353, 21378, 21394, 21416, 21435}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21603, 21622, 21653, 21678, 21700, 0}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21725, 21622, 21653, 21678, 21700, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 21843, 21874, {21899, 21921, 21943, 21968, 21990, 22015, 22043}, {22065, 22075, 22085, 22098, 22108, 22121, 22137}, {22147, 22151, 22158, 22162, 22169, 22176, 22183}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 280, 274, 44, 55, 3781, 3784, {22460, 22479, 22498, 22520, 22539, 22561, 22586}, {22605, 22610, 22618, 22626, 22634, 22642, 22650}, {22661, 22665, 22672, 22679, 22686, 22693, 22700}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {5487, 1327, 6438, 4983, 44, 55, 22938, 22957, {22988, 23013, 23044, 23072, 23097, 23125, 23159}, {23184, 23203, 23228, 23244, 23263, 23282, 23301}, {23311, 23318, 23325, 23332, 23339, 23352, 23359}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
- {23774, 2351, 1937, 1920, 23793, 55, 23801, 23829, {23851, 23870, 23889, 23914, 23933, 23967, 23992}, {24011, 19112, 19122, 19138, 24021, 24046, 19189}, {0, 0, 0, 0, 0, 0, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, 0, 0, 2601, 241, {2351,0,0,0,0,0,0,0,0,0,0,0,0,0},{23774,0,0,0,0,0,0,0},{1920,1928,0,0,0,0,0,0,0,0,0,0},{1937,1948,0,0,0,0,0,0,0}},
- {5487, 2351, 280, 274, 44, 55, 3781, 3784, {16553, 16572, 24363, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {25177, 1444, 280, 274, 25220, 25227, 25253, 25275, {25300, 25328, 25356, 25393, 25424, 25458, 25483}, {25517, 25533, 25549, 25574, 25593, 25615, 25634}, {25656, 25663, 25670, 25677, 25684, 25691, 25695}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,0,0,0,0,0},{25177,26320,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {5487, 243, 280, 274, 1982, 55, 0, 0, {26368, 26377, 26387, 26399, 26412, 26421, 26433}, {26445, 26449, 26454, 26458, 26462, 26466, 26470}, {2090, 2471, 2463, 2463, 14531, 6229, 2090}, {26474, 26481, 26490, 26497, 2781, 26504, 26512, 26523, 26528, 26533, 26540, 26549, 0}, {26474, 26481, 26490, 26497, 2781, 26504, 26557, 26523, 26528, 26533, 26540, 26549, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
- {3732, 1301, 280, 26602, 26610, 26645, 26681, 26697, {26713, 26747, 26778, 26809, 26831, 26874, 26902}, {26927, 26934, 26938, 26942, 26949, 26959, 26966}, {0, 0, 0, 0, 0, 0, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, 0, 0, 2601, 241, {1301,0,0,0,0,0,0,0,0,0,0,0,0,0},{3732,9954,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {5487, 243, 280, 26602, 1982, 55, 27216, 27241, {27266, 27291, 27310, 27338, 27357, 27382, 27401}, {27423, 27431, 27436, 27441, 27446, 27454, 27462}, {0, 0, 0, 0, 0, 0, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {4005, 243, 1394, 1377, 4034, 55, 946, 951, {27783, 27791, 27796, 27803, 27813, 27819, 27826}, {27834, 27838, 3928, 27842, 27847, 27851, 27855}, {2752, 2471, 2463, 2463, 4130, 4134, 2090}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, 2, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,35,1382,0,0,0,0,0,0,0,0},{1394,280,23,1402,0,0,0,0,0}},
- {5487, 2351, 280, 274, 44, 55, 27956, 27968, {27980, 16572, 28008, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {0, 0, 0, 0, 0, 0, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {28093, 1301, 2996, 3007, 28141, 3773, 28151, 28163, {28172, 28188, 28204, 28232, 28248, 28291, 28316}, {28344, 28354, 28364, 28371, 28381, 28397, 28410}, {28420, 28424, 28428, 28432, 28436, 28449, 28456}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, 0, 1, 2601, 241, {1301,1814,1857,243,14,0,0,0,0,0,0,0,0,0},{28093,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {28816, 2987, 2996, 3007, 1982, 28848, 28862, 28872, {28885, 28895, 28902, 28915, 28925, 28935, 28945}, {28885, 28895, 28955, 28915, 28925, 28935, 28945}, {28965, 28969, 28973, 28977, 28981, 28985, 28989}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, 0, 0, 239, 241, {2987,1301,0,0,0,0,0,0,0,0,0,0,0,0},{28816,0,0,0,0,0,0,0},{3007,0,0,0,0,0,0,0,0,0,0,0},{2996,0,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 29476, 3773, 29486, 29527, {29568, 29587, 29606, 29631, 29650, 29672, 29697}, {29716, 24417, 29726, 24440, 29742, 24463, 24479}, {29755, 29759, 29763, 29767, 29771, 29775, 29779}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {243, 14, 2996, 3007, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,30168,0,0,0,0},{3007,1377,0,0,0,0,0,0,0,0,0,0},{2996,1394,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {30186, 30193, 27796, 30199, 30210, 30218, 30227}, {30234, 27838, 3928, 30238, 30242, 30246, 10507}, {2471, 2471, 2463, 2463, 5695, 15399, 2090}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {3744, 2987, 2996, 3007, 44, 3773, 0, 0, {30345, 30352, 30360, 30367, 30374, 30382, 30390}, {30397, 30400, 30403, 30406, 30409, 30412, 30415}, {2471, 2471, 2465, 2471, 12319, 4132, 12319}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {3744, 2987, 2996, 3007, 44, 3773, 30512, 30523, {30533, 30551, 30566, 30588, 30601, 30615, 30632}, {30656, 30664, 30669, 30588, 30601, 30681, 30688}, {0, 0, 0, 0, 0, 0, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 0, 0, {31018, 31026, 14922, 14931, 14940, 31037, 31047}, {15387, 14972, 14976, 14980, 14984, 15241, 31056}, {0, 0, 0, 0, 0, 0, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
- {1960, 2351, 280, 274, 1982, 2362, 31154, 31159, {31164, 31171, 31186, 31200, 31216, 31231, 31247}, {6225, 31262, 2565, 31266, 31270, 31274, 31278}, {2090, 12319, 2463, 2085, 2090, 2465, 12319}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 0, 0, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {3744, 2987, 2996, 3007, 44, 3773, 31351, 31356, {31361, 31377, 31385, 31393, 31402, 31414, 31424}, {31434, 31440, 31446, 31450, 31454, 31462, 3868}, {0, 0, 0, 0, 0, 0, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {31576, 1444, 1394, 1920, 31600, 31617, 31631, 31638, {31645, 31655, 31665, 31675, 31685, 31695, 31705}, {31715, 31722, 31729, 31736, 31743, 31750, 31757}, {31764, 31768, 31772, 31776, 31780, 31784, 31788}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,0,0,0,0,0,0,0,0},{31576,31882,31912,0,0,0,0,0},{1920,1377,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 4765, 0, 0, {26445, 27838, 31942, 31949, 31959, 31964, 31971}, {31978, 4108, 31982, 4839, 31987, 31992, 31997}, {4398, 32002, 32005, 32008, 32011, 32014, 32017}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {32124, 243, 280, 274, 1982, 4765, 0, 0, {32152, 32160, 32167, 32175, 32185, 32193, 1007}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{32124,0,0,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {32404, 32422, 1394, 1377, 32433, 3773, 32449, 32454, {32459, 32484, 32513, 32538, 32551, 32566, 32583}, {32598, 32603, 32608, 32613, 32618, 32623, 8534}, {32628, 32628, 32631, 8545, 8548, 32628, 8545}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, 0, 1, 763, 241, {32422,32988,2903,3947,32997,0,0,0,0,0,0,0,0,0},{32404,33008,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 0, 0, {33027, 33039, 33050, 33062, 33074, 33084, 33096}, {33111, 33116, 33121, 33126, 33131, 33136, 33141}, {0, 0, 0, 0, 0, 0, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {5487, 243, 280, 274, 1982, 55, 6008, 6013, {33302, 33315, 33323, 33332, 33342, 33352, 33361}, {33373, 33377, 33381, 33385, 33389, 33393, 33397}, {2752, 2471, 2463, 7414, 12319, 5695, 2090}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
- {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,2895,33792,2903,1301,0,0,0,0,0,0,0,0},{2628,1960,33802,0,0,0,0,0},{274,1377,8087,8077,2922,8110,8115,8096,8102,0,0,0},{280,1394,8147,8160,2947,2933,2962,0,0}},
- {5487, 243, 280, 274, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,3720,14,1312,1320,1327,1301,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {4748, 14083, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {14083,1312,1336,1857,1327,243,1301,0,0,0,0,0,0,0},{4748,3732,3967,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {2628, 2647, 280, 274, 1982, 2362, 6145, 6148, {6151, 6160, 6168, 6177, 6188, 6197, 6206}, {4104, 4108, 2565, 6213, 6217, 6221, 6225}, {2752, 2471, 2463, 2463, 6229, 4134, 2090}, {6231, 6239, 6248, 6254, 6261, 6268, 6275, 6282, 6289, 6299, 6307, 6316, 0}, {6325, 6333, 4150, 6342, 6349, 6356, 6363, 4173, 6370, 6380, 1116, 6388, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, 2, 1, 763, 241, {2647,1336,11642,1320,6421,1301,0,0,0,0,0,0,0,0},{2628,6429,3732,0,0,0,0,0},{274,1377,8087,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {4748, 14083, 1394, 1377, 1982, 55, 946, 951, {7093, 7100, 7108, 7116, 7125, 7135, 7143}, {7152, 4401, 7155, 7158, 7161, 7164, 7167}, {7170, 2463, 2752, 3872, 2752, 4134, 7170}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 239, 241, {14083,1312,1327,1336,2883,1301,0,0,0,0,0,0,0,0},{4748,3967,3732,5530,0,0,0,0},{1377,274,33812,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 2647, 280, 274, 1982, 2362, 2370, 2375, {2380, 9835, 33822, 2403, 2410, 2418, 33829}, {2433, 9863, 33837, 2446, 2450, 2454, 6004}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
- {7648, 2351, 280, 274, 4034, 33841, 946, 951, {27783, 33845, 33859, 33872, 33885, 33898, 27826}, {4104, 7754, 7758, 7762, 7766, 7770, 4125}, {2752, 2090, 2465, 7774, 7774, 2090, 2090}, {33910, 33918, 33928, 27877, 27883, 33935, 33941, 6282, 27900, 27909, 27917, 33947, 0}, {33910, 33918, 33928, 27877, 27883, 33935, 33941, 6282, 27900, 27909, 27917, 33947, 0}, {2838, 33775, 3928, 27939, 2781, 2855, 2859, 18692, 17293, 27952, 2875, 2879, 0}, {2838, 33775, 3928, 27939, 2781, 2855, 2859, 18692, 17293, 27952, 2875, 2879, 0}, 2, 1, 2601, 241, {2351,14134,24833,2903,14,1301,0,0,0,0,0,0,0,0},{7648,4258,33956,33965,0,0,0,0},{274,33974,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
- {9790, 1973, 280, 274, 1982, 9808, 9821, 9824, {9827, 9835, 9843, 2403, 2410, 2418, 9850}, {9858, 9863, 9868, 2446, 2450, 2454, 9872}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{9790,9885,0,0,0,0,0,0},{274,1377,9908,0,0,0,0,0,0,0,0,0},{280,1394,9918,0,0,0,0,0,0}},
- {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {33985, 33996, 34020, 34050, 34067, 34089, 34098}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 243, 280, 274, 1982, 55, 946, 951, {17719, 17733, 17743, 17754, 17768, 17779, 17790}, {17803, 17808, 17813, 17820, 17826, 17832, 17838}, {2752, 2471, 2463, 7414, 2752, 12319, 2090}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, 2, 1, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{3732,5487,9942,9931,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {5487, 243, 1394, 1377, 1982, 55, 18012, 18015, {18019, 18024, 10453, 10460, 18030, 18037, 10477}, {18044, 18048, 10491, 10495, 18052, 10503, 10507}, {12319, 14531, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {34222, 2647, 280, 274, 1982, 18725, 0, 0, {18732, 18747, 18762, 18777, 18794, 18811, 18820}, {18831, 18838, 18845, 18852, 18859, 18866, 18873}, {18880, 18883, 8545, 8548, 8542, 18886, 18889}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {2647,1336,18714,2903,14,1301,0,0,0,0,0,0,0,0},{34222,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {5487, 1327, 6438, 4983, 44, 55, 18892, 18920, {18942, 18961, 18980, 19005, 19024, 19058, 19083}, {19102, 19112, 19122, 19138, 19148, 19173, 19189}, {19199, 19203, 19210, 19214, 19221, 19228, 19235}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 5, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
- {34243, 1444, 1394, 1377, 34319, 34351, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,1857,0,0,0,0},{34243,34386,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {34470, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {34490, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {34490, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {34498, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {34498, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,34503,1301,0,0,0,0,0,0,0,0,0,0},{34470,34513,34525,9931,0,0,0,0},{274,1377,34535,34547,8110,8115,8102,0,0,0,0,0},{280,1394,2947,2933,2962,0,0,0,0}},
- {2969, 14083, 2996, 3007, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {14083,1312,1320,2987,14,243,3967,5500,1301,1857,1814,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,1377,274,0,0,0,0,0,0,0,0,0},{2996,1394,280,0,0,0,0,0,0}},
- {4005, 243, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 4130, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 2, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,2883,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,1382,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
- {3732, 1301, 280, 274, 44, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 0, 0, 2601, 241, {1301,5871,1327,6136,14,3720,0,0,0,0,0,0,0,0},{3732,9931,0,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {17334, 1973, 1394, 1377, 1982, 17352, 17366, 17371, {34558, 34566, 34574, 34582, 34594, 34603, 34615}, {17456, 17461, 17466, 17471, 17476, 17481, 17486}, {2090, 2463, 2752, 6229, 2752, 15399, 2471}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {34626, 34637, 34644, 34652, 34659, 34666, 34673, 34681, 34687, 34695, 34703, 34711, 0}, {34626, 34637, 34644, 34652, 34659, 34666, 34673, 34681, 34687, 34695, 34703, 34711, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{17334,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {1422, 2987, 1937, 1920, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1920,1928,1377,274,0,0,0,0,0,0,0,0},{1937,1948,1394,280,0,0,0,0,0}},
- {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,2895,2903,1973,1301,0,0,0,0,0,0,0,0},{2628,1960,2910,0,0,0,0,0},{274,1377,2327,2922,0,0,0,0,0,0,0,0},{280,2933,2947,2962,0,0,0,0,0}},
- {34718, 243, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,14,1320,1301,5871,34729,3967,14134,0,0,0,0,0,0},{34718,34737,6429,3744,0,0,0,0},{3007,35,274,1377,0,0,0,0,0,0,0,0},{2996,23,280,1394,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,14083,1320,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {4748, 2647, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 763, 241, {2647,1336,33792,2903,1301,0,0,0,0,0,0,0,0,0},{4748,3732,4974,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {3991, 2351, 1394, 1377, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,35,0,0,0,0,0,0,0,0,0},{1394,280,23,0,0,0,0,0,0}},
- {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,34750,34777,2603,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,2895,33792,2903,1301,0,0,0,0,0,0,0,0},{2628,1960,33802,0,0,0,0,0},{274,1377,8087,8077,2922,8110,8115,8096,8102,0,0,0},{280,1394,8147,8160,2947,2933,2962,0,0}},
- {2969, 14083, 2996, 3007, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {14083,1312,14,2895,1301,0,0,0,0,0,0,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,35,274,1377,0,0,0,0,0,0,0,0},{2996,23,280,1394,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {3991, 2351, 1394, 1377, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,35,0,0,0,0,0,0,0,0,0},{1394,280,23,0,0,0,0,0,0}},
- {5487, 243, 280, 274, 1982, 55, 946, 951, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 2, 1, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {4005, 3956, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {3956,3947,1320,14,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 2351, 1394, 1377, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 0, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,35,0,0,0,0,0,0,0,0,0},{1394,280,23,0,0,0,0,0,0}},
- {5487, 1814, 23, 35, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,3956,1320,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 44, 2362, 34863, 34881, {34896, 34909, 34928, 34941, 34956, 34973, 11264}, {34984, 34991, 34998, 35005, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 14834, 14843, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 14834, 14843, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {3744, 243, 23, 35, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,14083,1320,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {14104, 243, 23, 35, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {14104, 243, 23, 35, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,274,1377,0,0,0,0,0,0,0,0},{23,2996,280,1394,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1301,1857,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {4005, 243, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1301,1857,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {4005, 2351, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 2601, 241, {2351,1327,14,1320,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
- {5487, 2351, 280, 274, 44, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,0,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {35384, 2987, 2996, 3007, 44, 4765, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {2987,1320,243,14,1301,0,0,0,0,0,0,0,0,0},{35384,13628,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
- {3744, 3764, 2996, 3007, 4034, 7676, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {33985, 33996, 34020, 34050, 34067, 34089, 34098}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
- {1960, 2647, 280, 274, 1982, 2362, 2370, 2375, {2380, 9835, 33822, 2403, 2410, 2418, 33829}, {2433, 9863, 33837, 2446, 2450, 2454, 6004}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {8945, 8954, 8966, 8973, 8981, 8991, 8997}, {9004, 9008, 9012, 9016, 9020, 9025, 9029}, {0, 0, 0, 0, 0, 0, 0}, {2473, 2480, 34822, 2494, 2500, 2504, 2509, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2504, 2509, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 0, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {14181, 14187, 14201, 14224, 14238, 14254, 14261}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {34222, 2647, 280, 274, 1982, 18725, 0, 0, {18732, 18747, 18762, 18777, 18794, 18811, 18820}, {18831, 18838, 18845, 18852, 18859, 18866, 18873}, {18880, 18883, 8545, 8548, 8542, 18886, 18889}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {2647,1336,18714,2903,14,1301,0,0,0,0,0,0,0,0},{34222,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {24812, 24833, 1394, 1377, 24842, 4765, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 763, 241, {24833,1301,0,0,0,0,0,0,0,0,0,0,0,0},{24812,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {1960, 2647, 280, 274, 1982, 2362, 946, 951, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {7266, 7271, 7275, 7279, 7283, 7287, 7291}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
- {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3732, 1336, 1394, 1377, 1982, 3773, 12592, 12604, {12616, 12631, 12646, 12661, 12678, 12697, 12708}, {12719, 12726, 12733, 12740, 12747, 12754, 12761}, {0, 0, 0, 0, 0, 0, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {18696, 18714, 280, 274, 1982, 18725, 0, 0, {33660, 33670, 33679, 33688, 33699, 33709, 33714}, {33721, 33727, 33732, 33737, 33742, 10109, 33746}, {33751, 2752, 2090, 7414, 2085, 7414, 2090}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, 0, 1, 239, 241, {18714,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18696,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
- {34243, 1444, 1394, 1377, 34319, 34351, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,1857,0,0,0,0},{34243,34386,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
- {3991, 2351, 1394, 1377, 44, 55, 29235, 29245, {29258, 29265, 29271, 29278, 29284, 29290, 29298}, {29308, 29312, 29316, 29320, 29324, 29328, 29332}, {12319, 12319, 12319, 12319, 12319, 12319, 12319}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, 0, 0, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,29470,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
- {3744, 2987, 2996, 3007, 44, 3773, 0, 0, {30345, 30352, 30360, 30367, 30374, 30382, 30390}, {30397, 30400, 30403, 30406, 30409, 30412, 30415}, {2471, 2471, 2465, 2471, 12319, 4132, 12319}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}}
+ {289, 308, 323, 331, 336, 352, 359, 371, {383, 396, 417, 432, 443, 462, 473}, {486, 491, 496, 501, 506, 511, 516}, {521, 524, 527, 530, 533, 524, 530}, {536, 549, 566, 575, 586, 593, 600, 607, 620, 639, 656, 671, 0}, {536, 549, 566, 575, 586, 593, 600, 607, 620, 639, 656, 671, 0}, {688, 694, 566, 704, 586, 593, 600, 712, 720, 730, 738, 748, 0}, {688, 694, 566, 704, 586, 593, 600, 712, 720, 730, 738, 748, 0}, 2, 1, 756, 241, {308,758,774,790,0,0,0,0,0,0,0,0,0,0},{289,807,825,850,0,0,0,0},{874,886,0,0,0,0,0,0,0,0,0,0},{897,912,0,0,0,0,0,0,0}},
+ {926, 243, 323, 331, 949, 352, 964, 969, {974, 983, 991, 999, 1008, 1015, 1025}, {1034, 1037, 1040, 1043, 1046, 1049, 1052}, {1055, 1057, 1059, 1061, 1063, 1065, 1067}, {1069, 1075, 1082, 1088, 1094, 1099, 1104, 1111, 1117, 1126, 1134, 1143, 0}, {1152, 1161, 1171, 1180, 1190, 1198, 1206, 1216, 1226, 1238, 1250, 1262, 0}, {1274, 1279, 1082, 1285, 1094, 1099, 1290, 1295, 1299, 1304, 1309, 1314, 0}, {1274, 1279, 1082, 1285, 1094, 1099, 1290, 1295, 1299, 1304, 1309, 1314, 0}, 2, 1, 239, 241, {243,14,1319,1330,1338,1345,1354,0,0,0,0,0,0,0},{1363,1389,1405,0,0,0,0,0},{274,331,1421,0,0,0,0,0,0,0,0,0},{280,323,1433,0,0,0,0,0,0}},
+ {1453, 1475, 1979, 1959, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {34084, 34091, 34098, 34105, 34112, 34119, 34126}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, 0, 0, 239, 241, {1475,1845,1319,0,0,0,0,0,0,0,0,0,0,0},{1453,6718,0,0,0,0,0,0},{1959,1951,274,331,0,0,0,0,0,0,0,0},{1979,1968,280,323,0,0,0,0,0}},
+ {1991, 2004, 323, 331, 2015, 2025, 2033, 2038, {2043, 2051, 2061, 2069, 2077, 2086, 2093}, {2100, 2103, 2106, 2110, 2113, 2117, 2121}, {2124, 2126, 2128, 2131, 2133, 2126, 2131}, {2136, 2142, 2148, 2156, 2162, 2170, 2178, 2188, 2194, 2202, 2210, 2219, 0}, {2228, 2234, 2241, 2249, 2255, 2263, 2271, 2281, 2194, 2287, 2295, 2305, 0}, {2314, 2317, 2320, 2323, 2326, 2329, 2332, 2335, 2338, 2341, 2345, 2349, 0}, {2314, 2317, 2320, 2323, 2326, 2329, 2332, 2335, 2338, 2341, 2345, 2349, 0}, 2, 1, 2353, 241, {2356,2365,1319,1827,1867,0,0,0,0,0,0,0,0,0},{1991,0,0,0,0,0,0,0},{331,274,2372,2380,0,0,0,0,0,0,0,0},{323,280,2385,2396,0,0,0,0,0}},
+ {1991, 2404, 280, 274, 2015, 2025, 2415, 2420, {2425, 2433, 2440, 2448, 2455, 2463, 2470}, {2478, 2483, 2487, 2491, 2495, 2499, 2503}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {2518, 2525, 2533, 2539, 2545, 2549, 2554, 2559, 2566, 2576, 2584, 2593, 0}, {2518, 2525, 2533, 2539, 2545, 2549, 2554, 2559, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 2646, 241, {2404,1345,1319,2648,0,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {2673, 2692, 280, 274, 2015, 2025, 2703, 2709, {2716, 2724, 2731, 2740, 2749, 2760, 2768}, {2776, 2779, 2782, 2785, 2788, 2791, 2794}, {2131, 2508, 2797, 2508, 2797, 2514, 2131}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, 2, 1, 756, 241, {2692,2928,1354,2940,2948,2356,1319,0,0,0,0,0,0,0},{2673,1991,2955,0,0,0,0,0},{274,331,2380,2967,0,0,0,0,0,0,0,0},{280,2978,2992,3007,0,0,0,0,0}},
+ {3014, 3032, 3041, 3052, 2015, 352, 3060, 3067, {3074, 3089, 3104, 3115, 3130, 3143, 3162}, {3177, 3184, 3191, 3198, 3205, 3212, 3219}, {3226, 3229, 3232, 3232, 3235, 3235, 3238}, {3241, 3262, 3285, 3300, 3317, 3328, 3343, 3358, 3377, 3400, 3419, 3438, 0}, {3459, 3480, 3503, 3518, 3535, 3546, 3561, 3576, 3595, 3618, 3637, 3656, 0}, {3677, 3684, 3691, 3698, 3705, 3712, 3721, 3730, 3737, 3744, 3751, 3758, 0}, {3677, 3684, 3691, 3698, 3705, 3712, 3721, 3730, 3737, 3744, 3751, 3758, 0}, 2, 1, 239, 241, {3032,243,1338,14,3765,1319,0,0,0,0,0,0,0,0},{3014,3777,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {3789, 3808, 3041, 3052, 2015, 3817, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {1991, 2356, 323, 331, 2015, 4368, 4378, 4382, {4386, 4398, 4410, 4420, 4434, 4444, 4456}, {4467, 4470, 4473, 4476, 4479, 4482, 4485}, {2131, 2508, 2510, 4488, 2510, 2126, 2516}, {4490, 4499, 4508, 4518, 4527, 4536, 4545, 4555, 4562, 4570, 4578, 4588, 0}, {4597, 4608, 4619, 4631, 4642, 4653, 4664, 4676, 4685, 4695, 4705, 4717, 0}, {4728, 4734, 4740, 4747, 4753, 4759, 4765, 4772, 4776, 4781, 4786, 4793, 0}, {4728, 4734, 4740, 4747, 4753, 4759, 4765, 4772, 4776, 4781, 4786, 4793, 0}, 2, 1, 756, 241, {2356,2692,2948,1319,0,0,0,0,0,0,0,0,0,0},{4799,4816,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 352, 3824, 3827, {4851, 4860, 4866, 4872, 4881, 4887, 4896}, {4903, 4908, 4913, 4918, 4923, 4928, 4933}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, 2, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{4834,5053,3777,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {5086, 243, 280, 274, 2015, 55, 5104, 5117, {5128, 5146, 5160, 5178, 5196, 5214, 5230}, {5244, 5256, 5268, 5280, 5292, 5304, 5316}, {5323, 5326, 5329, 5332, 5335, 5338, 5341}, {5344, 5355, 5368, 5375, 5386, 5393, 5402, 5411, 5424, 5437, 5452, 5465, 0}, {5344, 5355, 5368, 5375, 5386, 5393, 5402, 5411, 5424, 5437, 5452, 5465, 0}, {5476, 5485, 5368, 5494, 5386, 5503, 5512, 5521, 5530, 5539, 5548, 5557, 0}, {5476, 5485, 5368, 5494, 5386, 5503, 5512, 5521, 5530, 5539, 5548, 5557, 0}, 0, 0, 239, 241, {243,5566,14,1,1345,2404,5579,1319,5592,5609,0,0,0,0},{5086,5566,5619,5641,5592,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}},
+ {5662, 5676, 323, 331, 5688, 5699, 5707, 5711, {5715, 5725, 5733, 5738, 5745, 5758, 5766}, {4193, 5774, 4488, 5776, 5780, 2126, 5783}, {4193, 5774, 4488, 5787, 5780, 2126, 5787}, {5790, 5798, 5807, 5816, 5825, 5832, 5840, 5848, 5858, 5869, 2584, 2593, 0}, {5790, 5798, 5807, 5816, 5825, 5832, 5840, 5848, 5858, 5869, 2584, 2593, 0}, {5878, 1279, 5883, 5890, 5896, 5902, 5908, 5914, 5919, 5926, 1309, 5931, 0}, {5878, 1279, 5883, 5890, 5896, 5902, 5908, 5914, 5919, 5926, 1309, 5931, 0}, 0, 1, 756, 241, {5676,5936,1319,5950,0,0,0,0,0,0,0,0,0,0},{5662,0,0,0,0,0,0,0},{331,274,3052,0,0,0,0,0,0,0,0,0},{323,280,3041,0,0,0,0,0,0}},
+ {1991, 2356, 280, 274, 2015, 2025, 5959, 5964, {5969, 5980, 5991, 6005, 6019, 6031, 6043}, {6055, 6059, 6064, 6069, 6074, 6078, 6083}, {1067, 6087, 6089, 6087, 6092, 6092, 1057}, {6094, 6102, 4955, 6111, 6118, 6123, 6130, 6137, 2566, 5869, 6145, 6155, 0}, {6094, 6102, 4955, 6111, 6118, 6123, 6130, 6137, 2566, 5869, 6145, 6155, 0}, {2602, 2606, 2610, 2614, 6118, 6164, 6169, 6174, 2630, 2634, 6180, 6185, 0}, {2602, 2606, 2610, 2614, 6118, 6164, 6169, 6174, 2630, 2634, 6180, 6185, 0}, 2, 1, 756, 241, {2356,1354,6189,6201,1319,6215,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 352, 6224, 6227, {6230, 6239, 6247, 6256, 6267, 6276, 6285}, {4163, 4167, 2610, 6292, 6296, 6300, 6304}, {2797, 2516, 2508, 2508, 6308, 4193, 2131}, {6310, 6318, 6327, 6333, 6340, 6347, 6354, 6361, 6368, 6378, 6386, 6395, 0}, {6404, 6412, 4209, 6421, 6428, 6435, 6442, 4232, 6449, 6459, 1134, 6467, 0}, {6476, 2606, 2610, 2614, 6480, 6484, 6488, 4278, 6492, 6496, 2638, 4286, 0}, {6476, 2606, 2610, 2614, 6480, 6484, 6488, 4278, 6492, 6496, 2638, 4286, 0}, 2, 1, 239, 241, {243,3765,14,6500,1338,1319,0,0,0,0,0,0,0,0},{4834,6508,3777,0,0,0,0,0},{274,331,2380,5062,0,0,0,0,0,0,0,0},{280,2396,6517,0,0,0,0,0,0}},
+ {1453, 1845, 323, 331, 1484, 1500, 6526, 6533, {6540, 6550, 6560, 6570, 6580, 6590, 6600}, {1646, 6610, 6614, 6618, 6622, 6626, 6630}, {1646, 6610, 6614, 6618, 6622, 6626, 6630}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {1845,1888,1874,1475,6661,6680,6697,1319,0,0,0,0,0,0},{1453,6718,6742,6769,0,0,0,0},{331,274,1951,1959,0,0,0,0,0,0,0,0},{323,280,1968,1979,0,0,0,0,0}},
+ {6798, 1319, 1968, 1951, 6827, 6844, 6858, 6865, {6872, 6882, 6892, 6902, 6912, 6922, 6932}, {6942, 6946, 6950, 6954, 6958, 6962, 6966}, {6942, 6946, 6950, 6954, 6958, 6962, 6966}, {6970, 6975, 6980, 6985, 6990, 6995, 7000, 7005, 7010, 7015, 7021, 7027, 0}, {6970, 6975, 6980, 6985, 6990, 6995, 7000, 7005, 7010, 7015, 7021, 7027, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1319,5950,1867,1827,0,0,0,0,0,0,0,0,0,0},{6798,7033,7057,7084,7106,7137,0,0},{1951,1959,331,274,0,0,0,0,0,0,0,0},{1968,1979,323,280,0,0,0,0,0}},
+ {4834, 7163, 280, 274, 2015, 352, 964, 969, {7172, 7179, 7187, 7195, 7204, 7214, 7222}, {7231, 4470, 7234, 7237, 7240, 7243, 7246}, {7249, 2508, 2797, 3915, 2797, 4193, 7249}, {7251, 7259, 7268, 2539, 7274, 2549, 2554, 7278, 2566, 2576, 2584, 2593, 0}, {7251, 7259, 7268, 2539, 7274, 2549, 2554, 7278, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 7287, 2614, 7274, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 7287, 2614, 7274, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 2646, 241, {7163,2365,1345,14,1354,2928,1319,0,0,0,0,0,0,0},{4834,6508,3777,5053,0,0,0,0},{331,274,2380,7291,7303,0,0,0,0,0,0,0},{323,280,7315,7330,0,0,0,0,0}},
+ {1991, 2692, 280, 274, 2015, 2025, 964, 969, {2425, 2433, 2440, 2448, 2455, 2463, 2470}, {7345, 7350, 7354, 7358, 7362, 7366, 7370}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, 2, 1, 756, 241, {2692,1354,2948,1319,2928,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,7375,5062,0,0,0,0,0,0,0,0},{280,323,7386,6517,0,0,0,0,0}},
+ {3777, 1319, 280, 274, 2015, 352, 3824, 3827, {7400, 7410, 7424, 7431, 7438, 7447, 2093}, {7455, 7462, 7467, 7471, 7476, 7481, 7485}, {2124, 2126, 3915, 7490, 7493, 2126, 2131}, {7495, 7504, 7509, 7516, 2545, 7526, 7535, 7542, 7552, 7562, 2210, 7575, 0}, {7585, 7594, 7601, 7607, 7616, 7621, 7629, 7635, 7644, 7654, 7668, 7678, 0}, {7686, 7690, 2610, 7694, 2545, 7698, 7702, 7706, 7710, 7714, 7719, 7723, 0}, {7686, 7690, 2610, 7694, 2545, 7698, 7702, 7706, 7710, 7714, 7719, 7723, 0}, 2, 1, 2646, 241, {1319,5950,0,0,0,0,0,0,0,0,0,0,0,0},{3777,5566,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4068, 243, 280, 274, 949, 4096, 3824, 3827, {4108, 7727, 7741, 7754, 7767, 7780, 4155}, {4163, 7792, 7796, 7800, 7804, 7808, 4184}, {2797, 2131, 2510, 7812, 7812, 2131, 2131}, {7814, 7822, 7832, 1088, 7839, 7844, 7850, 4232, 7856, 7865, 7873, 7882, 0}, {7814, 7822, 7832, 1088, 7839, 7844, 7850, 4232, 7856, 7865, 7873, 7882, 0}, {2602, 7891, 2610, 4274, 4966, 2618, 2622, 4278, 6492, 7895, 2638, 7899, 0}, {2602, 7891, 2610, 4274, 4966, 2618, 2622, 4278, 6492, 7895, 2638, 7899, 0}, 0, 0, 239, 241, {243,14,3032,1338,1345,2404,2365,7163,1354,2692,2928,2948,2356,1319},{4068,4346,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {7903, 2404, 280, 274, 2015, 352, 7932, 7935, {7938, 7947, 4866, 7957, 7965, 7973, 7982}, {7988, 7991, 4470, 7995, 7998, 8002, 2121}, {2797, 6308, 2508, 2508, 6308, 4193, 2131}, {8005, 8013, 4955, 8020, 8027, 8032, 8042, 8050, 8056, 8066, 2584, 2593, 0}, {8005, 8013, 4955, 8020, 8027, 8032, 8042, 8050, 8056, 8066, 2584, 2593, 0}, {8074, 8081, 4955, 5030, 8027, 8087, 8094, 8050, 8099, 1304, 1309, 5931, 0}, {8074, 8081, 4955, 5030, 8027, 8087, 8094, 8050, 8099, 1304, 1309, 5931, 0}, 2, 1, 2646, 241, {243,14,1330,8105,1338,243,1319,0,0,0,0,0,0,0},{3014,3777,5053,0,0,0,0,0},{274,331,8113,8125,8136,8144,8154,8163,2967,8169,8177,8182},{280,323,8185,8200,2992,2978,8214,8227,3007}},
+ {3777, 2692, 323, 331, 2015, 352, 3824, 3827, {8239, 8249, 8254, 8261, 8270, 8274, 8281}, {8292, 8295, 8298, 2785, 8301, 8304, 8307}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {8311, 8320, 8330, 8337, 4966, 8345, 8351, 2559, 8357, 8368, 8378, 8388, 0}, {8311, 8320, 8330, 8337, 4966, 8345, 8351, 2559, 8357, 8368, 8378, 8388, 0}, {8398, 8403, 4913, 8408, 4966, 8413, 8418, 5914, 5041, 1304, 1309, 5931, 0}, {8398, 8403, 4913, 8408, 4966, 8413, 8418, 5914, 5041, 1304, 1309, 5931, 0}, 0, 1, 756, 241, {2692,2356,1319,0,0,0,0,0,0,0,0,0,0,0},{3777,0,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {807, 2692, 323, 331, 2015, 352, 8423, 8443, {8469, 8492, 417, 8515, 8526, 8541, 8556}, {8571, 8576, 8581, 8586, 8591, 8596, 8601}, {8606, 8609, 8606, 8612, 8615, 8609, 8612}, {8618, 8631, 8646, 8655, 8668, 8675, 8684, 8693, 8706, 8723, 8738, 8751, 0}, {8766, 8779, 8794, 8805, 8818, 8825, 8834, 8843, 8858, 8875, 8890, 8903, 0}, {8918, 8926, 8646, 8936, 8668, 8675, 8684, 8944, 8952, 8962, 8970, 8980, 0}, {8918, 8926, 8646, 8936, 8668, 8675, 8684, 8944, 8952, 8962, 8970, 8980, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{807,289,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 44, 2025, 3824, 3827, {9012, 9021, 9033, 9040, 9048, 9058, 9064}, {9071, 9075, 9079, 9083, 9087, 9092, 9096}, {9100, 9102, 9104, 1067, 9106, 9102, 1067}, {9109, 9119, 9128, 9136, 9144, 9152, 9159, 9166, 9174, 2210, 9180, 9188, 0}, {9197, 9207, 9216, 9224, 9232, 9240, 9247, 9254, 9263, 7668, 9269, 9279, 0}, {9288, 9292, 9297, 9302, 9306, 7702, 9310, 9314, 9318, 7719, 9322, 9326, 0}, {9288, 9292, 9297, 9302, 9306, 7702, 9310, 9314, 9318, 7719, 9322, 9326, 0}, 0, 1, 756, 241, {9002,9330,6189,9338,9350,9360,9370,1319,0,0,0,0,0,0},{8988,9382,9397,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2356, 323, 331, 2015, 2025, 9417, 9428, {9439, 9447, 9456, 9463, 9470, 9479, 2093}, {2100, 2103, 9486, 2110, 9489, 9493, 2121}, {2124, 2126, 9496, 2131, 9498, 2126, 2131}, {5790, 5798, 9501, 6111, 9507, 6164, 6169, 2559, 2566, 5869, 2584, 2593, 0}, {9512, 9521, 7601, 9531, 9539, 9545, 9551, 9557, 9565, 9575, 9584, 9593, 0}, {2602, 2606, 2610, 2614, 9507, 6164, 6169, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 9507, 6164, 6169, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 756, 241, {2004,2356,9602,2948,2692,1354,1319,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{331,274,2380,0,0,0,0,0,0,0,0,0},{323,280,2396,0,0,0,0,0,0}},
+ {3014, 2356, 280, 274, 2015, 352, 9611, 9614, {9617, 9624, 9633, 9642, 9654, 9662, 9671}, {9681, 9685, 3971, 9690, 9695, 9699, 9703}, {2797, 5774, 2508, 2508, 9707, 2126, 2131}, {9709, 9715, 4955, 9722, 2545, 9728, 9736, 9743, 9749, 9757, 9763, 9771, 0}, {9709, 9715, 4955, 9722, 2545, 9728, 9736, 9743, 9749, 9757, 9763, 9771, 0}, {2883, 9779, 3971, 9783, 9787, 9791, 9795, 9799, 9703, 9803, 9807, 9812, 0}, {2883, 9779, 3971, 9783, 9787, 9791, 9795, 9799, 9703, 9803, 9807, 9812, 0}, 0, 1, 756, 241, {1319,5950,0,0,0,0,0,0,0,0,0,0,0,0},{1319,0,0,0,0,0,0,0},{9816,274,0,0,0,0,0,0,0,0,0,0},{9824,280,0,0,0,0,0,0,0}},
+ {9835, 1319, 280, 274, 2015, 9853, 9866, 9869, {9872, 9880, 9888, 2448, 2455, 2463, 9895}, {9903, 9908, 9913, 2491, 2495, 2499, 9917}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {7251, 7259, 4955, 2539, 2545, 2549, 2554, 9922, 2566, 2576, 2584, 2593, 0}, {7251, 7259, 4955, 2539, 2545, 2549, 2554, 9922, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 2646, 241, {1319,5950,0,0,0,0,0,0,0,0,0,0,0,0},{9835,9930,0,0,0,0,0,0},{274,331,9953,0,0,0,0,0,0,0,0,0},{280,323,9963,0,0,0,0,0,0}},
+ {3777, 3032, 323, 331, 2015, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {3032,1338,14,243,9976,9987,1319,0,0,0,0,0,0,0},{3777,9999,10015,0,0,0,0,0},{331,274,3052,35,0,0,0,0,0,0,0,0},{323,280,3041,23,0,0,0,0,0}},
+ {10057, 2356, 280, 274, 2015, 352, 3824, 3827, {10074, 10080, 10090, 10096, 10107, 10117, 10122}, {10132, 10136, 10140, 10144, 10149, 10153, 10157}, {2126, 2126, 2131, 10161, 2126, 7493, 7493}, {10164, 10169, 10176, 10181, 10187, 10194, 10202, 10209, 10218, 10225, 10230, 10237, 0}, {10164, 10169, 10176, 10181, 10187, 10194, 10202, 10209, 10218, 10225, 10230, 10237, 0}, {10245, 10249, 3971, 10254, 3940, 10258, 10262, 10266, 10271, 10275, 10279, 10283, 0}, {10245, 10249, 3971, 10254, 3940, 10258, 10262, 10266, 10271, 10275, 10279, 10283, 0}, 0, 1, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{10287,5566,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {4054, 243, 3041, 3052, 44, 55, 10305, 10310, {10317, 10328, 10335, 10344, 10351, 10364, 10373}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10382, 10393, 10404, 10413, 10424, 10429, 10436, 10447, 10456, 10467, 10480, 10491, 0}, {10382, 10393, 10404, 10413, 10424, 10429, 10436, 10447, 10456, 10467, 10480, 10491, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {5566, 243, 323, 331, 2015, 55, 3824, 3827, {10502, 10509, 10515, 10522, 10527, 10533, 10539}, {10545, 10549, 10553, 10557, 10561, 10565, 10569}, {2508, 2131, 2131, 10573, 4488, 4191, 2131}, {10575, 10583, 10592, 2820, 10598, 2830, 2835, 10602, 2847, 2857, 2865, 10610, 0}, {10575, 10583, 10592, 2820, 10598, 2830, 2835, 10602, 2847, 2857, 2865, 10610, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 10619, 2912, 2916, 2920, 10623, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 10619, 2912, 2916, 2920, 10623, 0}, 0, 0, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {10627, 2692, 323, 331, 10645, 352, 10661, 10666, {10671, 10684, 10703, 10720, 10733, 10746, 10763}, {10776, 8576, 8581, 8586, 8591, 8596, 8601}, {10781, 8609, 8606, 8612, 8615, 8609, 8612}, {10784, 10797, 10808, 10825, 10840, 10855, 10870, 10883, 10898, 10915, 10930, 10947, 0}, {10962, 10973, 10986, 11001, 11014, 11027, 11040, 11051, 11064, 11079, 11092, 11111, 0}, {11124, 11131, 11138, 11145, 11152, 11159, 11166, 11173, 11180, 11187, 11194, 11201, 0}, {11124, 11131, 11138, 11145, 11152, 11159, 11166, 11173, 11180, 11187, 11194, 11201, 0}, 0, 1, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{10627,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {3777, 1354, 280, 274, 2015, 352, 11208, 11221, {11234, 11249, 11270, 11285, 11298, 11311, 11326}, {486, 491, 11339, 501, 11344, 511, 516}, {521, 524, 11349, 530, 533, 524, 530}, {11352, 11369, 11378, 11393, 11410, 11425, 11440, 11453, 11468, 11485, 11506, 11523, 0}, {11352, 11369, 11378, 11393, 586, 11425, 11440, 11453, 11468, 11485, 11506, 11523, 0}, {11538, 11545, 11552, 11559, 11566, 11573, 11580, 11587, 11594, 11601, 11608, 11615, 0}, {11538, 11545, 11552, 11559, 11566, 11573, 11580, 11587, 11594, 11601, 11608, 11615, 0}, 0, 0, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{3777,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2356, 323, 331, 2015, 2025, 2033, 11622, {11627, 11635, 11646, 11652, 11658, 11667, 2093}, {9071, 9075, 2495, 11673, 9087, 9092, 11677}, {9100, 9102, 1059, 1067, 9106, 9102, 1067}, {2518, 2525, 9501, 2539, 2545, 11681, 11687, 11693, 2566, 2576, 2584, 2593, 0}, {2518, 2525, 9501, 2539, 2545, 11681, 11687, 11693, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 11715, 323, 331, 2015, 11725, 11734, 11739, {11744, 11755, 11766, 11777, 11788, 11799, 11805}, {2126, 9707, 2510, 4488, 2124, 10573, 2516}, {2126, 9707, 2510, 4488, 2124, 10573, 2516}, {11814, 11822, 11831, 11838, 4966, 11845, 11851, 2559, 2566, 11857, 2584, 11866, 0}, {11814, 11822, 11831, 11838, 4966, 11845, 11851, 2559, 2566, 11857, 2584, 11866, 0}, {11876, 11881, 11831, 2614, 4966, 11845, 11851, 2626, 11887, 2634, 2638, 11892, 0}, {11876, 11881, 11831, 2614, 4966, 11845, 11851, 2626, 11887, 2634, 2638, 11892, 0}, 2, 1, 756, 241, {11715,2692,1354,1319,0,0,0,0,0,0,0,0,0,0},{11897,11916,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {11936, 9338, 323, 331, 11963, 2025, 11981, 11998, {12012, 12023, 12033, 12042, 12053, 12065, 12076}, {12086, 12089, 12092, 12095, 12098, 12101, 12104}, {2131, 2126, 2512, 2510, 7493, 2126, 2131}, {12107, 12117, 2533, 12128, 12137, 12143, 12151, 12159, 12167, 12178, 12187, 12197, 0}, {12107, 12117, 2533, 12128, 12137, 12143, 12151, 12159, 12167, 12178, 12187, 12197, 0}, {5017, 1279, 2533, 8408, 12137, 12207, 12213, 5914, 5041, 5926, 1309, 5931, 0}, {5017, 1279, 2533, 8408, 12137, 12207, 12213, 5914, 5041, 5926, 1309, 5931, 0}, 0, 1, 756, 241, {5676,12219,1319,0,0,0,0,0,0,0,0,0,0,0},{11936,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {12229, 1319, 280, 274, 12251, 12266, 12278, 11622, {12284, 12296, 12308, 12320, 12334, 12349, 12362}, {12376, 12089, 12379, 12095, 12382, 12385, 12388}, {2131, 2126, 12392, 2510, 4488, 2126, 9498}, {12394, 12401, 12409, 12415, 12424, 12433, 12443, 12449, 12460, 12470, 12477, 12487, 0}, {12495, 12502, 12510, 12516, 12525, 12534, 12544, 12550, 12561, 12571, 12578, 12588, 0}, {12596, 12602, 12607, 12612, 12617, 12622, 12627, 12633, 12639, 12645, 12651, 12658, 0}, {12596, 12602, 12607, 12612, 12617, 12622, 12627, 12633, 12639, 12645, 12651, 12658, 0}, 2, 1, 2646, 241, {1856,1319,0,0,0,0,0,0,0,0,0,0,0,0},{12229,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {12665, 2692, 280, 274, 2015, 55, 12683, 12695, {12707, 12722, 12737, 12752, 12769, 12788, 12799}, {12810, 12817, 12824, 12831, 12838, 12845, 12852}, {0, 0, 0, 0, 0, 0, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, 0, 1, 756, 241, {1354,1319,0,0,0,0,0,0,0,0,0,0,0,0},{3777,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {13023, 243, 23, 35, 44, 352, 13042, 13062, {13079, 13092, 13105, 13121, 13138, 13153, 13162}, {13079, 13092, 13105, 13121, 13138, 13153, 13162}, {13171, 13174, 13177, 13180, 13183, 13186, 13189}, {13192, 13205, 13216, 13225, 13236, 13241, 13250, 13261, 13268, 13283, 13294, 13307, 0}, {13320, 13335, 13216, 13225, 13348, 13241, 13355, 13261, 13268, 13283, 13294, 13307, 0}, {13192, 13205, 13216, 13225, 13236, 13241, 13250, 13261, 13268, 13283, 13294, 13307, 0}, {13192, 13205, 13216, 13225, 13236, 13241, 13250, 13261, 13268, 13283, 13294, 13307, 0}, 0, 6, 239, 241, {3999,3990,0,0,0,0,0,0,0,0,0,0,0,0},{4020,4040,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {5566, 243, 3041, 3052, 2015, 55, 13368, 13371, {13374, 13387, 13397, 13406, 13416, 13427, 13438}, {13450, 13453, 13458, 13463, 13468, 13473, 13478}, {13450, 13483, 13486, 13489, 13492, 13495, 13498}, {13501, 13514, 13525, 13535, 13546, 13558, 13570, 13583, 13595, 13608, 13623, 13644, 0}, {13501, 13514, 13525, 13535, 13546, 13558, 13570, 13583, 13595, 13608, 13623, 13644, 0}, {13663, 13669, 13675, 13681, 13687, 13693, 13699, 13705, 13711, 13717, 13724, 13731, 0}, {13663, 13669, 13675, 13681, 13687, 13693, 13699, 13705, 13711, 13717, 13724, 13731, 0}, 0, 1, 239, 241, {243,14,1345,2404,1319,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {13738, 2692, 280, 274, 44, 352, 13751, 13759, {13767, 13780, 13801, 13820, 13841, 13860, 13873}, {13884, 13891, 13898, 13905, 13912, 13919, 13926}, {0, 0, 0, 0, 0, 0, 0}, {13933, 13948, 13963, 13972, 13983, 13994, 14007, 14020, 14035, 14054, 14073, 14090, 0}, {13933, 13948, 13963, 13972, 13983, 13994, 14007, 14020, 14035, 14054, 14073, 14090, 0}, {14109, 14116, 14123, 14130, 14137, 14144, 14151, 14158, 14165, 14172, 14179, 14186, 0}, {14109, 14116, 14123, 14130, 14137, 14144, 14151, 14158, 14165, 14172, 14179, 14186, 0}, 0, 1, 756, 241, {2692,1354,14193,243,14203,3765,1319,0,0,0,0,0,0,0},{13738,3014,13023,5566,14214,14225,14237,14254},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {14272, 2692, 280, 274, 2015, 352, 0, 0, {14294, 14300, 14314, 14337, 14351, 14367, 14374}, {14383, 14386, 14391, 14397, 14401, 7493, 14406}, {6646, 6634, 6636, 6638, 6640, 6642, 6644}, {14410, 14417, 10176, 14424, 3940, 14430, 14436, 14442, 14449, 14458, 14466, 14473, 0}, {14410, 14417, 10176, 14424, 3940, 14430, 14436, 14442, 14449, 14458, 14466, 14473, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{3777,5566,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {14512, 1845, 323, 331, 14545, 14562, 3824, 3827, {14577, 14585, 14596, 14606, 14617, 14626, 14635}, {14645, 14648, 14651, 14654, 14657, 14660, 14663}, {14666, 2508, 12392, 2516, 12392, 2512, 14666}, {14668, 14678, 14686, 14694, 14702, 14710, 14717, 14725, 14733, 14740, 14746, 14753, 0}, {14668, 14678, 14686, 14694, 14702, 14710, 14717, 14725, 14733, 14740, 14746, 14753, 0}, {14761, 14765, 2610, 14769, 4966, 14773, 14777, 14781, 14785, 14789, 14793, 14797, 0}, {14761, 14765, 2610, 14769, 4966, 14773, 14777, 14781, 14785, 14789, 14793, 14797, 0}, 2, 1, 239, 241, {1845,1319,0,0,0,0,0,0,0,0,0,0,0,0},{14801,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{323,280,1433,0,0,0,0,0,0}},
+ {13023, 2692, 280, 274, 2015, 352, 14828, 14849, {14866, 396, 417, 8515, 14879, 14896, 14907}, {14920, 14928, 14936, 14942, 14950, 14958, 14966}, {521, 524, 527, 530, 533, 524, 530}, {14974, 549, 566, 575, 14989, 14996, 15005, 607, 620, 639, 656, 671, 0}, {14974, 549, 566, 575, 14989, 14996, 15005, 607, 620, 639, 656, 671, 0}, {15014, 15022, 15030, 704, 14989, 15038, 15046, 712, 720, 730, 738, 15054, 0}, {15014, 15022, 15030, 704, 14989, 15038, 15046, 712, 720, 730, 738, 15054, 0}, 0, 1, 756, 241, {2692,1354,1319,0,0,0,0,0,0,0,0,0,0,0},{13023,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {5566, 14, 23, 35, 2015, 352, 0, 0, {15066, 15073, 15084, 15093, 15102, 15109, 15120}, {15130, 15134, 15138, 15142, 15146, 15149, 15153}, {0, 0, 0, 0, 0, 0, 0}, {15157, 15167, 15176, 15184, 15193, 15206, 15218, 15225, 15232, 15239, 15249, 15261, 0}, {15157, 15167, 15176, 15184, 15193, 15206, 15218, 15225, 15232, 15239, 15249, 15261, 0}, {15274, 15278, 15282, 15286, 15290, 15294, 15298, 15302, 15306, 15310, 15314, 15318, 0}, {15274, 15278, 15282, 15286, 15290, 15294, 15298, 15302, 15306, 15310, 15314, 15318, 0}, 0, 0, 239, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {5566, 1845, 23, 35, 2015, 352, 0, 0, {15322, 15327, 15333, 15343, 15355, 15363, 15374}, {15383, 15387, 15391, 15395, 15399, 15403, 15407}, {0, 0, 0, 0, 0, 0, 0}, {15411, 15421, 15431, 15438, 15445, 2830, 15450, 15457, 15464, 15473, 15481, 15489, 0}, {15411, 15421, 15431, 15438, 15445, 2830, 15450, 15457, 15464, 15473, 15481, 15489, 0}, {2883, 2887, 15153, 15497, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, {2883, 2887, 15153, 15497, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, 0, 0, 239, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {5566, 2404, 23, 35, 2015, 352, 3824, 3827, {15513, 15519, 15530, 15343, 15540, 15363, 15374}, {15549, 15553, 15557, 15395, 15399, 15403, 15407}, {2131, 2508, 15561, 2510, 2131, 5774, 2508}, {15563, 15573, 15584, 15591, 15600, 15606, 15612, 15620, 15628, 15639, 15649, 15658, 0}, {15667, 15421, 15676, 15682, 15445, 2830, 15450, 15457, 15689, 15473, 15481, 15489, 0}, {2883, 2887, 15699, 2896, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, {2883, 2887, 15699, 2896, 15501, 2900, 2904, 15505, 2912, 2916, 2920, 15509, 0}, 0, 0, 2646, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {5566, 1845, 23, 35, 2015, 352, 15703, 15707, {15711, 15718, 15726, 15734, 15743, 15753, 15760}, {2776, 8298, 2782, 15769, 2788, 15772, 2794}, {2131, 2508, 2797, 3915, 2797, 4193, 2131}, {15775, 15784, 15794, 2820, 10598, 15800, 15806, 15812, 2847, 2857, 2865, 10610, 0}, {15775, 15784, 15794, 2820, 10598, 15800, 15806, 15812, 2847, 2857, 2865, 10610, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 2908, 2912, 2916, 2920, 10623, 0}, {2883, 2887, 3971, 2896, 10598, 2900, 2904, 2908, 2912, 2916, 2920, 10623, 0}, 0, 0, 239, 241, {1845,1888,1319,15821,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {15833, 2692, 323, 331, 2015, 352, 15867, 15883, {15905, 15921, 15946, 15974, 16002, 16030, 16058}, {16077, 16087, 16097, 16107, 16117, 16127, 16137}, {16147, 16151, 16155, 16151, 16159, 16163, 16167}, {16171, 16193, 16221, 16237, 16256, 16272, 16291, 16307, 16329, 16360, 16388, 16413, 0}, {16171, 16193, 16221, 16237, 16256, 16272, 16291, 16307, 16329, 16360, 16388, 16413, 0}, {16441, 16451, 16461, 16471, 16481, 16491, 16501, 16511, 16521, 16531, 16541, 16551, 0}, {16441, 16451, 16461, 16471, 16481, 16491, 16501, 16511, 16521, 16531, 16541, 16551, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{16561,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2404, 280, 274, 2015, 352, 16593, 16598, {5969, 16603, 16614, 16624, 16634, 16644, 16658}, {6055, 6059, 16670, 16675, 16679, 16684, 16689}, {2131, 2508, 2510, 2508, 5774, 2514, 2516}, {2518, 2525, 4955, 6111, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2518, 2525, 4955, 6111, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, 2, 1, 2646, 241, {2404,1345,1319,0,0,0,0,0,0,0,0,0,0,0},{1991,0,0,0,0,0,0,0},{274,5062,0,0,0,0,0,0,0,0,0,0},{280,6517,0,0,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 44, 55, 16693, 16721, {16743, 16762, 16781, 16803, 16822, 16856, 16881}, {16900, 16911, 16922, 16936, 16947, 16958, 16975}, {16986, 16990, 16997, 17004, 17011, 17018, 17025}, {17029, 17045, 17061, 17077, 17096, 17103, 17113, 17129, 17145, 17167, 17189, 17208, 0}, {17029, 17045, 17061, 17077, 17096, 17103, 17113, 17129, 17145, 17167, 17189, 17208, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {17230, 243, 280, 274, 2015, 17255, 17269, 17272, {17275, 17284, 17293, 17303, 17313, 17323, 17335}, {17343, 17348, 17352, 17356, 17360, 17365, 17370}, {17374, 2510, 2510, 9707, 17374, 17377, 2131}, {17380, 17387, 17392, 2820, 17398, 17404, 17411, 17417, 17425, 17435, 17443, 17452, 0}, {17380, 17387, 17392, 2820, 17398, 17404, 17411, 17417, 17425, 17435, 17443, 17452, 0}, {2883, 17462, 3971, 2896, 17466, 17470, 17475, 17479, 17483, 17487, 2920, 17491, 0}, {2883, 17462, 3971, 2896, 17466, 17470, 17475, 17479, 17483, 17487, 2920, 17491, 0}, 0, 0, 239, 241, {243,1319,17496,7163,3032,0,0,0,0,0,0,0,0,0},{17230,17505,9987,0,0,0,0,0},{274,3052,331,35,0,0,0,0,0,0,0,0},{280,3041,323,23,0,0,0,0,0}},
+ {17524, 2692, 280, 274, 2015, 17548, 17561, 17566, {17571, 17583, 17594, 17608, 17620, 17630, 17640}, {17651, 17656, 17661, 17666, 17671, 17676, 17681}, {2131, 4193, 2508, 6308, 2797, 15561, 2516}, {17686, 17703, 17716, 17730, 17743, 17756, 17769, 17783, 17795, 17809, 17823, 17837, 0}, {17686, 17703, 17716, 17730, 17743, 17756, 17769, 17783, 17795, 17809, 17823, 17837, 0}, {17850, 17857, 17862, 17867, 17871, 17876, 17881, 17886, 17891, 17898, 17903, 17909, 0}, {17850, 17857, 17862, 17867, 17871, 17876, 17881, 17886, 17891, 17898, 17903, 17909, 0}, 2, 1, 756, 241, {2692,1354,2948,1319,0,0,0,0,0,0,0,0,0,0},{17914,0,0,0,0,0,0,0},{274,331,5062,0,0,0,0,0,0,0,0,0},{280,323,6517,0,0,0,0,0,0}},
+ {5566, 243, 323, 331, 2015, 55, 18225, 18228, {18232, 18237, 10515, 10522, 18243, 18250, 10539}, {18257, 18261, 10553, 10557, 18265, 10565, 10569}, {12392, 14666, 2131, 10573, 4488, 4191, 2131}, {10575, 10583, 18269, 2820, 10598, 2900, 18273, 18279, 2847, 2857, 2865, 18284, 0}, {10575, 10583, 18269, 2820, 10598, 2900, 18273, 18279, 2847, 2857, 2865, 18284, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18279, 2912, 2916, 2920, 15509, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18279, 2912, 2916, 2920, 15509, 0}, 0, 1, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {18736, 18757, 280, 274, 18766, 18782, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 1, 2646, 241, {1354,1319,0,0,0,0,0,0,0,0,0,0,0,0},{18791,0,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 44, 18811, 18819, 18827, {18835, 18844, 18853, 18861, 18870, 18879, 18886}, {18895, 18898, 18901, 18904, 18907, 18911, 18914}, {6636, 6638, 6640, 6642, 12392, 14666, 6634}, {10575, 10583, 18917, 18923, 10598, 2830, 18273, 18930, 15464, 18937, 15481, 18944, 0}, {10575, 10583, 18917, 18923, 10598, 2830, 18273, 18930, 15464, 18937, 15481, 18944, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18952, 2912, 2916, 2920, 10623, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18952, 2912, 2916, 2920, 10623, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {18956, 2692, 280, 274, 2015, 18974, 0, 0, {34133, 34143, 34152, 34161, 34172, 34182, 34187}, {34194, 34200, 34205, 34210, 34215, 10153, 34219}, {34224, 2797, 2131, 7493, 2126, 7493, 2131}, {14410, 14417, 10176, 14424, 3940, 34226, 34231, 34236, 14449, 14458, 14466, 14473, 0}, {14410, 14417, 10176, 14424, 3940, 34226, 34231, 34236, 14449, 14458, 14466, 14473, 0}, {34243, 34248, 3971, 2896, 3940, 34226, 34231, 34252, 10549, 2916, 34256, 34261, 0}, {34243, 34248, 3971, 2896, 3940, 34226, 34231, 34252, 10549, 2916, 34256, 34261, 0}, 0, 1, 756, 241, {19141,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{18956,3777,5566,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {5566, 1345, 6517, 5062, 44, 352, 19152, 19180, {19202, 19221, 19240, 19265, 19284, 19318, 19343}, {19362, 19372, 19382, 19398, 19408, 19433, 19449}, {19459, 19463, 19470, 19474, 19481, 19488, 19495}, {19499, 19527, 19561, 19577, 19596, 19603, 19613, 19629, 19645, 19676, 19698, 19720, 0}, {19499, 19527, 19561, 19577, 19596, 19603, 19613, 19629, 19645, 19676, 19698, 19720, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{5062,2380,19745,19754,0,0,0,0,0,0,0,0},{6517,2396,19762,19774,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 55, 20321, 20362, {20403, 20422, 20441, 20463, 20482, 20504, 20529}, {20548, 20558, 20568, 20581, 20591, 20604, 20620}, {20630, 20634, 20641, 20648, 20655, 20662, 20669}, {20673, 20701, 20729, 20745, 20764, 20771, 20781, 20797, 20813, 20841, 20863, 20885, 0}, {20673, 20701, 20729, 20745, 20764, 20771, 20781, 20797, 20813, 20841, 20863, 20885, 0}, {20910, 20929, 20729, 20745, 20764, 20771, 20781, 20797, 20948, 20964, 20980, 20990, 0}, {20910, 20929, 20729, 20745, 20764, 20771, 20781, 20797, 20948, 20964, 20980, 20990, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 55, 7932, 21003, {21006, 21025, 21044, 21069, 21088, 21110, 21135}, {21154, 21164, 21174, 21190, 21200, 21213, 21229}, {21239, 21243, 21250, 21254, 21261, 21268, 21275}, {21279, 21301, 21332, 21354, 21373, 21380, 21390, 21406, 21422, 21453, 21475, 21497, 0}, {21279, 21301, 21332, 21354, 21373, 21380, 21390, 21406, 21422, 21453, 21475, 21497, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 2015, 352, 21522, 21547, {21572, 21591, 21613, 21638, 21654, 21676, 21695}, {21705, 21712, 21719, 21726, 21733, 21740, 21747}, {21705, 21712, 21719, 21726, 21733, 21740, 21747}, {21751, 21767, 21792, 21811, 21830, 21837, 21850, 21863, 21882, 21913, 21938, 21960, 0}, {21751, 21767, 21792, 21811, 21830, 21837, 21850, 21985, 21882, 21913, 21938, 21960, 0}, {22004, 22012, 22026, 22040, 21830, 21837, 21850, 22051, 22059, 22073, 22084, 22092, 0}, {22004, 22012, 22026, 22040, 21830, 21837, 21850, 22051, 22059, 22073, 22084, 22092, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 3817, 22103, 22134, {22159, 22181, 22203, 22228, 22250, 22275, 22303}, {22325, 22335, 22345, 22358, 22368, 22381, 22397}, {22407, 22411, 22418, 22422, 22429, 22436, 22443}, {22447, 22463, 22488, 22507, 22529, 22536, 22549, 22562, 22581, 22612, 22637, 22656, 0}, {22447, 22463, 22488, 22507, 22529, 22536, 22549, 22562, 22581, 22612, 22637, 22656, 0}, {22681, 22688, 6638, 22704, 22529, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {22681, 22688, 6638, 22704, 22529, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 280, 274, 44, 3817, 3824, 3827, {22720, 22739, 22758, 22780, 22799, 22821, 22846}, {22865, 22870, 22878, 22886, 22894, 22902, 22910}, {22921, 22925, 22932, 22939, 22946, 22953, 22960}, {22964, 22980, 23005, 23024, 23046, 23053, 23066, 23079, 23098, 23126, 23151, 23173, 0}, {22964, 22980, 23005, 23024, 23046, 23053, 23066, 23079, 23098, 23126, 23151, 23173, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {5566, 1345, 6517, 5062, 44, 18811, 23198, 23217, {23248, 23273, 23304, 23332, 23357, 23385, 23419}, {23444, 23463, 23488, 23504, 23523, 23542, 23561}, {23571, 23578, 23585, 23592, 23599, 23612, 23619}, {23623, 23642, 23670, 23698, 23723, 23736, 23752, 23765, 23790, 23827, 23855, 23877, 0}, {23623, 23642, 23670, 23698, 23723, 23736, 23752, 23765, 23790, 23827, 23855, 23877, 0}, {23902, 23912, 23931, 23947, 23723, 23736, 23752, 23963, 23970, 23995, 24011, 24021, 0}, {23902, 23912, 23931, 23947, 23723, 23736, 23752, 23963, 23970, 23995, 24011, 24021, 0}, 0, 0, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{5062,2380,19745,19754,0,0,0,0,0,0,0,0},{6517,2396,19762,19774,0,0,0,0,0}},
+ {24034, 2404, 1968, 1951, 24053, 352, 24061, 24089, {24111, 24130, 24149, 24174, 24193, 24227, 24252}, {24271, 19372, 19382, 19398, 24281, 24306, 19449}, {0, 0, 0, 0, 0, 0, 0}, {24322, 24347, 24378, 24394, 19596, 19603, 19613, 24413, 24429, 24460, 24482, 24504, 0}, {24322, 24347, 24378, 24394, 19596, 19603, 19613, 24413, 24429, 24460, 24482, 24504, 0}, {24529, 24542, 24378, 24394, 19596, 19603, 19613, 24561, 24568, 24584, 24600, 24610, 0}, {24529, 24542, 24378, 24394, 19596, 19603, 19613, 24561, 24568, 24584, 24600, 24610, 0}, 0, 0, 2646, 241, {2404,0,0,0,0,0,0,0,0,0,0,0,0,0},{24034,0,0,0,0,0,0,0},{1951,1959,0,0,0,0,0,0,0,0,0,0},{1968,1979,0,0,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 44, 55, 3824, 3827, {16743, 16762, 24623, 16803, 24645, 16856, 16881}, {24667, 24677, 24687, 24700, 24710, 24723, 24739}, {16986, 16990, 16997, 17004, 17011, 17018, 17025}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 24844, 24860, 24885, 24907, 24935, 0}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 24844, 24860, 24885, 24907, 24935, 0}, {24957, 24970, 17061, 24989, 24824, 17103, 24831, 25005, 25012, 6652, 25034, 25056, 0}, {24957, 24970, 17061, 24989, 24824, 17103, 24831, 25005, 25012, 6652, 25034, 25056, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {25493, 1475, 280, 274, 25536, 25569, 25593, 25615, {25640, 25668, 25696, 25733, 25764, 25798, 25823}, {25857, 25873, 25889, 25914, 25933, 25955, 25974}, {25996, 26003, 26010, 26017, 26024, 26031, 26035}, {26045, 26079, 26116, 26150, 26184, 26215, 26252, 26289, 26329, 26363, 26397, 26446, 0}, {26045, 26079, 26116, 26150, 26184, 26215, 26252, 26289, 26329, 26363, 26397, 26446, 0}, {26495, 26508, 26521, 26534, 26547, 26560, 26573, 26586, 26599, 26612, 26628, 26644, 0}, {26495, 26508, 26521, 26534, 26547, 26560, 26573, 26586, 26599, 26612, 26628, 26644, 0}, 0, 0, 239, 241, {1475,1827,1836,1856,1319,1845,1867,1874,1881,0,0,0,0,0},{25493,26660,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {3777, 14, 280, 274, 2015, 352, 0, 0, {26708, 26717, 26727, 26739, 26752, 26761, 26773}, {26785, 26789, 26794, 26798, 26802, 26806, 26810}, {2131, 2516, 2508, 2508, 14666, 6308, 2131}, {26814, 26821, 26830, 26837, 2826, 26844, 26852, 26863, 26868, 26873, 26880, 26889, 0}, {26814, 26821, 26830, 26837, 2826, 26844, 26897, 26863, 26868, 26873, 26880, 26889, 0}, {26907, 26911, 26794, 26916, 2826, 26920, 26924, 26863, 26868, 26928, 26932, 26937, 0}, {26907, 26911, 26794, 26916, 2826, 26920, 26924, 26863, 26868, 26928, 26932, 26937, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,35,3052,0,0,0,0,0,0,0,0},{280,323,23,3041,0,0,0,0,0}},
+ {3777, 14, 280, 331, 26942, 352, 26977, 26993, {27009, 27043, 27074, 27105, 27127, 27170, 27198}, {27223, 27230, 27234, 27238, 27245, 27255, 27262}, {0, 0, 0, 0, 0, 0, 0}, {27266, 27279, 27298, 27311, 27324, 27337, 27356, 27375, 27388, 27404, 27417, 27442, 0}, {27266, 27279, 27298, 27311, 27324, 27337, 27356, 27375, 27388, 27404, 27417, 27442, 0}, {27455, 27459, 27463, 27467, 27471, 27475, 27479, 27483, 27487, 27491, 27498, 27505, 0}, {27455, 27459, 27463, 27467, 27471, 27475, 27479, 27483, 27487, 27491, 27498, 27505, 0}, 0, 0, 239, 241, {1319,0,0,0,0,0,0,0,0,0,0,0,0,0},{3777,9999,0,0,0,0,0,0},{27512,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {5566, 243, 280, 274, 2015, 352, 27520, 27545, {27570, 27595, 27614, 27642, 27661, 27686, 27705}, {27727, 27735, 27740, 27745, 27750, 27758, 27766}, {0, 0, 0, 0, 0, 0, 0}, {27771, 27790, 27806, 27819, 27832, 27854, 27873, 27895, 27911, 27927, 27940, 27956, 0}, {27771, 27790, 27806, 27819, 27832, 27854, 27873, 27895, 27911, 27927, 27940, 27956, 0}, {27972, 27981, 27990, 28002, 28012, 28021, 28033, 28042, 28051, 28060, 28069, 28078, 0}, {27972, 27981, 27990, 28002, 28012, 28021, 28033, 28042, 28051, 28060, 28069, 28078, 0}, 0, 0, 239, 241, {243,1319,0,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{27512,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {4290, 243, 323, 331, 949, 4096, 964, 969, {28087, 28095, 28100, 28107, 28117, 28123, 28130}, {28138, 28142, 3971, 28146, 28151, 28155, 28159}, {2797, 2516, 2508, 2508, 4189, 4193, 2131}, {28164, 28172, 6327, 28181, 28187, 28192, 28198, 6361, 28204, 28213, 28221, 28230, 0}, {28164, 28172, 6327, 28181, 28187, 28192, 28198, 6361, 28204, 28213, 28221, 28230, 0}, {28239, 2887, 3971, 28243, 2826, 28247, 28252, 18952, 17483, 28256, 2920, 3979, 0}, {28239, 2887, 3971, 28243, 2826, 28247, 28252, 18952, 17483, 28256, 2920, 3979, 0}, 2, 1, 239, 241, {243,14,1330,1338,1345,1354,1319,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{331,274,35,1421,0,0,0,0,0,0,0,0},{323,280,23,1433,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 44, 55, 28260, 28272, {28284, 16762, 28312, 16803, 24645, 16856, 16881}, {24667, 24677, 24687, 24700, 24710, 24723, 24739}, {0, 0, 0, 0, 0, 0, 0}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 28331, 28347, 28375, 24907, 24935, 0}, {24749, 24774, 17061, 24805, 24824, 17103, 24831, 28331, 28347, 28375, 24907, 24935, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,1951,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {28397, 1319, 1968, 1951, 28445, 18811, 28455, 28467, {28476, 28492, 28508, 28536, 28552, 28595, 28620}, {28648, 28658, 28668, 28675, 28685, 28701, 28714}, {28724, 28728, 28732, 28736, 28740, 28753, 28760}, {28767, 28786, 28811, 28830, 28855, 28868, 28881, 28894, 28916, 28950, 28975, 29003, 0}, {28767, 28786, 28811, 28830, 28855, 28868, 28881, 28894, 28916, 28950, 28975, 29003, 0}, {29031, 29038, 29048, 28830, 28855, 28868, 28881, 29061, 29071, 29084, 29094, 29107, 0}, {29031, 29038, 29048, 28830, 28855, 28868, 28881, 29061, 29071, 29084, 29094, 29107, 0}, 0, 1, 2646, 241, {1319,1845,1888,243,14,0,0,0,0,0,0,0,0,0},{28397,0,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {29120, 3032, 3041, 3052, 2015, 29152, 29168, 29178, {29191, 29201, 29208, 29221, 29231, 29241, 29251}, {29191, 29201, 29261, 29221, 29231, 29241, 29251}, {29271, 29275, 29279, 29283, 29287, 29291, 29295}, {29299, 29315, 29331, 29341, 29354, 29361, 29368, 29378, 29391, 29410, 29429, 29445, 0}, {29299, 29315, 29331, 29341, 29354, 29361, 29368, 29378, 29391, 29410, 29429, 29445, 0}, {29461, 29471, 29331, 29481, 29354, 29361, 29368, 29491, 29501, 29511, 29521, 29531, 0}, {29461, 29471, 29331, 29481, 29354, 29361, 29368, 29491, 29501, 29511, 29521, 29531, 0}, 0, 0, 239, 241, {3032,1319,0,0,0,0,0,0,0,0,0,0,0,0},{29120,0,0,0,0,0,0,0},{3052,0,0,0,0,0,0,0,0,0,0,0},{3041,0,0,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 29782, 55, 29792, 29833, {29874, 29893, 29912, 29937, 29956, 29978, 30003}, {30022, 24677, 30032, 24700, 30048, 24723, 24739}, {30061, 30065, 30069, 30073, 30077, 30081, 30085}, {17029, 30089, 17061, 30117, 24824, 30136, 17113, 17129, 30146, 30177, 30199, 30224, 0}, {17029, 30089, 17061, 30117, 24824, 30136, 17113, 17129, 30146, 30177, 30199, 30224, 0}, {30249, 30256, 17061, 30266, 24824, 30136, 30282, 30295, 30302, 30318, 30334, 30347, 0}, {30249, 30256, 17061, 30266, 24824, 30136, 30282, 30295, 30302, 30318, 30334, 30347, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {30360, 1475, 3041, 3052, 2015, 352, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30381, 30388, 30397, 30412, 30423, 30432, 30439, 30446, 30453, 30464, 30477, 30490, 0}, {30381, 30388, 30397, 30412, 30423, 30432, 30439, 30446, 30453, 30464, 30477, 30490, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,30495,0,0,0,0},{3052,331,0,0,0,0,0,0,0,0,0,0},{3041,323,0,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 44, 30513, 3824, 3827, {30519, 30526, 28100, 30532, 30543, 30551, 30560}, {30567, 28142, 3971, 30571, 30575, 30579, 10569}, {2516, 2516, 2508, 2508, 5774, 15561, 2131}, {30583, 30589, 30597, 28181, 30603, 30608, 30614, 6361, 30620, 30630, 30638, 30648, 0}, {30583, 30589, 30597, 28181, 30603, 30608, 30614, 6361, 30620, 30630, 30638, 30648, 0}, {30658, 30662, 3971, 28243, 3940, 30666, 30670, 18952, 17483, 2916, 30674, 15509, 0}, {30658, 30662, 3971, 28243, 3940, 30666, 30670, 18952, 17483, 2916, 30674, 15509, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {4020, 3032, 3041, 3052, 44, 352, 0, 0, {30678, 30685, 30693, 30700, 30707, 30715, 30723}, {30730, 30733, 30736, 30739, 30742, 30745, 30748}, {2516, 2516, 2510, 2516, 12392, 4191, 12392}, {30751, 30759, 30769, 30775, 30783, 30788, 30793, 30798, 30805, 18937, 30813, 30821, 0}, {30751, 30759, 30769, 30775, 30783, 30788, 30793, 30798, 30805, 18937, 30813, 30821, 0}, {2883, 30829, 3971, 30833, 3940, 29745, 29749, 30837, 3911, 2916, 30841, 15509, 0}, {2883, 30829, 3971, 30833, 3940, 29745, 29749, 30837, 3911, 2916, 30841, 15509, 0}, 0, 0, 239, 241, {3032,1338,14,243,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {254, 3032, 3041, 3052, 29782, 55, 30845, 30856, {30866, 30884, 30899, 30921, 30934, 30948, 30965}, {30989, 30997, 31002, 30921, 30934, 31014, 31021}, {0, 0, 0, 0, 0, 0, 0}, {31035, 31057, 31073, 31093, 31107, 31124, 31139, 31156, 31170, 31183, 31202, 31216, 0}, {31035, 31057, 31073, 31093, 31107, 31124, 31139, 31156, 31170, 31183, 31202, 31216, 0}, {31235, 31250, 31259, 31272, 31279, 31289, 31297, 31307, 31314, 31320, 31332, 31339, 0}, {31235, 31250, 31259, 31272, 31279, 31289, 31297, 31307, 31314, 31320, 31332, 31339, 0}, 0, 0, 239, 241, {3032,1338,14,243,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {5566, 14, 23, 35, 2015, 3817, 0, 0, {31351, 31359, 15084, 15093, 15102, 31370, 31380}, {15549, 15134, 15138, 15142, 15146, 15403, 31389}, {0, 0, 0, 0, 0, 0, 0}, {31393, 31402, 31412, 31420, 10598, 3944, 31428, 31434, 31443, 31452, 31461, 31470, 0}, {31393, 31402, 31412, 31420, 10598, 3944, 31428, 31434, 31443, 31452, 31461, 31470, 0}, {2883, 2887, 15153, 31479, 10598, 2900, 2904, 18952, 17483, 2916, 31483, 15509, 0}, {2883, 2887, 15153, 31479, 10598, 2900, 2904, 18952, 17483, 2916, 31483, 15509, 0}, 0, 0, 239, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,3052,274,0,0,0,0,0,0,0,0,0},{23,3041,280,0,0,0,0,0,0}},
+ {31487, 2404, 280, 274, 2015, 31506, 31519, 31524, {31529, 31536, 31551, 31565, 31581, 31596, 31612}, {6304, 31627, 2610, 31631, 31635, 31639, 31643}, {2131, 12392, 2508, 2126, 2131, 2510, 12392}, {7251, 7259, 31647, 31654, 31661, 2549, 2554, 31666, 31676, 31687, 31696, 31706, 0}, {7251, 7259, 31647, 31654, 31661, 2549, 2554, 31666, 31676, 31687, 31696, 31706, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 0, 0, 2646, 241, {2404,1345,1319,2648,0,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4020, 3032, 2385, 2372, 44, 352, 31716, 31721, {31726, 31742, 31750, 31758, 31767, 31779, 31789}, {31799, 31805, 31811, 31815, 31819, 31827, 3911}, {0, 0, 0, 0, 0, 0, 0}, {31834, 31847, 31861, 31870, 31876, 31880, 31885, 31893, 15464, 31906, 15481, 15489, 0}, {31834, 31847, 31861, 31870, 31876, 31880, 31885, 31893, 15464, 31906, 15481, 15489, 0}, {31915, 2887, 31919, 15497, 31876, 31923, 2904, 31927, 2912, 31935, 2920, 15509, 0}, {31915, 2887, 31919, 15497, 31876, 31923, 2904, 31927, 2912, 31935, 2920, 15509, 0}, 0, 0, 239, 241, {3032,1338,14,243,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {31941, 1475, 1968, 1951, 31965, 31982, 32009, 32016, {32023, 32033, 32043, 32053, 32063, 32073, 32083}, {32093, 32100, 32107, 32114, 32121, 32128, 32135}, {32142, 32146, 32150, 32154, 32158, 32162, 32166}, {32170, 32177, 32184, 32191, 32198, 32205, 32212, 32219, 32226, 32233, 32240, 32250, 0}, {32170, 32177, 32184, 32191, 32198, 32205, 32212, 32219, 32226, 32233, 32240, 32250, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 0, 239, 241, {1475,1827,1836,1856,1319,1845,0,0,0,0,0,0,0,0},{31941,32260,32290,0,0,0,0,0},{1951,331,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 352, 0, 0, {26785, 28142, 32320, 32327, 32337, 32342, 32349}, {32356, 4167, 32360, 4918, 32365, 32370, 32375}, {4467, 32380, 32383, 32386, 32389, 32392, 32395}, {32398, 32405, 32320, 32416, 32422, 32426, 32435, 32442, 32447, 32456, 8292, 32461, 0}, {32398, 32405, 32320, 32416, 32422, 32426, 32435, 32442, 32447, 32456, 8292, 32461, 0}, {32467, 32471, 32478, 26916, 32422, 32483, 32488, 32442, 32493, 32456, 8292, 32498, 0}, {32467, 32471, 32478, 26916, 32422, 32483, 32488, 32442, 32493, 32456, 8292, 32498, 0}, 2, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{4834,5053,3777,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {32502, 243, 6517, 5068, 949, 352, 0, 0, {32524, 32532, 32539, 32547, 32557, 32565, 1025}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32576, 32584, 1082, 1088, 4966, 32593, 32598, 1111, 1117, 32605, 1134, 32614, 0}, {32576, 32584, 1082, 1088, 4966, 32593, 32598, 1111, 1117, 32605, 1134, 32614, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 2, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{32623,0,0,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {32804, 2692, 323, 331, 32839, 32855, 32873, 32878, {32883, 32908, 32937, 32962, 32975, 32990, 33007}, {33022, 33027, 33032, 33037, 33042, 33047, 8601}, {33052, 33052, 33055, 8612, 8615, 33052, 8612}, {33058, 33077, 33092, 33114, 33134, 33150, 33166, 33180, 33206, 33230, 33247, 33264, 0}, {33058, 33077, 33092, 33114, 33134, 33150, 33166, 33180, 33206, 33230, 33247, 33264, 0}, {33281, 33290, 33299, 33313, 33327, 33339, 33351, 33361, 33377, 33391, 33398, 33405, 0}, {33281, 33290, 33299, 33313, 33327, 33339, 33351, 33361, 33377, 33391, 33398, 33405, 0}, 0, 1, 756, 241, {33412,33423,2948,3990,33432,0,0,0,0,0,0,0,0,0},{33443,33461,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {33480, 14193, 323, 331, 2015, 18811, 0, 0, {33500, 33512, 33523, 33535, 33547, 33557, 33569}, {33584, 33589, 33594, 33599, 33604, 33609, 33614}, {0, 0, 0, 0, 0, 0, 0}, {33619, 33628, 33640, 33648, 33653, 33663, 33670, 33679, 33686, 33692, 33701, 33712, 0}, {33619, 33628, 33640, 33648, 33653, 33663, 33670, 33679, 33686, 33692, 33701, 33712, 0}, {33720, 33725, 33730, 33735, 33740, 33745, 33750, 33604, 33755, 33760, 33765, 33770, 0}, {33720, 33725, 33730, 33735, 33740, 33745, 33750, 33604, 33755, 33760, 33765, 33770, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {5566, 243, 280, 274, 2015, 352, 6087, 6092, {33775, 33788, 33796, 33805, 33815, 33825, 33834}, {33846, 33850, 33854, 33858, 33862, 33866, 33870}, {2797, 2516, 2508, 7493, 12392, 5774, 2131}, {33874, 33888, 33899, 33908, 33919, 33931, 33945, 33957, 33970, 33983, 33995, 34008, 0}, {33874, 33888, 33899, 33908, 33919, 33931, 33945, 33957, 33970, 33983, 33995, 34008, 0}, {34022, 34027, 34033, 34039, 34044, 34050, 34056, 34061, 34067, 34072, 18215, 34078, 0}, {34022, 34027, 34033, 34039, 34044, 34050, 34056, 34061, 34067, 34072, 18215, 34078, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,35,3052,0,0,0,0,0,0,0,0},{280,323,23,3041,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {1453, 1475, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {1597, 1604, 1611, 1618, 1625, 1632, 1639}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, 0, 0, 239, 241, {1475,1827,1836,1319,1845,1856,1867,1874,1881,1888,0,0,0,0},{1453,1897,1924,0,0,0,0,0},{331,274,1951,1959,0,0,0,0,0,0,0,0},{323,280,1968,1979,0,0,0,0,0}},
+ {2673, 2692, 280, 274, 2015, 2025, 2703, 2709, {2716, 2724, 2731, 2740, 2749, 2760, 2768}, {2776, 2779, 2782, 2785, 2788, 2791, 2794}, {2131, 2508, 2797, 2508, 2797, 2514, 2131}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, 2, 1, 756, 241, {2692,1354,2940,34265,2948,1319,0,0,0,0,0,0,0,0},{2673,1991,34275,0,0,0,0,0},{274,331,8154,8144,2967,8177,8182,8163,8169,0,0,0},{280,323,8214,8227,2992,2978,3007,0,0}},
+ {5566, 243, 280, 274, 2015, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,35,3052,0,0,0,0,0,0,0,0},{280,323,23,3041,0,0,0,0,0}},
+ {4068, 243, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,3765,14,1330,1338,1345,1319,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4834, 1345, 280, 274, 2015, 352, 3824, 3827, {4851, 4860, 4866, 4872, 4881, 4887, 4896}, {4903, 4908, 4913, 4918, 4923, 4928, 4933}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, 2, 1, 2646, 241, {14193,1330,1354,1888,1345,243,1319,0,0,0,0,0,0,0},{4834,3777,4010,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {2673, 2692, 280, 274, 2015, 352, 6224, 6227, {6230, 6239, 6247, 6256, 6267, 6276, 6285}, {4163, 4167, 2610, 6292, 6296, 6300, 6304}, {2797, 2516, 2508, 2508, 6308, 4193, 2131}, {6310, 6318, 6327, 6333, 6340, 6347, 6354, 6361, 6368, 6378, 6386, 6395, 0}, {6404, 6412, 4209, 6421, 6428, 6435, 6442, 4232, 6449, 6459, 1134, 6467, 0}, {6476, 2606, 2610, 2614, 6480, 6484, 6488, 4278, 6492, 6496, 2638, 4286, 0}, {6476, 2606, 2610, 2614, 6480, 6484, 6488, 4278, 6492, 6496, 2638, 4286, 0}, 2, 1, 756, 241, {2692,1354,11704,1338,6500,1319,0,0,0,0,0,0,0,0},{2673,6508,3777,0,0,0,0,0},{274,331,8154,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4834, 14193, 323, 331, 2015, 352, 964, 969, {7172, 7179, 7187, 7195, 7204, 7214, 7222}, {7231, 4470, 7234, 7237, 7240, 7243, 7246}, {7249, 2508, 2797, 3915, 2797, 4193, 7249}, {7251, 7259, 7268, 2539, 7274, 2549, 2554, 7278, 2566, 2576, 2584, 2593, 0}, {7251, 7259, 7268, 2539, 7274, 2549, 2554, 7278, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 7287, 2614, 7274, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 7287, 2614, 7274, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 239, 241, {14193,1330,1345,1354,2928,1319,0,0,0,0,0,0,0,0},{4834,4010,3777,5609,0,0,0,0},{331,274,34285,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2692, 280, 274, 2015, 2025, 2415, 2420, {2425, 9880, 34295, 2448, 2455, 2463, 34302}, {2478, 9908, 34310, 2491, 2495, 2499, 6083}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, 2, 1, 756, 241, {2692,1354,2948,1319,2928,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,7375,5062,0,0,0,0,0,0,0,0},{280,323,7386,6517,0,0,0,0,0}},
+ {4346, 243, 280, 274, 949, 4096, 964, 969, {28087, 34314, 34328, 34341, 34354, 34367, 28130}, {4163, 7792, 7796, 7800, 7804, 7808, 4184}, {2797, 2131, 2510, 7812, 7812, 2131, 2131}, {34379, 34387, 34397, 28181, 28187, 34404, 34410, 6361, 28204, 28213, 28221, 34416, 0}, {34379, 34387, 34397, 28181, 28187, 34404, 34410, 6361, 28204, 28213, 28221, 34416, 0}, {2883, 34248, 3971, 28243, 2826, 2900, 2904, 18952, 17483, 28256, 2920, 2924, 0}, {2883, 34248, 3971, 28243, 2826, 2900, 2904, 18952, 17483, 28256, 2920, 2924, 0}, 2, 1, 239, 241, {2404,14225,25463,2948,14,1319,0,0,0,0,0,0,0,0},{4068,4346,34425,34434,0,0,0,0},{274,34443,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+ {9835, 2356, 280, 274, 2015, 9853, 9866, 9869, {9872, 9880, 9888, 2448, 2455, 2463, 9895}, {9903, 9908, 9913, 2491, 2495, 2499, 9917}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {7251, 7259, 4955, 2539, 2545, 2549, 2554, 9922, 2566, 2576, 2584, 2593, 0}, {7251, 7259, 4955, 2539, 2545, 2549, 2554, 9922, 2566, 2576, 2584, 2593, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 2626, 2630, 2634, 2638, 2642, 0}, 2, 1, 756, 241, {2356,2692,2948,1319,0,0,0,0,0,0,0,0,0,0},{9835,9930,0,0,0,0,0,0},{274,331,9953,0,0,0,0,0,0,0,0,0},{280,323,9963,0,0,0,0,0,0}},
+ {3777, 2692, 280, 331, 2015, 352, 0, 0, {34454, 34465, 34489, 34519, 34536, 34558, 34567}, {14383, 14386, 14391, 14397, 14401, 7493, 14406}, {6646, 6634, 6636, 6638, 6640, 6642, 6644}, {34578, 34591, 566, 34604, 586, 34615, 34624, 607, 34633, 34650, 34665, 34678, 0}, {34578, 34591, 566, 34604, 586, 34615, 34624, 607, 34633, 34650, 34665, 34678, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{3777,5566,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {3777, 243, 280, 274, 2015, 352, 964, 969, {17932, 17946, 17956, 17967, 17981, 17992, 18003}, {18016, 18021, 18026, 18033, 18039, 18045, 18051}, {2797, 2516, 2508, 7493, 2797, 12392, 2131}, {18056, 18064, 18072, 18079, 18088, 18098, 18108, 18114, 18122, 18137, 18155, 18163, 0}, {18056, 18064, 18072, 18079, 18088, 18098, 18108, 18114, 18122, 18137, 18155, 18163, 0}, {18171, 18175, 18072, 18181, 18185, 18190, 18108, 18196, 18201, 18208, 18215, 18220, 0}, {18171, 18175, 18072, 18181, 18185, 18190, 18108, 18196, 18201, 18208, 18215, 18220, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{3777,5566,9987,9976,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {5566, 243, 323, 331, 2015, 55, 18225, 18228, {18232, 18237, 10515, 10522, 18243, 18250, 10539}, {18257, 18261, 10553, 10557, 18265, 10565, 10569}, {12392, 14666, 2131, 10573, 4488, 4191, 2131}, {10575, 10583, 18269, 2820, 10598, 2900, 18273, 18279, 2847, 2857, 2865, 18284, 0}, {10575, 10583, 18269, 2820, 10598, 2900, 18273, 18279, 2847, 2857, 2865, 18284, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18279, 2912, 2916, 2920, 15509, 0}, {2883, 2887, 18269, 2896, 10598, 2900, 2904, 18279, 2912, 2916, 2920, 15509, 0}, 0, 1, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {34691, 2692, 280, 274, 2015, 352, 0, 0, {18981, 18996, 19011, 19026, 19043, 19060, 19069}, {19080, 19087, 19094, 19101, 19108, 19115, 19122}, {19129, 19132, 8612, 8615, 8609, 19135, 19138}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, 0, 1, 756, 241, {2692,1354,19141,2948,14,1319,0,0,0,0,0,0,0,0},{34691,3777,5566,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {5566, 1345, 6517, 5062, 44, 55, 19152, 19180, {19202, 19221, 19240, 19265, 19284, 19318, 19343}, {19362, 19372, 19382, 19398, 19408, 19433, 19449}, {19459, 19463, 19470, 19474, 19481, 19488, 19495}, {19499, 19527, 19561, 19577, 19596, 19603, 19613, 19629, 19645, 19676, 19698, 19720, 0}, {19499, 19527, 19561, 19577, 19596, 19603, 19613, 19629, 19645, 19676, 19698, 19720, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, {6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6655, 6658, 0}, 0, 5, 2646, 241, {1345,2365,2948,2404,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{5062,2380,19745,19754,0,0,0,0,0,0,0,0},{6517,2396,19762,19774,0,0,0,0,0}},
+ {34712, 1475, 323, 331, 34750, 34766, 0, 0, {25145, 25152, 25163, 25176, 25189, 25200, 25213}, {25224, 25229, 25234, 25239, 25244, 25249, 25254}, {0, 0, 0, 0, 0, 0, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, 0, 0, 239, 241, {1475,1827,1836,1856,1319,1845,1867,1874,1881,1888,0,0,0,0},{34785,34861,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {1453, 3032, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {34084, 34091, 34098, 34105, 34112, 34119, 34126}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, 0, 0, 239, 241, {3032,1338,14,1874,1888,1475,1845,1319,0,0,0,0,0,0},{1453,6718,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {34945, 2692, 280, 274, 2015, 2025, 2703, 2709, {2716, 2724, 2731, 2740, 2749, 2760, 2768}, {2776, 2779, 2782, 2785, 2788, 2791, 2794}, {2131, 2508, 2797, 2508, 2797, 2514, 2131}, {34965, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {34965, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {34973, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, {34973, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, 2, 1, 756, 241, {2692,1354,34978,1319,0,0,0,0,0,0,0,0,0,0},{34945,34988,35000,9976,0,0,0,0},{274,331,35010,35022,8177,8182,8169,0,0,0,0,0},{280,323,2992,2978,3007,0,0,0,0}},
+ {3014, 14193, 3041, 3052, 2015, 3817, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {14193,1330,1338,3032,14,243,4010,5579,1319,1888,1845,0,0,0},{3014,3777,0,0,0,0,0,0},{3052,331,274,0,0,0,0,0,0,0,0,0},{3041,323,280,0,0,0,0,0,0}},
+ {4068, 243, 323, 331, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 4189, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 2, 1, 239, 241, {243,14,1330,1338,1345,1354,1319,2928,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{331,274,1421,0,0,0,0,0,0,0,0,0},{323,280,1433,0,0,0,0,0,0}},
+ {3777, 1319, 280, 274, 44, 352, 3824, 3827, {4851, 4860, 4866, 4872, 4881, 4887, 4896}, {4903, 4908, 4913, 4918, 4923, 4928, 4933}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, 0, 0, 2646, 241, {1319,5950,1345,6215,14,3765,0,0,0,0,0,0,0,0},{3777,9976,0,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {35033, 2356, 323, 331, 2015, 17548, 17561, 17566, {35059, 35067, 35075, 35083, 35095, 35104, 35116}, {17651, 17656, 17661, 17666, 17671, 17676, 17681}, {2131, 2508, 2797, 6308, 2797, 15561, 2516}, {17686, 17703, 17716, 17730, 17743, 17756, 17769, 17783, 17795, 17809, 17823, 17837, 0}, {17686, 17703, 17716, 17730, 17743, 17756, 17769, 17783, 17795, 17809, 17823, 17837, 0}, {35127, 35138, 35145, 35153, 35160, 35167, 35174, 35182, 35188, 35196, 35204, 35212, 0}, {35127, 35138, 35145, 35153, 35160, 35167, 35174, 35182, 35188, 35196, 35204, 35212, 0}, 2, 1, 756, 241, {2356,2692,2948,1319,0,0,0,0,0,0,0,0,0,0},{17914,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {1453, 3032, 1968, 1951, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {1597, 1604, 1611, 1618, 1625, 1632, 1639}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, 0, 0, 239, 241, {3032,1338,14,1874,1888,1475,1845,1319,0,0,0,0,0,0},{1453,6718,0,0,0,0,0,0},{1951,1959,331,274,0,0,0,0,0,0,0,0},{1968,1979,323,280,0,0,0,0,0}},
+ {35219, 2692, 280, 274, 2015, 2025, 2703, 2709, {2716, 2724, 2731, 2740, 2749, 2760, 2768}, {2776, 2779, 2782, 2785, 2788, 2791, 2794}, {2131, 2508, 2797, 2508, 2797, 2514, 2131}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, 2, 1, 756, 241, {2692,1354,2940,2948,2356,1319,0,0,0,0,0,0,0,0},{2673,1991,2955,0,0,0,0,0},{274,331,2380,2967,0,0,0,0,0,0,0,0},{280,2978,2992,3007,0,0,0,0,0}},
+ {35245, 1319, 3041, 3052, 44, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 2646, 241, {243,14,1338,1319,5950,35258,4010,14225,0,0,0,0,0,0},{35266,35245,6508,4020,0,0,0,0},{3052,35,274,331,0,0,0,0,0,0,0,0},{3041,23,280,323,0,0,0,0,0}},
+ {4290, 243, 3041, 3052, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,14193,1338,1345,1319,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4834, 2692, 280, 274, 2015, 352, 3824, 3827, {4851, 4860, 4866, 4872, 4881, 4887, 4896}, {4903, 4908, 4913, 4918, 4923, 4928, 4933}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, 2, 1, 756, 241, {2692,1354,34265,2948,1319,0,0,0,0,0,0,0,0,0},{4834,3777,5053,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4054, 2404, 323, 331, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 2646, 241, {2404,1345,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{331,274,35,0,0,0,0,0,0,0,0,0},{323,280,23,0,0,0,0,0,0}},
+ {1453, 3032, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {34084, 34091, 34098, 34105, 34112, 34119, 34126}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, 0, 0, 239, 241, {3032,1338,14,1874,1888,1475,1845,1319,0,0,0,0,0,0},{1453,35277,35304,2648,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {2673, 2692, 280, 274, 2015, 2025, 2703, 2709, {2716, 2724, 2731, 2740, 2749, 2760, 2768}, {2776, 2779, 2782, 2785, 2788, 2791, 2794}, {2131, 2508, 2797, 2508, 2797, 2514, 2131}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2799, 2806, 2814, 2820, 2826, 2830, 2835, 2840, 2847, 2857, 2865, 2874, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, {2883, 2887, 2891, 2896, 2826, 2900, 2904, 2908, 2912, 2916, 2920, 2924, 0}, 2, 1, 756, 241, {2692,1354,2940,34265,2948,1319,0,0,0,0,0,0,0,0},{2673,1991,34275,0,0,0,0,0},{274,331,8154,8144,2967,8177,8182,8163,8169,0,0,0},{280,323,8214,8227,2992,2978,3007,0,0}},
+ {3014, 14193, 3041, 3052, 2015, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {14193,1330,14,2940,1319,0,0,0,0,0,0,0,0,0},{3014,3777,0,0,0,0,0,0},{3052,35,274,331,0,0,0,0,0,0,0,0},{3041,23,280,323,0,0,0,0,0}},
+ {4319, 243, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 1, 239, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {35320, 243, 280, 274, 2015, 352, 3824, 3827, {4851, 4860, 4866, 4872, 4881, 4887, 4896}, {4903, 4908, 4913, 4918, 4923, 4928, 4933}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, 2, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{4834,5053,3777,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4054, 2404, 323, 331, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 2646, 241, {2404,1345,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{331,274,35,0,0,0,0,0,0,0,0,0},{323,280,23,0,0,0,0,0,0}},
+ {5566, 243, 280, 274, 2015, 352, 964, 969, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 2, 1, 239, 241, {243,14,1338,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {4290, 1338, 3041, 3052, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {3999,3990,1338,14,1345,1319,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4834, 243, 280, 274, 2015, 352, 3824, 3827, {4851, 4860, 4866, 4872, 4881, 4887, 4896}, {4903, 4908, 4913, 4918, 4923, 4928, 4933}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {4938, 4946, 4955, 4960, 4966, 4970, 4975, 4983, 4989, 4999, 1134, 5007, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, {5017, 5023, 4955, 5030, 4966, 4970, 5035, 4983, 5041, 1304, 1309, 5047, 0}, 2, 1, 239, 241, {243,14,1354,1345,1319,0,0,0,0,0,0,0,0,0},{4834,5053,3777,0,0,0,0,0},{274,331,5062,5068,5078,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35354, 35364, {11627, 35372, 9033, 11652, 9048, 9058, 9064}, {9071, 9075, 9079, 11673, 9087, 9092, 9096}, {9100, 9102, 9104, 1067, 9106, 9102, 1067}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 2404, 323, 331, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 0, 2646, 241, {2404,1345,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{331,274,35,0,0,0,0,0,0,0,0,0},{323,280,23,0,0,0,0,0,0}},
+ {5566, 1319, 23, 35, 2015, 3817, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 2646, 241, {1845,1888,1319,0,0,0,0,0,0,0,0,0,0,0},{5566,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {4290, 1338, 3041, 3052, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,3999,1338,1345,1319,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {1991, 9002, 323, 331, 44, 2025, 35424, 35442, {35457, 35470, 35489, 35502, 35517, 35534, 11326}, {35545, 35552, 35559, 35566, 35573, 35580, 35587}, {521, 524, 35594, 530, 533, 524, 530}, {35597, 35610, 566, 575, 14989, 14996, 15005, 607, 35625, 35644, 35659, 35676, 0}, {35597, 35610, 566, 575, 14989, 14996, 15005, 607, 35625, 35644, 35659, 35676, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {4054, 243, 280, 274, 44, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {243,1319,0,0,0,0,0,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4290, 2404, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 2646, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {4290, 243, 3041, 3052, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,14193,1338,1345,1319,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35354, 35364, {11627, 35372, 9033, 11652, 9048, 9058, 9064}, {9071, 9075, 9079, 11673, 9087, 9092, 9096}, {9100, 9102, 9104, 1067, 9106, 9102, 1067}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35770, 35794, 35803, 35812, 35823, 35832, 35845, 35854, 35859, 35870, 35892, 35916, 0}, {35770, 35794, 35803, 35812, 35823, 35832, 35845, 35854, 35859, 35870, 35892, 35916, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {13023, 243, 23, 35, 2015, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {243,1319,0,0,0,0,0,0,0,0,0,0,0,0},{13023,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {4290, 243, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35424, 35442, {35457, 35470, 35489, 8515, 35517, 35534, 11326}, {35545, 35552, 35559, 35938, 35573, 35580, 35587}, {521, 524, 35594, 530, 533, 524, 530}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35770, 35794, 35803, 35812, 35823, 35832, 35845, 35854, 35859, 35870, 35892, 35916, 0}, {35770, 35794, 35803, 35812, 35823, 35832, 35845, 35854, 35859, 35870, 35892, 35916, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {13023, 243, 23, 35, 2015, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {243,1319,0,0,0,0,0,0,0,0,0,0,0,0},{13023,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {4290, 243, 23, 35, 949, 35945, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,274,331,0,0,0,0,0,0,0,0},{23,3041,280,323,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35354, 35364, {11627, 35372, 9033, 11652, 9048, 9058, 9064}, {9071, 9075, 9079, 11673, 9087, 9092, 9096}, {9100, 9102, 9104, 1067, 9106, 9102, 1067}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35770, 35794, 35803, 35812, 35823, 35832, 35845, 35854, 35859, 35870, 35892, 35916, 0}, {35770, 35794, 35803, 35812, 35823, 35832, 35845, 35854, 35859, 35870, 35892, 35916, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 1, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {3014, 243, 3041, 3052, 35958, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1319,1888,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {4290, 243, 323, 331, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 1, 239, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35424, 35442, {35457, 35470, 35489, 8515, 35517, 35534, 11326}, {35545, 35552, 35559, 35938, 35573, 35580, 35587}, {521, 524, 35594, 530, 533, 524, 530}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 44, 3817, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1319,1888,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {4290, 2404, 323, 331, 949, 35968, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 1, 2646, 241, {2404,1345,14,1338,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {4290, 243, 323, 331, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 1, 239, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {4290, 243, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4054, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{35,274,331,0,0,0,0,0,0,0,0,0},{23,280,323,0,0,0,0,0,0}},
+ {5566, 2404, 280, 274, 44, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 2646, 241, {2404,1345,2365,2948,1319,0,0,0,0,0,0,0,0,0},{5566,3777,0,0,0,0,0,0},{274,331,1959,0,0,0,0,0,0,0,0,0},{280,323,1979,1968,0,0,0,0,0}},
+ {4290, 243, 23, 35, 949, 35968, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,1338,1345,1319,0,0,0,0,0,0,0,0,0},{4290,4319,4346,0,0,0,0,0},{35,3052,331,274,0,0,0,0,0,0,0,0},{23,3041,323,280,0,0,0,0,0}},
+ {4290, 243, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,33432,1319,0,0,0,0,0,0,0,0,0,0},{4290,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {3014, 3032, 3041, 3052, 2015, 352, 3824, 3827, {3830, 3837, 3844, 3852, 3862, 3871, 3878}, {3887, 3891, 3895, 3899, 3903, 3907, 3911}, {2131, 2508, 2510, 3915, 2510, 2514, 2131}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {3917, 3925, 3934, 2820, 3940, 3944, 3949, 2840, 2847, 3954, 2865, 3962, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, {2883, 2887, 3971, 2896, 3940, 2900, 2904, 2908, 2912, 3975, 2920, 3979, 0}, 0, 0, 239, 241, {3032,1338,243,14,1319,0,0,0,0,0,0,0,0,0},{35979,13738,0,0,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {4068, 243, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,33432,1319,0,0,0,0,0,0,0,0,0,0},{4290,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {4068, 243, 23, 35, 35998, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,33432,1319,0,0,0,0,0,0,0,0,0,0},{4290,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {4290, 243, 23, 35, 949, 4096, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {243,14,33432,1319,0,0,0,0,0,0,0,0,0,0},{4290,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+ {4020, 3808, 3041, 3052, 949, 3817, 964, 969, {4108, 4116, 4122, 4129, 4140, 4147, 4155}, {4163, 4167, 2610, 4171, 4176, 4180, 4184}, {2797, 2516, 2508, 2508, 4191, 4193, 2131}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4195, 4201, 4209, 1088, 4215, 4220, 4226, 4232, 4239, 1126, 4250, 4260, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, {4270, 2606, 2610, 4274, 4215, 2618, 2622, 4278, 2630, 4282, 2638, 4286, 0}, 0, 0, 239, 241, {3808,3983,3990,3999,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35424, 35442, {35457, 35470, 35489, 8515, 35517, 35534, 11326}, {35545, 35552, 35559, 35938, 35573, 35580, 35587}, {521, 524, 35594, 530, 533, 524, 530}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35354, 35364, {11627, 35372, 9033, 11652, 9048, 9058, 9064}, {9071, 9075, 9079, 11673, 9087, 9092, 9096}, {9100, 9102, 9104, 1067, 9106, 9102, 1067}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2518, 2525, 35383, 2539, 2545, 2618, 2622, 11693, 35388, 35398, 35406, 35415, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {3777, 2692, 280, 331, 2015, 352, 0, 0, {34454, 34465, 34489, 34519, 34536, 34558, 34567}, {14383, 14386, 14391, 14397, 14401, 7493, 14406}, {6646, 6634, 6636, 6638, 6640, 6642, 6644}, {34578, 34591, 566, 34604, 586, 34615, 34624, 607, 34633, 34650, 34665, 34678, 0}, {34578, 34591, 566, 34604, 586, 34615, 34624, 607, 34633, 34650, 34665, 34678, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{3777,5566,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1453, 1475, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {1597, 1604, 1611, 1618, 1625, 1632, 1639}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, {1674, 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1744, 1754, 0}, 0, 0, 239, 241, {1475,1827,1836,1319,1845,1856,1867,1874,1881,1888,0,0,0,0},{1453,1897,1924,0,0,0,0,0},{331,274,1951,1959,0,0,0,0,0,0,0,0},{323,280,1968,1979,0,0,0,0,0}},
+ {1991, 2692, 280, 274, 2015, 2025, 2415, 2420, {2425, 9880, 34295, 2448, 2455, 2463, 34302}, {2478, 9908, 34310, 2491, 2495, 2499, 6083}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, 2, 1, 756, 241, {2692,1354,2948,1319,2928,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,7375,5062,0,0,0,0,0,0,0,0},{280,323,7386,6517,0,0,0,0,0}},
+ {1991, 2356, 323, 331, 2015, 11725, 35354, 35364, {9012, 9021, 9033, 9040, 9048, 9058, 9064}, {9071, 9075, 9079, 9083, 9087, 9092, 9096}, {0, 0, 0, 0, 0, 0, 0}, {2518, 2525, 35383, 2539, 2545, 2549, 2554, 11693, 35388, 35398, 35406, 35415, 0}, {2518, 2525, 35383, 2539, 2545, 2549, 2554, 11693, 35388, 35398, 35406, 35415, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, {2602, 2606, 2610, 2614, 2545, 2618, 2622, 11700, 2630, 2634, 2638, 2642, 0}, 0, 0, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {14272, 2692, 280, 274, 2015, 352, 0, 0, {14294, 14300, 14314, 14337, 14351, 14367, 14374}, {14383, 14386, 14391, 14397, 14401, 7493, 14406}, {6646, 6634, 6636, 6638, 6640, 6642, 6644}, {14410, 14417, 10176, 14424, 3940, 14430, 14436, 14442, 14449, 14458, 14466, 14473, 0}, {14410, 14417, 10176, 14424, 3940, 14430, 14436, 14442, 14449, 14458, 14466, 14473, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, {14480, 7891, 2610, 2614, 14484, 14488, 14492, 14496, 14500, 2634, 14504, 14508, 0}, 0, 1, 756, 241, {2692,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{3777,5566,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {34691, 2692, 280, 274, 2015, 352, 0, 0, {18981, 18996, 19011, 19026, 19043, 19060, 19069}, {19080, 19087, 19094, 19101, 19108, 19115, 19122}, {19129, 19132, 8612, 8615, 8609, 19135, 19138}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, 0, 1, 756, 241, {2692,1354,19141,2948,14,1319,0,0,0,0,0,0,0,0},{34691,3777,5566,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {25072, 1319, 280, 274, 25126, 5699, 0, 0, {25145, 25152, 25163, 25176, 25189, 25200, 25213}, {25224, 25229, 25234, 25239, 25244, 25249, 25254}, {0, 0, 0, 0, 0, 0, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, 0, 0, 2646, 241, {25463,1319,0,0,0,0,0,0,0,0,0,0,0,0},{25472,0,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {1453, 3032, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {34084, 34091, 34098, 34105, 34112, 34119, 34126}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, 0, 0, 239, 241, {3032,1338,14,1874,1888,1475,1845,1319,0,0,0,0,0,0},{1453,6718,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1453, 3032, 323, 331, 1484, 1500, 1513, 1520, {1527, 1537, 1547, 1557, 1567, 1577, 1587}, {34084, 34091, 34098, 34105, 34112, 34119, 34126}, {1646, 1650, 1654, 1658, 1662, 1666, 1670}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, {1764, 1769, 1774, 1779, 1784, 1789, 1794, 1799, 1804, 1809, 1815, 1821, 0}, 0, 0, 239, 241, {3032,1338,14,1874,1888,1475,1845,1319,0,0,0,0,0,0},{1453,6718,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {1991, 2692, 280, 274, 2015, 2025, 964, 969, {2425, 2433, 2440, 2448, 2455, 2463, 2470}, {7345, 7350, 7354, 7358, 7362, 7366, 7370}, {2131, 2508, 2510, 2512, 2510, 2514, 2516}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2518, 2525, 4955, 2539, 4966, 2549, 2554, 2559, 2566, 2576, 2584, 6155, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, {2602, 2606, 2610, 2614, 4966, 2618, 2622, 2626, 2630, 2634, 2638, 6185, 0}, 2, 1, 756, 241, {2692,1354,2948,1319,2928,0,0,0,0,0,0,0,0,0},{1991,2659,0,0,0,0,0,0},{274,331,7375,5062,0,0,0,0,0,0,0,0},{280,323,7386,6517,0,0,0,0,0}},
+ {8988, 9002, 323, 331, 35343, 2025, 35424, 35442, {35457, 35470, 35489, 8515, 35517, 35534, 11326}, {35545, 35552, 35559, 35938, 35573, 35580, 35587}, {521, 524, 35594, 530, 533, 524, 530}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35597, 35610, 566, 575, 14989, 35721, 35728, 607, 35625, 35644, 35659, 35676, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, {35693, 35700, 35707, 35714, 14989, 35721, 35728, 35735, 35742, 35749, 35756, 35763, 0}, 0, 1, 756, 241, {2356,2948,2004,2692,9602,1354,11704,1319,0,0,0,0,0,0},{1991,2659,2673,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {12665, 2692, 280, 274, 2015, 55, 12683, 12695, {12707, 12722, 12737, 12752, 12769, 12788, 12799}, {12810, 12817, 12824, 12831, 12838, 12845, 12852}, {0, 0, 0, 0, 0, 0, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12859, 12870, 8646, 12883, 8668, 12894, 12901, 8693, 12908, 12923, 12936, 12947, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, {12960, 12967, 12974, 12981, 8668, 12894, 12901, 12988, 12995, 13002, 13009, 13016, 0}, 0, 1, 756, 241, {1354,1319,0,0,0,0,0,0,0,0,0,0,0,0},{3777,0,0,0,0,0,0,0},{331,274,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {18956, 2692, 280, 274, 2015, 18974, 0, 0, {34133, 34143, 34152, 34161, 34172, 34182, 34187}, {34194, 34200, 34205, 34210, 34215, 10153, 34219}, {34224, 2797, 2131, 7493, 2126, 7493, 2131}, {14410, 14417, 10176, 14424, 3940, 34226, 34231, 34236, 14449, 14458, 14466, 14473, 0}, {14410, 14417, 10176, 14424, 3940, 34226, 34231, 34236, 14449, 14458, 14466, 14473, 0}, {34243, 34248, 3971, 2896, 3940, 34226, 34231, 34252, 10549, 2916, 34256, 34261, 0}, {34243, 34248, 3971, 2896, 3940, 34226, 34231, 34252, 10549, 2916, 34256, 34261, 0}, 0, 1, 756, 241, {19141,1354,2948,14,1319,0,0,0,0,0,0,0,0,0},{18956,3777,5566,0,0,0,0,0},{274,331,0,0,0,0,0,0,0,0,0,0},{280,323,0,0,0,0,0,0,0}},
+ {34712, 1475, 323, 331, 34750, 34766, 0, 0, {25145, 25152, 25163, 25176, 25189, 25200, 25213}, {25224, 25229, 25234, 25239, 25244, 25249, 25254}, {0, 0, 0, 0, 0, 0, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25259, 25274, 25283, 25290, 25303, 25310, 25321, 25330, 25339, 25346, 25357, 25368, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, {25379, 25386, 25393, 25400, 25407, 25414, 25421, 25428, 25435, 25442, 25449, 25456, 0}, 0, 0, 239, 241, {1475,1827,1836,1856,1319,1845,1867,1874,1881,1888,0,0,0,0},{34785,34861,0,0,0,0,0,0},{331,0,0,0,0,0,0,0,0,0,0,0},{323,0,0,0,0,0,0,0,0}},
+ {4054, 2404, 323, 331, 44, 352, 29541, 29551, {29564, 29571, 29577, 29584, 29590, 29596, 29604}, {29614, 29618, 29622, 29626, 29630, 29634, 29638}, {12392, 12392, 12392, 12392, 12392, 12392, 12392}, {29644, 29653, 29662, 29667, 29673, 29679, 29685, 29692, 29698, 29707, 29716, 29724, 0}, {29644, 29653, 29662, 29667, 29673, 29679, 29685, 29692, 29698, 29707, 29716, 29724, 0}, {29733, 29737, 3971, 29741, 3940, 29745, 29749, 29753, 29758, 29762, 29768, 29772, 0}, {29733, 29737, 3971, 29741, 3940, 29745, 29749, 29753, 29758, 29762, 29768, 29772, 0}, 0, 0, 2646, 241, {2404,1345,1319,0,0,0,0,0,0,0,0,0,0,0},{4054,254,0,0,0,0,0,0},{331,274,29776,0,0,0,0,0,0,0,0,0},{323,280,0,0,0,0,0,0,0}},
+ {4020, 3032, 3041, 3052, 44, 352, 0, 0, {30678, 30685, 30693, 30700, 30707, 30715, 30723}, {30730, 30733, 30736, 30739, 30742, 30745, 30748}, {2516, 2516, 2510, 2516, 12392, 4191, 12392}, {30751, 30759, 30769, 30775, 30783, 30788, 30793, 30798, 30805, 18937, 30813, 30821, 0}, {30751, 30759, 30769, 30775, 30783, 30788, 30793, 30798, 30805, 18937, 30813, 30821, 0}, {2883, 30829, 3971, 30833, 3940, 29745, 29749, 30837, 3911, 2916, 30841, 15509, 0}, {2883, 30829, 3971, 30833, 3940, 29745, 29749, 30837, 3911, 2916, 30841, 15509, 0}, 0, 0, 239, 241, {3032,1338,14,243,1888,1319,4010,0,0,0,0,0,0,0},{4020,4040,254,4054,0,0,0,0},{3052,35,331,274,0,0,0,0,0,0,0,0},{3041,23,323,280,0,0,0,0,0}}
};
static const NumberFormatEntry number_format_entries [] = {
- {35403, 35406, 35403, 35406, 35403, 35406, 35409, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35465, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35485, 35494, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35506, 35471, 35473, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35559, 35573, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35607, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35632, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35636, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35639, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 0, 35477, 35588, 35644, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 35654, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35670, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35674, 35684, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35693, 35471, 35473, 35477, 35697, 35716, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35735, 35471, 35473, 35477, 35588, 35644, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35738, 763, 35738, 763, 35738, 0, 35471, 35473, 35477, 35742, 35751, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35760, 35471, 35768, 35477, 35784, 35812, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35839, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35842, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35853, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35857, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35860, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 3, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35865, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35868, 35471, 35872, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35888, 35902, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35915, 35471, 35918, 35477, 35932, 35944, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35955, 35471, 35846, 35477, 35958, 35969, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35403, 35406, 35403, 35406, 35403, 35406, 35979, 35419, 0, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35983, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35987, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35993, 36003, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36016, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36019, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36026, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36030, 35471, 36037, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 36063, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 36095, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 36121, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 36152, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36162, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36167, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36170, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36174, 35471, 0, 35477, 35439, 35449, 2601, 35458, 4, 1, 0, 0, 0, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36178, 35471, 0, 35477, 35439, 35449, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36186, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36193, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36206, 35419, 0, 35477, 35439, 35449, 2601, 35458, 3, 0, 4, 2, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36209, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36213, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36213, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36162, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35738, 763, 35738, 763, 35738, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36217, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36167, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 35409, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35465, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35485, 35494, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36220, 35471, 36224, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35506, 35471, 35473, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35559, 35573, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35607, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35632, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35636, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35639, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 0, 35477, 35588, 35644, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 35654, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35670, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35674, 35684, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35693, 35471, 35473, 35477, 35697, 35716, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35735, 35471, 35473, 35477, 35588, 35644, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35738, 763, 35738, 763, 35738, 0, 35471, 35473, 35477, 35742, 35751, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35760, 35471, 35768, 35477, 35784, 35812, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35839, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35842, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35853, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35857, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35860, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 3, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35865, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35868, 35471, 35872, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35888, 35902, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35915, 35471, 35918, 35477, 35932, 35944, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35955, 35471, 35846, 35477, 35958, 35969, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36019, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35403, 35406, 35403, 35406, 35403, 35406, 35979, 35419, 0, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35983, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35987, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36234, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35993, 36003, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36016, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36019, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36026, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36239, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 36037, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 36063, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 36095, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 36121, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 36152, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {763, 35460, 763, 35460, 763, 35460, 36162, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36167, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36170, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36174, 35471, 0, 35477, 35439, 35449, 2601, 35458, 4, 1, 0, 0, 0, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36012, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36178, 35471, 0, 35477, 35439, 35449, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36186, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
- {763, 35460, 763, 35460, 763, 35460, 36193, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36206, 35419, 0, 35477, 35439, 35449, 2601, 35458, 3, 0, 4, 2, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36209, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36213, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36213, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36213, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36162, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36217, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36167, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36245, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 36255, 763, 36255, 763, 36255, 0, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36167, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 36255, 763, 36255, 763, 36255, 0, 35471, 0, 35477, 35588, 35644, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35674, 35684, 2601, 35458, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35588, 35644, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36257, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36265, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36272, 35471, 36037, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36162, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36276, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 36224, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35586, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 15, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35846, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36286, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 0, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 7774, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 36255, 763, 36255, 763, 36255, 0, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36296, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 0, 35471, 36224, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 36255, 763, 36255, 763, 36255, 0, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36306, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36310, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36320, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36324, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36327, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36337, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36343, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36353, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36359, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36369, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36374, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36384, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36388, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36396, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36406, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36416, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36209, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36426, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36436, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36446, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35403, 35406, 35403, 35406, 35403, 35406, 36450, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36012, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
- {35460, 763, 35460, 763, 35460, 763, 36460, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36463, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 2471, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36467, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
- {35460, 763, 35460, 763, 35460, 763, 36470, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36478, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36257, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36483, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36234, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36265, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36486, 35471, 36224, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36486, 35471, 36224, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 763, 35460, 763, 35460, 763, 36478, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35460, 35460, 35460, 35460, 35460, 36019, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36239, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {35460, 35462, 35460, 35462, 35460, 35462, 36162, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
- {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
- {763, 35460, 763, 35460, 763, 35460, 36213, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}
+ {756, 36014, 36016, 36019, 36016, 36019, 36022, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36076, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36096, 36105, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36113, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36113, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36117, 36082, 36084, 36088, 36121, 36133, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36148, 36159, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36170, 36184, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36218, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36084, 36088, 36227, 36235, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36243, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36247, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36250, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 0, 36088, 36199, 36255, 2646, 36071, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36113, 36082, 36265, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36281, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36285, 36295, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 0, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36304, 36082, 36084, 36088, 36308, 36327, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36346, 36082, 36084, 36088, 36199, 36255, 2646, 36071, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36349, 756, 36351, 756, 36351, 0, 36082, 36084, 36088, 36355, 36364, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 0, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36373, 36082, 36381, 36088, 36397, 36425, 2646, 36071, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36452, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 0, 36088, 36121, 36133, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36455, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 36073, 36014, 36073, 36145, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36466, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36470, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36473, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 3, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36478, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36481, 36082, 36485, 36088, 36052, 36062, 2646, 36071, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36501, 36515, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36528, 36082, 36531, 36088, 36545, 36557, 2646, 36071, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 756, 36014, 756, 36014, 36568, 36082, 36459, 36088, 36571, 36582, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36592, 36073, 36014, 36014, 36014, 36014, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {239, 36014, 36016, 36019, 36016, 36019, 36594, 36032, 0, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36598, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 756, 36014, 756, 36602, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 0, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36608, 36618, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 0, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36631, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {2646, 36073, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {2646, 36073, 36014, 36073, 36014, 36073, 36634, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36641, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36645, 36082, 36652, 36088, 36052, 36062, 2646, 36071, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 36678, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 36710, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 36736, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 36767, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36777, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36782, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 756, 36014, 756, 36785, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36789, 36082, 0, 36088, 36052, 36062, 2646, 36071, 4, 1, 0, 0, 0, 0, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36793, 36082, 0, 36088, 36052, 36062, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36801, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36227, 36235, 2646, 36071, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36808, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+ {36016, 36019, 36016, 36019, 36016, 36019, 36821, 36032, 0, 36088, 36052, 36062, 2646, 36071, 3, 0, 4, 2, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36824, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36828, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36828, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36777, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36014, 36014, 36014, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 756, 36351, 756, 36351, 0, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36014, 36014, 36014, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 36832, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36782, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36022, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36076, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36096, 36105, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36835, 36082, 36839, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36117, 36082, 36084, 36088, 36121, 36133, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36148, 36159, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36170, 36184, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36218, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36084, 36088, 36227, 36235, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36243, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36247, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36250, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 0, 36088, 36199, 36255, 2646, 36071, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36113, 36082, 36265, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36281, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36285, 36295, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36145, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36304, 36082, 36084, 36088, 36308, 36327, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36346, 36082, 36084, 36088, 36199, 36255, 2646, 36071, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36349, 756, 36351, 756, 36351, 0, 36082, 36084, 36088, 36355, 36364, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 0, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36373, 36082, 36381, 36088, 36397, 36425, 2646, 36071, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36452, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 0, 36088, 36121, 36133, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36455, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 36073, 36014, 36073, 36145, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36466, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36470, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36473, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 3, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36478, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36481, 36082, 36485, 36088, 36052, 36062, 2646, 36071, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36501, 36515, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36528, 36082, 36531, 36088, 36545, 36557, 2646, 36071, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 756, 36014, 756, 36014, 36568, 36082, 36459, 36088, 36571, 36582, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36592, 36073, 36014, 36014, 36014, 36014, 36634, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {239, 36014, 36016, 36019, 36016, 36019, 36594, 36032, 0, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36598, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 756, 36014, 756, 36602, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 36849, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36608, 36618, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 0, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 0, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36631, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {2646, 36073, 36014, 36073, 36014, 36073, 36634, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36641, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36854, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 36652, 36088, 36052, 36062, 2646, 36071, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 36678, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 36710, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 36736, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 36767, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 756, 36014, 756, 36014, 36777, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36782, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 756, 36014, 756, 36785, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36789, 36082, 0, 36088, 36052, 36062, 2646, 36071, 4, 1, 0, 0, 0, 0, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36627, 36082, 0, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36793, 36082, 0, 36088, 36052, 36062, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36801, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 756, 36014, 756, 36014, 36808, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+ {36016, 36019, 36016, 36019, 36016, 36019, 36821, 36032, 0, 36088, 36052, 36062, 2646, 36071, 3, 0, 4, 2, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36824, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36828, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36828, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 10573, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36145, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36828, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36777, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36014, 36014, 36014, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36014, 36014, 36014, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 36832, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36782, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36860, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36113, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36349, 756, 36349, 756, 36349, 0, 36082, 36084, 36088, 36148, 36159, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36782, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36227, 36235, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36349, 756, 36349, 756, 36349, 0, 36082, 0, 36088, 36199, 36255, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36285, 36295, 2646, 36071, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36145, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 36073, 36014, 36073, 36092, 36082, 36084, 36088, 36199, 36255, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 36870, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36092, 36082, 0, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36197, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36878, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36014, 36014, 36014, 36885, 36082, 36652, 36088, 36052, 36062, 2646, 36071, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {756, 36014, 36014, 36073, 36014, 36073, 36777, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36889, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36839, 36088, 36052, 36062, 2646, 36071, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36148, 36159, 2646, 36071, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36197, 36082, 36084, 36088, 36227, 36235, 2646, 36071, 15, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36459, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36899, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 0, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36148, 36159, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 7812, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36349, 756, 36349, 756, 36349, 0, 36082, 36084, 36088, 36227, 36235, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36909, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 0, 36082, 36839, 36088, 36052, 36062, 2646, 36071, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36349, 756, 36349, 756, 36349, 0, 36082, 36084, 36088, 36148, 36159, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36919, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36227, 36235, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36923, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36092, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36933, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36092, 36082, 36084, 36088, 36227, 36235, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36937, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36940, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 10573, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36950, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36956, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36966, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36972, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36982, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 36987, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36997, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 37001, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 37009, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 37019, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36092, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 37029, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36824, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 9, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 37039, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 37049, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 3, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 37059, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36016, 36019, 36016, 36019, 37063, 36032, 36035, 36049, 36052, 36062, 2646, 36071, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36627, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+ {36014, 756, 36014, 756, 36014, 756, 37073, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 37076, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 2516, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 37080, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36197, 36082, 36084, 36088, 36199, 36209, 2646, 36071, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+ {36014, 756, 36014, 756, 36014, 756, 37083, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 37091, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 36870, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 37096, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36145, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 756, 36014, 756, 36849, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36878, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36052, 36062, 2646, 36071, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 37099, 36082, 36839, 36088, 36052, 36062, 2646, 36071, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 37099, 36082, 36839, 36088, 36052, 36062, 2646, 36071, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36145, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36014, 756, 36014, 756, 36014, 756, 37091, 36082, 36084, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {36592, 36073, 36014, 36014, 36014, 36014, 36634, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {36014, 36073, 36014, 36073, 36014, 36073, 36854, 36082, 0, 36088, 36052, 36062, 2646, 36071, 8, 3, 1, 1, 1, 0, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 36014, 36073, 36014, 36073, 36777, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+ {756, 36014, 36014, 36073, 36014, 36073, 0, 36082, 0, 36088, 36227, 36235, 2646, 36071, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+ {756, 36014, 756, 36014, 756, 36014, 36828, 36082, 0, 36088, 36052, 36062, 2646, 36071, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}
};
static const CultureInfoEntry culture_entries [] = {
- {0x0001, 0x007F, 768, -1, 36490, 36493, 36500, 36515, 36519, 36490, 0, {0, 0, 36523, 0}, 0, 0, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x0002, 0x007F, 257, -1, 36551, 36554, 36564, 36583, 36587, 36551, 0, {36591, 0, 0, 0}, 1, 1, { 1251, 21025, 10007, 866, 0, ';' }},
- {0x0003, 0x007F, 257, -1, 36633, 36636, 36644, 36652, 36656, 36633, 0, {36660, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0004, 0x0004, 257, -1, 36680, 36687, 36715, 36722, 36726, 36730, 0, {36733, 0, 0, 0}, 3, 3, { 936, 500, 10008, 936, 0, ',' }},
- {0x0004, 0x7804, 257, -1, 36740, 36748, 36715, 36722, 36726, 36730, 0, {36733, 0, 0, 0}, 4, 4, { 936, 500, 10008, 936, 0, ',' }},
- {0x0005, 0x007F, 257, -1, 36769, 36772, 36778, 36788, 36792, 36769, 0, {36796, 0, 0, 0}, 5, 5, { 1250, 500, 10029, 852, 0, ';' }},
- {0x0006, 0x007F, 257, -1, 36822, 36825, 36832, 36838, 36842, 36822, 0, {36846, 0, 0, 0}, 6, 6, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x0007, 0x007F, 257, -1, 36867, 36870, 36877, 36885, 36889, 36867, 0, {36893, 0, 0, 0}, 7, 7, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x0008, 0x007F, 257, -1, 36918, 36921, 36927, 36944, 36948, 36918, 0, {36952, 0, 0, 0}, 8, 8, { 1253, 20273, 10006, 737, 0, ';' }},
- {0x0009, 0x007F, 257, -1, 36994, 36997, 36997, 37005, 37009, 36994, 0, {37013, 0, 0, 0}, 9, 9, { 1252, 37, 10000, 437, 0, ',' }},
- {0x000A, 0x007F, 257, -1, 37032, 37035, 37043, 37052, 37056, 37032, 0, {37060, 0, 0, 0}, 10, 10, { 1252, 20284, 10000, 850, 0, ';' }},
- {0x000B, 0x007F, 257, -1, 37082, 37085, 37093, 37099, 37103, 37082, 0, {37107, 0, 0, 0}, 11, 11, { 1252, 20278, 10000, 850, 0, ';' }},
- {0x000C, 0x007F, 257, -1, 37132, 37135, 37142, 37152, 37156, 37132, 0, {37160, 0, 0, 0}, 12, 12, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x000D, 0x007F, 257, -1, 37182, 37185, 37192, 37203, 37207, 37182, 0, {37211, 0, 0, 0}, 13, 13, { 1255, 500, 10005, 862, 1, ',' }},
- {0x000E, 0x007F, 257, -1, 37244, 37247, 37257, 37264, 37268, 37244, 0, {37272, 0, 0, 0}, 14, 14, { 1250, 500, 10029, 852, 0, ';' }},
- {0x000F, 0x007F, 257, -1, 37288, 37291, 37301, 37311, 37315, 37288, 0, {37319, 0, 0, 0}, 15, 15, { 1252, 20871, 10079, 850, 0, ';' }},
- {0x0010, 0x007F, 257, -1, 37339, 37342, 37350, 37359, 37363, 37339, 0, {37060, 0, 0, 0}, 16, 16, { 1252, 20280, 10000, 850, 0, ';' }},
- {0x0011, 0x007F, 257, -1, 37367, 37370, 37379, 37389, 37393, 37367, 0, {37397, 0, 0, 0}, 17, 17, { 932, 20290, 10001, 932, 0, ',' }},
- {0x0012, 0x007F, 257, -1, 37424, 37427, 37434, 37444, 37448, 37424, 0, {37452, 0, 0, 0}, 18, 18, { 949, 20833, 10003, 949, 0, ',' }},
- {0x0013, 0x007F, 257, -1, 37462, 37465, 37471, 37482, 37486, 37462, 0, {37490, 0, 0, 0}, 19, 19, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0014, 0x007F, 257, -1, 37512, 37515, 37525, 37531, 37535, 37539, 0, {36846, 0, 0, 0}, 20, 20, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x0015, 0x007F, 257, -1, 37542, 37545, 37552, 37559, 37563, 37542, 0, {37567, 0, 0, 0}, 21, 21, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x0016, 0x007F, 257, -1, 37591, 37594, 37605, 37616, 37620, 37591, 0, {37624, 0, 0, 0}, 22, 22, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0017, 0x007F, 257, -1, 37647, 37650, 37658, 37668, 37672, 37647, 0, {37676, 0, 0, 0}, 23, 23, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x0018, 0x007F, 257, -1, 37696, 37699, 37708, 37717, 37721, 37696, 0, {37725, 0, 0, 0}, 24, 24, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x0019, 0x007F, 257, -1, 37744, 37747, 37755, 37770, 37774, 37744, 0, {37778, 0, 0, 0}, 25, 25, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x001A, 0x007F, 257, -1, 37824, 37827, 37836, 37845, 37849, 37824, 0, {37853, 0, 0, 0}, 26, 26, { 1250, 500, 10082, 852, 0, ';' }},
- {0x001B, 0x007F, 257, -1, 37876, 37879, 37886, 37898, 37902, 37876, 0, {37906, 0, 0, 0}, 27, 27, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x001C, 0x007F, 257, -1, 37930, 37933, 37942, 37948, 37952, 37930, 0, {0, 0, 0, 0}, 28, 28, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x001D, 0x007F, 257, -1, 37956, 37959, 37967, 37975, 37979, 37956, 0, {36846, 0, 0, 0}, 29, 29, { 1252, 20278, 10000, 850, 0, ';' }},
- {0x001E, 0x007F, 512, -1, 37983, 37986, 37991, 38001, 38005, 37983, 0, {0, 38009, 0, 0}, 30, 30, { 874, 20838, 10021, 874, 0, ',' }},
- {0x001F, 0x007F, 257, -1, 38040, 38043, 38051, 38060, 38064, 38040, 0, {38068, 0, 0, 0}, 31, 31, { 1254, 20905, 10081, 857, 0, ';' }},
- {0x0020, 0x007F, 257, -1, 38082, 38085, 38090, 38099, 38103, 38082, 0, {38107, 0, 0, 0}, 32, 32, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x0021, 0x007F, 257, -1, 38137, 38140, 38151, 38168, 38172, 38137, 0, {38176, 0, 0, 0}, 33, 33, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0022, 0x007F, 257, -1, 38195, 38198, 38208, 38229, 38233, 38195, 0, {38237, 0, 0, 0}, 34, 34, { 1251, 500, 10017, 866, 0, ';' }},
- {0x0023, 0x007F, 257, -1, 38283, 38286, 38297, 38318, 38322, 38283, 0, {38326, 0, 0, 0}, 35, 35, { 1251, 500, 10007, 866, 0, ';' }},
- {0x0024, 0x007F, 257, -1, 38368, 38371, 38381, 38395, 38399, 38368, 0, {38403, 0, 0, 0}, 36, 36, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x0025, 0x007F, 257, -1, 38425, 38428, 38437, 38443, 38447, 38425, 0, {38451, 0, 0, 0}, 37, 37, { 1257, 500, 10029, 775, 0, ';' }},
- {0x0026, 0x007F, 257, -1, 38471, 38474, 38482, 38492, 38496, 38471, 0, {38500, 0, 0, 0}, 38, 38, { 1257, 500, 10029, 775, 0, ';' }},
- {0x0027, 0x007F, 257, -1, 38519, 38522, 38533, 38543, 38547, 38519, 0, {38551, 0, 0, 0}, 39, 39, { 1257, 500, 10029, 775, 0, ';' }},
- {0x0028, 0x007F, 257, -1, 38574, 38577, 0, 38583, 38587, 38574, 0, {0, 0, 0, 0}, 40, 40, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0029, 0x007F, 257, -1, 38591, 38594, 38602, 38613, 38617, 38591, 0, {38621, 0, 0, 0}, 41, 41, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x002A, 0x007F, 257, -1, 38645, 38648, 38659, 38674, 4121, 38645, 0, {38678, 0, 0, 0}, 42, 42, { 1258, 500, 10000, 1258, 0, ',' }},
- {0x002B, 0x007F, 257, -1, 38693, 38696, 38705, 38720, 38724, 38693, 0, {0, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, 0, ',' }},
- {0x002C, 0x007F, 257, -1, 14519, 38728, 38740, 38754, 38758, 14519, 0, {38762, 0, 0, 0}, 44, 44, { 1254, 20905, 10081, 857, 0, ';' }},
- {0x002D, 0x007F, 257, -1, 38780, 38783, 38790, 38798, 38802, 38780, 0, {38806, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 850, 0, ';' }},
- {0x002F, 0x007F, 257, -1, 38826, 38829, 38840, 38861, 38865, 38826, 0, {38869, 0, 0, 0}, 46, 46, { 1251, 500, 10007, 866, 0, ';' }},
- {0x0032, 0x007F, 257, -1, 38913, 38916, 38923, 38932, 38936, 38913, 0, {0, 0, 0, 0}, 47, 47, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0034, 0x007F, 257, -1, 38940, 38943, 38949, 38958, 38962, 38940, 0, {0, 0, 0, 0}, 48, 48, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0035, 0x007F, 257, -1, 38966, 38969, 38974, 38982, 38986, 38966, 0, {38990, 0, 0, 0}, 49, 49, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0036, 0x007F, 257, -1, 39011, 39014, 39014, 39024, 39028, 39011, 0, {39032, 0, 0, 0}, 50, 50, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0037, 0x007F, 257, -1, 39052, 39055, 39064, 39086, 39090, 39052, 0, {39094, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, 0, ';' }},
- {0x0038, 0x007F, 257, -1, 39159, 39162, 39170, 39180, 39184, 39159, 0, {0, 0, 0, 0}, 52, 52, { 1252, 20277, 10079, 850, 0, ';' }},
- {0x0039, 0x007F, 257, -1, 39188, 39191, 39197, 39216, 39220, 39188, 0, {39224, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, 0, ',' }},
- {0x003A, 0x007F, 257, -1, 39265, 39268, 39276, 39282, 39286, 39265, 0, {39290, 0, 0, 0}, 54, 54, { 0, 500, 2, 1, 0, ',' }},
- {0x003B, 0x007F, 257, -1, 39311, 39314, 39328, 39345, 39349, 39311, 0, {0, 0, 0, 0}, 55, 55, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x003C, 0x007F, 257, -1, 39353, 39356, 39362, 39370, 39374, 39353, 0, {39378, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, 0, ',' }},
- {0x003E, 0x007F, 257, -1, 39399, 39402, 39408, 39422, 39426, 39399, 0, {39430, 0, 0, 0}, 57, 57, { 1252, 500, 10000, 850, 0, ';' }},
- {0x003F, 0x007F, 257, -1, 39447, 39450, 39457, 39477, 39481, 39447, 0, {39485, 0, 0, 0}, 58, 58, { 0, 500, 2, 1, 0, ';' }},
- {0x0040, 0x007F, 257, -1, 39527, 39530, 39538, 39551, 39555, 39527, 0, {0, 0, 0, 0}, 59, 59, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0041, 0x007F, 257, -1, 39559, 39562, 39570, 39580, 39584, 39559, 0, {39588, 0, 0, 0}, 60, 60, { 1252, 500, 10000, 437, 0, ',' }},
- {0x0043, 0x007F, 257, -1, 39609, 39612, 39618, 39629, 39633, 39609, 0, {0, 0, 0, 0}, 61, 61, { 1254, 500, 10029, 857, 0, ';' }},
- {0x0045, 0x007F, 257, -1, 39637, 39640, 39648, 39664, 39668, 39637, 0, {39672, 0, 0, 0}, 62, 62, { 0, 500, 2, 1, 0, ',' }},
- {0x0046, 0x007F, 257, -1, 39737, 39740, 39748, 39767, 39771, 39737, 0, {0, 0, 0, 0}, 63, 63, { 0, 500, 2, 1, 0, ',' }},
- {0x0047, 0x007F, 257, -1, 39775, 39778, 39787, 39809, 39813, 39775, 0, {39817, 0, 0, 0}, 64, 64, { 0, 500, 2, 1, 0, ',' }},
- {0x0048, 0x007F, 257, -1, 14525, 39873, 39879, 39895, 39899, 14525, 0, {0, 0, 0, 0}, 65, 65, { 0, 500, 2, 1, 0, ',' }},
- {0x0049, 0x007F, 257, -1, 39903, 39906, 39912, 39928, 39932, 39903, 0, {39936, 0, 0, 0}, 66, 66, { 0, 500, 2, 1, 0, ',' }},
- {0x004A, 0x007F, 257, -1, 40001, 40004, 40011, 40030, 40034, 40001, 0, {40038, 0, 0, 0}, 67, 67, { 0, 500, 2, 1, 0, ',' }},
- {0x004B, 0x007F, 257, -1, 35839, 40103, 40111, 40127, 40131, 35839, 0, {40135, 0, 0, 0}, 68, 68, { 0, 500, 2, 1, 0, ',' }},
- {0x004C, 0x007F, 257, -1, 40206, 40209, 40219, 40238, 40242, 40206, 0, {40246, 0, 0, 0}, 69, 69, { 0, 500, 2, 1, 0, ',' }},
- {0x004D, 0x007F, 257, -1, 14516, 40296, 40305, 40327, 40331, 14516, 0, {40335, 0, 0, 0}, 70, 70, { 0, 500, 2, 1, 0, ',' }},
- {0x004E, 0x007F, 257, -1, 40388, 40391, 40399, 40415, 2565, 40388, 0, {40419, 0, 0, 0}, 71, 71, { 0, 500, 2, 1, 0, ',' }},
- {0x0050, 0x007F, 257, -1, 40481, 40484, 40494, 40507, 40511, 40481, 0, {0, 0, 0, 0}, 72, 72, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0051, 0x007F, 257, -1, 40515, 40518, 40526, 40551, 40555, 40515, 0, {0, 0, 0, 0}, 73, 73, { 0, 500, 2, 1, 0, ',' }},
- {0x0052, 0x007F, 257, -1, 40559, 40562, 40568, 40576, 40580, 40559, 0, {0, 0, 0, 0}, 74, 74, { 1252, 20285, 10000, 850, 0, ',' }},
- {0x0053, 0x007F, 257, -1, 40584, 40587, 40593, 40621, 40625, 40584, 0, {0, 0, 0, 0}, 75, 75, { 0, 500, 2, 1, 0, ',' }},
- {0x0054, 0x007F, 257, -1, 40629, 40632, 40636, 40646, 40650, 40629, 0, {0, 0, 0, 0}, 76, 76, { 0, 500, 2, 1, 0, ',' }},
- {0x0056, 0x007F, 257, -1, 40654, 40657, 40666, 40673, 40677, 40654, 0, {37060, 0, 0, 0}, 77, 77, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0057, 0x007F, 257, -1, 40681, 40685, 40693, 40712, 40681, 40681, 0, {0, 0, 0, 0}, 78, 78, { 0, 500, 2, 1, 0, ',' }},
- {0x005B, 0x007F, 257, -1, 40716, 40719, 40727, 40743, 40747, 40716, 0, {40751, 0, 0, 0}, 79, 79, { 0, 500, 2, 1, 0, ',' }},
- {0x005E, 0x007F, 257, -1, 7865, 40773, 40781, 40794, 40798, 7865, 0, {40802, 0, 0, 0}, 80, 80, { 0, 500, 2, 1, 0, ';' }},
- {0x005F, 0x007F, 257, -1, 40847, 40851, 40877, 40887, 40847, 40847, 0, {0, 0, 0, 0}, 81, 81, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0061, 0x007F, 257, -1, 2059, 40891, 40898, 40917, 40921, 2059, 0, {40925, 0, 0, 0}, 82, 82, { 0, 500, 2, 1, 0, ',' }},
- {0x0063, 0x007F, 1024, -1, 40975, 40978, 40985, 40994, 40998, 40975, 0, {0, 0, 0, 0}, 83, 83, { 0, 500, 2, 1, 1, ';' }},
- {0x0064, 0x007F, 257, -1, 41002, 41006, 41006, 41015, 41002, 41002, 0, {41019, 0, 0, 0}, 84, 84, { 1252, 500, 10000, 437, 0, ',' }},
- {0x0068, 0x007F, 257, -1, 41042, 41045, 41045, 41051, 41055, 41042, 0, {0, 0, 0, 0}, 85, 85, { 1252, 37, 10000, 437, 0, ',' }},
- {0x006A, 0x007F, 257, -1, 41059, 41062, 41069, 41084, 41088, 41059, 0, {0, 0, 0, 0}, 86, 86, { 1252, 37, 10000, 437, 0, ',' }},
- {0x006C, 0x007F, 257, -1, 41092, 41096, 41111, 41128, 41092, 41092, 0, {0, 0, 0, 0}, 87, 87, { 1252, 500, 10000, 850, 0, ',' }},
- {0x006F, 0x007F, 257, -1, 41132, 41135, 41147, 41159, 41163, 41132, 0, {0, 0, 0, 0}, 88, 88, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x0070, 0x007F, 257, -1, 14510, 41167, 41167, 41172, 41176, 14510, 0, {0, 0, 0, 0}, 89, 89, { 1252, 37, 10000, 437, 0, ',' }},
- {0x0078, 0x007F, 257, -1, 41180, 41183, 41194, 41204, 41208, 41180, 0, {41212, 0, 0, 0}, 90, 90, { 0, 500, 2, 1, 0, ',' }},
- {0x007E, 0x007F, 257, -1, 41225, 41228, 41235, 41245, 41249, 41225, 0, {41253, 0, 0, 0}, 91, 91, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0082, 0x007F, 257, -1, 41273, 41276, 41284, 41292, 41296, 41273, 0, {0, 0, 0, 0}, 92, 92, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0084, 0x007F, 257, -1, 41300, 41304, 41317, 41336, 41300, 41300, 0, {41340, 0, 0, 0}, 93, 93, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0085, 0x007F, 257, -1, 41365, 41369, 41375, 41393, 41365, 41365, 0, {0, 0, 0, 0}, 94, 94, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0087, 0x007F, 257, -1, 41397, 41400, 41400, 41412, 41416, 41397, 0, {0, 0, 0, 0}, 95, 95, { 1252, 37, 10000, 437, 0, ';' }},
- {0x0091, 0x007F, 257, -1, 41420, 41423, 41439, 41449, 41453, 41420, 0, {41457, 0, 0, 0}, 96, 96, { 1252, 20285, 10000, 850, 0, ',' }},
- {0x0401, 0x0001, 768, 98, 41482, 41488, 41510, 36515, 36519, 36490, 13258, {0, 0, 36523, 0}, 97, 97, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x0402, 0x0002, 257, 11, 41574, 41580, 41601, 36583, 36587, 36551, 41639, {36591, 0, 0, 0}, 98, 98, { 1251, 21025, 10007, 866, 0, ';' }},
- {0x0403, 0x0003, 257, 32, 41642, 41648, 41664, 36652, 36656, 36633, 41682, {36660, 0, 0, 0}, 99, 99, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0404, 0x7C04, 257, 110, 41685, 41691, 41713, 41729, 36726, 36730, 41733, {41736, 0, 0, 0}, 100, 100, { 950, 500, 10002, 950, 0, ',' }},
- {0x0405, 0x0005, 257, 24, 41743, 41749, 41772, 36788, 36792, 36769, 41802, {36796, 0, 0, 0}, 101, 101, { 1250, 500, 10029, 852, 0, ';' }},
- {0x0406, 0x0006, 257, 26, 41805, 41811, 41828, 36838, 36842, 36822, 41844, {36846, 0, 0, 0}, 102, 102, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x0407, 0x0007, 257, 25, 41847, 41853, 41870, 36885, 36889, 36867, 41892, {36893, 0, 0, 0}, 103, 103, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x0408, 0x0008, 257, 40, 41895, 41901, 41916, 36944, 36948, 36918, 41948, {36952, 0, 0, 0}, 104, 104, { 1253, 20273, 10006, 737, 0, ';' }},
- {0x0409, 0x0009, 257, 112, 41951, 41957, 41957, 37005, 37009, 36994, 41981, {37013, 0, 0, 0}, 105, 105, { 1252, 37, 10000, 437, 0, ',' }},
- {0x040B, 0x000B, 257, 34, 41984, 41990, 42008, 37099, 37103, 37082, 42022, {37107, 0, 0, 0}, 106, 106, { 1252, 20278, 10000, 850, 0, ';' }},
- {0x040C, 0x000C, 257, 36, 42025, 42031, 42047, 37152, 37156, 37132, 42066, {37160, 0, 0, 0}, 107, 107, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x040D, 0x000D, 257, 48, 42069, 42075, 42091, 37203, 37207, 37182, 42115, {37211, 0, 0, 0}, 108, 108, { 1255, 500, 10005, 862, 1, ',' }},
- {0x040E, 0x000E, 257, 45, 42118, 42124, 42144, 37264, 37268, 37244, 42167, {37272, 0, 0, 0}, 109, 109, { 1250, 500, 10029, 852, 0, ';' }},
- {0x040F, 0x000F, 257, 52, 42170, 42176, 42196, 37311, 37315, 37288, 42216, {37319, 0, 0, 0}, 110, 110, { 1252, 20871, 10079, 850, 0, ';' }},
- {0x0410, 0x0010, 257, 53, 42219, 42225, 42241, 37359, 37363, 37339, 42259, {37060, 0, 0, 0}, 111, 111, { 1252, 20280, 10000, 850, 0, ';' }},
- {0x0411, 0x0011, 257, 56, 42262, 42268, 42285, 37389, 37393, 37367, 42304, {37397, 0, 0, 0}, 112, 112, { 932, 20290, 10001, 932, 0, ',' }},
- {0x0412, 0x0012, 257, 60, 42307, 42313, 42334, 37444, 37448, 37424, 42359, {37452, 0, 0, 0}, 113, 113, { 949, 20833, 10003, 949, 0, ',' }},
- {0x0413, 0x0013, 257, 80, 42362, 42368, 42388, 37482, 37486, 37462, 42411, {37490, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0414, 0x7C14, 257, 81, 42414, 42420, 42447, 37531, 37535, 37539, 42469, {36846, 0, 0, 0}, 115, 115, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x0415, 0x0015, 257, 89, 42472, 42478, 42494, 37559, 37563, 37542, 42510, {37567, 0, 0, 0}, 116, 116, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x0416, 0x0016, 257, 15, 42513, 42519, 42539, 37616, 37620, 37591, 42559, {37624, 0, 0, 0}, 117, 117, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0417, 0x0017, 257, 19, 42562, 42568, 42590, 37668, 37672, 37647, 13261, {37676, 0, 0, 0}, 118, 118, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x0418, 0x0018, 257, 94, 42609, 42615, 42634, 37717, 37721, 37696, 42654, {37725, 0, 0, 0}, 119, 119, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x0419, 0x0019, 257, 96, 42657, 42663, 42680, 37770, 37774, 37744, 42710, {37778, 0, 0, 0}, 120, 120, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x041A, 0x001A, 257, 44, 42713, 42719, 42738, 37845, 37849, 37824, 42758, {37853, 0, 0, 0}, 121, 121, { 1250, 500, 10082, 852, 0, ';' }},
- {0x041B, 0x001B, 257, 102, 42761, 42767, 42785, 37898, 37902, 37876, 42820, {37906, 0, 0, 0}, 122, 122, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x041C, 0x001C, 257, 2, 42823, 42829, 42848, 37948, 37952, 37930, 42867, {0, 0, 0, 0}, 123, 123, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x041D, 0x001D, 257, 99, 42870, 42876, 42893, 37975, 37979, 37956, 42911, {36846, 0, 0, 0}, 124, 124, { 1252, 20278, 10000, 850, 0, ';' }},
- {0x041E, 0x001E, 512, 105, 42914, 42920, 42936, 38001, 38005, 37983, 42958, {0, 38009, 0, 0}, 125, 125, { 874, 20838, 10021, 874, 0, ',' }},
- {0x041F, 0x001F, 257, 108, 42961, 42967, 42984, 38060, 38064, 38040, 43004, {38068, 0, 0, 0}, 126, 126, { 1254, 20905, 10081, 857, 0, ';' }},
- {0x0420, 0x0020, 257, 88, 43007, 43013, 43029, 38099, 38103, 38082, 43055, {38107, 0, 0, 0}, 127, 127, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x0421, 0x0021, 257, 46, 43058, 43064, 43087, 38168, 38172, 38137, 43116, {38176, 0, 0, 0}, 128, 128, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0422, 0x0022, 257, 111, 43119, 43125, 43145, 38229, 38233, 38195, 43183, {38237, 0, 0, 0}, 129, 129, { 1251, 500, 10017, 866, 0, ';' }},
- {0x0423, 0x0023, 257, 16, 43186, 43192, 43213, 38318, 38322, 38283, 43253, {38326, 0, 0, 0}, 130, 130, { 1251, 500, 10007, 866, 0, ';' }},
- {0x0424, 0x0024, 257, 101, 43256, 43262, 43283, 38395, 38399, 38368, 43309, {38403, 0, 0, 0}, 131, 131, { 1250, 20880, 10029, 852, 0, ';' }},
- {0x0425, 0x0025, 257, 30, 43312, 43318, 43337, 38443, 38447, 38425, 43351, {38451, 0, 0, 0}, 132, 132, { 1257, 500, 10029, 775, 0, ';' }},
- {0x0426, 0x0026, 257, 68, 43354, 43360, 43377, 38492, 38496, 38471, 43397, {38500, 0, 0, 0}, 133, 133, { 1257, 500, 10029, 775, 0, ';' }},
- {0x0427, 0x0027, 257, 66, 43400, 43406, 43429, 38543, 38547, 38519, 43449, {38551, 0, 0, 0}, 134, 134, { 1257, 500, 10029, 775, 0, ';' }},
- {0x0428, 0x7C28, 257, 106, 43452, 43463, 0, 38583, 38587, 38574, 43492, {0, 0, 0, 0}, 135, 135, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0429, 0x0029, 257, 51, 43495, 43501, 43516, 38613, 38617, 38591, 43540, {38621, 0, 0, 0}, 136, 136, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x042A, 0x002A, 257, 116, 43543, 43549, 43570, 38674, 4121, 38645, 43598, {38678, 0, 0, 0}, 137, 137, { 1258, 500, 10000, 1258, 0, ',' }},
- {0x042B, 0x002B, 257, 3, 43601, 43607, 43626, 38720, 38724, 38693, 3781, {0, 0, 0, 0}, 138, 138, { 0, 500, 2, 1, 0, ',' }},
- {0x042C, 0x782C, 257, 7, 43691, 43702, 43734, 38754, 38758, 14519, 43762, {38762, 0, 0, 0}, 139, 139, { 1254, 20905, 10081, 857, 0, ';' }},
- {0x042D, 0x002D, 257, 32, 43765, 43771, 43786, 38798, 38802, 38780, 41682, {38806, 0, 0, 0}, 140, 140, { 1252, 500, 10000, 850, 0, ';' }},
- {0x042F, 0x002F, 257, 73, 43805, 43811, 43834, 38861, 38865, 38826, 43878, {38869, 0, 0, 0}, 141, 141, { 1251, 500, 10007, 866, 0, ';' }},
- {0x0432, 0x0032, 257, 118, 43881, 43887, 38923, 38932, 38936, 38913, 43909, {0, 0, 0, 0}, 142, 142, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0434, 0x0034, 257, 118, 43912, 43918, 38949, 38958, 38962, 38940, 43909, {0, 0, 0, 0}, 143, 143, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0435, 0x0035, 257, 118, 43939, 43945, 43965, 38982, 38986, 38966, 43909, {38990, 0, 0, 0}, 144, 144, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0436, 0x0036, 257, 118, 43993, 43999, 44024, 39024, 39028, 39011, 43909, {39032, 0, 0, 0}, 145, 145, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0437, 0x0037, 257, 38, 44048, 44054, 44073, 39086, 39090, 39052, 44128, {39094, 0, 0, 0}, 146, 146, { 0, 500, 2, 1, 0, ';' }},
- {0x0438, 0x0038, 257, 35, 44131, 44137, 44161, 39180, 39184, 39159, 44182, {0, 0, 0, 0}, 147, 147, { 1252, 20277, 10079, 850, 0, ';' }},
- {0x0439, 0x0039, 257, 49, 44185, 44191, 44205, 39216, 39220, 39188, 44239, {39224, 0, 0, 0}, 148, 148, { 0, 500, 2, 1, 0, ',' }},
- {0x043A, 0x003A, 257, 75, 44242, 44248, 44264, 39282, 39286, 39265, 44278, {39290, 0, 0, 0}, 149, 149, { 0, 500, 2, 1, 0, ',' }},
- {0x043B, 0x003B, 257, 81, 44281, 44287, 44310, 39345, 39349, 39311, 42469, {0, 0, 0, 0}, 150, 150, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x043E, 0x003E, 257, 77, 44335, 44341, 44358, 39422, 39426, 39399, 44383, {39430, 0, 0, 0}, 151, 151, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0440, 0x0040, 257, 58, 44386, 44392, 44413, 39551, 39555, 39527, 44449, {0, 0, 0, 0}, 152, 152, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0441, 0x0041, 257, 57, 44452, 44458, 44474, 39580, 39584, 39559, 44492, {39588, 0, 0, 0}, 153, 153, { 1252, 500, 10000, 437, 0, ',' }},
- {0x0443, 0x7C43, 257, 114, 44495, 44506, 44532, 39629, 39633, 39609, 44566, {0, 0, 0, 0}, 154, 154, { 1254, 500, 10029, 857, 0, ';' }},
- {0x0445, 0x0045, 257, 49, 44569, 44575, 44591, 39664, 39668, 39637, 44239, {39672, 0, 0, 0}, 155, 155, { 0, 500, 2, 1, 0, ',' }},
- {0x0447, 0x0047, 257, 49, 44622, 44628, 44645, 39809, 39813, 39775, 44239, {39817, 0, 0, 0}, 156, 156, { 0, 500, 2, 1, 0, ',' }},
- {0x0448, 0x0048, 257, 49, 44682, 44688, 44702, 39895, 39899, 14525, 44239, {0, 0, 0, 0}, 157, 157, { 0, 500, 2, 1, 0, ',' }},
- {0x0449, 0x0049, 257, 49, 44733, 44739, 44753, 39928, 39932, 39903, 44239, {39936, 0, 0, 0}, 158, 158, { 0, 500, 2, 1, 0, ',' }},
- {0x044A, 0x004A, 257, 49, 44793, 44799, 44814, 40030, 40034, 40001, 44239, {40038, 0, 0, 0}, 159, 159, { 0, 500, 2, 1, 0, ',' }},
- {0x044B, 0x004B, 257, 49, 44861, 44867, 44883, 40127, 40131, 35839, 44239, {40135, 0, 0, 0}, 160, 160, { 0, 500, 2, 1, 0, ',' }},
- {0x044C, 0x004C, 257, 49, 44914, 44920, 44938, 40238, 40242, 40206, 44239, {40246, 0, 0, 0}, 161, 161, { 0, 500, 2, 1, 0, ',' }},
- {0x044D, 0x004D, 257, 49, 44978, 44984, 45001, 40327, 40331, 14516, 44239, {40335, 0, 0, 0}, 162, 162, { 0, 500, 2, 1, 0, ',' }},
- {0x044E, 0x004E, 257, 49, 45038, 45044, 45060, 40415, 2565, 40388, 44239, {40419, 0, 0, 0}, 163, 163, { 0, 500, 2, 1, 0, ',' }},
- {0x0451, 0x0051, 257, 21, 45091, 45097, 45113, 40551, 40555, 40515, 13340, {0, 0, 0, 0}, 164, 164, { 0, 500, 2, 1, 0, ',' }},
- {0x0452, 0x0052, 257, 37, 45159, 45165, 45188, 40576, 40580, 40559, 45211, {0, 0, 0, 0}, 165, 165, { 1252, 20285, 10000, 850, 0, ',' }},
- {0x0453, 0x0053, 257, 59, 45214, 45220, 45237, 40621, 40625, 40584, 45289, {0, 0, 0, 0}, 166, 166, { 0, 500, 2, 1, 0, ',' }},
- {0x0454, 0x0054, 257, 62, 45292, 45298, 45309, 40646, 40650, 40629, 45331, {0, 0, 0, 0}, 167, 167, { 0, 500, 2, 1, 0, ',' }},
- {0x0456, 0x0056, 257, 32, 45334, 45340, 45357, 40673, 40677, 40654, 41682, {37060, 0, 0, 0}, 168, 168, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0457, 0x0057, 257, 49, 45374, 45381, 45397, 40712, 40681, 40681, 44239, {0, 0, 0, 0}, 169, 169, { 0, 500, 2, 1, 0, ',' }},
- {0x045B, 0x005B, 257, 65, 45431, 45437, 45457, 40743, 40747, 40716, 45507, {40751, 0, 0, 0}, 170, 170, { 0, 500, 2, 1, 0, ',' }},
- {0x045E, 0x005E, 257, 33, 45510, 45516, 45535, 40794, 40798, 7865, 45566, {40802, 0, 0, 0}, 171, 171, { 0, 500, 2, 1, 0, ';' }},
- {0x0461, 0x0061, 257, 82, 45569, 45575, 45590, 40917, 40921, 2059, 45627, {40925, 0, 0, 0}, 172, 172, { 0, 500, 2, 1, 0, ',' }},
- {0x0463, 0x0063, 1024, 1, 45630, 45636, 45657, 40994, 40998, 40975, 45687, {0, 0, 0, 0}, 173, 173, { 0, 500, 2, 1, 1, ';' }},
- {0x0464, 0x0064, 257, 87, 45690, 45697, 45720, 41015, 41002, 41002, 45741, {41019, 0, 0, 0}, 174, 174, { 1252, 500, 10000, 437, 0, ',' }},
- {0x0468, 0x7C68, 257, 78, 45744, 45755, 45778, 41051, 41055, 41042, 45795, {0, 0, 0, 0}, 175, 175, { 1252, 37, 10000, 437, 0, ',' }},
- {0x046A, 0x006A, 257, 78, 45798, 45804, 45821, 41084, 41088, 41059, 45795, {0, 0, 0, 0}, 176, 176, { 1252, 37, 10000, 437, 0, ',' }},
- {0x046C, 0x006C, 257, 118, 45867, 45874, 41111, 41128, 41092, 41092, 43909, {0, 0, 0, 0}, 177, 177, { 1252, 500, 10000, 850, 0, ',' }},
- {0x046F, 0x006F, 257, 39, 45904, 45910, 45934, 41159, 41163, 41132, 45965, {0, 0, 0, 0}, 178, 178, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x0470, 0x0070, 257, 78, 45968, 45974, 45974, 41172, 41176, 14510, 45795, {0, 0, 0, 0}, 179, 179, { 1252, 37, 10000, 437, 0, ',' }},
- {0x0478, 0x0078, 257, 21, 45989, 45995, 46014, 41204, 41208, 41180, 13340, {41212, 0, 0, 0}, 180, 180, { 0, 500, 2, 1, 0, ',' }},
- {0x047E, 0x007E, 257, 36, 46033, 46039, 46055, 41245, 41249, 41225, 42066, {41253, 0, 0, 0}, 181, 181, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0482, 0x0082, 257, 36, 46074, 46080, 46097, 41292, 41296, 41273, 42066, {0, 0, 0, 0}, 182, 182, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0485, 0x0085, 257, 96, 46115, 46122, 41375, 41393, 41365, 41365, 42710, {0, 0, 0, 0}, 183, 183, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0487, 0x0087, 257, 97, 46137, 46143, 46143, 41412, 41416, 41397, 46164, {0, 0, 0, 0}, 184, 184, { 1252, 37, 10000, 437, 0, ';' }},
- {0x0491, 0x0091, 257, 37, 46167, 46173, 46206, 41449, 41453, 41420, 45211, {41457, 0, 0, 0}, 185, 185, { 1252, 20285, 10000, 850, 0, ',' }},
- {0x0801, 0x0001, 257, 50, 46242, 46248, 46262, 46292, 36519, 36490, 46296, {36523, 0, 0, 0}, 186, 186, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x0804, 0x0004, 257, 21, 46299, 36748, 46305, 36722, 36726, 36730, 13340, {36733, 0, 0, 0}, 187, 187, { 936, 500, 10008, 936, 0, ',' }},
- {0x0807, 0x0007, 257, 19, 46321, 46327, 46348, 46366, 36889, 36867, 13261, {36893, 0, 0, 0}, 188, 188, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x0809, 0x0009, 257, 37, 46370, 46376, 46376, 46401, 37009, 36994, 45211, {37013, 0, 0, 0}, 189, 189, { 1252, 20285, 10000, 850, 0, ',' }},
- {0x080A, 0x000A, 257, 76, 46405, 46411, 46428, 46447, 37056, 37032, 46451, {37060, 0, 0, 0}, 190, 190, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x080C, 0x000C, 257, 10, 46454, 46460, 46477, 46498, 37156, 37132, 46502, {37160, 0, 0, 0}, 191, 191, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0810, 0x0010, 257, 19, 46505, 46511, 46533, 46553, 37363, 37339, 13261, {37060, 0, 0, 0}, 192, 192, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0813, 0x0013, 257, 10, 46557, 46563, 46579, 46600, 37486, 37462, 46502, {37490, 0, 0, 0}, 193, 193, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0814, 0x7814, 257, 81, 46604, 46610, 46637, 46653, 46657, 46661, 42469, {36846, 0, 0, 0}, 194, 194, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x0816, 0x0016, 257, 91, 46664, 46670, 46692, 46714, 37620, 37591, 46718, {37624, 0, 0, 0}, 195, 195, { 1252, 500, 10000, 850, 0, ';' }},
- {0x081D, 0x001D, 257, 34, 46721, 46727, 46745, 46763, 37979, 37956, 42022, {36846, 0, 0, 0}, 196, 196, { 1252, 20278, 10000, 850, 0, ';' }},
- {0x082C, 0x742C, 257, 7, 46767, 46778, 43734, 46813, 38758, 14519, 43762, {38762, 0, 0, 0}, 197, 197, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x083C, 0x003C, 257, 47, 46817, 46823, 46839, 39370, 39374, 39353, 46855, {39378, 0, 0, 0}, 198, 198, { 1252, 500, 10000, 850, 0, ',' }},
- {0x083E, 0x003E, 257, 13, 46858, 46864, 46879, 46902, 39426, 39399, 46906, {39430, 0, 0, 0}, 199, 199, { 1252, 500, 10000, 850, 0, ';' }},
- {0x0843, 0x7843, 257, 114, 46909, 46920, 44532, 39629, 39633, 39609, 44566, {0, 0, 0, 0}, 200, 200, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x0845, 0x0045, 257, 9, 46949, 46955, 46976, 47019, 39668, 39637, 47023, {39672, 0, 0, 0}, 201, 201, { 0, 500, 2, 1, 0, ',' }},
- {0x0850, 0x7C50, 257, 21, 47026, 47037, 40494, 47066, 40511, 40481, 13340, {0, 0, 0, 0}, 202, 202, { 0, 500, 2, 1, 0, ',' }},
- {0x0C01, 0x0001, 257, 31, 47070, 47076, 47091, 47115, 36519, 36490, 47119, {36523, 0, 0, 0}, 203, 203, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x0C04, 0x7C04, 257, 42, 47122, 47128, 47171, 47208, 36726, 36730, 47212, {41736, 0, 0, 0}, 204, 204, { 950, 500, 10002, 950, 0, ',' }},
- {0x0C07, 0x0007, 257, 5, 47215, 47221, 47238, 47260, 36889, 36867, 47264, {36893, 0, 0, 0}, 205, 205, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x0C09, 0x0009, 257, 6, 47267, 47273, 47273, 47293, 37009, 36994, 47297, {37013, 0, 0, 0}, 206, 206, { 1252, 500, 10000, 850, 0, ',' }},
- {0x0C0A, 0x000A, 257, 32, 47300, 47306, 47322, 47341, 37056, 37032, 41682, {37060, 0, 0, 0}, 207, 207, { 1252, 20284, 10000, 850, 0, ';' }},
- {0x0C0C, 0x000C, 257, 18, 47345, 47351, 47367, 47386, 37156, 37132, 47390, {37160, 0, 0, 0}, 208, 208, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x0C3B, 0x003B, 257, 34, 47393, 47399, 47423, 47449, 47453, 39311, 42022, {0, 0, 0, 0}, 209, 209, { 1252, 20278, 10000, 850, 0, ';' }},
- {0x1001, 0x0001, 257, 69, 47457, 47463, 47478, 47506, 36519, 36490, 47510, {36523, 0, 0, 0}, 210, 210, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x1004, 0x0004, 257, 100, 47513, 47519, 47551, 47570, 36726, 36730, 47574, {36733, 0, 0, 0}, 211, 211, { 936, 500, 10008, 936, 0, ',' }},
- {0x1007, 0x0007, 257, 67, 47577, 47583, 47603, 47623, 36889, 36867, 47627, {36893, 0, 0, 0}, 212, 212, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x1009, 0x0009, 257, 18, 47630, 47636, 47636, 47653, 37009, 36994, 47390, {37013, 0, 0, 0}, 213, 213, { 1252, 37, 10000, 850, 0, ',' }},
- {0x100A, 0x000A, 257, 41, 47657, 47663, 47683, 47704, 37056, 37032, 47708, {37060, 0, 0, 0}, 214, 214, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x100C, 0x000C, 257, 19, 47711, 47717, 47738, 47757, 37156, 37132, 13261, {37160, 0, 0, 0}, 215, 215, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x1401, 0x0001, 257, 28, 47761, 47767, 47784, 47816, 36519, 36490, 47820, {36523, 0, 0, 0}, 216, 216, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x1404, 0x7C04, 257, 74, 47823, 47829, 47868, 47905, 36726, 36730, 47909, {41736, 0, 0, 0}, 217, 217, { 950, 500, 10002, 950, 0, ',' }},
- {0x1407, 0x0007, 257, 64, 47912, 47918, 47941, 47965, 36889, 36867, 47969, {36893, 0, 0, 0}, 218, 218, { 1252, 20273, 10000, 850, 0, ';' }},
- {0x1409, 0x0009, 257, 83, 47972, 47978, 47978, 48000, 37009, 36994, 48004, {37013, 0, 0, 0}, 219, 219, { 1252, 500, 10000, 850, 0, ',' }},
- {0x140A, 0x000A, 257, 23, 48007, 48013, 48034, 48056, 37056, 37032, 48060, {37060, 0, 0, 0}, 220, 220, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x140C, 0x000C, 257, 67, 48063, 48069, 48089, 48112, 37156, 37132, 47627, {37160, 0, 0, 0}, 221, 221, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x1801, 0x0001, 257, 70, 48116, 48122, 48139, 48169, 36519, 36490, 48173, {36523, 0, 0, 0}, 222, 222, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x1809, 0x0009, 257, 47, 48176, 48182, 48182, 48200, 37009, 36994, 46855, {37013, 0, 0, 0}, 223, 223, { 1252, 500, 10000, 850, 0, ',' }},
- {0x180A, 0x000A, 257, 85, 48204, 48210, 48227, 48246, 37056, 37032, 48250, {37060, 0, 0, 0}, 224, 224, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x180C, 0x000C, 257, 71, 48253, 48259, 48275, 48294, 37156, 37132, 48298, {37160, 0, 0, 0}, 225, 225, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x181A, 0x701A, 257, 8, 48301, 48312, 48352, 48404, 48408, 48412, 48415, {48418, 0, 0, 0}, 226, 226, { 1250, 870, 10082, 852, 0, ';' }},
- {0x1C01, 0x0001, 257, 107, 48441, 48447, 48464, 48490, 36519, 36490, 48494, {36523, 0, 0, 0}, 227, 227, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x1C09, 0x0009, 257, 118, 48497, 48503, 48503, 48526, 37009, 36994, 43909, {37013, 0, 0, 0}, 228, 228, { 1252, 500, 10000, 437, 0, ',' }},
- {0x1C0A, 0x000A, 257, 27, 48530, 48536, 48565, 48598, 37056, 37032, 48602, {37060, 0, 0, 0}, 229, 229, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x1C1A, 0x6C1A, 257, 8, 48605, 48616, 48352, 48659, 48663, 48412, 48415, {38869, 0, 0, 0}, 230, 230, { 1251, 21025, 10007, 855, 0, ';' }},
- {0x2001, 0x0001, 257, 84, 48667, 48673, 48687, 48715, 36519, 36490, 48719, {36523, 0, 0, 0}, 231, 231, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x2009, 0x0009, 257, 54, 48722, 48728, 48728, 48746, 37009, 36994, 48750, {37013, 0, 0, 0}, 232, 232, { 1252, 500, 10000, 850, 0, ',' }},
- {0x200A, 0x000A, 257, 115, 48753, 48759, 48779, 48800, 37056, 37032, 48804, {37060, 0, 0, 0}, 233, 233, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x2401, 0x0001, 257, 117, 48807, 48813, 48828, 48856, 36519, 36490, 48860, {36523, 0, 0, 0}, 234, 234, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x240A, 0x000A, 257, 22, 48863, 48869, 48888, 48908, 37056, 37032, 48912, {37060, 0, 0, 0}, 235, 235, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x241A, 0x701A, 257, 95, 48915, 48926, 48950, 48978, 9243, 48412, 48982, {48418, 0, 0, 0}, 236, 236, { 1250, 500, 10029, 852, 0, ';' }},
- {0x2801, 0x0001, 257, 104, 48985, 48991, 49006, 49034, 36519, 36490, 49038, {36523, 0, 0, 0}, 237, 237, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x2809, 0x0009, 257, 17, 49041, 49047, 49047, 49064, 37009, 36994, 49068, {37013, 0, 0, 0}, 238, 238, { 1252, 500, 10000, 850, 0, ';' }},
- {0x280A, 0x000A, 257, 86, 49071, 49077, 49092, 49109, 37056, 37032, 49113, {37060, 0, 0, 0}, 239, 239, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x281A, 0x6C1A, 257, 95, 49116, 49127, 48950, 49154, 9243, 48412, 48982, {38869, 0, 0, 0}, 240, 240, { 1251, 21025, 10007, 855, 0, ';' }},
- {0x2C01, 0x0001, 257, 55, 49158, 49164, 49180, 49210, 36519, 36490, 49214, {36523, 0, 0, 0}, 241, 241, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x2C09, 0x0009, 257, 109, 49217, 49223, 49223, 49253, 37009, 36994, 49257, {37013, 0, 0, 0}, 242, 242, { 1252, 500, 10000, 850, 0, ';' }},
- {0x2C0A, 0x000A, 257, 4, 49260, 49266, 49286, 49307, 37056, 37032, 49311, {37060, 0, 0, 0}, 243, 243, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x2C1A, 0x701A, 257, 72, 49314, 49325, 49353, 49386, 9243, 48412, 49390, {48418, 0, 0, 0}, 244, 244, { 1250, 500, 10029, 852, 0, ';' }},
- {0x3001, 0x0001, 257, 63, 49393, 49399, 49416, 49444, 36519, 36490, 49448, {36523, 0, 0, 0}, 245, 245, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x3009, 0x0009, 257, 119, 49451, 49457, 49457, 49476, 37009, 36994, 49480, {37013, 0, 0, 0}, 246, 246, { 1252, 500, 10000, 437, 0, ',' }},
- {0x300A, 0x000A, 257, 29, 49483, 49489, 49507, 49526, 37056, 37032, 49530, {37060, 0, 0, 0}, 247, 247, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x301A, 0x6C1A, 257, 72, 49533, 49544, 49353, 49575, 9243, 48412, 49390, {38869, 0, 0, 0}, 248, 248, { 1251, 21025, 10007, 855, 0, ';' }},
- {0x3401, 0x0001, 257, 61, 49579, 49585, 49601, 49631, 36519, 36490, 49635, {36523, 0, 0, 0}, 249, 249, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x3409, 0x0009, 257, 87, 49638, 49644, 49644, 49666, 37009, 36994, 45741, {37013, 0, 0, 0}, 250, 250, { 1252, 500, 10000, 437, 0, ',' }},
- {0x340A, 0x000A, 257, 20, 49670, 49676, 49692, 49709, 37056, 37032, 49713, {37060, 0, 0, 0}, 251, 251, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x3801, 0x0001, 257, 0, 49716, 49722, 49752, 49816, 36519, 36490, 49820, {36523, 0, 0, 0}, 252, 252, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x380A, 0x000A, 257, 113, 49823, 49829, 49847, 49866, 37056, 37032, 49870, {37060, 0, 0, 0}, 253, 253, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x3C01, 0x0001, 257, 12, 49873, 49879, 49896, 49928, 36519, 36490, 49932, {36523, 0, 0, 0}, 254, 254, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x3C0A, 0x000A, 257, 92, 49935, 49941, 49960, 49980, 37056, 37032, 49984, {37060, 0, 0, 0}, 255, 255, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x4001, 0x0001, 257, 93, 49987, 49993, 50008, 50032, 36519, 36490, 50036, {36523, 0, 0, 0}, 256, 256, { 1256, 20420, 10004, 720, 1, ';' }},
- {0x4009, 0x0009, 257, 49, 50039, 50045, 50045, 50061, 37009, 36994, 44239, {37013, 0, 0, 0}, 257, 257, { 1252, 37, 10000, 437, 0, ',' }},
- {0x400A, 0x000A, 257, 14, 50065, 50071, 50089, 50108, 37056, 37032, 50112, {37060, 0, 0, 0}, 258, 258, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x440A, 0x000A, 257, 103, 50115, 50121, 50143, 50166, 37056, 37032, 50170, {37060, 0, 0, 0}, 259, 259, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x4809, 0x0009, 257, 100, 50173, 50179, 50179, 50199, 37009, 36994, 47574, {37013, 0, 0, 0}, 260, 260, { 1252, 37, 10000, 437, 0, ',' }},
- {0x480A, 0x000A, 257, 43, 50203, 50209, 50228, 50248, 37056, 37032, 50252, {37060, 0, 0, 0}, 261, 261, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x4C0A, 0x000A, 257, 79, 50255, 50261, 50281, 50302, 37056, 37032, 50306, {37060, 0, 0, 0}, 262, 262, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x500A, 0x000A, 257, 90, 50309, 50315, 50337, 50360, 37056, 37032, 50364, {37060, 0, 0, 0}, 263, 263, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x540A, 0x000A, 257, 112, 50367, 50373, 50397, 50423, 37056, 37032, 41981, {37060, 0, 0, 0}, 264, 264, { 1252, 20284, 10000, 850, 0, ',' }},
- {0x6C1A, 0x7C1A, 257, -1, 50427, 50435, 50454, 49154, 9243, 48412, 0, {38869, 0, 0, 0}, 265, 265, { 1251, 21025, 10007, 855, 0, ';' }},
- {0x701A, 0x7C1A, 257, -1, 50467, 50475, 50454, 48978, 9243, 48412, 0, {48418, 0, 0, 0}, 266, 266, { 1250, 500, 10029, 852, 0, ';' }},
- {0x742C, 0x002C, 257, -1, 50491, 50499, 38740, 46813, 38758, 14519, 0, {38762, 0, 0, 0}, 267, 267, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x7804, 0x007F, 257, -1, 36730, 36748, 36715, 36722, 36726, 36730, 0, {36733, 0, 0, 0}, 268, 268, { 936, 500, 10008, 936, 0, ',' }},
- {0x7814, 0x0014, 257, -1, 46661, 50522, 50540, 46653, 46657, 46661, 0, {36846, 0, 0, 0}, 269, 269, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x781A, 0x007F, 257, -1, 50548, 50551, 50559, 50568, 50572, 50548, 0, {48418, 0, 0, 0}, 270, 270, { 1250, 870, 10082, 852, 0, ';' }},
- {0x782C, 0x002C, 257, -1, 50576, 50584, 38740, 38754, 38758, 14519, 0, {38762, 0, 0, 0}, 271, 271, { 1254, 20905, 10081, 857, 0, ';' }},
- {0x7843, 0x0043, 257, -1, 50604, 50612, 39618, 39629, 39633, 39609, 0, {0, 0, 0, 0}, 272, 272, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x7850, 0x0050, 257, -1, 50629, 50637, 40494, 50658, 40511, 40481, 0, {0, 0, 0, 0}, 273, 273, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x7C04, 0x7804, 257, -1, 50662, 41691, 36715, 41729, 36726, 36730, 0, {41736, 0, 0, 0}, 274, 274, { 950, 500, 10002, 950, 0, ',' }},
- {0x7C04, 0x7C04, 257, -1, 50670, 50677, 36715, 41729, 36726, 36730, 0, {41736, 0, 0, 0}, 275, 275, { 950, 500, 10002, 950, 0, ',' }},
- {0x7C14, 0x0014, 257, -1, 37539, 50706, 50724, 37531, 37535, 37539, 0, {36846, 0, 0, 0}, 276, 276, { 1252, 20277, 10000, 850, 0, ';' }},
- {0x7C1A, 0x007F, 257, -1, 48412, 50738, 50454, 50746, 9243, 48412, 0, {38869, 0, 0, 0}, 277, 277, { 1250, 500, 10029, 852, 0, ';' }},
- {0x7C28, 0x0028, 257, -1, 50750, 50758, 0, 38583, 38587, 38574, 0, {0, 0, 0, 0}, 278, 278, { 1251, 20880, 10007, 866, 0, ';' }},
- {0x7C43, 0x0043, 257, -1, 50775, 50783, 39618, 39629, 39633, 39609, 0, {0, 0, 0, 0}, 279, 279, { 1254, 500, 10029, 857, 0, ';' }},
- {0x7C50, 0x0050, 257, -1, 50797, 50805, 40494, 47066, 40511, 40481, 0, {0, 0, 0, 0}, 280, 280, { 0, 500, 2, 1, 0, ',' }},
- {0x7C5F, 0x005F, 257, -1, 50827, 50836, 40877, 40887, 40847, 40847, 0, {0, 0, 0, 0}, 281, 281, { 1252, 20297, 10000, 850, 0, ';' }},
- {0x7C68, 0x0068, 257, -1, 50870, 50878, 41045, 41051, 41055, 41042, 0, {0, 0, 0, 0}, 282, 282, { 1252, 37, 10000, 437, 0, ',' }}
+ {0x0001, 0x007F, 768, -1, 37103, 37106, 37113, 37128, 37132, 37103, 0, {0, 0, 37136, 0}, 0, 0, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x0002, 0x007F, 257, -1, 37164, 37167, 37177, 37196, 37200, 37164, 0, {37204, 0, 0, 0}, 1, 1, { 1251, 21025, 10007, 866, 0, ';' }},
+ {0x0003, 0x007F, 257, -1, 37246, 37249, 37257, 37265, 37269, 37246, 0, {37273, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0004, 0x0004, 257, -1, 37293, 37300, 37328, 37335, 37339, 37343, 0, {37346, 0, 0, 0}, 3, 3, { 936, 500, 10008, 936, 0, ',' }},
+ {0x0004, 0x7804, 257, -1, 37353, 37361, 37328, 37335, 37339, 37343, 0, {37346, 0, 0, 0}, 4, 4, { 936, 500, 10008, 936, 0, ',' }},
+ {0x0005, 0x007F, 257, -1, 37382, 37385, 37391, 37401, 37405, 37382, 0, {37409, 0, 0, 0}, 5, 5, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x0006, 0x007F, 257, -1, 37435, 37438, 37445, 37451, 37455, 37435, 0, {37459, 0, 0, 0}, 6, 6, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x0007, 0x007F, 257, -1, 37480, 37483, 37490, 37498, 37502, 37480, 0, {37506, 0, 0, 0}, 7, 7, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x0008, 0x007F, 257, -1, 37531, 37534, 37540, 37557, 37561, 37531, 0, {37565, 0, 0, 0}, 8, 8, { 1253, 20273, 10006, 737, 0, ';' }},
+ {0x0009, 0x007F, 257, -1, 37607, 37610, 37610, 37618, 37622, 37607, 0, {37626, 0, 0, 0}, 9, 9, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x000A, 0x007F, 257, -1, 37645, 37648, 37656, 37665, 37669, 37645, 0, {37673, 0, 0, 0}, 10, 10, { 1252, 20284, 10000, 850, 0, ';' }},
+ {0x000B, 0x007F, 257, -1, 37695, 37698, 37706, 37712, 37716, 37695, 0, {37720, 0, 0, 0}, 11, 11, { 1252, 20278, 10000, 850, 0, ';' }},
+ {0x000C, 0x007F, 257, -1, 37745, 37748, 37755, 37765, 37769, 37745, 0, {37773, 0, 0, 0}, 12, 12, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x000D, 0x007F, 257, -1, 37795, 37798, 37805, 37816, 37820, 37795, 0, {37824, 0, 0, 0}, 13, 13, { 1255, 500, 10005, 862, 1, ',' }},
+ {0x000E, 0x007F, 257, -1, 37857, 37860, 37870, 37877, 37881, 37857, 0, {37885, 0, 0, 0}, 14, 14, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x000F, 0x007F, 257, -1, 37901, 37904, 37914, 37924, 37928, 37901, 0, {37932, 0, 0, 0}, 15, 15, { 1252, 20871, 10079, 850, 0, ';' }},
+ {0x0010, 0x007F, 257, -1, 37952, 37955, 37963, 37972, 37976, 37952, 0, {37673, 0, 0, 0}, 16, 16, { 1252, 20280, 10000, 850, 0, ';' }},
+ {0x0011, 0x007F, 257, -1, 37980, 37983, 37992, 38002, 38006, 37980, 0, {38010, 0, 0, 0}, 17, 17, { 932, 20290, 10001, 932, 0, ',' }},
+ {0x0012, 0x007F, 257, -1, 38037, 38040, 38047, 38057, 38061, 38037, 0, {38065, 0, 0, 0}, 18, 18, { 949, 20833, 10003, 949, 0, ',' }},
+ {0x0013, 0x007F, 257, -1, 38075, 38078, 38084, 38095, 38099, 38075, 0, {38103, 0, 0, 0}, 19, 19, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0014, 0x007F, 257, -1, 38125, 38128, 38138, 38144, 38148, 38152, 0, {37459, 0, 0, 0}, 20, 20, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x0015, 0x007F, 257, -1, 38155, 38158, 38165, 38172, 38176, 38155, 0, {38180, 0, 0, 0}, 21, 21, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x0016, 0x007F, 257, -1, 38204, 38207, 38218, 38229, 38233, 38204, 0, {38237, 0, 0, 0}, 22, 22, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0017, 0x007F, 257, -1, 38260, 38263, 38271, 38281, 38285, 38260, 0, {38289, 0, 0, 0}, 23, 23, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x0018, 0x007F, 257, -1, 38309, 38312, 38321, 38330, 38334, 38309, 0, {38338, 0, 0, 0}, 24, 24, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x0019, 0x007F, 257, -1, 38357, 38360, 38368, 38383, 38387, 38357, 0, {38391, 0, 0, 0}, 25, 25, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x001A, 0x007F, 257, -1, 38437, 38440, 38449, 38458, 38462, 38437, 0, {38466, 0, 0, 0}, 26, 26, { 1250, 500, 10082, 852, 0, ';' }},
+ {0x001B, 0x007F, 257, -1, 38489, 38492, 38499, 38511, 38515, 38489, 0, {38519, 0, 0, 0}, 27, 27, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x001C, 0x007F, 257, -1, 38543, 38546, 38555, 38561, 38565, 38543, 0, {0, 0, 0, 0}, 28, 28, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x001D, 0x007F, 257, -1, 38569, 38572, 38580, 38588, 38592, 38569, 0, {37459, 0, 0, 0}, 29, 29, { 1252, 20278, 10000, 850, 0, ';' }},
+ {0x001E, 0x007F, 512, -1, 38596, 38599, 38604, 38614, 38618, 38596, 0, {0, 38622, 0, 0}, 30, 30, { 874, 20838, 10021, 874, 0, ',' }},
+ {0x001F, 0x007F, 257, -1, 38653, 38656, 38664, 38673, 38677, 38653, 0, {38681, 0, 0, 0}, 31, 31, { 1254, 20905, 10081, 857, 0, ';' }},
+ {0x0020, 0x007F, 257, -1, 38695, 38698, 38703, 38712, 38716, 38695, 0, {38720, 0, 0, 0}, 32, 32, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x0021, 0x007F, 257, -1, 38750, 38753, 38764, 38781, 38785, 38750, 0, {38789, 0, 0, 0}, 33, 33, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0022, 0x007F, 257, -1, 38808, 38811, 38821, 38842, 38846, 38808, 0, {38850, 0, 0, 0}, 34, 34, { 1251, 500, 10017, 866, 0, ';' }},
+ {0x0023, 0x007F, 257, -1, 38896, 38899, 38910, 38931, 38935, 38896, 0, {38939, 0, 0, 0}, 35, 35, { 1251, 500, 10007, 866, 0, ';' }},
+ {0x0024, 0x007F, 257, -1, 38981, 38984, 38994, 39008, 39012, 38981, 0, {39016, 0, 0, 0}, 36, 36, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x0025, 0x007F, 257, -1, 39038, 39041, 39050, 39056, 39060, 39038, 0, {39064, 0, 0, 0}, 37, 37, { 1257, 500, 10029, 775, 0, ';' }},
+ {0x0026, 0x007F, 257, -1, 39084, 39087, 39095, 39105, 39109, 39084, 0, {39113, 0, 0, 0}, 38, 38, { 1257, 500, 10029, 775, 0, ';' }},
+ {0x0027, 0x007F, 257, -1, 39132, 39135, 39146, 39156, 39160, 39132, 0, {39164, 0, 0, 0}, 39, 39, { 1257, 500, 10029, 775, 0, ';' }},
+ {0x0028, 0x007F, 257, -1, 39187, 39190, 0, 39196, 39200, 39187, 0, {0, 0, 0, 0}, 40, 40, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0029, 0x007F, 257, -1, 39204, 39207, 39215, 39226, 39230, 39204, 0, {39234, 0, 0, 0}, 41, 41, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x002A, 0x007F, 257, -1, 39258, 39261, 39272, 39287, 4180, 39258, 0, {39291, 0, 0, 0}, 42, 42, { 1258, 500, 10000, 1258, 0, ',' }},
+ {0x002B, 0x007F, 257, -1, 39306, 39309, 39318, 39333, 39337, 39306, 0, {0, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, 0, ',' }},
+ {0x002C, 0x007F, 257, -1, 14654, 39341, 39353, 39367, 39371, 14654, 0, {39375, 0, 0, 0}, 44, 44, { 1254, 20905, 10081, 857, 0, ';' }},
+ {0x002D, 0x007F, 257, -1, 39393, 39396, 39403, 39411, 39415, 39393, 0, {39419, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x002F, 0x007F, 257, -1, 39439, 39442, 39453, 39474, 39478, 39439, 0, {39482, 0, 0, 0}, 46, 46, { 1251, 500, 10007, 866, 0, ';' }},
+ {0x0032, 0x007F, 257, -1, 39526, 39529, 39536, 39545, 39549, 39526, 0, {0, 0, 0, 0}, 47, 47, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0034, 0x007F, 257, -1, 39553, 39556, 39562, 39571, 39575, 39553, 0, {0, 0, 0, 0}, 48, 48, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0035, 0x007F, 257, -1, 39579, 39582, 39587, 39595, 39599, 39579, 0, {39603, 0, 0, 0}, 49, 49, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0036, 0x007F, 257, -1, 39624, 39627, 39627, 39637, 39641, 39624, 0, {39645, 0, 0, 0}, 50, 50, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0037, 0x007F, 257, -1, 39665, 39668, 39677, 39699, 39703, 39665, 0, {39707, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, 0, ';' }},
+ {0x0038, 0x007F, 257, -1, 39772, 39775, 39783, 39793, 39797, 39772, 0, {0, 0, 0, 0}, 52, 52, { 1252, 20277, 10079, 850, 0, ';' }},
+ {0x0039, 0x007F, 257, -1, 39801, 39804, 39810, 39829, 39833, 39801, 0, {39837, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, 0, ',' }},
+ {0x003A, 0x007F, 257, -1, 39878, 39881, 39889, 39895, 39899, 39878, 0, {39903, 0, 0, 0}, 54, 54, { 0, 500, 2, 1, 0, ',' }},
+ {0x003B, 0x007F, 257, -1, 39924, 39927, 39941, 39958, 39962, 39924, 0, {0, 0, 0, 0}, 55, 55, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x003C, 0x007F, 257, -1, 39966, 39969, 39975, 39983, 39987, 39966, 0, {39991, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x003E, 0x007F, 257, -1, 40012, 40015, 40021, 40035, 40039, 40012, 0, {40043, 0, 0, 0}, 57, 57, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x003F, 0x007F, 257, -1, 40060, 40063, 40070, 40090, 40094, 40060, 0, {40098, 0, 0, 0}, 58, 58, { 0, 500, 2, 1, 0, ';' }},
+ {0x0040, 0x007F, 257, -1, 40140, 40143, 40151, 40164, 40168, 40140, 0, {0, 0, 0, 0}, 59, 59, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0041, 0x007F, 257, -1, 40172, 40175, 40183, 40193, 40197, 40172, 0, {40201, 0, 0, 0}, 60, 60, { 1252, 500, 10000, 437, 0, ',' }},
+ {0x0043, 0x007F, 257, -1, 40222, 40225, 40231, 40242, 40246, 40222, 0, {0, 0, 0, 0}, 61, 61, { 1254, 500, 10029, 857, 0, ';' }},
+ {0x0045, 0x007F, 257, -1, 40250, 40253, 40261, 40277, 40281, 40250, 0, {40285, 0, 0, 0}, 62, 62, { 0, 500, 2, 1, 0, ',' }},
+ {0x0046, 0x007F, 257, -1, 40350, 40353, 40361, 40380, 40384, 40350, 0, {0, 0, 0, 0}, 63, 63, { 0, 500, 2, 1, 0, ',' }},
+ {0x0047, 0x007F, 257, -1, 40388, 40391, 40400, 40422, 40426, 40388, 0, {40430, 0, 0, 0}, 64, 64, { 0, 500, 2, 1, 0, ',' }},
+ {0x0048, 0x007F, 257, -1, 14660, 40486, 40492, 40508, 40512, 14660, 0, {0, 0, 0, 0}, 65, 65, { 0, 500, 2, 1, 0, ',' }},
+ {0x0049, 0x007F, 257, -1, 40516, 40519, 40525, 40541, 40545, 40516, 0, {40549, 0, 0, 0}, 66, 66, { 0, 500, 2, 1, 0, ',' }},
+ {0x004A, 0x007F, 257, -1, 40614, 40617, 40624, 40643, 40647, 40614, 0, {40651, 0, 0, 0}, 67, 67, { 0, 500, 2, 1, 0, ',' }},
+ {0x004B, 0x007F, 257, -1, 36452, 40716, 40724, 40740, 40744, 36452, 0, {40748, 0, 0, 0}, 68, 68, { 0, 500, 2, 1, 0, ',' }},
+ {0x004C, 0x007F, 257, -1, 40819, 40822, 40832, 40851, 40855, 40819, 0, {40859, 0, 0, 0}, 69, 69, { 0, 500, 2, 1, 0, ',' }},
+ {0x004D, 0x007F, 257, -1, 14651, 40909, 40918, 40940, 40944, 14651, 0, {40948, 0, 0, 0}, 70, 70, { 0, 500, 2, 1, 0, ',' }},
+ {0x004E, 0x007F, 257, -1, 41001, 41004, 41012, 41028, 2610, 41001, 0, {41032, 0, 0, 0}, 71, 71, { 0, 500, 2, 1, 0, ',' }},
+ {0x0050, 0x007F, 257, -1, 41094, 41097, 41107, 41120, 41124, 41094, 0, {0, 0, 0, 0}, 72, 72, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0051, 0x007F, 257, -1, 41128, 41131, 41139, 41164, 41168, 41128, 0, {0, 0, 0, 0}, 73, 73, { 0, 500, 2, 1, 0, ',' }},
+ {0x0052, 0x007F, 257, -1, 41172, 41175, 41181, 41189, 41193, 41172, 0, {0, 0, 0, 0}, 74, 74, { 1252, 20285, 10000, 850, 0, ',' }},
+ {0x0053, 0x007F, 257, -1, 41197, 41200, 41206, 41234, 41238, 41197, 0, {0, 0, 0, 0}, 75, 75, { 0, 500, 2, 1, 0, ',' }},
+ {0x0054, 0x007F, 257, -1, 41242, 41245, 41249, 41259, 41263, 41242, 0, {0, 0, 0, 0}, 76, 76, { 0, 500, 2, 1, 0, ',' }},
+ {0x0056, 0x007F, 257, -1, 41267, 41270, 41279, 41286, 41290, 41267, 0, {37673, 0, 0, 0}, 77, 77, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0057, 0x007F, 257, -1, 41294, 41298, 41306, 41325, 41294, 41294, 0, {0, 0, 0, 0}, 78, 78, { 0, 500, 2, 1, 0, ',' }},
+ {0x005B, 0x007F, 257, -1, 41329, 41332, 41340, 41356, 41360, 41329, 0, {41364, 0, 0, 0}, 79, 79, { 0, 500, 2, 1, 0, ',' }},
+ {0x005E, 0x007F, 257, -1, 7932, 41386, 41394, 41407, 41411, 7932, 0, {41415, 0, 0, 0}, 80, 80, { 0, 500, 2, 1, 0, ';' }},
+ {0x005F, 0x007F, 257, -1, 41460, 41464, 41490, 41500, 41460, 41460, 0, {0, 0, 0, 0}, 81, 81, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0061, 0x007F, 257, -1, 2100, 41504, 41511, 41530, 41534, 2100, 0, {41538, 0, 0, 0}, 82, 82, { 0, 500, 2, 1, 0, ',' }},
+ {0x0063, 0x007F, 1024, -1, 41588, 41591, 41598, 41607, 41611, 41588, 0, {0, 0, 0, 0}, 83, 83, { 0, 500, 2, 1, 1, ';' }},
+ {0x0064, 0x007F, 257, -1, 41615, 41619, 41619, 41628, 41615, 41615, 0, {41632, 0, 0, 0}, 84, 84, { 1252, 500, 10000, 437, 0, ',' }},
+ {0x0068, 0x007F, 257, -1, 41655, 41658, 41658, 41664, 41668, 41655, 0, {0, 0, 0, 0}, 85, 85, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x006A, 0x007F, 257, -1, 41672, 41675, 41682, 41697, 41701, 41672, 0, {0, 0, 0, 0}, 86, 86, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x006C, 0x007F, 257, -1, 41705, 41709, 41724, 41741, 41705, 41705, 0, {0, 0, 0, 0}, 87, 87, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x006F, 0x007F, 257, -1, 41745, 41748, 41760, 41772, 41776, 41745, 0, {0, 0, 0, 0}, 88, 88, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x0070, 0x007F, 257, -1, 14645, 41780, 41780, 41785, 41789, 14645, 0, {0, 0, 0, 0}, 89, 89, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x0078, 0x007F, 257, -1, 41793, 41796, 41807, 41817, 41821, 41793, 0, {41825, 0, 0, 0}, 90, 90, { 0, 500, 2, 1, 0, ',' }},
+ {0x007E, 0x007F, 257, -1, 41838, 41841, 41848, 41858, 41862, 41838, 0, {41866, 0, 0, 0}, 91, 91, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0082, 0x007F, 257, -1, 41886, 41889, 41897, 41905, 41909, 41886, 0, {0, 0, 0, 0}, 92, 92, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0084, 0x007F, 257, -1, 41913, 41917, 41930, 41949, 41913, 41913, 0, {41953, 0, 0, 0}, 93, 93, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0085, 0x007F, 257, -1, 41978, 41982, 41988, 42006, 41978, 41978, 0, {0, 0, 0, 0}, 94, 94, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0087, 0x007F, 257, -1, 42010, 42013, 42013, 42025, 42029, 42010, 0, {0, 0, 0, 0}, 95, 95, { 1252, 37, 10000, 437, 0, ';' }},
+ {0x0091, 0x007F, 257, -1, 42033, 42036, 42052, 42062, 42066, 42033, 0, {42070, 0, 0, 0}, 96, 96, { 1252, 20285, 10000, 850, 0, ',' }},
+ {0x0401, 0x0001, 768, 98, 42095, 42101, 42123, 37128, 37132, 37103, 13368, {0, 0, 37136, 0}, 97, 97, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x0402, 0x0002, 257, 11, 42187, 42193, 42214, 37196, 37200, 37164, 42252, {37204, 0, 0, 0}, 98, 98, { 1251, 21025, 10007, 866, 0, ';' }},
+ {0x0403, 0x0003, 257, 32, 42255, 42261, 42277, 37265, 37269, 37246, 42295, {37273, 0, 0, 0}, 99, 99, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0404, 0x7C04, 257, 110, 42298, 42304, 42326, 42342, 37339, 37343, 42346, {42349, 0, 0, 0}, 100, 100, { 950, 500, 10002, 950, 0, ',' }},
+ {0x0405, 0x0005, 257, 24, 42356, 42362, 42385, 37401, 37405, 37382, 42415, {37409, 0, 0, 0}, 101, 101, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x0406, 0x0006, 257, 26, 42418, 42424, 42441, 37451, 37455, 37435, 42457, {37459, 0, 0, 0}, 102, 102, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x0407, 0x0007, 257, 25, 42460, 42466, 42483, 37498, 37502, 37480, 42505, {37506, 0, 0, 0}, 103, 103, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x0408, 0x0008, 257, 40, 42508, 42514, 42529, 37557, 37561, 37531, 42561, {37565, 0, 0, 0}, 104, 104, { 1253, 20273, 10006, 737, 0, ';' }},
+ {0x0409, 0x0009, 257, 112, 42564, 42570, 42570, 37618, 37622, 37607, 42594, {37626, 0, 0, 0}, 105, 105, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x040B, 0x000B, 257, 34, 42597, 42603, 42621, 37712, 37716, 37695, 42635, {37720, 0, 0, 0}, 106, 106, { 1252, 20278, 10000, 850, 0, ';' }},
+ {0x040C, 0x000C, 257, 36, 42638, 42644, 42660, 37765, 37769, 37745, 42679, {37773, 0, 0, 0}, 107, 107, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x040D, 0x000D, 257, 48, 42682, 42688, 42704, 37816, 37820, 37795, 42728, {37824, 0, 0, 0}, 108, 108, { 1255, 500, 10005, 862, 1, ',' }},
+ {0x040E, 0x000E, 257, 45, 42731, 42737, 42757, 37877, 37881, 37857, 42780, {37885, 0, 0, 0}, 109, 109, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x040F, 0x000F, 257, 52, 42783, 42789, 42809, 37924, 37928, 37901, 42829, {37932, 0, 0, 0}, 110, 110, { 1252, 20871, 10079, 850, 0, ';' }},
+ {0x0410, 0x0010, 257, 53, 42832, 42838, 42854, 37972, 37976, 37952, 42872, {37673, 0, 0, 0}, 111, 111, { 1252, 20280, 10000, 850, 0, ';' }},
+ {0x0411, 0x0011, 257, 56, 42875, 42881, 42898, 38002, 38006, 37980, 42917, {38010, 0, 0, 0}, 112, 112, { 932, 20290, 10001, 932, 0, ',' }},
+ {0x0412, 0x0012, 257, 60, 42920, 42926, 42947, 38057, 38061, 38037, 42972, {38065, 0, 0, 0}, 113, 113, { 949, 20833, 10003, 949, 0, ',' }},
+ {0x0413, 0x0013, 257, 80, 42975, 42981, 43001, 38095, 38099, 38075, 43024, {38103, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0414, 0x7C14, 257, 81, 43027, 43033, 43060, 38144, 38148, 38152, 43082, {37459, 0, 0, 0}, 115, 115, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x0415, 0x0015, 257, 89, 43085, 43091, 43107, 38172, 38176, 38155, 43123, {38180, 0, 0, 0}, 116, 116, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x0416, 0x0016, 257, 15, 43126, 43132, 43152, 38229, 38233, 38204, 43172, {38237, 0, 0, 0}, 117, 117, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0417, 0x0017, 257, 19, 43175, 43181, 43203, 38281, 38285, 38260, 13371, {38289, 0, 0, 0}, 118, 118, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x0418, 0x0018, 257, 94, 43222, 43228, 43247, 38330, 38334, 38309, 43267, {38338, 0, 0, 0}, 119, 119, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x0419, 0x0019, 257, 96, 43270, 43276, 43293, 38383, 38387, 38357, 43323, {38391, 0, 0, 0}, 120, 120, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x041A, 0x001A, 257, 44, 43326, 43332, 43351, 38458, 38462, 38437, 43371, {38466, 0, 0, 0}, 121, 121, { 1250, 500, 10082, 852, 0, ';' }},
+ {0x041B, 0x001B, 257, 102, 43374, 43380, 43398, 38511, 38515, 38489, 43433, {38519, 0, 0, 0}, 122, 122, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x041C, 0x001C, 257, 2, 43436, 43442, 43461, 38561, 38565, 38543, 43480, {0, 0, 0, 0}, 123, 123, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x041D, 0x001D, 257, 99, 43483, 43489, 43506, 38588, 38592, 38569, 43524, {37459, 0, 0, 0}, 124, 124, { 1252, 20278, 10000, 850, 0, ';' }},
+ {0x041E, 0x001E, 512, 105, 43527, 43533, 43549, 38614, 38618, 38596, 43571, {0, 38622, 0, 0}, 125, 125, { 874, 20838, 10021, 874, 0, ',' }},
+ {0x041F, 0x001F, 257, 108, 43574, 43580, 43597, 38673, 38677, 38653, 43617, {38681, 0, 0, 0}, 126, 126, { 1254, 20905, 10081, 857, 0, ';' }},
+ {0x0420, 0x0020, 257, 88, 43620, 43626, 43642, 38712, 38716, 38695, 43668, {38720, 0, 0, 0}, 127, 127, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x0421, 0x0021, 257, 46, 43671, 43677, 43700, 38781, 38785, 38750, 43729, {38789, 0, 0, 0}, 128, 128, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0422, 0x0022, 257, 111, 43732, 43738, 43758, 38842, 38846, 38808, 43796, {38850, 0, 0, 0}, 129, 129, { 1251, 500, 10017, 866, 0, ';' }},
+ {0x0423, 0x0023, 257, 16, 43799, 43805, 43826, 38931, 38935, 38896, 43866, {38939, 0, 0, 0}, 130, 130, { 1251, 500, 10007, 866, 0, ';' }},
+ {0x0424, 0x0024, 257, 101, 43869, 43875, 43896, 39008, 39012, 38981, 43922, {39016, 0, 0, 0}, 131, 131, { 1250, 20880, 10029, 852, 0, ';' }},
+ {0x0425, 0x0025, 257, 30, 43925, 43931, 43950, 39056, 39060, 39038, 43964, {39064, 0, 0, 0}, 132, 132, { 1257, 500, 10029, 775, 0, ';' }},
+ {0x0426, 0x0026, 257, 68, 43967, 43973, 43990, 39105, 39109, 39084, 44010, {39113, 0, 0, 0}, 133, 133, { 1257, 500, 10029, 775, 0, ';' }},
+ {0x0427, 0x0027, 257, 66, 44013, 44019, 44042, 39156, 39160, 39132, 44062, {39164, 0, 0, 0}, 134, 134, { 1257, 500, 10029, 775, 0, ';' }},
+ {0x0428, 0x7C28, 257, 106, 44065, 44076, 0, 39196, 39200, 39187, 44105, {0, 0, 0, 0}, 135, 135, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0429, 0x0029, 257, 51, 44108, 44114, 44129, 39226, 39230, 39204, 44153, {39234, 0, 0, 0}, 136, 136, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x042A, 0x002A, 257, 116, 44156, 44162, 44183, 39287, 4180, 39258, 44211, {39291, 0, 0, 0}, 137, 137, { 1258, 500, 10000, 1258, 0, ',' }},
+ {0x042B, 0x002B, 257, 3, 44214, 44220, 44239, 39333, 39337, 39306, 3824, {0, 0, 0, 0}, 138, 138, { 0, 500, 2, 1, 0, ',' }},
+ {0x042C, 0x782C, 257, 7, 44304, 44315, 44347, 39367, 39371, 14654, 44375, {39375, 0, 0, 0}, 139, 139, { 1254, 20905, 10081, 857, 0, ';' }},
+ {0x042D, 0x002D, 257, 32, 44378, 44384, 44399, 39411, 39415, 39393, 42295, {39419, 0, 0, 0}, 140, 140, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x042F, 0x002F, 257, 73, 44418, 44424, 44447, 39474, 39478, 39439, 44491, {39482, 0, 0, 0}, 141, 141, { 1251, 500, 10007, 866, 0, ';' }},
+ {0x0432, 0x0032, 257, 118, 44494, 44500, 39536, 39545, 39549, 39526, 44522, {0, 0, 0, 0}, 142, 142, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0434, 0x0034, 257, 118, 44525, 44531, 39562, 39571, 39575, 39553, 44522, {0, 0, 0, 0}, 143, 143, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0435, 0x0035, 257, 118, 44552, 44558, 44578, 39595, 39599, 39579, 44522, {39603, 0, 0, 0}, 144, 144, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0436, 0x0036, 257, 118, 44606, 44612, 44637, 39637, 39641, 39624, 44522, {39645, 0, 0, 0}, 145, 145, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0437, 0x0037, 257, 38, 44661, 44667, 44686, 39699, 39703, 39665, 44741, {39707, 0, 0, 0}, 146, 146, { 0, 500, 2, 1, 0, ';' }},
+ {0x0438, 0x0038, 257, 35, 44744, 44750, 44774, 39793, 39797, 39772, 44795, {0, 0, 0, 0}, 147, 147, { 1252, 20277, 10079, 850, 0, ';' }},
+ {0x0439, 0x0039, 257, 49, 44798, 44804, 44818, 39829, 39833, 39801, 44852, {39837, 0, 0, 0}, 148, 148, { 0, 500, 2, 1, 0, ',' }},
+ {0x043A, 0x003A, 257, 75, 44855, 44861, 44877, 39895, 39899, 39878, 44891, {39903, 0, 0, 0}, 149, 149, { 0, 500, 2, 1, 0, ',' }},
+ {0x043B, 0x003B, 257, 81, 44894, 44900, 44923, 39958, 39962, 39924, 43082, {0, 0, 0, 0}, 150, 150, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x043E, 0x003E, 257, 77, 44948, 44954, 44971, 40035, 40039, 40012, 44996, {40043, 0, 0, 0}, 151, 151, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0440, 0x0040, 257, 58, 44999, 45005, 45026, 40164, 40168, 40140, 45062, {0, 0, 0, 0}, 152, 152, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0441, 0x0041, 257, 57, 45065, 45071, 45087, 40193, 40197, 40172, 45105, {40201, 0, 0, 0}, 153, 153, { 1252, 500, 10000, 437, 0, ',' }},
+ {0x0443, 0x7C43, 257, 114, 45108, 45119, 45145, 40242, 40246, 40222, 45179, {0, 0, 0, 0}, 154, 154, { 1254, 500, 10029, 857, 0, ';' }},
+ {0x0445, 0x0045, 257, 49, 45182, 45188, 45204, 40277, 40281, 40250, 44852, {40285, 0, 0, 0}, 155, 155, { 0, 500, 2, 1, 0, ',' }},
+ {0x0447, 0x0047, 257, 49, 45235, 45241, 45258, 40422, 40426, 40388, 44852, {40430, 0, 0, 0}, 156, 156, { 0, 500, 2, 1, 0, ',' }},
+ {0x0448, 0x0048, 257, 49, 45295, 45301, 45315, 40508, 40512, 14660, 44852, {0, 0, 0, 0}, 157, 157, { 0, 500, 2, 1, 0, ',' }},
+ {0x0449, 0x0049, 257, 49, 45346, 45352, 45366, 40541, 40545, 40516, 44852, {40549, 0, 0, 0}, 158, 158, { 0, 500, 2, 1, 0, ',' }},
+ {0x044A, 0x004A, 257, 49, 45406, 45412, 45427, 40643, 40647, 40614, 44852, {40651, 0, 0, 0}, 159, 159, { 0, 500, 2, 1, 0, ',' }},
+ {0x044B, 0x004B, 257, 49, 45474, 45480, 45496, 40740, 40744, 36452, 44852, {40748, 0, 0, 0}, 160, 160, { 0, 500, 2, 1, 0, ',' }},
+ {0x044C, 0x004C, 257, 49, 45527, 45533, 45551, 40851, 40855, 40819, 44852, {40859, 0, 0, 0}, 161, 161, { 0, 500, 2, 1, 0, ',' }},
+ {0x044D, 0x004D, 257, 49, 45591, 45597, 45614, 40940, 40944, 14651, 44852, {40948, 0, 0, 0}, 162, 162, { 0, 500, 2, 1, 0, ',' }},
+ {0x044E, 0x004E, 257, 49, 45651, 45657, 45673, 41028, 2610, 41001, 44852, {41032, 0, 0, 0}, 163, 163, { 0, 500, 2, 1, 0, ',' }},
+ {0x0451, 0x0051, 257, 21, 45704, 45710, 45726, 41164, 41168, 41128, 13450, {0, 0, 0, 0}, 164, 164, { 0, 500, 2, 1, 0, ',' }},
+ {0x0452, 0x0052, 257, 37, 45772, 45778, 45801, 41189, 41193, 41172, 45824, {0, 0, 0, 0}, 165, 165, { 1252, 20285, 10000, 850, 0, ',' }},
+ {0x0453, 0x0053, 257, 59, 45827, 45833, 45850, 41234, 41238, 41197, 45902, {0, 0, 0, 0}, 166, 166, { 0, 500, 2, 1, 0, ',' }},
+ {0x0454, 0x0054, 257, 62, 45905, 45911, 45922, 41259, 41263, 41242, 45944, {0, 0, 0, 0}, 167, 167, { 0, 500, 2, 1, 0, ',' }},
+ {0x0456, 0x0056, 257, 32, 45947, 45953, 45970, 41286, 41290, 41267, 42295, {37673, 0, 0, 0}, 168, 168, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0457, 0x0057, 257, 49, 45987, 45994, 46010, 41325, 41294, 41294, 44852, {0, 0, 0, 0}, 169, 169, { 0, 500, 2, 1, 0, ',' }},
+ {0x045B, 0x005B, 257, 65, 46044, 46050, 46070, 41356, 41360, 41329, 46120, {41364, 0, 0, 0}, 170, 170, { 0, 500, 2, 1, 0, ',' }},
+ {0x045E, 0x005E, 257, 33, 46123, 46129, 46148, 41407, 41411, 7932, 46179, {41415, 0, 0, 0}, 171, 171, { 0, 500, 2, 1, 0, ';' }},
+ {0x0461, 0x0061, 257, 82, 46182, 46188, 46203, 41530, 41534, 2100, 46240, {41538, 0, 0, 0}, 172, 172, { 0, 500, 2, 1, 0, ',' }},
+ {0x0463, 0x0063, 1024, 1, 46243, 46249, 46270, 41607, 41611, 41588, 46300, {0, 0, 0, 0}, 173, 173, { 0, 500, 2, 1, 1, ';' }},
+ {0x0464, 0x0064, 257, 87, 46303, 46310, 46333, 41628, 41615, 41615, 46354, {41632, 0, 0, 0}, 174, 174, { 1252, 500, 10000, 437, 0, ',' }},
+ {0x0468, 0x7C68, 257, 78, 46357, 46368, 46391, 41664, 41668, 41655, 46408, {0, 0, 0, 0}, 175, 175, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x046A, 0x006A, 257, 78, 46411, 46417, 46434, 41697, 41701, 41672, 46408, {0, 0, 0, 0}, 176, 176, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x046C, 0x006C, 257, 118, 46480, 46487, 41724, 41741, 41705, 41705, 44522, {0, 0, 0, 0}, 177, 177, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x046F, 0x006F, 257, 39, 46517, 46523, 46547, 41772, 41776, 41745, 46578, {0, 0, 0, 0}, 178, 178, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x0470, 0x0070, 257, 78, 46581, 46587, 46587, 41785, 41789, 14645, 46408, {0, 0, 0, 0}, 179, 179, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x0478, 0x0078, 257, 21, 46602, 46608, 46627, 41817, 41821, 41793, 13450, {41825, 0, 0, 0}, 180, 180, { 0, 500, 2, 1, 0, ',' }},
+ {0x047E, 0x007E, 257, 36, 46646, 46652, 46668, 41858, 41862, 41838, 42679, {41866, 0, 0, 0}, 181, 181, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0482, 0x0082, 257, 36, 46687, 46693, 46710, 41905, 41909, 41886, 42679, {0, 0, 0, 0}, 182, 182, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0485, 0x0085, 257, 96, 46728, 46735, 41988, 42006, 41978, 41978, 43323, {0, 0, 0, 0}, 183, 183, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0487, 0x0087, 257, 97, 46750, 46756, 46756, 42025, 42029, 42010, 46777, {0, 0, 0, 0}, 184, 184, { 1252, 37, 10000, 437, 0, ';' }},
+ {0x0491, 0x0091, 257, 37, 46780, 46786, 46819, 42062, 42066, 42033, 45824, {42070, 0, 0, 0}, 185, 185, { 1252, 20285, 10000, 850, 0, ',' }},
+ {0x0801, 0x0001, 257, 50, 46855, 46861, 46875, 46905, 37132, 37103, 46909, {37136, 0, 0, 0}, 186, 186, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x0804, 0x0004, 257, 21, 46912, 37361, 46918, 37335, 37339, 37343, 13450, {37346, 0, 0, 0}, 187, 187, { 936, 500, 10008, 936, 0, ',' }},
+ {0x0807, 0x0007, 257, 19, 46934, 46940, 46961, 46979, 37502, 37480, 13371, {37506, 0, 0, 0}, 188, 188, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x0809, 0x0009, 257, 37, 46983, 46989, 46989, 47014, 37622, 37607, 45824, {37626, 0, 0, 0}, 189, 189, { 1252, 20285, 10000, 850, 0, ',' }},
+ {0x080A, 0x000A, 257, 76, 47018, 47024, 47041, 47060, 37669, 37645, 47064, {37673, 0, 0, 0}, 190, 190, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x080C, 0x000C, 257, 10, 47067, 47073, 47090, 47111, 37769, 37745, 47115, {37773, 0, 0, 0}, 191, 191, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0810, 0x0010, 257, 19, 47118, 47124, 47146, 47166, 37976, 37952, 13371, {37673, 0, 0, 0}, 192, 192, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0813, 0x0013, 257, 10, 47170, 47176, 47192, 47213, 38099, 38075, 47115, {38103, 0, 0, 0}, 193, 193, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0814, 0x7814, 257, 81, 47217, 47223, 47250, 47266, 47270, 47274, 43082, {37459, 0, 0, 0}, 194, 194, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x0816, 0x0016, 257, 91, 47277, 47283, 47305, 47327, 38233, 38204, 47331, {38237, 0, 0, 0}, 195, 195, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x081D, 0x001D, 257, 34, 47334, 47340, 47358, 47376, 38592, 38569, 42635, {37459, 0, 0, 0}, 196, 196, { 1252, 20278, 10000, 850, 0, ';' }},
+ {0x082C, 0x742C, 257, 7, 47380, 47391, 44347, 47426, 39371, 14654, 44375, {39375, 0, 0, 0}, 197, 197, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x083C, 0x003C, 257, 47, 47430, 47436, 47452, 39983, 39987, 39966, 47468, {39991, 0, 0, 0}, 198, 198, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x083E, 0x003E, 257, 13, 47471, 47477, 47492, 47515, 40039, 40012, 47519, {40043, 0, 0, 0}, 199, 199, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x0843, 0x7843, 257, 114, 47522, 47533, 45145, 40242, 40246, 40222, 45179, {0, 0, 0, 0}, 200, 200, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x0845, 0x0045, 257, 9, 47562, 47568, 47589, 47632, 40281, 40250, 47636, {40285, 0, 0, 0}, 201, 201, { 0, 500, 2, 1, 0, ',' }},
+ {0x0850, 0x7C50, 257, 21, 47639, 47650, 41107, 47679, 41124, 41094, 13450, {0, 0, 0, 0}, 202, 202, { 0, 500, 2, 1, 0, ',' }},
+ {0x0C01, 0x0001, 257, 31, 47683, 47689, 47704, 47728, 37132, 37103, 47732, {37136, 0, 0, 0}, 203, 203, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x0C04, 0x7C04, 257, 42, 47735, 47741, 47784, 47821, 37339, 37343, 47825, {42349, 0, 0, 0}, 204, 204, { 950, 500, 10002, 950, 0, ',' }},
+ {0x0C07, 0x0007, 257, 5, 47828, 47834, 47851, 47873, 37502, 37480, 47877, {37506, 0, 0, 0}, 205, 205, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x0C09, 0x0009, 257, 6, 47880, 47886, 47886, 47906, 37622, 37607, 47910, {37626, 0, 0, 0}, 206, 206, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x0C0A, 0x000A, 257, 32, 47913, 47919, 47935, 47954, 37669, 37645, 42295, {37673, 0, 0, 0}, 207, 207, { 1252, 20284, 10000, 850, 0, ';' }},
+ {0x0C0C, 0x000C, 257, 18, 47958, 47964, 47980, 47999, 37769, 37745, 48003, {37773, 0, 0, 0}, 208, 208, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x0C3B, 0x003B, 257, 34, 48006, 48012, 48036, 48062, 48066, 39924, 42635, {0, 0, 0, 0}, 209, 209, { 1252, 20278, 10000, 850, 0, ';' }},
+ {0x1001, 0x0001, 257, 69, 48070, 48076, 48091, 48119, 37132, 37103, 48123, {37136, 0, 0, 0}, 210, 210, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x1004, 0x0004, 257, 100, 48126, 48132, 48164, 48183, 37339, 37343, 48187, {37346, 0, 0, 0}, 211, 211, { 936, 500, 10008, 936, 0, ',' }},
+ {0x1007, 0x0007, 257, 67, 48190, 48196, 48216, 48236, 37502, 37480, 48240, {37506, 0, 0, 0}, 212, 212, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x1009, 0x0009, 257, 18, 48243, 48249, 48249, 48266, 37622, 37607, 48003, {37626, 0, 0, 0}, 213, 213, { 1252, 37, 10000, 850, 0, ',' }},
+ {0x100A, 0x000A, 257, 41, 48270, 48276, 48296, 48317, 37669, 37645, 48321, {37673, 0, 0, 0}, 214, 214, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x100C, 0x000C, 257, 19, 48324, 48330, 48351, 48370, 37769, 37745, 13371, {37773, 0, 0, 0}, 215, 215, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x1401, 0x0001, 257, 28, 48374, 48380, 48397, 48429, 37132, 37103, 48433, {37136, 0, 0, 0}, 216, 216, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x1404, 0x7C04, 257, 74, 48436, 48442, 48481, 48518, 37339, 37343, 48522, {42349, 0, 0, 0}, 217, 217, { 950, 500, 10002, 950, 0, ',' }},
+ {0x1407, 0x0007, 257, 64, 48525, 48531, 48554, 48578, 37502, 37480, 48582, {37506, 0, 0, 0}, 218, 218, { 1252, 20273, 10000, 850, 0, ';' }},
+ {0x1409, 0x0009, 257, 83, 48585, 48591, 48591, 48613, 37622, 37607, 48617, {37626, 0, 0, 0}, 219, 219, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x140A, 0x000A, 257, 23, 48620, 48626, 48647, 48669, 37669, 37645, 48673, {37673, 0, 0, 0}, 220, 220, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x140C, 0x000C, 257, 67, 48676, 48682, 48702, 48725, 37769, 37745, 48240, {37773, 0, 0, 0}, 221, 221, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x1801, 0x0001, 257, 70, 48729, 48735, 48752, 48782, 37132, 37103, 48786, {37136, 0, 0, 0}, 222, 222, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x1809, 0x0009, 257, 47, 48789, 48795, 48795, 48813, 37622, 37607, 47468, {37626, 0, 0, 0}, 223, 223, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x180A, 0x000A, 257, 85, 48817, 48823, 48840, 48859, 37669, 37645, 48863, {37673, 0, 0, 0}, 224, 224, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x180C, 0x000C, 257, 71, 48866, 48872, 48888, 48907, 37769, 37745, 48911, {37773, 0, 0, 0}, 225, 225, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x181A, 0x701A, 257, 8, 48914, 48925, 48965, 49017, 49021, 49025, 49028, {49031, 0, 0, 0}, 226, 226, { 1250, 870, 10082, 852, 0, ';' }},
+ {0x1C01, 0x0001, 257, 107, 49054, 49060, 49077, 49103, 37132, 37103, 49107, {37136, 0, 0, 0}, 227, 227, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x1C09, 0x0009, 257, 118, 49110, 49116, 49116, 49139, 37622, 37607, 44522, {37626, 0, 0, 0}, 228, 228, { 1252, 500, 10000, 437, 0, ',' }},
+ {0x1C0A, 0x000A, 257, 27, 49143, 49149, 49178, 49211, 37669, 37645, 49215, {37673, 0, 0, 0}, 229, 229, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x1C1A, 0x6C1A, 257, 8, 49218, 49229, 48965, 49272, 49276, 49025, 49028, {39482, 0, 0, 0}, 230, 230, { 1251, 21025, 10007, 855, 0, ';' }},
+ {0x2001, 0x0001, 257, 84, 49280, 49286, 49300, 49328, 37132, 37103, 49332, {37136, 0, 0, 0}, 231, 231, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x2009, 0x0009, 257, 54, 49335, 49341, 49341, 49359, 37622, 37607, 49363, {37626, 0, 0, 0}, 232, 232, { 1252, 500, 10000, 850, 0, ',' }},
+ {0x200A, 0x000A, 257, 115, 49366, 49372, 49392, 49413, 37669, 37645, 49417, {37673, 0, 0, 0}, 233, 233, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x2401, 0x0001, 257, 117, 49420, 49426, 49441, 49469, 37132, 37103, 49473, {37136, 0, 0, 0}, 234, 234, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x240A, 0x000A, 257, 22, 49476, 49482, 49501, 49521, 37669, 37645, 49525, {37673, 0, 0, 0}, 235, 235, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x241A, 0x701A, 257, 95, 49528, 49539, 49563, 49591, 9310, 49025, 49595, {49031, 0, 0, 0}, 236, 236, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x2801, 0x0001, 257, 104, 49598, 49604, 49619, 49647, 37132, 37103, 49651, {37136, 0, 0, 0}, 237, 237, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x2809, 0x0009, 257, 17, 49654, 49660, 49660, 49677, 37622, 37607, 49681, {37626, 0, 0, 0}, 238, 238, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x280A, 0x000A, 257, 86, 49684, 49690, 49705, 49722, 37669, 37645, 49726, {37673, 0, 0, 0}, 239, 239, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x281A, 0x6C1A, 257, 95, 49729, 49740, 49563, 49767, 9310, 49025, 49595, {39482, 0, 0, 0}, 240, 240, { 1251, 21025, 10007, 855, 0, ';' }},
+ {0x2C01, 0x0001, 257, 55, 49771, 49777, 49793, 49823, 37132, 37103, 49827, {37136, 0, 0, 0}, 241, 241, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x2C09, 0x0009, 257, 109, 49830, 49836, 49836, 49866, 37622, 37607, 49870, {37626, 0, 0, 0}, 242, 242, { 1252, 500, 10000, 850, 0, ';' }},
+ {0x2C0A, 0x000A, 257, 4, 49873, 49879, 49899, 49920, 37669, 37645, 49924, {37673, 0, 0, 0}, 243, 243, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x2C1A, 0x701A, 257, 72, 49927, 49938, 49966, 49999, 9310, 49025, 50003, {49031, 0, 0, 0}, 244, 244, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x3001, 0x0001, 257, 63, 50006, 50012, 50029, 50057, 37132, 37103, 50061, {37136, 0, 0, 0}, 245, 245, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x3009, 0x0009, 257, 119, 50064, 50070, 50070, 50089, 37622, 37607, 50093, {37626, 0, 0, 0}, 246, 246, { 1252, 500, 10000, 437, 0, ',' }},
+ {0x300A, 0x000A, 257, 29, 50096, 50102, 50120, 50139, 37669, 37645, 50143, {37673, 0, 0, 0}, 247, 247, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x301A, 0x6C1A, 257, 72, 50146, 50157, 49966, 50188, 9310, 49025, 50003, {39482, 0, 0, 0}, 248, 248, { 1251, 21025, 10007, 855, 0, ';' }},
+ {0x3401, 0x0001, 257, 61, 50192, 50198, 50214, 50244, 37132, 37103, 50248, {37136, 0, 0, 0}, 249, 249, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x3409, 0x0009, 257, 87, 50251, 50257, 50257, 50279, 37622, 37607, 46354, {37626, 0, 0, 0}, 250, 250, { 1252, 500, 10000, 437, 0, ',' }},
+ {0x340A, 0x000A, 257, 20, 50283, 50289, 50305, 50322, 37669, 37645, 50326, {37673, 0, 0, 0}, 251, 251, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x3801, 0x0001, 257, 0, 50329, 50335, 50365, 50429, 37132, 37103, 50433, {37136, 0, 0, 0}, 252, 252, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x380A, 0x000A, 257, 113, 50436, 50442, 50460, 50479, 37669, 37645, 50483, {37673, 0, 0, 0}, 253, 253, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x3C01, 0x0001, 257, 12, 50486, 50492, 50509, 50541, 37132, 37103, 50545, {37136, 0, 0, 0}, 254, 254, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x3C0A, 0x000A, 257, 92, 50548, 50554, 50573, 50593, 37669, 37645, 50597, {37673, 0, 0, 0}, 255, 255, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x4001, 0x0001, 257, 93, 50600, 50606, 50621, 50645, 37132, 37103, 50649, {37136, 0, 0, 0}, 256, 256, { 1256, 20420, 10004, 720, 1, ';' }},
+ {0x4009, 0x0009, 257, 49, 50652, 50658, 50658, 50674, 37622, 37607, 44852, {37626, 0, 0, 0}, 257, 257, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x400A, 0x000A, 257, 14, 50678, 50684, 50702, 50721, 37669, 37645, 50725, {37673, 0, 0, 0}, 258, 258, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x440A, 0x000A, 257, 103, 50728, 50734, 50756, 50779, 37669, 37645, 50783, {37673, 0, 0, 0}, 259, 259, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x4809, 0x0009, 257, 100, 50786, 50792, 50792, 50812, 37622, 37607, 48187, {37626, 0, 0, 0}, 260, 260, { 1252, 37, 10000, 437, 0, ',' }},
+ {0x480A, 0x000A, 257, 43, 50816, 50822, 50841, 50861, 37669, 37645, 50865, {37673, 0, 0, 0}, 261, 261, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x4C0A, 0x000A, 257, 79, 50868, 50874, 50894, 50915, 37669, 37645, 50919, {37673, 0, 0, 0}, 262, 262, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x500A, 0x000A, 257, 90, 50922, 50928, 50950, 50973, 37669, 37645, 50977, {37673, 0, 0, 0}, 263, 263, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x540A, 0x000A, 257, 112, 50980, 50986, 51010, 51036, 37669, 37645, 42594, {37673, 0, 0, 0}, 264, 264, { 1252, 20284, 10000, 850, 0, ',' }},
+ {0x6C1A, 0x7C1A, 257, -1, 51040, 51048, 51067, 49767, 9310, 49025, 0, {39482, 0, 0, 0}, 265, 265, { 1251, 21025, 10007, 855, 0, ';' }},
+ {0x701A, 0x7C1A, 257, -1, 51080, 51088, 51067, 49591, 9310, 49025, 0, {49031, 0, 0, 0}, 266, 266, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x742C, 0x002C, 257, -1, 51104, 51112, 39353, 47426, 39371, 14654, 0, {39375, 0, 0, 0}, 267, 267, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x7804, 0x007F, 257, -1, 37343, 37361, 37328, 37335, 37339, 37343, 0, {37346, 0, 0, 0}, 268, 268, { 936, 500, 10008, 936, 0, ',' }},
+ {0x7814, 0x0014, 257, -1, 47274, 51135, 51153, 47266, 47270, 47274, 0, {37459, 0, 0, 0}, 269, 269, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x781A, 0x007F, 257, -1, 51161, 51164, 51172, 51181, 51185, 51161, 0, {49031, 0, 0, 0}, 270, 270, { 1250, 870, 10082, 852, 0, ';' }},
+ {0x782C, 0x002C, 257, -1, 51189, 51197, 39353, 39367, 39371, 14654, 0, {39375, 0, 0, 0}, 271, 271, { 1254, 20905, 10081, 857, 0, ';' }},
+ {0x7843, 0x0043, 257, -1, 51217, 51225, 40231, 40242, 40246, 40222, 0, {0, 0, 0, 0}, 272, 272, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x7850, 0x0050, 257, -1, 51242, 51250, 41107, 51271, 41124, 41094, 0, {0, 0, 0, 0}, 273, 273, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x7C04, 0x7804, 257, -1, 51275, 42304, 37328, 42342, 37339, 37343, 0, {42349, 0, 0, 0}, 274, 274, { 950, 500, 10002, 950, 0, ',' }},
+ {0x7C04, 0x7C04, 257, -1, 51283, 51290, 37328, 42342, 37339, 37343, 0, {42349, 0, 0, 0}, 275, 275, { 950, 500, 10002, 950, 0, ',' }},
+ {0x7C14, 0x0014, 257, -1, 38152, 51319, 51337, 38144, 38148, 38152, 0, {37459, 0, 0, 0}, 276, 276, { 1252, 20277, 10000, 850, 0, ';' }},
+ {0x7C1A, 0x007F, 257, -1, 49025, 51351, 51067, 51359, 9310, 49025, 0, {39482, 0, 0, 0}, 277, 277, { 1250, 500, 10029, 852, 0, ';' }},
+ {0x7C28, 0x0028, 257, -1, 51363, 51371, 0, 39196, 39200, 39187, 0, {0, 0, 0, 0}, 278, 278, { 1251, 20880, 10007, 866, 0, ';' }},
+ {0x7C43, 0x0043, 257, -1, 51388, 51396, 40231, 40242, 40246, 40222, 0, {0, 0, 0, 0}, 279, 279, { 1254, 500, 10029, 857, 0, ';' }},
+ {0x7C50, 0x0050, 257, -1, 51410, 51418, 41107, 47679, 41124, 41094, 0, {0, 0, 0, 0}, 280, 280, { 0, 500, 2, 1, 0, ',' }},
+ {0x7C5F, 0x005F, 257, -1, 51440, 51449, 41490, 41500, 41460, 41460, 0, {0, 0, 0, 0}, 281, 281, { 1252, 20297, 10000, 850, 0, ';' }},
+ {0x7C68, 0x0068, 257, -1, 51483, 51491, 41658, 41664, 41668, 41655, 0, {0, 0, 0, 0}, 282, 282, { 1252, 37, 10000, 437, 0, ',' }}
};
static const CultureInfoNameEntry culture_name_entries [] = {
- {39011, 50}, /* af */
- {50892, 145}, /* af-za */
- {7865, 80}, /* am */
- {50898, 171}, /* am-et */
- {36490, 0}, /* ar */
- {50904, 252}, /* ar-ae */
- {50910, 254}, /* ar-bh */
- {50916, 216}, /* ar-dz */
- {50922, 203}, /* ar-eg */
- {50928, 186}, /* ar-iq */
- {50934, 241}, /* ar-jo */
- {50940, 249}, /* ar-kw */
- {50946, 245}, /* ar-lb */
- {50952, 210}, /* ar-ly */
- {50958, 222}, /* ar-ma */
- {50964, 231}, /* ar-om */
- {50970, 256}, /* ar-qa */
- {50976, 97}, /* ar-sa */
- {50982, 237}, /* ar-sy */
- {50988, 227}, /* ar-tn */
- {50994, 234}, /* ar-ye */
- {14516, 70}, /* as */
- {51000, 162}, /* as-in */
- {14519, 44}, /* az */
- {51006, 267}, /* az-cyrl */
- {51014, 197}, /* az-cyrl-az */
- {51025, 271}, /* az-latn */
- {51033, 139}, /* az-latn-az */
- {38283, 35}, /* be */
- {51044, 130}, /* be-by */
- {36551, 1}, /* bg */
- {51050, 98}, /* bg-bg */
- {39637, 62}, /* bn */
- {51056, 201}, /* bn-bd */
- {51062, 155}, /* bn-in */
- {40515, 73}, /* bo */
- {51068, 164}, /* bo-cn */
- {41225, 91}, /* br */
- {51074, 181}, /* br-fr */
- {50548, 270}, /* bs */
- {36633, 2}, /* ca */
- {51080, 99}, /* ca-es */
- {36769, 5}, /* cs */
- {51086, 101}, /* cs-cz */
- {40559, 74}, /* cy */
- {51092, 165}, /* cy-gb */
- {36822, 6}, /* da */
- {51098, 102}, /* da-dk */
- {36867, 7}, /* de */
- {51104, 205}, /* de-at */
- {51110, 188}, /* de-ch */
- {51116, 103}, /* de-de */
- {51122, 218}, /* de-li */
- {51128, 212}, /* de-lu */
- {36918, 8}, /* el */
- {51134, 104}, /* el-gr */
- {36994, 9}, /* en */
- {51140, 206}, /* en-au */
- {51146, 238}, /* en-bz */
- {51152, 213}, /* en-ca */
- {51158, 189}, /* en-gb */
- {51164, 223}, /* en-ie */
- {51170, 257}, /* en-in */
- {51176, 232}, /* en-jm */
- {51182, 219}, /* en-nz */
- {51188, 250}, /* en-ph */
- {51194, 260}, /* en-sg */
- {51200, 242}, /* en-tt */
- {51206, 105}, /* en-us */
- {51212, 228}, /* en-za */
- {51218, 246}, /* en-zw */
- {37032, 10}, /* es */
- {51224, 243}, /* es-ar */
- {51230, 258}, /* es-bo */
- {51236, 251}, /* es-cl */
- {51242, 235}, /* es-co */
- {51248, 220}, /* es-cr */
- {51254, 229}, /* es-do */
- {51260, 247}, /* es-ec */
- {51266, 207}, /* es-es */
- {51272, 214}, /* es-gt */
- {51278, 261}, /* es-hn */
- {51284, 190}, /* es-mx */
- {51290, 262}, /* es-ni */
- {51296, 224}, /* es-pa */
- {51302, 239}, /* es-pe */
- {51308, 263}, /* es-pr */
- {51314, 255}, /* es-py */
- {51320, 259}, /* es-sv */
- {51326, 264}, /* es-us */
- {51332, 253}, /* es-uy */
- {51338, 233}, /* es-ve */
- {38425, 37}, /* et */
- {51344, 132}, /* et-ee */
- {38780, 45}, /* eu */
- {51350, 140}, /* eu-es */
- {38591, 41}, /* fa */
- {51356, 136}, /* fa-ir */
- {37082, 11}, /* fi */
- {51362, 106}, /* fi-fi */
- {41002, 84}, /* fil */
- {51368, 174}, /* fil-ph */
- {39159, 52}, /* fo */
- {51375, 147}, /* fo-fo */
- {37132, 12}, /* fr */
- {51381, 191}, /* fr-be */
- {51387, 208}, /* fr-ca */
- {51393, 215}, /* fr-ch */
- {51399, 107}, /* fr-fr */
- {51405, 221}, /* fr-lu */
- {51411, 225}, /* fr-mc */
- {39353, 56}, /* ga */
- {51417, 198}, /* ga-ie */
- {41420, 96}, /* gd */
- {51423, 185}, /* gd-gb */
- {40654, 77}, /* gl */
- {51429, 168}, /* gl-es */
- {41300, 93}, /* gsw */
- {39775, 64}, /* gu */
- {51435, 156}, /* gu-in */
- {41042, 85}, /* ha */
- {51441, 282}, /* ha-latn */
- {51449, 175}, /* ha-latn-ng */
- {37182, 13}, /* he */
- {51460, 108}, /* he-il */
- {39188, 53}, /* hi */
- {51466, 148}, /* hi-in */
- {37824, 26}, /* hr */
- {51472, 121}, /* hr-hr */
- {37244, 14}, /* hu */
- {51478, 109}, /* hu-hu */
- {38693, 43}, /* hy */
- {51484, 138}, /* hy-am */
- {38137, 33}, /* id */
- {51490, 128}, /* id-id */
- {14510, 89}, /* ig */
- {51496, 179}, /* ig-ng */
- {41180, 90}, /* ii */
- {51502, 180}, /* ii-cn */
- {37288, 15}, /* is */
- {51508, 110}, /* is-is */
- {37339, 16}, /* it */
- {51514, 192}, /* it-ch */
- {51520, 111}, /* it-it */
- {37367, 17}, /* ja */
- {51526, 112}, /* ja-jp */
- {39052, 51}, /* ka */
- {51532, 146}, /* ka-ge */
- {39447, 58}, /* kk */
- {41132, 88}, /* kl */
- {51538, 178}, /* kl-gl */
- {40584, 75}, /* km */
- {51544, 166}, /* km-kh */
- {35839, 68}, /* kn */
- {51550, 160}, /* kn-in */
- {37424, 18}, /* ko */
- {51556, 113}, /* ko-kr */
- {40681, 78}, /* kok */
- {51562, 169}, /* kok-in */
- {39527, 59}, /* ky */
- {51569, 152}, /* ky-kg */
- {40629, 76}, /* lo */
- {51575, 167}, /* lo-la */
- {38519, 39}, /* lt */
- {51581, 134}, /* lt-lt */
- {38471, 38}, /* lv */
- {51587, 133}, /* lv-lv */
- {38826, 46}, /* mk */
- {51593, 141}, /* mk-mk */
- {40206, 69}, /* ml */
- {51599, 161}, /* ml-in */
- {40481, 72}, /* mn */
- {51605, 273}, /* mn-cyrl */
- {51613, 280}, /* mn-mong */
- {51621, 202}, /* mn-mong-cn */
- {40388, 71}, /* mr */
- {51632, 163}, /* mr-in */
- {39399, 57}, /* ms */
- {51638, 199}, /* ms-bn */
- {51644, 151}, /* ms-my */
- {39265, 54}, /* mt */
- {51650, 149}, /* mt-mt */
- {37539, 276}, /* nb */
- {51656, 115}, /* nb-no */
- {2059, 82}, /* ne */
- {51662, 172}, /* ne-np */
- {37462, 19}, /* nl */
- {51668, 193}, /* nl-be */
- {51674, 114}, /* nl-nl */
- {46661, 269}, /* nn */
- {51680, 194}, /* nn-no */
- {37512, 20}, /* no */
- {41092, 87}, /* nso */
- {51686, 177}, /* nso-za */
- {41273, 92}, /* oc */
- {51693, 182}, /* oc-fr */
- {14525, 65}, /* or */
- {51699, 157}, /* or-in */
- {39737, 63}, /* pa */
- {37542, 21}, /* pl */
- {51705, 116}, /* pl-pl */
- {40975, 83}, /* ps */
- {51711, 173}, /* ps-af */
- {37591, 22}, /* pt */
- {51717, 117}, /* pt-br */
- {51723, 195}, /* pt-pt */
- {37647, 23}, /* rm */
- {51729, 118}, /* rm-ch */
- {37696, 24}, /* ro */
- {51735, 119}, /* ro-ro */
- {37744, 25}, /* ru */
- {51741, 120}, /* ru-ru */
- {41397, 95}, /* rw */
- {51747, 184}, /* rw-rw */
- {41365, 94}, /* sah */
- {51753, 183}, /* sah-ru */
- {39311, 55}, /* se */
- {51760, 209}, /* se-fi */
- {51766, 150}, /* se-no */
- {40716, 79}, /* si */
- {51772, 170}, /* si-lk */
- {37876, 27}, /* sk */
- {51778, 122}, /* sk-sk */
- {38368, 36}, /* sl */
- {51784, 131}, /* sl-si */
- {37930, 28}, /* sq */
- {51790, 123}, /* sq-al */
- {48412, 277}, /* sr */
- {51796, 265}, /* sr-cyrl */
- {51804, 230}, /* sr-cyrl-ba */
- {51815, 248}, /* sr-cyrl-me */
- {51826, 240}, /* sr-cyrl-rs */
- {51837, 266}, /* sr-latn */
- {51845, 226}, /* sr-latn-ba */
- {51856, 244}, /* sr-latn-me */
- {51867, 236}, /* sr-latn-rs */
- {37956, 29}, /* sv */
- {51878, 196}, /* sv-fi */
- {51884, 124}, /* sv-se */
- {39559, 60}, /* sw */
- {51890, 153}, /* sw-ke */
- {39903, 66}, /* ta */
- {51896, 158}, /* ta-in */
- {40001, 67}, /* te */
- {51902, 159}, /* te-in */
- {38574, 40}, /* tg */
- {51908, 278}, /* tg-cyrl */
- {51916, 135}, /* tg-cyrl-tj */
- {37983, 30}, /* th */
- {51927, 125}, /* th-th */
- {38913, 47}, /* tn */
- {51933, 142}, /* tn-za */
- {38040, 31}, /* tr */
- {51939, 126}, /* tr-tr */
- {40847, 81}, /* tzm */
- {51945, 281}, /* tzm-latn */
- {38195, 34}, /* uk */
- {51954, 129}, /* uk-ua */
- {38082, 32}, /* ur */
- {51960, 127}, /* ur-pk */
- {39609, 61}, /* uz */
- {51966, 272}, /* uz-cyrl */
- {51974, 200}, /* uz-cyrl-uz */
- {51985, 279}, /* uz-latn */
- {51993, 154}, /* uz-latn-uz */
- {38645, 42}, /* vi */
- {52004, 137}, /* vi-vn */
- {38940, 48}, /* xh */
- {52010, 143}, /* xh-za */
- {41059, 86}, /* yo */
- {52016, 176}, /* yo-ng */
- {36730, 268}, /* zh */
- {52022, 3}, /* zh-chs */
- {52029, 275}, /* zh-cht */
- {52036, 187}, /* zh-cn */
- {52042, 4}, /* zh-hans */
- {52050, 274}, /* zh-hant */
- {52058, 204}, /* zh-hk */
- {52064, 217}, /* zh-mo */
- {52070, 211}, /* zh-sg */
- {52076, 100}, /* zh-tw */
- {38966, 49}, /* zu */
- {52082, 144} /* zu-za */
+ {39624, 50}, /* af */
+ {51505, 145}, /* af-za */
+ {7932, 80}, /* am */
+ {51511, 171}, /* am-et */
+ {37103, 0}, /* ar */
+ {51517, 252}, /* ar-ae */
+ {51523, 254}, /* ar-bh */
+ {51529, 216}, /* ar-dz */
+ {51535, 203}, /* ar-eg */
+ {51541, 186}, /* ar-iq */
+ {51547, 241}, /* ar-jo */
+ {51553, 249}, /* ar-kw */
+ {51559, 245}, /* ar-lb */
+ {51565, 210}, /* ar-ly */
+ {51571, 222}, /* ar-ma */
+ {51577, 231}, /* ar-om */
+ {51583, 256}, /* ar-qa */
+ {51589, 97}, /* ar-sa */
+ {51595, 237}, /* ar-sy */
+ {51601, 227}, /* ar-tn */
+ {51607, 234}, /* ar-ye */
+ {14651, 70}, /* as */
+ {51613, 162}, /* as-in */
+ {14654, 44}, /* az */
+ {51619, 267}, /* az-cyrl */
+ {51627, 197}, /* az-cyrl-az */
+ {51638, 271}, /* az-latn */
+ {51646, 139}, /* az-latn-az */
+ {38896, 35}, /* be */
+ {51657, 130}, /* be-by */
+ {37164, 1}, /* bg */
+ {51663, 98}, /* bg-bg */
+ {40250, 62}, /* bn */
+ {51669, 201}, /* bn-bd */
+ {51675, 155}, /* bn-in */
+ {41128, 73}, /* bo */
+ {51681, 164}, /* bo-cn */
+ {41838, 91}, /* br */
+ {51687, 181}, /* br-fr */
+ {51161, 270}, /* bs */
+ {37246, 2}, /* ca */
+ {51693, 99}, /* ca-es */
+ {37382, 5}, /* cs */
+ {51699, 101}, /* cs-cz */
+ {41172, 74}, /* cy */
+ {51705, 165}, /* cy-gb */
+ {37435, 6}, /* da */
+ {51711, 102}, /* da-dk */
+ {37480, 7}, /* de */
+ {51717, 205}, /* de-at */
+ {51723, 188}, /* de-ch */
+ {51729, 103}, /* de-de */
+ {51735, 218}, /* de-li */
+ {51741, 212}, /* de-lu */
+ {37531, 8}, /* el */
+ {51747, 104}, /* el-gr */
+ {37607, 9}, /* en */
+ {51753, 206}, /* en-au */
+ {51759, 238}, /* en-bz */
+ {51765, 213}, /* en-ca */
+ {51771, 189}, /* en-gb */
+ {51777, 223}, /* en-ie */
+ {51783, 257}, /* en-in */
+ {51789, 232}, /* en-jm */
+ {51795, 219}, /* en-nz */
+ {51801, 250}, /* en-ph */
+ {51807, 260}, /* en-sg */
+ {51813, 242}, /* en-tt */
+ {51819, 105}, /* en-us */
+ {51825, 228}, /* en-za */
+ {51831, 246}, /* en-zw */
+ {37645, 10}, /* es */
+ {51837, 243}, /* es-ar */
+ {51843, 258}, /* es-bo */
+ {51849, 251}, /* es-cl */
+ {51855, 235}, /* es-co */
+ {51861, 220}, /* es-cr */
+ {51867, 229}, /* es-do */
+ {51873, 247}, /* es-ec */
+ {51879, 207}, /* es-es */
+ {51885, 214}, /* es-gt */
+ {51891, 261}, /* es-hn */
+ {51897, 190}, /* es-mx */
+ {51903, 262}, /* es-ni */
+ {51909, 224}, /* es-pa */
+ {51915, 239}, /* es-pe */
+ {51921, 263}, /* es-pr */
+ {51927, 255}, /* es-py */
+ {51933, 259}, /* es-sv */
+ {51939, 264}, /* es-us */
+ {51945, 253}, /* es-uy */
+ {51951, 233}, /* es-ve */
+ {39038, 37}, /* et */
+ {51957, 132}, /* et-ee */
+ {39393, 45}, /* eu */
+ {51963, 140}, /* eu-es */
+ {39204, 41}, /* fa */
+ {51969, 136}, /* fa-ir */
+ {37695, 11}, /* fi */
+ {51975, 106}, /* fi-fi */
+ {41615, 84}, /* fil */
+ {51981, 174}, /* fil-ph */
+ {39772, 52}, /* fo */
+ {51988, 147}, /* fo-fo */
+ {37745, 12}, /* fr */
+ {51994, 191}, /* fr-be */
+ {52000, 208}, /* fr-ca */
+ {52006, 215}, /* fr-ch */
+ {52012, 107}, /* fr-fr */
+ {52018, 221}, /* fr-lu */
+ {52024, 225}, /* fr-mc */
+ {39966, 56}, /* ga */
+ {52030, 198}, /* ga-ie */
+ {42033, 96}, /* gd */
+ {52036, 185}, /* gd-gb */
+ {41267, 77}, /* gl */
+ {52042, 168}, /* gl-es */
+ {41913, 93}, /* gsw */
+ {40388, 64}, /* gu */
+ {52048, 156}, /* gu-in */
+ {41655, 85}, /* ha */
+ {52054, 282}, /* ha-latn */
+ {52062, 175}, /* ha-latn-ng */
+ {37795, 13}, /* he */
+ {52073, 108}, /* he-il */
+ {39801, 53}, /* hi */
+ {52079, 148}, /* hi-in */
+ {38437, 26}, /* hr */
+ {52085, 121}, /* hr-hr */
+ {37857, 14}, /* hu */
+ {52091, 109}, /* hu-hu */
+ {39306, 43}, /* hy */
+ {52097, 138}, /* hy-am */
+ {38750, 33}, /* id */
+ {52103, 128}, /* id-id */
+ {14645, 89}, /* ig */
+ {52109, 179}, /* ig-ng */
+ {41793, 90}, /* ii */
+ {52115, 180}, /* ii-cn */
+ {37901, 15}, /* is */
+ {52121, 110}, /* is-is */
+ {37952, 16}, /* it */
+ {52127, 192}, /* it-ch */
+ {52133, 111}, /* it-it */
+ {37980, 17}, /* ja */
+ {52139, 112}, /* ja-jp */
+ {39665, 51}, /* ka */
+ {52145, 146}, /* ka-ge */
+ {40060, 58}, /* kk */
+ {41745, 88}, /* kl */
+ {52151, 178}, /* kl-gl */
+ {41197, 75}, /* km */
+ {52157, 166}, /* km-kh */
+ {36452, 68}, /* kn */
+ {52163, 160}, /* kn-in */
+ {38037, 18}, /* ko */
+ {52169, 113}, /* ko-kr */
+ {41294, 78}, /* kok */
+ {52175, 169}, /* kok-in */
+ {40140, 59}, /* ky */
+ {52182, 152}, /* ky-kg */
+ {41242, 76}, /* lo */
+ {52188, 167}, /* lo-la */
+ {39132, 39}, /* lt */
+ {52194, 134}, /* lt-lt */
+ {39084, 38}, /* lv */
+ {52200, 133}, /* lv-lv */
+ {39439, 46}, /* mk */
+ {52206, 141}, /* mk-mk */
+ {40819, 69}, /* ml */
+ {52212, 161}, /* ml-in */
+ {41094, 72}, /* mn */
+ {52218, 273}, /* mn-cyrl */
+ {52226, 280}, /* mn-mong */
+ {52234, 202}, /* mn-mong-cn */
+ {41001, 71}, /* mr */
+ {52245, 163}, /* mr-in */
+ {40012, 57}, /* ms */
+ {52251, 199}, /* ms-bn */
+ {52257, 151}, /* ms-my */
+ {39878, 54}, /* mt */
+ {52263, 149}, /* mt-mt */
+ {38152, 276}, /* nb */
+ {52269, 115}, /* nb-no */
+ {2100, 82}, /* ne */
+ {52275, 172}, /* ne-np */
+ {38075, 19}, /* nl */
+ {52281, 193}, /* nl-be */
+ {52287, 114}, /* nl-nl */
+ {47274, 269}, /* nn */
+ {52293, 194}, /* nn-no */
+ {38125, 20}, /* no */
+ {41705, 87}, /* nso */
+ {52299, 177}, /* nso-za */
+ {41886, 92}, /* oc */
+ {52306, 182}, /* oc-fr */
+ {14660, 65}, /* or */
+ {52312, 157}, /* or-in */
+ {40350, 63}, /* pa */
+ {38155, 21}, /* pl */
+ {52318, 116}, /* pl-pl */
+ {41588, 83}, /* ps */
+ {52324, 173}, /* ps-af */
+ {38204, 22}, /* pt */
+ {52330, 117}, /* pt-br */
+ {52336, 195}, /* pt-pt */
+ {38260, 23}, /* rm */
+ {52342, 118}, /* rm-ch */
+ {38309, 24}, /* ro */
+ {52348, 119}, /* ro-ro */
+ {38357, 25}, /* ru */
+ {52354, 120}, /* ru-ru */
+ {42010, 95}, /* rw */
+ {52360, 184}, /* rw-rw */
+ {41978, 94}, /* sah */
+ {52366, 183}, /* sah-ru */
+ {39924, 55}, /* se */
+ {52373, 209}, /* se-fi */
+ {52379, 150}, /* se-no */
+ {41329, 79}, /* si */
+ {52385, 170}, /* si-lk */
+ {38489, 27}, /* sk */
+ {52391, 122}, /* sk-sk */
+ {38981, 36}, /* sl */
+ {52397, 131}, /* sl-si */
+ {38543, 28}, /* sq */
+ {52403, 123}, /* sq-al */
+ {49025, 277}, /* sr */
+ {52409, 265}, /* sr-cyrl */
+ {52417, 230}, /* sr-cyrl-ba */
+ {52428, 248}, /* sr-cyrl-me */
+ {52439, 240}, /* sr-cyrl-rs */
+ {52450, 266}, /* sr-latn */
+ {52458, 226}, /* sr-latn-ba */
+ {52469, 244}, /* sr-latn-me */
+ {52480, 236}, /* sr-latn-rs */
+ {38569, 29}, /* sv */
+ {52491, 196}, /* sv-fi */
+ {52497, 124}, /* sv-se */
+ {40172, 60}, /* sw */
+ {52503, 153}, /* sw-ke */
+ {40516, 66}, /* ta */
+ {52509, 158}, /* ta-in */
+ {40614, 67}, /* te */
+ {52515, 159}, /* te-in */
+ {39187, 40}, /* tg */
+ {52521, 278}, /* tg-cyrl */
+ {52529, 135}, /* tg-cyrl-tj */
+ {38596, 30}, /* th */
+ {52540, 125}, /* th-th */
+ {39526, 47}, /* tn */
+ {52546, 142}, /* tn-za */
+ {38653, 31}, /* tr */
+ {52552, 126}, /* tr-tr */
+ {41460, 81}, /* tzm */
+ {52558, 281}, /* tzm-latn */
+ {38808, 34}, /* uk */
+ {52567, 129}, /* uk-ua */
+ {38695, 32}, /* ur */
+ {52573, 127}, /* ur-pk */
+ {40222, 61}, /* uz */
+ {52579, 272}, /* uz-cyrl */
+ {52587, 200}, /* uz-cyrl-uz */
+ {52598, 279}, /* uz-latn */
+ {52606, 154}, /* uz-latn-uz */
+ {39258, 42}, /* vi */
+ {52617, 137}, /* vi-vn */
+ {39553, 48}, /* xh */
+ {52623, 143}, /* xh-za */
+ {41672, 86}, /* yo */
+ {52629, 176}, /* yo-ng */
+ {37343, 268}, /* zh */
+ {52635, 3}, /* zh-chs */
+ {52642, 275}, /* zh-cht */
+ {52649, 187}, /* zh-cn */
+ {52655, 4}, /* zh-hans */
+ {52663, 274}, /* zh-hant */
+ {52671, 204}, /* zh-hk */
+ {52677, 217}, /* zh-mo */
+ {52683, 211}, /* zh-sg */
+ {52689, 100}, /* zh-tw */
+ {39579, 49}, /* zu */
+ {52695, 144} /* zu-za */
};
static const RegionInfoEntry region_entries [] = {
- { 224,49820,47115,47115,52088,52109,36426,52156,52160,52188},
- { 3,45687,52212,52212,52216,52228,36206,52247,52251,52266},
- { 6,42867,52279,52279,52283,52291,35842,52302,52306,0},
- { 7,3781,48169,48169,52319,52327,35987,52375,52379,0},
- { 11,49311,47816,47816,52393,52393,35586,49034,52403,52418},
- { 14,47264,52433,52433,52437,52445,35481,52457,52461,52461},
- { 12,47297,52466,52466,52470,52470,35586,52480,52484,52484},
- { 5,43762,38754,38754,52502,52513,36234,52525,52529,52547},
- { 25,48415,52567,52567,52571,52594,36324,52631,52635,52671},
- { 23,47023,52714,52714,52718,52729,36272,52754,52758,52775},
- { 21,46502,38318,38318,52816,52824,35481,52457,52461,52833},
- { 35,41639,36583,36583,52838,52847,35465,52864,52868,52882},
- { 17,49932,52908,52908,52912,52920,36436,52935,52939,52954},
- { 37,46906,52978,52978,52982,52982,35586,52989,52993,53007},
- { 26,50112,53020,53020,53024,53024,36460,40551,53032,53051},
- { 32,42559,53061,53061,53065,53072,35735,53079,53083,53098},
- { 29,43253,53114,53114,53118,53126,0,53143,53147,53164},
- { 24,49068,53196,53196,53200,53200,35586,53207,53211,53211},
- { 39,47390,53225,53225,53229,53229,35586,53236,53240,53256},
- { 223,13261,53272,53272,53276,53288,0,53295,53299,53311},
- { 46,49713,53325,53325,53329,53329,35586,53335,53339,53352},
- { 45,13340,53365,53365,53369,53375,36162,53394,53398,53411},
- { 51,48912,53430,53430,53434,53434,35586,53443,53447,53462},
- { 54,48060,53478,53478,53482,53482,36306,53493,53497,53516},
- { 75,41802,53537,53537,53541,53556,35506,53574,53578,53600},
- { 94,41892,36885,36885,53615,53623,35481,52457,52461,52461},
- { 61,41844,53635,53635,53639,53647,35534,53655,53659,53672},
- { 65,48602,53684,53684,53688,53707,35586,53729,53733,53748},
- { 4,47820,53764,53764,53768,53776,36296,53791,53795,53810},
- { 66,49530,53834,53834,53838,53838,35586,53846,53850,53860},
- { 70,43351,50423,50423,53882,53890,35481,52457,52461,52833},
- { 67,47119,53896,53896,53900,53906,36276,53913,53917,53932},
- { 217,41682,37052,37052,53950,53956,35481,52457,52461,52833},
- { 73,45566,53964,53964,53968,53977,36186,53993,53997,54012},
- { 77,42022,37099,37099,54038,54046,35481,52457,52461,52833},
- { 81,44182,54052,54052,54056,54070,35534,53655,53659,54079},
- { 84,42066,37152,37152,54092,54092,35481,52457,52461,52833},
- { 242,45211,54099,54099,54103,54118,36167,54131,54135,54158},
- { 88,44128,54180,54180,54184,54192,0,54223,54227,54241},
- { 93,45965,54276,54276,54280,54290,35534,53655,53659,54307},
- { 98,41948,54325,54325,54329,54336,35481,52457,52461,54349},
- { 99,47708,54358,54358,54362,54362,7774,54372,54376,54395},
- { 104,47212,54416,54416,54420,54440,35586,54468,54472,54489},
- { 106,50252,54496,54496,54500,54500,2471,54509,54513,54530},
- { 108,42758,37845,37845,54549,54557,35839,54566,54570,54584},
- { 109,42167,37264,37264,54589,54597,35636,54611,54615,54632},
- { 111,43116,54646,54646,54650,54650,35865,54660,54664,54682},
- { 68,46855,54699,54699,54703,54711,35481,52457,52461,52461},
- { 117,42115,54717,54717,54721,54728,35632,54739,54743,54762},
- { 113,44239,38168,38168,54769,54775,36012,54788,54792,54805},
- { 121,46296,54840,54840,54844,54849,36245,54862,54866,54878},
- { 116,43540,54900,54900,54904,54909,35979,54920,54924,54937},
- { 110,42216,37311,37311,54957,54965,35534,54973,54977,54994},
- { 118,42259,37359,37359,55010,55016,35481,52457,52461,52461},
- { 124,48750,55023,55023,55027,55027,35586,55035,55039,55039},
- { 126,49214,55055,55055,55059,55066,36396,55079,55083,55099},
- { 122,42304,37389,37389,55121,55127,35502,55134,55138,55151},
- { 129,44492,55161,55161,55165,55165,36026,55171,55175,55191},
- { 130,44449,55209,55209,55213,55224,36019,55245,55249,0},
- { 40,45289,40621,40621,55264,55273,36170,55295,55299,55314},
- { 134,42359,37444,37444,55319,55331,35670,55344,55348,55365},
- { 136,49635,55382,55382,55386,55393,36416,55406,55410,55424},
- { 138,45331,40646,40646,55446,40636,36174,55451,55455,55467},
- { 139,49448,55477,55477,55481,55489,36406,55500,55504,55519},
- { 145,47969,55541,55541,55545,55545,0,53295,53299,55559},
- { 42,45507,55577,55577,55581,55591,36178,55623,55627,55644},
- { 141,43449,55679,55679,55683,55693,35955,55701,55705,55722},
- { 147,47627,55728,55728,55732,55743,35481,52457,52461,52461},
- { 140,43397,55753,55753,55757,55764,35915,55772,55776,55789},
- { 148,47510,55803,55803,55807,55813,36286,55824,55828,55841},
- { 159,48173,40415,40415,55861,55869,36310,55882,55886,55902},
- { 158,48298,55922,55922,55926,55926,35481,52457,52461,52833},
- { 270,49390,55933,55933,55937,55948,35481,52457,52461,55966},
- { 19618,43878,55971,55971,55975,55985,0,55971,56006,56023},
- { 151,47909,56055,56055,56059,56075,0,56103,56107,56123},
- { 163,44278,39282,39282,56133,56133,35481,52457,52461,56139},
- { 166,46451,56144,56144,56148,56155,35586,56163,56167,56180},
- { 167,44383,56194,56194,56198,56198,36016,56207,56211,56229},
- { 175,45795,56246,56246,56250,56258,36213,56267,56271,56286},
- { 182,50306,56292,56292,56296,56296,36467,56306,56310,56330},
- { 176,42411,37482,37482,56353,56365,35481,52457,52461,52461},
- { 177,42469,37531,37531,56375,56382,35534,56388,56392,56408},
- { 178,45627,56422,56422,56426,56432,36193,56448,56452,0},
- { 183,48004,56467,56467,56471,56471,35586,56483,56487,56487},
- { 164,48719,56506,56506,56510,56515,36343,56526,56530,56541},
- { 192,48250,39767,39767,56561,56568,36320,56576,56580,56598},
- { 187,49113,56615,56615,56619,56624,36384,56630,56634,56653},
- { 201,45741,56671,56671,56675,56687,36209,56697,56701,56701},
- { 190,43055,56717,56717,56721,56730,35860,56745,56749,56765},
- { 191,42510,56793,56793,56797,56804,35693,56811,56815,56828},
- { 202,50364,56842,56842,56846,56846,35586,53846,53850,53860},
- { 193,46718,56858,56858,56862,56862,35481,52457,52461,52461},
- { 185,49984,56871,56871,56875,56875,36446,56884,56888,56907},
- { 197,50036,56926,56926,56930,56936,36450,56943,56947,56959},
- { 200,42654,56977,56977,56981,56989,0,56998,57002,57015},
- { 271,48982,50746,50746,57029,57036,36369,57049,57053,57067},
- { 203,42710,37770,37770,57080,57087,35760,57100,57104,57118},
- { 204,46164,57150,57150,57154,57154,36217,57161,57165,0},
- { 205,13258,57179,57179,57183,57196,35409,57243,57247,57259},
- { 221,42911,57279,57279,57283,57290,35534,57298,57302,57316},
- { 215,47574,57329,57329,57333,57343,0,57353,57357,57374},
- { 212,43309,57387,57387,57391,57400,35481,52457,52461,57410},
- { 143,42820,57415,57415,57419,57428,35481,52457,52461,52461},
- { 72,50170,38395,38395,57449,57449,36463,53846,53850,53860},
- { 222,49038,57461,57461,57465,57471,36374,57482,57486,57499},
- { 227,42958,38001,38001,57519,37991,35853,57528,57532,57542},
- { 228,43492,57561,57561,57565,0,36019,57576,57580,57599},
- { 234,48494,57612,57612,57616,57624,36327,57633,57637,57652},
- { 235,43004,57673,57673,57677,57684,35857,57693,57697,57710},
- { 225,49257,57724,57724,57728,57728,35586,57748,57752,57752},
- { 237,41733,57779,57779,57783,57790,36220,57797,57801,57819},
- { 241,43183,38229,38229,57829,57837,35868,57852,57856,57874},
- { 244,41981,57908,57908,57912,57912,35586,53846,53850,53850},
- { 246,49870,57926,57926,57930,57930,35586,57938,57942,57957},
- { 247,44566,39629,39629,57971,57982,36239,58003,58007,58022},
- { 249,48804,58041,58041,58045,58045,36353,58055,58059,58079},
- { 251,43598,58099,58099,58103,58111,35983,58122,58126,58142},
- { 261,48860,58150,58150,58154,58160,36359,58171,58175,58187},
- { 209,43909,58205,58205,58209,0,10511,58222,58226,0},
- { 264,49480,58245,58245,58249,58249,35586,53846,53850,53850}
+ { 224,50433,47728,47728,52701,52722,37039,52769,52773,52801},
+ { 3,46300,52825,52825,52829,52841,36821,52860,52864,52879},
+ { 6,43480,52892,52892,52896,52904,36455,52915,52919,0},
+ { 7,3824,48782,48782,52932,52940,36602,52988,52992,0},
+ { 11,49924,48429,48429,53006,53006,36197,49647,53016,53031},
+ { 14,47877,53046,53046,53050,53058,36092,53070,53074,53074},
+ { 12,47910,53079,53079,53083,53083,36197,53093,53097,53097},
+ { 5,44375,39367,39367,53115,53126,36849,53138,53142,53160},
+ { 25,49028,53180,53180,53184,53207,36937,53244,53248,53284},
+ { 23,47636,53327,53327,53331,53342,36885,53367,53371,53388},
+ { 21,47115,38931,38931,53429,53437,36092,53070,53074,53446},
+ { 35,42252,37196,37196,53451,53460,36076,53477,53481,53495},
+ { 17,50545,53521,53521,53525,53533,37049,53548,53552,53567},
+ { 37,47519,53591,53591,53595,53595,36197,53602,53606,53620},
+ { 26,50725,53633,53633,53637,53637,37073,41164,53645,53664},
+ { 32,43172,53674,53674,53678,53685,36346,53692,53696,53711},
+ { 29,43866,53727,53727,53731,53739,0,53756,53760,53777},
+ { 24,49681,53809,53809,53813,53813,36197,53820,53824,53824},
+ { 39,48003,53838,53838,53842,53842,36197,53849,53853,53869},
+ { 223,13371,53885,53885,53889,53901,0,53908,53912,53924},
+ { 46,50326,53938,53938,53942,53942,36197,53948,53952,53965},
+ { 45,13450,53978,53978,53982,53988,36777,54007,54011,54024},
+ { 51,49525,54043,54043,54047,54047,36197,54056,54060,54075},
+ { 54,48673,54091,54091,54095,54095,36919,54106,54110,54129},
+ { 75,42415,54150,54150,54154,54169,36117,54187,54191,54213},
+ { 94,42505,37498,37498,54228,54236,36092,53070,53074,53074},
+ { 61,42457,54248,54248,54252,54260,36145,54268,54272,54285},
+ { 65,49215,54297,54297,54301,54320,36197,54342,54346,54361},
+ { 4,48433,54377,54377,54381,54389,36909,54404,54408,54423},
+ { 66,50143,54447,54447,54451,54451,36197,54459,54463,54473},
+ { 70,43964,51036,51036,54495,54503,36092,53070,53074,53446},
+ { 67,47732,54509,54509,54513,54519,36889,54526,54530,54545},
+ { 217,42295,37665,37665,54563,54569,36092,53070,53074,53446},
+ { 73,46179,54577,54577,54581,54590,36801,54606,54610,54625},
+ { 77,42635,37712,37712,54651,54659,36092,53070,53074,53446},
+ { 81,44795,54665,54665,54669,54683,36145,54268,54272,54692},
+ { 84,42679,37765,37765,54705,54705,36092,53070,53074,53446},
+ { 242,45824,54712,54712,54716,54731,36782,54744,54748,54771},
+ { 88,44741,54793,54793,54797,54805,0,54836,54840,54854},
+ { 93,46578,54889,54889,54893,54903,36145,54268,54272,54920},
+ { 98,42561,54938,54938,54942,54949,36092,53070,53074,54962},
+ { 99,48321,54971,54971,54975,54975,7812,54985,54989,55008},
+ { 104,47825,55029,55029,55033,55053,36197,55081,55085,55102},
+ { 106,50865,55109,55109,55113,55113,2516,55122,55126,55143},
+ { 108,43371,38458,38458,55162,55170,36452,55179,55183,55197},
+ { 109,42780,37877,37877,55202,55210,36247,55224,55228,55245},
+ { 111,43729,55259,55259,55263,55263,36478,55273,55277,55295},
+ { 68,47468,55312,55312,55316,55324,36092,53070,53074,53074},
+ { 117,42728,55330,55330,55334,55341,36243,55352,55356,55375},
+ { 113,44852,38781,38781,55382,55388,36627,55401,55405,55418},
+ { 121,46909,55453,55453,55457,55462,36860,55475,55479,55491},
+ { 116,44153,55513,55513,55517,55522,36594,55533,55537,55550},
+ { 110,42829,37924,37924,55570,55578,36145,55586,55590,55607},
+ { 118,42872,37972,37972,55623,55629,36092,53070,53074,53074},
+ { 124,49363,55636,55636,55640,55640,36197,55648,55652,55652},
+ { 126,49827,55668,55668,55672,55679,37009,55692,55696,55712},
+ { 122,42917,38002,38002,55734,55740,36113,55747,55751,55764},
+ { 129,45105,55774,55774,55778,55778,36641,55784,55788,55804},
+ { 130,45062,55822,55822,55826,55837,36634,55858,55862,0},
+ { 40,45902,41234,41234,55877,55886,36785,55908,55912,55927},
+ { 134,42972,38057,38057,55932,55944,36281,55957,55961,55978},
+ { 136,50248,55995,55995,55999,56006,37029,56019,56023,56037},
+ { 138,45944,41259,41259,56059,41249,36789,56064,56068,56080},
+ { 139,50061,56090,56090,56094,56102,37019,56113,56117,56132},
+ { 145,48582,56154,56154,56158,56158,0,53908,53912,56172},
+ { 42,46120,56190,56190,56194,56204,36793,56236,56240,56257},
+ { 141,44062,56292,56292,56296,56306,36568,56314,56318,56335},
+ { 147,48240,56341,56341,56345,56356,36092,53070,53074,53074},
+ { 140,44010,56366,56366,56370,56377,36528,56385,56389,56402},
+ { 148,48123,56416,56416,56420,56426,36899,56437,56441,56454},
+ { 159,48786,41028,41028,56474,56482,36923,56495,56499,56515},
+ { 158,48911,56535,56535,56539,56539,36092,53070,53074,53446},
+ { 270,50003,56546,56546,56550,56561,36092,53070,53074,56579},
+ { 19618,44491,56584,56584,56588,56598,0,56584,56619,56636},
+ { 151,48522,56668,56668,56672,56688,0,56716,56720,56736},
+ { 163,44891,39895,39895,56746,56746,36092,53070,53074,56752},
+ { 166,47064,56757,56757,56761,56768,36197,56776,56780,56793},
+ { 167,44996,56807,56807,56811,56811,36631,56820,56824,56842},
+ { 175,46408,56859,56859,56863,56871,36828,56880,56884,56899},
+ { 182,50919,56905,56905,56909,56909,37080,56919,56923,56943},
+ { 176,43024,38095,38095,56966,56978,36092,53070,53074,53074},
+ { 177,43082,38144,38144,56988,56995,36145,57001,57005,57021},
+ { 178,46240,57035,57035,57039,57045,36808,57061,57065,0},
+ { 183,48617,57080,57080,57084,57084,36197,57096,57100,57100},
+ { 164,49332,57119,57119,57123,57128,36956,57139,57143,57154},
+ { 192,48863,40380,40380,57174,57181,36933,57189,57193,57211},
+ { 187,49726,57228,57228,57232,57237,36997,57243,57247,57266},
+ { 201,46354,57284,57284,57288,57300,36824,57310,57314,57314},
+ { 190,43668,57330,57330,57334,57343,36473,57358,57362,57378},
+ { 191,43123,57406,57406,57410,57417,36304,57424,57428,57441},
+ { 202,50977,57455,57455,57459,57459,36197,54459,54463,54473},
+ { 193,47331,57471,57471,57475,57475,36092,53070,53074,53074},
+ { 185,50597,57484,57484,57488,57488,37059,57497,57501,57520},
+ { 197,50649,57539,57539,57543,57549,37063,57556,57560,57572},
+ { 200,43267,57590,57590,57594,57602,0,57611,57615,57628},
+ { 271,49595,51359,51359,57642,57649,36982,57662,57666,57680},
+ { 203,43323,38383,38383,57693,57700,36373,57713,57717,57731},
+ { 204,46777,57763,57763,57767,57767,36832,57774,57778,0},
+ { 205,13368,57792,57792,57796,57809,36022,57856,57860,57872},
+ { 221,43524,57892,57892,57896,57903,36145,57911,57915,57929},
+ { 215,48187,57942,57942,57946,57956,0,57966,57970,57987},
+ { 212,43922,58000,58000,58004,58013,36092,53070,53074,58023},
+ { 143,43433,58028,58028,58032,58041,36092,53070,53074,53074},
+ { 72,50783,39008,39008,58062,58062,37076,54459,54463,54473},
+ { 222,49651,58074,58074,58078,58084,36987,58095,58099,58112},
+ { 227,43571,38614,38614,58132,38604,36466,58141,58145,58155},
+ { 228,44105,58174,58174,58178,0,36634,58189,58193,58212},
+ { 234,49107,58225,58225,58229,58237,36940,58246,58250,58265},
+ { 235,43617,58286,58286,58290,58297,36470,58306,58310,58323},
+ { 225,49870,58337,58337,58341,58341,36197,58361,58365,58365},
+ { 237,42346,58392,58392,58396,58403,36835,58410,58414,58432},
+ { 241,43796,38842,38842,58442,58450,36481,58465,58469,58487},
+ { 244,42594,58521,58521,58525,58525,36197,54459,54463,54463},
+ { 246,50483,58539,58539,58543,58543,36197,58551,58555,58570},
+ { 247,45179,40242,40242,58584,58595,36854,58616,58620,58635},
+ { 249,49417,58654,58654,58658,58658,36966,58668,58672,58692},
+ { 251,44211,58712,58712,58716,58724,36598,58735,58739,58755},
+ { 261,49473,58763,58763,58767,58773,36972,58784,58788,58800},
+ { 209,44522,58818,58818,58822,0,10573,58835,58839,0},
+ { 264,50093,58858,58858,58862,58862,36197,54459,54463,54463}
};
static const RegionInfoNameEntry region_name_entries [] = {
- {49820, 0}, /* AE */
- {45687, 1}, /* AF */
- {42867, 2}, /* AL */
- {3781, 3}, /* AM */
- {49311, 4}, /* AR */
- {47264, 5}, /* AT */
- {47297, 6}, /* AU */
- {43762, 7}, /* AZ */
- {48415, 8}, /* BA */
- {47023, 9}, /* BD */
- {46502, 10}, /* BE */
- {41639, 11}, /* BG */
- {49932, 12}, /* BH */
- {46906, 13}, /* BN */
- {50112, 14}, /* BO */
- {42559, 15}, /* BR */
- {43253, 16}, /* BY */
- {49068, 17}, /* BZ */
- {47390, 18}, /* CA */
- {13261, 19}, /* CH */
- {49713, 20}, /* CL */
- {13340, 21}, /* CN */
- {48912, 22}, /* CO */
- {48060, 23}, /* CR */
- {41802, 24}, /* CZ */
- {41892, 25}, /* DE */
- {41844, 26}, /* DK */
- {48602, 27}, /* DO */
- {47820, 28}, /* DZ */
- {49530, 29}, /* EC */
- {43351, 30}, /* EE */
- {47119, 31}, /* EG */
- {41682, 32}, /* ES */
- {45566, 33}, /* ET */
- {42022, 34}, /* FI */
- {44182, 35}, /* FO */
- {42066, 36}, /* FR */
- {45211, 37}, /* GB */
- {44128, 38}, /* GE */
- {45965, 39}, /* GL */
- {41948, 40}, /* GR */
- {47708, 41}, /* GT */
- {47212, 42}, /* HK */
- {50252, 43}, /* HN */
- {42758, 44}, /* HR */
- {42167, 45}, /* HU */
- {43116, 46}, /* ID */
- {46855, 47}, /* IE */
- {42115, 48}, /* IL */
- {44239, 49}, /* IN */
- {46296, 50}, /* IQ */
- {43540, 51}, /* IR */
- {42216, 52}, /* IS */
- {42259, 53}, /* IT */
- {48750, 54}, /* JM */
- {49214, 55}, /* JO */
- {42304, 56}, /* JP */
- {44492, 57}, /* KE */
- {44449, 58}, /* KG */
- {45289, 59}, /* KH */
- {42359, 60}, /* KR */
- {49635, 61}, /* KW */
- {45331, 62}, /* LA */
- {49448, 63}, /* LB */
- {47969, 64}, /* LI */
- {45507, 65}, /* LK */
- {43449, 66}, /* LT */
- {47627, 67}, /* LU */
- {43397, 68}, /* LV */
- {47510, 69}, /* LY */
- {48173, 70}, /* MA */
- {48298, 71}, /* MC */
- {49390, 72}, /* ME */
- {43878, 73}, /* MK */
- {47909, 74}, /* MO */
- {44278, 75}, /* MT */
- {46451, 76}, /* MX */
- {44383, 77}, /* MY */
- {45795, 78}, /* NG */
- {50306, 79}, /* NI */
- {42411, 80}, /* NL */
- {42469, 81}, /* NO */
- {45627, 82}, /* NP */
- {48004, 83}, /* NZ */
- {48719, 84}, /* OM */
- {48250, 85}, /* PA */
- {49113, 86}, /* PE */
- {45741, 87}, /* PH */
- {43055, 88}, /* PK */
- {42510, 89}, /* PL */
- {50364, 90}, /* PR */
- {46718, 91}, /* PT */
- {49984, 92}, /* PY */
- {50036, 93}, /* QA */
- {42654, 94}, /* RO */
- {48982, 95}, /* RS */
- {42710, 96}, /* RU */
- {46164, 97}, /* RW */
- {13258, 98}, /* SA */
- {42911, 99}, /* SE */
- {47574, 100}, /* SG */
- {43309, 101}, /* SI */
- {42820, 102}, /* SK */
- {50170, 103}, /* SV */
- {49038, 104}, /* SY */
- {42958, 105}, /* TH */
- {43492, 106}, /* TJ */
- {48494, 107}, /* TN */
- {43004, 108}, /* TR */
- {49257, 109}, /* TT */
- {41733, 110}, /* TW */
- {43183, 111}, /* UA */
- {41981, 112}, /* US */
- {49870, 113}, /* UY */
- {44566, 114}, /* UZ */
- {48804, 115}, /* VE */
- {43598, 116}, /* VN */
- {48860, 117}, /* YE */
- {43909, 118}, /* ZA */
- {49480, 119} /* ZW */
+ {50433, 0}, /* AE */
+ {46300, 1}, /* AF */
+ {43480, 2}, /* AL */
+ {3824, 3}, /* AM */
+ {49924, 4}, /* AR */
+ {47877, 5}, /* AT */
+ {47910, 6}, /* AU */
+ {44375, 7}, /* AZ */
+ {49028, 8}, /* BA */
+ {47636, 9}, /* BD */
+ {47115, 10}, /* BE */
+ {42252, 11}, /* BG */
+ {50545, 12}, /* BH */
+ {47519, 13}, /* BN */
+ {50725, 14}, /* BO */
+ {43172, 15}, /* BR */
+ {43866, 16}, /* BY */
+ {49681, 17}, /* BZ */
+ {48003, 18}, /* CA */
+ {13371, 19}, /* CH */
+ {50326, 20}, /* CL */
+ {13450, 21}, /* CN */
+ {49525, 22}, /* CO */
+ {48673, 23}, /* CR */
+ {42415, 24}, /* CZ */
+ {42505, 25}, /* DE */
+ {42457, 26}, /* DK */
+ {49215, 27}, /* DO */
+ {48433, 28}, /* DZ */
+ {50143, 29}, /* EC */
+ {43964, 30}, /* EE */
+ {47732, 31}, /* EG */
+ {42295, 32}, /* ES */
+ {46179, 33}, /* ET */
+ {42635, 34}, /* FI */
+ {44795, 35}, /* FO */
+ {42679, 36}, /* FR */
+ {45824, 37}, /* GB */
+ {44741, 38}, /* GE */
+ {46578, 39}, /* GL */
+ {42561, 40}, /* GR */
+ {48321, 41}, /* GT */
+ {47825, 42}, /* HK */
+ {50865, 43}, /* HN */
+ {43371, 44}, /* HR */
+ {42780, 45}, /* HU */
+ {43729, 46}, /* ID */
+ {47468, 47}, /* IE */
+ {42728, 48}, /* IL */
+ {44852, 49}, /* IN */
+ {46909, 50}, /* IQ */
+ {44153, 51}, /* IR */
+ {42829, 52}, /* IS */
+ {42872, 53}, /* IT */
+ {49363, 54}, /* JM */
+ {49827, 55}, /* JO */
+ {42917, 56}, /* JP */
+ {45105, 57}, /* KE */
+ {45062, 58}, /* KG */
+ {45902, 59}, /* KH */
+ {42972, 60}, /* KR */
+ {50248, 61}, /* KW */
+ {45944, 62}, /* LA */
+ {50061, 63}, /* LB */
+ {48582, 64}, /* LI */
+ {46120, 65}, /* LK */
+ {44062, 66}, /* LT */
+ {48240, 67}, /* LU */
+ {44010, 68}, /* LV */
+ {48123, 69}, /* LY */
+ {48786, 70}, /* MA */
+ {48911, 71}, /* MC */
+ {50003, 72}, /* ME */
+ {44491, 73}, /* MK */
+ {48522, 74}, /* MO */
+ {44891, 75}, /* MT */
+ {47064, 76}, /* MX */
+ {44996, 77}, /* MY */
+ {46408, 78}, /* NG */
+ {50919, 79}, /* NI */
+ {43024, 80}, /* NL */
+ {43082, 81}, /* NO */
+ {46240, 82}, /* NP */
+ {48617, 83}, /* NZ */
+ {49332, 84}, /* OM */
+ {48863, 85}, /* PA */
+ {49726, 86}, /* PE */
+ {46354, 87}, /* PH */
+ {43668, 88}, /* PK */
+ {43123, 89}, /* PL */
+ {50977, 90}, /* PR */
+ {47331, 91}, /* PT */
+ {50597, 92}, /* PY */
+ {50649, 93}, /* QA */
+ {43267, 94}, /* RO */
+ {49595, 95}, /* RS */
+ {43323, 96}, /* RU */
+ {46777, 97}, /* RW */
+ {13368, 98}, /* SA */
+ {43524, 99}, /* SE */
+ {48187, 100}, /* SG */
+ {43922, 101}, /* SI */
+ {43433, 102}, /* SK */
+ {50783, 103}, /* SV */
+ {49651, 104}, /* SY */
+ {43571, 105}, /* TH */
+ {44105, 106}, /* TJ */
+ {49107, 107}, /* TN */
+ {43617, 108}, /* TR */
+ {49870, 109}, /* TT */
+ {42346, 110}, /* TW */
+ {43796, 111}, /* UA */
+ {42594, 112}, /* US */
+ {50483, 113}, /* UY */
+ {45179, 114}, /* UZ */
+ {49417, 115}, /* VE */
+ {44211, 116}, /* VN */
+ {49473, 117}, /* YE */
+ {44522, 118}, /* ZA */
+ {50093, 119} /* ZW */
};
@@ -1432,9 +1432,10 @@ static const char locale_strings [] = {
"HH:mm:ss\0"
"dd MMMM yyyy '\xd0\xb3.'\0"
"d.M.yyyy '\xd0\xb3.'\0"
- "HH:mm:ss '\xd1\x87.'\0"
- "HH:mm '\xd1\x87.'\0"
+ "H:mm:ss\0"
+ "H:mm\0"
"MMMM yyyy '\xd0\xb3.'\0"
+ "d MMMM\0"
"\xd0\xbf\xd1\x80. \xd0\xbe\xd0\xb1.\0"
"\xd1\x81\xd0\xbb. \xd0\xbe\xd0\xb1.\0"
"\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbb\xd1\x8f\0"
@@ -1483,10 +1484,12 @@ static const char locale_strings [] = {
"d MMMM yyyy '\xd0\xb3.'\0"
"dddd, dd MMMM yyyy '\xd0\xb3.'\0"
"dddd, d MMMM yyyy '\xd0\xb3.'\0"
+ "HH:mm '\xd1\x87.'\0"
"H:mm '\xd1\x87.'\0"
+ "HH:mm:ss '\xd1\x87.'\0"
"H:mm:ss '\xd1\x87.'\0"
- "dddd, d' / 'MMMM' / 'yyyy\0"
- "MMMM' / 'yyyy\0"
+ "dddd, d MMMM' de 'yyyy\0"
+ "MMMM' de 'yyyy\0"
"a.m.\0"
"p.m.\0"
"diumenge\0"
@@ -1548,11 +1551,10 @@ static const char locale_strings [] = {
"d/M/yy\0"
"dd-MM-yy\0"
"dd.MM.yy\0"
+ "dddd, d' / 'MMMM' / 'yyyy\0"
"d'/'MMMM'/'yyyy\0"
"d' 'MMMM' 'yyyy\0"
- "H:mm\0"
"HH'H'mm'\\''\0"
- "H:mm:ss\0"
"HH'H'mm'\\''ss'\\'\\''\0"
"yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0"
"yyyy/M/d\0"
@@ -1620,8 +1622,9 @@ static const char locale_strings [] = {
"tt h:mm:ss\0"
"tt hh:mm:ss\0"
"d. MMMM yyyy\0"
- "d.M.yyyy\0"
+ "d. M. yyyy\0"
"MMMM yyyy\0"
+ "d. MMMM\0"
"dop.\0"
"odp.\0"
"ned\xc4\x9ble\0"
@@ -1678,13 +1681,14 @@ static const char locale_strings [] = {
"10.\0"
"11.\0"
"12.\0"
+ ". \0"
+ "d.M.yyyy\0"
"d-M-yy\0"
"h.mm tt\0"
"H.mm\0"
"h.mm.ss tt\0"
"H.mm.ss\0"
"dd-MM-yyyy\0"
- "d. MMMM\0"
"f.m.\0"
"e.m.\0"
"s\xc3\xb8ndag\0"
@@ -1845,9 +1849,9 @@ static const char locale_strings [] = {
"\xce\x94\xce\xb5\xce\xba\0"
"dd/MMM/yyyy\0"
"d MMMM yyyy\0"
- "dddd, MMMM dd, yyyy\0"
+ "dddd, MMMM d, yyyy\0"
"M/d/yyyy\0"
- "MMMM dd\0"
+ "MMMM d\0"
"AM\0"
"PM\0"
"Sunday\0"
@@ -1880,10 +1884,11 @@ static const char locale_strings [] = {
"MM/dd/yy\0"
"MM/dd/yyyy\0"
"dd-MMM-yy\0"
+ "dddd, MMMM dd, yyyy\0"
"MMMM dd, yyyy\0"
"dd MMMM, yyyy\0"
- "dddd, dd' de 'MMMM' de 'yyyy\0"
- "MMMM' de 'yyyy\0"
+ "dddd, d' de 'MMMM' de 'yyyy\0"
+ "d' de 'MMMM\0"
"domingo\0"
"lunes\0"
"martes\0"
@@ -1915,10 +1920,10 @@ static const char locale_strings [] = {
"ago\0"
"oct\0"
"dic\0"
+ "dddd, dd' de 'MMMM' de 'yyyy\0"
"dddd d' de 'MMMM' de 'yyyy\0"
"d' de 'MMMM' de 'yyyy\0"
- "d. MMMM'ta 'yyyy\0"
- "d. MMMM'ta'\0"
+ "d'.' MMMM\0"
"ap.\0"
"ip.\0"
"sunnuntaina\0"
@@ -1972,9 +1977,9 @@ static const char locale_strings [] = {
"loka\0"
"marras\0"
"joulu\0"
+ "d. MMMM'ta 'yyyy\0"
"dd. MMMM'ta 'yyyy\0"
"dddd d MMMM yyyy\0"
- "d MMMM\0"
"dimanche\0"
"lundi\0"
"mardi\0"
@@ -2332,8 +2337,6 @@ static const char locale_strings [] = {
"pa\xc5\xba\0"
"lis\0"
"gru\0"
- "dddd, d' de 'MMMM' de 'yyyy\0"
- "dd' de 'MMMM\0"
"segunda-feira\0"
"ter\xc3\xa7\x61-feira\0"
"quarta-feira\0"
@@ -2358,6 +2361,7 @@ static const char locale_strings [] = {
"fev\0"
"out\0"
"dez\0"
+ "dddd, 'ils\xe2\x80\x99' d. MMMM, yyyy\0"
"am\0"
"sm\0"
"dumengia\0"
@@ -2537,7 +2541,6 @@ static const char locale_strings [] = {
"dd. MM. yy.\0"
"dd. MMMM yyyy.\0"
"dddd, d. MMMM yyyy.\0"
- "d. M. yyyy\0"
"dopoludnia\0"
"popoludn\xc3\xad\0"
"nede\xc4\xbe\x61\0"
@@ -2564,11 +2567,7 @@ static const char locale_strings [] = {
"okt\xc3\xb3\x62ra\0"
"novembra\0"
"decembra\0"
- ". \0"
"d. M. yy\0"
- "h:mm:ss.tt\0"
- "h:mm.tt\0"
- "yyyy-MM\0"
"PD\0"
"MD\0"
"e diel\0"
@@ -2604,6 +2603,8 @@ static const char locale_strings [] = {
"Tet\0"
"N\xc3\xabn\0"
"Dhj\0"
+ "h:mm.tt\0"
+ "h:mm:ss.tt\0"
"'den 'd MMMM yyyy\0"
"'den 'd MMMM\0"
"FM\0"
@@ -2624,7 +2625,7 @@ static const char locale_strings [] = {
"dd MMM yyyy\0"
"ddd d MMMM yyyy\0"
"'\xe0\xb8\xa7\xe0\xb8\xb1\xe0\xb8\x99'dddd'\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb9\x88' d MMMM gg yyyy\0"
- "dd MMMM yyyy dddd\0"
+ "d MMMM yyyy dddd\0"
"Pazar\0"
"Pazartesi\0"
"Sal\xc4\xb1\0"
@@ -2662,6 +2663,7 @@ static const char locale_strings [] = {
"Eki\0"
"Kas\0"
"Ara\0"
+ "dd MMMM yyyy dddd\0"
"\xd8\xaf\xd9\x86\0"
"\xd8\xb1\xd8\xa7\xd8\xaa\0"
"\xd8\xa7\xd8\xaa\xd9\x88\xd8\xa7\xd8\xb1\0"
@@ -2805,9 +2807,8 @@ static const char locale_strings [] = {
"avgust\0"
"avg\0"
"dd. MM. yy\0"
- "d. MMMM yyyy'. a.'\0"
"d.MM.yyyy\0"
- "MMMM yyyy'. a.'\0"
+ "dd. MMMM\0"
"e.k.\0"
"p.k.\0"
"p\xc3\xbchap\xc3\xa4\x65v\0"
@@ -2829,8 +2830,10 @@ static const char locale_strings [] = {
"veebr\0"
"sept\0"
"dets\0"
+ "d. MMMM yyyy'. a.'\0"
"dd. MMMM yyyy'. a.'\0"
"dddd, yyyy'. gada 'd. MMMM\0"
+ "yyyy'. gada 'MMMM\0"
"priek\xc5\xa1pusdien\xc4\x81\0"
"p\xc4\x93\x63pusdien\xc4\x81\0"
"sv\xc4\x93tdiena\0"
@@ -2914,6 +2917,7 @@ static const char locale_strings [] = {
"Spal.\0"
"Lapkr.\0"
"Gruod.\0"
+ "d MMMM yyyy' \xd1\x81.'\0"
"\xd0\xbf\xd0\xb5. \xd1\x87\xd0\xbe.\0"
"\xd0\xbf\xd0\xb0. \xd1\x87\xd0\xbe.\0"
"\xd0\xaf\xd0\xba\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0"
@@ -2948,6 +2952,7 @@ static const char locale_strings [] = {
"\xd0\x9e\xd0\xba\xd1\x82\0"
"\xd0\x9d\xd0\xbe\xd1\x8f\0"
"\xd0\x94\xd0\xb5\xd0\xba\0"
+ "dddd, dd MMMM yyyy\0"
"\xd9\x82\xd8\xa8\xd9\x84\xe2\x80\x8c\xd8\xa7\xd8\xb2\xd8\xb8\xd9\x87\xd8\xb1\0"
"\xd8\xa8\xd8\xb9\xd8\xaf\xd8\xa7\xd8\xb2\xd8\xb8\xd9\x87\xd8\xb1\0"
"\xdb\x8c\xda\xa9\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0"
@@ -3069,11 +3074,11 @@ static const char locale_strings [] = {
"\xd4\xb4\xd5\xa5\xd5\xaf\0"
"d/MM/yyyy\0"
"d/MMM/yyyy\0"
- "dddd, dd MMMM yyyy\0"
"d-MMM-yyyy\0"
"dd-MMM-yyyy\0"
"ddd, d-MMMM-yyyy\0"
"ddd, dd-MMMM-yyyy\0"
+ "dd MMMM yyyy'-c\xc3\xbc il'\0"
"bazar\0"
"bazar ert\xc9\x99si\0"
"\xc3\xa7\xc9\x99r\xc5\x9f\xc9\x99nb\xc9\x99 ax\xc5\x9f\x61m\xc4\xb1\0"
@@ -3105,8 +3110,9 @@ static const char locale_strings [] = {
"sen\0"
"noy\0"
"dek\0"
- "dddd, yyyy.'eko' MMMM'k 'd\0"
- "yyyy.'eko' MMMM\0"
+ "dddd, yyyy'(e)ko' MMMM'ren' d'a'\0"
+ "yyyy'(e)ko' MMMM\0"
+ "MMMM'ren' d'a'\0"
"igandea\0"
"astelehena\0"
"asteartea\0"
@@ -3144,6 +3150,7 @@ static const char locale_strings [] = {
"urr\0"
"aza\0"
"abe\0"
+ "dddd, yyyy.'eko' MMMM'k 'd\0"
"\xd0\xbf\xd1\x80\xd0\xb5\xd1\x82\xd0\xbf\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xbd\xd0\xb5\0"
"\xd0\xbf\xd0\xbe\xd0\xbf\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xbd\xd0\xb5\0"
"\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\0"
@@ -3277,8 +3284,7 @@ static const char locale_strings [] = {
"Julie\0"
"Augustus\0"
"yyyy/MMM/dd\0"
- "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' dd MM, dddd\0"
- "dd MM\0"
+ "dddd, d MMMM, yyyy '\xe1\x83\xac\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x98'\0"
"\xe1\x83\x93\xe1\x83\x98\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1\0"
"\xe1\x83\xa1\xe1\x83\x90\xe1\x83\xa6\xe1\x83\x90\xe1\x83\x9b\xe1\x83\x9d\xe1\x83\xa1\0"
"\xe1\x83\x99\xe1\x83\x95\xe1\x83\x98\xe1\x83\xa0\xe1\x83\x90\0"
@@ -3325,6 +3331,7 @@ static const char locale_strings [] = {
"\xe1\x83\x9d\xe1\x83\xa5\xe1\x83\xa2\0"
"\xe1\x83\x9c\xe1\x83\x9d\xe1\x83\x94\0"
"\xe1\x83\x93\xe1\x83\x94\xe1\x83\x99\0"
+ "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' dd MM, dddd\0"
"f.p.\0"
"s.p.\0"
"m\xc3\xa1nadagur\0"
@@ -3414,8 +3421,8 @@ static const char locale_strings [] = {
"Di\xc4\x8b\0"
"ddMMyyyy\0"
"d' ta\\' 'MMMM yyyy\0"
- "MMMM d'. b. 'yyyy\0"
- "MMMM d'. b. '\0"
+ "dddd, MMMM d'. b. 'yyyy\0"
+ "MMMM d'. b.'\0"
"i.b.\0"
"e.b.\0"
"sotnabeaivi\0"
@@ -3456,6 +3463,7 @@ static const char locale_strings [] = {
"golg\0"
"sk\xc3\xa1\x62\0"
"juov\0"
+ "MMMM d'. b. 'yyyy\0"
"D\xc3\xa9 Domhnaigh\0"
"D\xc3\xa9 Luain\0"
"D\xc3\xa9 M\xc3\xa1irt\0"
@@ -3546,8 +3554,12 @@ static const char locale_strings [] = {
"\xd2\x9b\xd0\xb0\xd1\x80.\0"
"\xd0\xb6\xd0\xb5\xd0\xbb\xd1\x82.\0"
"dd MMMM yyyy '\xd0\xb6.'\0"
- "d'-'MMMM yyyy'-\xd0\xb6.'\0"
+ "dd'-'MMMM yyyy'-\xd0\xb6.'\0"
+ "d-MMM yy\0"
"MMMM yyyy'-\xd0\xb6.'\0"
+ "d'-'MMMM\0"
+ "d'-'MMMM yyyy'-\xd0\xb6.'\0"
+ "MMMM dd\0"
"asubuhi\0"
"alasiri\0"
"Jumapili\0"
@@ -3571,7 +3583,6 @@ static const char locale_strings [] = {
"Desemba\0"
"Ago\0"
"yyyy 'yil' d-MMMM\0"
- "dd/MM yyyy\0"
"d-MMMM\0"
"\xd1\x8f\xd0\xba\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0"
"\xd0\xb4\xd1\x83\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0"
@@ -3591,6 +3602,7 @@ static const char locale_strings [] = {
"\xd0\x94\0"
"\xd0\x96\0"
"\xd0\xa8\0"
+ "dd/MM yyyy\0"
"\xe0\xa6\xaa\xe0\xa7\x82\xe0\xa6\xb0\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0"
"\xe0\xa6\x85\xe0\xa6\xaa\xe0\xa6\xb0\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0"
"\xe0\xa6\xb0\xe0\xa6\xac\xe0\xa6\xbf\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0"
@@ -3949,9 +3961,8 @@ static const char locale_strings [] = {
"\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x87\xe0\xa4\x82\0"
"\xe0\xa4\xa8\xe0\xa5\x8b\xe0\xa4\xb5\xe0\xa5\x8d\xe0\xa4\xb9\xe0\xa5\x87\xe0\xa4\x82\0"
"\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\x82\0"
- "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MMMM d\0"
- "yy.MM.dd\0"
- "yyyy '\xd0\xbe\xd0\xbd' MMMM\0"
+ "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' M'-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\xd1\x8b\xd0\xbd' d. dddd '\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd0\xb3'.\0"
+ "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MMMM\0"
"\xd0\xbd\xd1\x8f\xd0\xbc\0"
"\xd0\xb4\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xb0\0"
"\xd0\xbc\xd1\x8f\xd0\xb3\xd0\xbc\xd0\xb0\xd1\x80\0"
@@ -3990,9 +4001,11 @@ static const char locale_strings [] = {
"\xd1\x82\xd0\xb0\xd1\x85\0"
"\xd0\xbd\xd0\xbe\xd1\x85\0"
"\xd0\xb3\xd0\xb0\xd1\x85\0"
+ "yy.MM.dd\0"
+ "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MMMM d\0"
"yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3' M'\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6' d\0"
- "yyyy.M\0"
- "'\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b' M'\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6'd\0"
+ "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b' M\0"
+ "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8bM\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6\xe0\xbc\x8b\x64\0"
"\xe0\xbd\xa6\xe0\xbe\x94\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xbc\xe0\xbc\x8b\0"
"\xe0\xbd\x95\xe0\xbe\xb1\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xbc\xe0\xbc\x8b\0"
"\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\x89\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x98\xe0\xbc\x8b\0"
@@ -4075,9 +4088,7 @@ static const char locale_strings [] = {
"Hyd\0"
"Tach\0"
"Rhag\0"
- "H:mm tt\0"
"'\xe1\x9e\x81\xe1\x9f\x82' MM '\xe1\x9e\x86\xe1\x9f\x92\xe1\x9e\x93\xe1\x9e\xb6\xe1\x9f\x86' yyyy\0"
- "'\xe1\x9e\x90\xe1\x9f\x92\xe1\x9e\x84\xe1\x9f\x83\xe1\x9e\x91\xe1\x9e\xb8' dd '\xe1\x9e\x81\xe1\x9f\x82' MM\0"
"\xe1\x9e\x96\xe1\x9f\x92\xe1\x9e\x9a\xe1\x9e\xb9\xe1\x9e\x80\0"
"\xe1\x9e\x9b\xe1\x9f\x92\xe1\x9e\x84\xe1\x9e\xb6\xe1\x9e\x85\0"
"\xe1\x9e\x90\xe1\x9f\x92\xe1\x9e\x84\xe1\x9f\x83\xe1\x9e\xa2\xe1\x9e\xb6\xe1\x9e\x91\xe1\x9e\xb7\xe1\x9e\x8f\xe1\x9f\x92\xe1\x9e\x99\0"
@@ -4118,6 +4129,7 @@ static const char locale_strings [] = {
"\xe1\x9f\xa1\xe1\x9f\xa0\0"
"\xe1\x9f\xa1\xe1\x9f\xa1\0"
"\xe1\x9f\xa1\xe1\x9f\xa2\0"
+ "H:mm tt\0"
"\xe0\xba\x81\xe0\xbb\x88\xe0\xba\xad\xe0\xba\x99\xe0\xba\x97\xe0\xbb\x88\xe0\xba\xbd\xe0\xba\x87\0"
"\xe0\xba\xab\xe0\xba\xa5\xe0\xba\xb1\xe0\xba\x87\xe0\xba\x97\xe0\xbb\x88\xe0\xba\xbd\xe0\xba\x87\0"
"\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\xad\xe0\xba\xb2\xe0\xba\x97\xe0\xba\xb4\xe0\xba\x94\0"
@@ -4239,7 +4251,7 @@ static const char locale_strings [] = {
"\xe0\xb6\xb1\xe0\xb7\x9c\xe0\xb7\x80\xe0\xb7\x90\0"
"\xe0\xb6\xaf\xe0\xb7\x99\xe0\xb7\x83\xe0\xb7\x90\0"
"dddd '\xe1\x8d\xa3' MMMM d '\xe1\x89\x80\xe1\x8a\x95' yyyy\0"
- "MMMM d \xe1\x89\x80\xe1\x8a\x95\0"
+ "MMMM d' \xe1\x89\x80\xe1\x8a\x95'\0"
"\xe1\x8c\xa1\xe1\x8b\x8b\xe1\x89\xb5\0"
"\xe1\x8a\xa8\xe1\x88\xb3\xe1\x8b\x93\xe1\x89\xb5\0"
"\xe1\x8a\xa5\xe1\x88\x91\xe1\x8b\xb5\0"
@@ -4352,6 +4364,7 @@ static const char locale_strings [] = {
"\xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\0"
"\xe0\xa4\xa8\xe0\xa5\x8b\xe0\xa4\xad\xe0\xa5\x87\0"
"\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x87\0"
+ "yyyy, dd, MMMM, dddd\0"
"\xd9\x88\xd8\xb1\xdb\x8c\0"
"\xd8\xba\xd9\x88\xdb\x8c\xdb\x8c\0"
"\xd8\xba\xd8\xa8\xd8\xb1\xda\xab\xd9\x88\xd9\x84\xdb\x8c\0"
@@ -4365,6 +4378,7 @@ static const char locale_strings [] = {
"\xd8\xb3\xd9\x84\xd9\x88\xd8\xa7\xd8\xba\xd9\x87\0"
"\xda\xa9\xd8\xa8\0"
"dd/MM/yyyy '\xd9\x87\xd9\x80'\0"
+ "MM/dd\0"
"Linggo\0"
"Lunes\0"
"Miyerkules\0"
@@ -4474,6 +4488,8 @@ static const char locale_strings [] = {
"Disemere\0"
"Apo\0"
"Nof\0"
+ "MMMM d'.-at, 'yyyy\0"
+ "MMMM d'.-at'\0"
"u.t.\0"
"u.k.\0"
"sabaat\0"
@@ -4527,7 +4543,7 @@ static const char locale_strings [] = {
"\xe1\xbb\x8ckt\0"
"yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d'\0"
"yyyy'\xea\x88\x8e' M'\xea\x86\xaa'\0"
- "M'\xea\x86\xaa' d'\xea\x91\x8d'\0"
+ "M'\xe2\x80\x99 \xea\x86\xaa\xe2\x80\x99'd'\xe2\x80\x99 \xea\x91\x8d\xe2\x80\x99'\0"
"\xea\x8e\xb8\xea\x84\x91\0"
"\xea\x81\xaf\xea\x8b\x92\0"
"\xea\x91\xad\xea\x86\x8f\xea\x91\x8d\0"
@@ -4598,7 +4614,7 @@ static const char locale_strings [] = {
"Goue\0"
"Gwen\0"
"Ker\0"
- "dddd,' lo 'd MMMM' de 'yyyy\0"
+ "dddd d MMMM' de 'yyyy\0"
"Dimenge\0"
"diluns\0"
"dimar\xc3\xa7\0"
@@ -4611,6 +4627,7 @@ static const char locale_strings [] = {
"julhet\0"
"oct\xc3\xb2\x62re\0"
"dezembre\0"
+ "dddd,' lo 'd MMMM' de 'yyyy\0"
"v.m.\0"
"n.m.\0"
"Sunntig\0"
@@ -4632,9 +4649,9 @@ static const char locale_strings [] = {
"Oktoober\0"
"Nov\xc3\xa4mber\0"
"Dez\xc3\xa4mber\0"
- "MMMM d yyyy '\xd1\x81.'\0"
- "MM.dd.yyyy\0"
- "MMMM yyyy '\xd1\x81.'\0"
+ "dddd, yyyy '\xd1\x81.' MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0"
+ "yyyy '\xd1\x81.' MMMM\0"
+ "MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0"
"\xd0\xad\xd0\x98\0"
"\xd0\xad\xd0\x9a\0"
"\xd0\x91\xd0\xb0\xd1\x81\xd0\xba\xd1\x8b\xd2\xbb\xd1\x8b\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8c\xd0\xb0\0"
@@ -4676,9 +4693,12 @@ static const char locale_strings [] = {
"\xd0\x90\xd0\xbb\xd1\x82\0"
"\xd0\xa1\xd1\x8d\xd1\x82\0"
"\xd0\x90\xd1\x85\xd1\x81\0"
+ "MM.dd.yyyy\0"
"MM.dd.yy\0"
"MM-dd-yyyy\0"
+ "MMMM d yyyy '\xd1\x81.'\0"
"MMMM dd yyyy '\xd1\x81.'\0"
+ "d ' ' MMMM ' ' yyyy\0"
"Ku cyumweru\0"
"Kuwa mbere\0"
"Kuwa kabiri\0"
@@ -4788,7 +4808,6 @@ static const char locale_strings [] = {
"tysdag\0"
"laurdag\0"
"tys\0"
- "d/M\0"
"Segunda-feira\0"
"Ter\xc3\xa7\x61-feira\0"
"Quarta-feira\0"
@@ -4820,9 +4839,10 @@ static const char locale_strings [] = {
"\xd0\xbd\xd0\xbe\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0"
"\xd0\xb4\xd0\xb5\xd0\xba\xd0\xb0\xd0\xb1\xd1\x80\0"
"yyyy '\xd0\xb9\xd0\xb8\xd0\xbb' d-MMMM\0"
+ "yyyy\xe1\xa0\xa3\xe1\xa0\xa8 MMMM d\xe1\xa0\xa1\xe1\xa0\xb3\xe1\xa0\xa6\xe1\xa0\xb7\xe1\xa0\x82 dddd\0"
+ "yyyy\xe1\xa0\xa3\xe1\xa0\xa8 MMMM\0"
+ "MMMM d\xe1\xa0\xa1\xe1\xa0\xb3\xe1\xa0\xa6\xe1\xa0\xb7\0"
"yyyy'\xe1\xa0\xa3\xe1\xa0\xa8 \xe1\xa0\xa4\xe1\xa0\x8b' M'\xe1\xa0\xb0\xe1\xa0\xa0\xe1\xa0\xb7\xe1\xa0\x8e\xe1\xa0\xa0 \xe2\x80\xaf\xe1\xa0\xa2\xe1\xa0\xa2\xe1\xa0\xa8 'd' \xe1\xa0\xa4\xe1\xa0\x8b \xe1\xa0\xa1\xe1\xa0\xb3\xe1\xa0\xa6\xe1\xa0\xb7'\0"
- "yyyy'\xe1\xa0\xa3\xe1\xa0\xa8' M'\xe1\xa0\xb0\xe1\xa0\xa0\xe1\xa0\xb7\xe1\xa0\x8e\xe1\xa0\xa0'\0"
- "M'\xe1\xa0\xb0\xe1\xa0\xa0\xe1\xa0\xb7\xe1\xa0\x8e\xe1\xa0\xa0' d'\xe1\xa0\xa1\xe1\xa0\xb3\xe1\xa0\xa6\xe1\xa0\xb7'\0"
"yyyy'\xe1\xa0\xa3\xe1\xa0\xa8 \xe1\xa0\xa4\xe1\xa0\x8b' M'\xe1\xa0\xb0\xe1\xa0\xa0\xe1\xa0\xb7\xe1\xa0\x8e\xe1\xa0\xa0 \xe2\x80\xaf\xe1\xa0\xa2\xe1\xa0\xa2\xe1\xa0\xa8 'd' \xe1\xa0\xa4\xe1\xa0\x8b \xe1\xa0\xa1\xe1\xa0\xb3\xe1\xa0\xa6\xe1\xa0\xb7\xe1\xa0\x82' dddd\0"
"dddd, dd. MMMM yyyy\0"
"J\xc3\xa4nner\0"
@@ -4832,6 +4852,7 @@ static const char locale_strings [] = {
"d.MMMyyyy\0"
"HH:mm' Uhr'\0"
"H:mm' Uhr'\0"
+ "dddd', 'MMMM d'. b. 'yyyy\0"
"aejlege\0"
"m\xc3\xa5\x61nta\0"
"d\xc3\xa4jsta\0"
@@ -4851,11 +4872,14 @@ static const char locale_strings [] = {
"golggot\0"
"sk\xc3\xa1\x62ma\0"
"juovla\0"
- "MMMM-dd-yy\0"
- "M/dd/yy\0"
+ "dddd' den 'd'.' MMMM yyyy\0"
"MMMM d, yyyy\0"
+ "M/dd/yy\0"
+ "MMMM-dd-yy\0"
"dddd yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0"
"dddd yyyy MM dd\0"
+ "dddd', le 'd MMMM yyyy\0"
+ "MMMM yyyy.\0"
"pre podne\0"
"popodne\0"
"ponedeljak\0"
@@ -4910,7 +4934,12 @@ static const char locale_strings [] = {
"\xd8\xaa\xd8\xb4\xd8\xb1\xd9\x8a\xd9\x86 \xd8\xa7\xd9\x84\xd8\xab\xd8\xa7\xd9\x86\xd9\x8a\0"
"\xd9\x83\xd8\xa7\xd9\x86\xd9\x88\xd9\x86 \xd8\xa7\xd9\x84\xd8\xa3\xd9\x88\xd9\x84\0"
"\xd1\x81\xd1\x80\xd0\xb5\0"
+ "dd' de 'MMMM\0"
+ "MMMM/yyyy\0"
+ "d' de 'MMM\0"
"dddd, d MMMM, yyyy\0"
+ "MMMM' del 'yyyy\0"
+ ",\0"
"\xd9\xab\0"
"\xd9\xac\0"
"\xd8\xb1.\xd8\xb3.\xe2\x80\x8f\0"
@@ -4920,7 +4949,6 @@ static const char locale_strings [] = {
"-Infinity\0"
"Infinity\0"
"+\0"
- ",\0"
"\xc2\xa0\0"
"\xd0\xbb\xd0\xb2.\0"
"%\0"
@@ -4956,6 +4984,7 @@ static const char locale_strings [] = {
"-niesko\xc5\x84\x63zono\xc5\x9b\xc4\x87\0"
"+niesko\xc5\x84\x63zono\xc5\x9b\xc4\x87\0"
"R$\0"
+ "'\0"
"\xe2\x80\x99\0"
"-infinit\0"
"+infinit\0"
@@ -4981,6 +5010,7 @@ static const char locale_strings [] = {
"Lt\0"
"-begalyb\xc4\x97\0"
"begalyb\xc4\x97\0"
+ ";\0"
"\xef\xb7\xbc\0"
"\xe2\x82\xab\0"
"\xd5\xa4\xd6\x80.\0"
@@ -5012,7 +5042,6 @@ static const char locale_strings [] = {
"man.\0"
"so\xca\xbcm\0"
"\xd8\xaf.\xd8\xb9.\xe2\x80\x8f\0"
- "'\0"
"\xd0\xbc\xd0\xb0\xd0\xbd.\0"
"\xd1\x81\xd1\x9e\xd0\xbc\0"
"\xe0\xa7\xb3\0"
diff --git a/mono/metadata/debug-helpers.c b/mono/metadata/debug-helpers.c
index f38a054125..a20e8ae06e 100644
--- a/mono/metadata/debug-helpers.c
+++ b/mono/metadata/debug-helpers.c
@@ -468,6 +468,8 @@ match_class (MonoMethodDesc *desc, int pos, MonoClass *klass)
gboolean
mono_method_desc_full_match (MonoMethodDesc *desc, MonoMethod *method)
{
+ if (!desc->klass)
+ return FALSE;
if (!match_class (desc, strlen (desc->klass), method->klass))
return FALSE;
diff --git a/mono/metadata/domain-internals.h b/mono/metadata/domain-internals.h
index b73be9382a..8ffe885532 100644
--- a/mono/metadata/domain-internals.h
+++ b/mono/metadata/domain-internals.h
@@ -190,7 +190,11 @@ struct _MonoJitInfo {
next_jit_code_hash) must be in the same order and at the
same offset as in RuntimeMethod, because of the jit_code_hash
internal hash table in MonoDomain. */
- MonoMethod *method;
+ union {
+ MonoMethod *method;
+ MonoImage *image;
+ gpointer aot_info;
+ } d;
struct _MonoJitInfo *next_jit_code_hash;
gpointer code_start;
/* This might contain an id for the unwind info instead of a register mask */
@@ -207,6 +211,10 @@ struct _MonoJitInfo {
gboolean from_llvm:1;
gboolean dbg_hidden_inited:1;
gboolean dbg_hidden:1;
+ /* Whenever this jit info was loaded in async context */
+ gboolean async:1;
+ gboolean dbg_step_through_inited:1;
+ gboolean dbg_step_through:1;
/* FIXME: Embed this after the structure later*/
gpointer gc_info; /* Currently only used by SGen */
@@ -226,6 +234,17 @@ struct _MonoAppContext {
gpointer *static_data;
};
+/* Lock-free allocator */
+typedef struct {
+ guint8 *mem;
+ gpointer prev;
+ int size, pos;
+} LockFreeMempoolChunk;
+
+typedef struct {
+ LockFreeMempoolChunk *current, *chunks;
+} LockFreeMempool;
+
/*
* We have two unloading states because the domain
* must remain fully functional while AppDomain::DomainUnload is
@@ -315,10 +334,17 @@ struct _MonoDomain {
int num_jit_info_tables;
MonoJitInfoTable *
volatile jit_info_table;
+ /*
+ * Contains information about AOT loaded code.
+ * Only used in the root domain.
+ */
+ MonoJitInfoTable *
+ volatile aot_modules;
GSList *jit_info_free_queue;
/* Used when loading assemblies */
gchar **search_path;
gchar *private_bin_path;
+ LockFreeMempool *lock_free_mp;
/* Used by remoting proxies */
MonoMethod *create_proxy_for_type_method;
@@ -459,6 +485,9 @@ mono_domain_alloc (MonoDomain *domain, guint size) MONO_INTERNAL;
gpointer
mono_domain_alloc0 (MonoDomain *domain, guint size) MONO_INTERNAL;
+gpointer
+mono_domain_alloc0_lock_free (MonoDomain *domain, guint size) MONO_INTERNAL;
+
void*
mono_domain_code_reserve (MonoDomain *domain, int size) MONO_LLVM_INTERNAL;
diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c
index fb4c1252ed..d23451f903 100644
--- a/mono/metadata/domain.c
+++ b/mono/metadata/domain.c
@@ -17,12 +17,14 @@
#include <mono/metadata/gc-internal.h>
+#include <mono/utils/atomic.h>
#include <mono/utils/mono-compiler.h>
#include <mono/utils/mono-logger-internal.h>
#include <mono/utils/mono-membar.h>
#include <mono/utils/mono-counters.h>
#include <mono/utils/hazard-pointer.h>
#include <mono/utils/mono-tls.h>
+#include <mono/utils/mono-mmap.h>
#include <mono/metadata/object.h>
#include <mono/metadata/object-internals.h>
#include <mono/metadata/domain-internals.h>
@@ -40,7 +42,7 @@
#include <metadata/profiler-private.h>
#include <mono/metadata/coree.h>
-/* #define DEBUG_DOMAIN_UNLOAD */
+#define DEBUG_DOMAIN_UNLOAD 1
/* we need to use both the Tls* functions and __thread because
* some archs may generate faster jit code with one meachanism
@@ -102,23 +104,10 @@ typedef struct {
int startup_count;
} AppConfigInfo;
-/*
- * AotModuleInfo: Contains information about AOT modules.
- */
-typedef struct {
- MonoImage *image;
- gpointer start, end;
-} AotModuleInfo;
-
static const MonoRuntimeInfo *current_runtime = NULL;
static MonoJitInfoFindInAot jit_info_find_in_aot_func = NULL;
-/*
- * Contains information about AOT loaded code.
- */
-static MonoAotModuleInfoTable *aot_modules = NULL;
-
/* This is the list of runtime versions supported by this JIT.
*/
static const MonoRuntimeInfo supported_runtimes[] = {
@@ -147,9 +136,6 @@ get_runtimes_from_exe (const char *exe_file, MonoImage **exe_image, const MonoRu
static const MonoRuntimeInfo*
get_runtime_by_version (const char *version);
-static MonoImage*
-mono_jit_info_find_aot_module (guint8* addr);
-
MonoNativeTlsKey
mono_domain_get_tls_key (void)
{
@@ -174,7 +160,7 @@ mono_domain_get_tls_offset (void)
#define JIT_INFO_TABLE_HIGH_WATERMARK(n) ((n) * 5 / 6)
#define JIT_INFO_TOMBSTONE_MARKER ((MonoMethod*)NULL)
-#define IS_JIT_INFO_TOMBSTONE(ji) ((ji)->method == JIT_INFO_TOMBSTONE_MARKER)
+#define IS_JIT_INFO_TOMBSTONE(ji) ((ji)->d.method == JIT_INFO_TOMBSTONE_MARKER)
#define JIT_INFO_TABLE_HAZARD_INDEX 0
#define JIT_INFO_HAZARD_INDEX 1
@@ -331,32 +317,11 @@ jit_info_table_chunk_index (MonoJitInfoTableChunk *chunk, MonoThreadHazardPointe
return left;
}
-/*
- * mono_jit_info_table_find_internal:
- *
- * If TRY_AOT is FALSE, avoid loading information for missing methods from AOT images, which is currently not async safe.
- * In this case, only those AOT methods will be found whose jit info is already loaded.
- */
-MonoJitInfo*
-mono_jit_info_table_find_internal (MonoDomain *domain, char *addr, gboolean try_aot)
+static MonoJitInfo*
+jit_info_table_find (MonoJitInfoTable *table, MonoThreadHazardPointers *hp, gint8 *addr)
{
- MonoJitInfoTable *table;
MonoJitInfo *ji;
int chunk_pos, pos;
- MonoThreadHazardPointers *hp = mono_hazard_pointer_get ();
- MonoImage *image;
-
- ++mono_stats.jit_info_table_lookup_count;
-
- /* First we have to get the domain's jit_info_table. This is
- complicated by the fact that a writer might substitute a
- new table and free the old one. What the writer guarantees
- us is that it looks at the hazard pointers after it has
- changed the jit_info_table pointer. So, if we guard the
- table by a hazard pointer and make sure that the pointer is
- still there after we've made it hazardous, we don't have to
- worry about the writer freeing the table. */
- table = get_hazardous_pointer ((gpointer volatile*)&domain->jit_info_table, hp, JIT_INFO_TABLE_HAZARD_INDEX);
chunk_pos = jit_info_table_index (table, (gint8*)addr);
g_assert (chunk_pos < table->num_chunks);
@@ -382,7 +347,6 @@ mono_jit_info_table_find_internal (MonoDomain *domain, char *addr, gboolean try_
}
if ((gint8*)addr >= (gint8*)ji->code_start
&& (gint8*)addr < (gint8*)ji->code_start + ji->code_size) {
- mono_hazard_pointer_clear (hp, JIT_INFO_TABLE_HAZARD_INDEX);
mono_hazard_pointer_clear (hp, JIT_INFO_HAZARD_INDEX);
return ji;
}
@@ -399,19 +363,53 @@ mono_jit_info_table_find_internal (MonoDomain *domain, char *addr, gboolean try_
} while (chunk_pos < table->num_chunks);
not_found:
- if (!hp)
- return NULL;
+ if (hp)
+ mono_hazard_pointer_clear (hp, JIT_INFO_HAZARD_INDEX);
+ return NULL;
+}
+
+/*
+ * mono_jit_info_table_find_internal:
+ *
+ * If TRY_AOT is FALSE, avoid loading information for missing methods from AOT images, which is currently not async safe.
+ * In this case, only those AOT methods will be found whose jit info is already loaded.
+ * ASYNC SAFETY: When called in an async context (mono_thread_info_is_async_context ()), this is async safe.
+ * In this case, the returned MonoJitInfo might not have metadata information, in particular,
+ * mono_jit_info_get_method () could fail.
+ */
+MonoJitInfo*
+mono_jit_info_table_find_internal (MonoDomain *domain, char *addr, gboolean try_aot)
+{
+ MonoJitInfoTable *table;
+ MonoJitInfo *ji, *module_ji;
+ MonoThreadHazardPointers *hp = mono_hazard_pointer_get ();
+
+ ++mono_stats.jit_info_table_lookup_count;
- mono_hazard_pointer_clear (hp, JIT_INFO_TABLE_HAZARD_INDEX);
- mono_hazard_pointer_clear (hp, JIT_INFO_HAZARD_INDEX);
+ /* First we have to get the domain's jit_info_table. This is
+ complicated by the fact that a writer might substitute a
+ new table and free the old one. What the writer guarantees
+ us is that it looks at the hazard pointers after it has
+ changed the jit_info_table pointer. So, if we guard the
+ table by a hazard pointer and make sure that the pointer is
+ still there after we've made it hazardous, we don't have to
+ worry about the writer freeing the table. */
+ table = get_hazardous_pointer ((gpointer volatile*)&domain->jit_info_table, hp, JIT_INFO_TABLE_HAZARD_INDEX);
- ji = NULL;
+ ji = jit_info_table_find (table, hp, (gint8*)addr);
+ if (hp)
+ mono_hazard_pointer_clear (hp, JIT_INFO_TABLE_HAZARD_INDEX);
+ if (ji)
+ return ji;
/* Maybe its an AOT module */
- if (try_aot) {
- image = mono_jit_info_find_aot_module ((guint8*)addr);
- if (image)
- ji = jit_info_find_in_aot_func (domain, image, addr);
+ if (try_aot && mono_root_domain && mono_root_domain->aot_modules) {
+ table = get_hazardous_pointer ((gpointer volatile*)&mono_root_domain->aot_modules, hp, JIT_INFO_TABLE_HAZARD_INDEX);
+ module_ji = jit_info_table_find (table, hp, (gint8*)addr);
+ if (module_ji)
+ ji = jit_info_find_in_aot_func (domain, module_ji->d.image, addr);
+ if (hp)
+ mono_hazard_pointer_clear (hp, JIT_INFO_TABLE_HAZARD_INDEX);
}
return ji;
@@ -679,22 +677,16 @@ jit_info_table_chunk_overflow (MonoJitInfoTable *table, MonoJitInfoTableChunk *c
* the one we're looking for (i.e. we either find the element directly
* or we end up to the left of it).
*/
-void
-mono_jit_info_table_add (MonoDomain *domain, MonoJitInfo *ji)
+static void
+jit_info_table_add (MonoDomain *domain, MonoJitInfoTable *volatile *table_ptr, MonoJitInfo *ji)
{
MonoJitInfoTable *table;
- int chunk_pos, pos;
MonoJitInfoTableChunk *chunk;
+ int chunk_pos, pos;
int num_elements;
int i;
- g_assert (ji->method != NULL);
-
- mono_domain_lock (domain);
-
- ++mono_stats.jit_info_table_insert_count;
-
- table = domain->jit_info_table;
+ table = *table_ptr;
restart:
chunk_pos = jit_info_table_index (table, (gint8*)ji->code_start + ji->code_size);
@@ -707,7 +699,7 @@ mono_jit_info_table_add (MonoDomain *domain, MonoJitInfo *ji)
/* Debugging code, should be removed. */
//jit_info_table_check (new_table);
- domain->jit_info_table = new_table;
+ *table_ptr = new_table;
mono_memory_barrier ();
domain->num_jit_info_tables++;
mono_thread_hazardous_free_or_queue (table, (MonoHazardousFreeFunc)jit_info_table_free, TRUE, FALSE);
@@ -749,6 +741,18 @@ mono_jit_info_table_add (MonoDomain *domain, MonoJitInfo *ji)
/* Debugging code, should be removed. */
//jit_info_table_check (table);
+}
+
+void
+mono_jit_info_table_add (MonoDomain *domain, MonoJitInfo *ji)
+{
+ g_assert (ji->d.method != NULL);
+
+ mono_domain_lock (domain);
+
+ ++mono_stats.jit_info_table_insert_count;
+
+ jit_info_table_add (domain, &domain->jit_info_table, ji);
mono_domain_unlock (domain);
}
@@ -760,7 +764,7 @@ mono_jit_info_make_tombstone (MonoJitInfo *ji)
tombstone->code_start = ji->code_start;
tombstone->code_size = ji->code_size;
- tombstone->method = JIT_INFO_TOMBSTONE_MARKER;
+ tombstone->d.method = JIT_INFO_TOMBSTONE_MARKER;
return tombstone;
}
@@ -780,19 +784,13 @@ mono_jit_info_free_or_queue (MonoDomain *domain, MonoJitInfo *ji)
}
}
-void
-mono_jit_info_table_remove (MonoDomain *domain, MonoJitInfo *ji)
+static void
+jit_info_table_remove (MonoJitInfoTable *table, MonoJitInfo *ji)
{
- MonoJitInfoTable *table;
MonoJitInfoTableChunk *chunk;
gpointer start = ji->code_start;
int chunk_pos, pos;
- mono_domain_lock (domain);
- table = domain->jit_info_table;
-
- ++mono_stats.jit_info_table_remove_count;
-
chunk_pos = jit_info_table_index (table, start);
g_assert (chunk_pos < table->num_chunks);
@@ -823,90 +821,49 @@ mono_jit_info_table_remove (MonoDomain *domain, MonoJitInfo *ji)
/* Debugging code, should be removed. */
//jit_info_table_check (table);
-
- mono_jit_info_free_or_queue (domain, ji);
-
- mono_domain_unlock (domain);
-}
-
-static MonoAotModuleInfoTable*
-mono_aot_module_info_table_new (void)
-{
- return g_array_new (FALSE, FALSE, sizeof (gpointer));
-}
-
-static int
-aot_info_table_index (MonoAotModuleInfoTable *table, char *addr)
-{
- int left = 0, right = table->len;
-
- while (left < right) {
- int pos = (left + right) / 2;
- AotModuleInfo *ainfo = g_array_index (table, gpointer, pos);
- char *start = ainfo->start;
- char *end = ainfo->end;
-
- if (addr < start)
- right = pos;
- else if (addr >= end)
- left = pos + 1;
- else
- return pos;
- }
-
- return left;
}
void
-mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end)
+mono_jit_info_table_remove (MonoDomain *domain, MonoJitInfo *ji)
{
- AotModuleInfo *ainfo = g_new0 (AotModuleInfo, 1);
- int pos;
-
- ainfo->image = image;
- ainfo->start = start;
- ainfo->end = end;
+ MonoJitInfoTable *table;
- mono_appdomains_lock ();
+ mono_domain_lock (domain);
+ table = domain->jit_info_table;
- if (!aot_modules)
- aot_modules = mono_aot_module_info_table_new ();
+ ++mono_stats.jit_info_table_remove_count;
- pos = aot_info_table_index (aot_modules, start);
+ jit_info_table_remove (table, ji);
- g_array_insert_val (aot_modules, pos, ainfo);
+ mono_jit_info_free_or_queue (domain, ji);
- mono_appdomains_unlock ();
+ mono_domain_unlock (domain);
}
-static MonoImage*
-mono_jit_info_find_aot_module (guint8* addr)
+void
+mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end)
{
- guint left = 0, right;
-
- if (!aot_modules)
- return NULL;
+ MonoJitInfo *ji;
mono_appdomains_lock ();
- right = aot_modules->len;
- while (left < right) {
- guint pos = (left + right) / 2;
- AotModuleInfo *ai = g_array_index (aot_modules, gpointer, pos);
-
- if (addr < (guint8*)ai->start)
- right = pos;
- else if (addr >= (guint8*)ai->end)
- left = pos + 1;
- else {
- mono_appdomains_unlock ();
- return ai->image;
- }
+ /*
+ * We reuse MonoJitInfoTable to store AOT module info,
+ * this gives us async-safe lookup.
+ */
+ g_assert (mono_root_domain);
+ if (!mono_root_domain->aot_modules) {
+ mono_root_domain->num_jit_info_tables ++;
+ mono_root_domain->aot_modules = jit_info_table_new (mono_root_domain);
}
- mono_appdomains_unlock ();
+ ji = g_new0 (MonoJitInfo, 1);
+ ji->d.image = image;
+ ji->code_start = start;
+ ji->code_size = (guint8*)end - (guint8*)start;
+ jit_info_table_add (mono_root_domain, &mono_root_domain->aot_modules, ji);
- return NULL;
+ mono_appdomains_unlock ();
}
void
@@ -930,7 +887,8 @@ mono_jit_info_get_code_size (MonoJitInfo* ji)
MonoMethod*
mono_jit_info_get_method (MonoJitInfo* ji)
{
- return ji->method;
+ g_assert (!ji->async);
+ return ji->d.method;
}
static gpointer
@@ -938,7 +896,7 @@ jit_info_key_extract (gpointer value)
{
MonoJitInfo *info = (MonoJitInfo*)value;
- return info->method;
+ return info->d.method;
}
static gpointer*
@@ -1048,6 +1006,94 @@ mono_jit_info_get_cas_info (MonoJitInfo *ji)
}
}
+#define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
+#define ALIGN_PTR_TO(ptr,align) (gpointer)((((gssize)(ptr)) + (align - 1)) & (~(align - 1)))
+
+static LockFreeMempool*
+lock_free_mempool_new (void)
+{
+ return g_new0 (LockFreeMempool, 1);
+}
+
+static void
+lock_free_mempool_free (LockFreeMempool *mp)
+{
+ LockFreeMempoolChunk *chunk, *next;
+
+ chunk = mp->chunks;
+ while (chunk) {
+ next = chunk->prev;
+ mono_vfree (chunk, mono_pagesize ());
+ chunk = next;
+ }
+}
+
+/*
+ * This is async safe
+ */
+static LockFreeMempoolChunk*
+lock_free_mempool_chunk_new (LockFreeMempool *mp, int len)
+{
+ LockFreeMempoolChunk *chunk, *prev;
+ int size;
+
+ size = mono_pagesize ();
+ while (size - sizeof (LockFreeMempoolChunk) < len)
+ size += mono_pagesize ();
+ chunk = mono_valloc (0, size, MONO_MMAP_READ|MONO_MMAP_WRITE);
+ g_assert (chunk);
+ chunk->mem = ALIGN_PTR_TO ((char*)chunk + sizeof (LockFreeMempoolChunk), 16);
+ chunk->size = ((char*)chunk + size) - (char*)chunk->mem;
+ chunk->pos = 0;
+
+ /* Add to list of chunks lock-free */
+ while (TRUE) {
+ prev = mp->chunks;
+ if (InterlockedCompareExchangePointer ((volatile gpointer*)&mp->chunks, chunk, prev) == prev)
+ break;
+ }
+ chunk->prev = prev;
+
+ return chunk;
+}
+
+/*
+ * This is async safe
+ */
+static gpointer
+lock_free_mempool_alloc0 (LockFreeMempool *mp, guint size)
+{
+ LockFreeMempoolChunk *chunk;
+ gpointer res;
+ int oldpos;
+
+ // FIXME: Free the allocator
+
+ size = ALIGN_TO (size, 8);
+ chunk = mp->current;
+ if (!chunk) {
+ chunk = lock_free_mempool_chunk_new (mp, size);
+ mono_memory_barrier ();
+ /* Publish */
+ mp->current = chunk;
+ }
+
+ /* The code below is lock-free, 'chunk' is shared state */
+ oldpos = InterlockedExchangeAdd (&chunk->pos, size);
+ if (oldpos + size > chunk->size) {
+ chunk = lock_free_mempool_chunk_new (mp, size);
+ g_assert (chunk->pos + size <= chunk->size);
+ res = chunk->mem;
+ chunk->pos += size;
+ mono_memory_barrier ();
+ mp->current = chunk;
+ } else {
+ res = (char*)chunk->mem + oldpos;
+ }
+
+ return res;
+}
+
void
mono_install_create_domain_hook (MonoCreateDomainFunc func)
{
@@ -1220,6 +1266,7 @@ mono_domain_create (void)
domain->mp = mono_mempool_new ();
domain->code_mp = mono_code_manager_new ();
+ domain->lock_free_mp = lock_free_mempool_new ();
domain->env = mono_g_hash_table_new_type ((GHashFunc)mono_string_hash, (GCompareFunc)mono_string_equal, MONO_HASH_KEY_VALUE_GC);
domain->domain_assemblies = NULL;
domain->assembly_bindings = NULL;
@@ -2016,6 +2063,8 @@ mono_domain_free (MonoDomain *domain, gboolean force)
* this will free them.
*/
mono_thread_hazardous_try_free_all ();
+ if (domain->aot_modules)
+ jit_info_table_free (domain->aot_modules);
g_assert (domain->num_jit_info_tables == 1);
jit_info_table_free (domain->jit_info_table);
domain->jit_info_table = NULL;
@@ -2039,6 +2088,8 @@ mono_domain_free (MonoDomain *domain, gboolean force)
mono_code_manager_destroy (domain->code_mp);
domain->code_mp = NULL;
#endif
+ lock_free_mempool_free (domain->lock_free_mp);
+ domain->lock_free_mp = NULL;
g_hash_table_destroy (domain->finalizable_objects_hash);
domain->finalizable_objects_hash = NULL;
@@ -2146,6 +2197,12 @@ mono_domain_alloc0 (MonoDomain *domain, guint size)
return res;
}
+gpointer
+mono_domain_alloc0_lock_free (MonoDomain *domain, guint size)
+{
+ return lock_free_mempool_alloc0 (domain->lock_free_mp, size);
+}
+
/*
* mono_domain_code_reserve:
*
@@ -2289,7 +2346,7 @@ mono_domain_add_class_static_data (MonoDomain *domain, MonoClass *klass, gpointe
if (next >= size) {
/* 'data' is allocated by alloc_fixed */
gpointer *new_array = mono_gc_alloc_fixed (sizeof (gpointer) * (size * 2), MONO_GC_ROOT_DESCR_FOR_FIXED (size * 2));
- mono_gc_memmove (new_array, domain->static_data_array, sizeof (gpointer) * size);
+ mono_gc_memmove_aligned (new_array, domain->static_data_array, sizeof (gpointer) * size);
size *= 2;
new_array [1] = GINT_TO_POINTER (size);
mono_gc_free_fixed (domain->static_data_array);
diff --git a/mono/metadata/exception.c b/mono/metadata/exception.c
index d8ffb90b49..24bfd6ed5b 100644
--- a/mono/metadata/exception.c
+++ b/mono/metadata/exception.c
@@ -831,7 +831,7 @@ mono_exception_get_native_backtrace (MonoException *exc)
gpointer ip = mono_array_get (arr, gpointer, i);
MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), ip);
if (ji) {
- char *msg = mono_debug_print_stack_frame (ji->method, (char*)ip - (char*)ji->code_start, domain);
+ char *msg = mono_debug_print_stack_frame (mono_jit_info_get_method (ji), (char*)ip - (char*)ji->code_start, domain);
g_string_append_printf (text, "%s\n", msg);
g_free (msg);
} else {
diff --git a/mono/metadata/gc-internal.h b/mono/metadata/gc-internal.h
index 9ac75836d3..ba39c1b199 100644
--- a/mono/metadata/gc-internal.h
+++ b/mono/metadata/gc-internal.h
@@ -335,9 +335,6 @@ gboolean mono_gc_precise_stack_mark_enabled (void) MONO_INTERNAL;
FILE *mono_gc_get_logfile (void) MONO_INTERNAL;
-typedef void (*mono_reference_queue_callback) (void *user_data);
-
-typedef struct _MonoReferenceQueue MonoReferenceQueue;
typedef struct _RefQueueEntry RefQueueEntry;
struct _RefQueueEntry {
@@ -355,10 +352,6 @@ struct _MonoReferenceQueue {
gboolean should_be_deleted;
};
-MonoReferenceQueue* mono_gc_reference_queue_new (mono_reference_queue_callback callback) MONO_INTERNAL;
-void mono_gc_reference_queue_free (MonoReferenceQueue *queue) MONO_INTERNAL;
-gboolean mono_gc_reference_queue_add (MonoReferenceQueue *queue, MonoObject *obj, void *user_data) MONO_INTERNAL;
-
#ifdef HOST_WIN32
BOOL APIENTRY mono_gc_dllmain (HMODULE module_handle, DWORD reason, LPVOID reserved) MONO_INTERNAL;
#endif
@@ -367,8 +360,10 @@ BOOL APIENTRY mono_gc_dllmain (HMODULE module_handle, DWORD reason, LPVOID reser
Those functions must be used when it's possible that either destination is not
word aligned or size is not a multiple of word size.
*/
-void mono_gc_bzero (void *dest, size_t size) MONO_INTERNAL;
-void mono_gc_memmove (void *dest, const void *src, size_t size) MONO_INTERNAL;
+void mono_gc_bzero_atomic (void *dest, size_t size) MONO_INTERNAL;
+void mono_gc_bzero_aligned (void *dest, size_t size) MONO_INTERNAL;
+void mono_gc_memmove_atomic (void *dest, const void *src, size_t size) MONO_INTERNAL;
+void mono_gc_memmove_aligned (void *dest, const void *src, size_t size) MONO_INTERNAL;
guint mono_gc_get_vtable_bits (MonoClass *class) MONO_INTERNAL;
diff --git a/mono/metadata/gc-memfuncs.c b/mono/metadata/gc-memfuncs.c
new file mode 100644
index 0000000000..1b3d6b29e1
--- /dev/null
+++ b/mono/metadata/gc-memfuncs.c
@@ -0,0 +1,230 @@
+/*
+ * test-sgen-qsort.c: Our own bzero/memmove.
+ *
+ * Copyright (C) 2013 Xamarin Inc
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License 2.0 as published by the Free Software Foundation;
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License 2.0 along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * SGen cannot deal with invalid pointers on the heap or in registered roots. Sometimes we
+ * need to copy or zero out memory in code that might be interrupted by collections. To
+ * guarantee that those operations will not result in invalid pointers, we must do it
+ * word-atomically.
+ *
+ * libc's bzero() and memcpy()/memmove() functions do not guarantee word-atomicity, even in
+ * cases where one would assume so. For instance, some implementations (like Darwin's on
+ * x86) have variants of memcpy() using vector instructions. Those may copy bytewise for
+ * the region preceding the first vector-aligned address. That region could be
+ * word-aligned, but it would still be copied byte-wise.
+ *
+ * All our memory writes here are to "volatile" locations. This is so that C compilers
+ * don't "optimize" our code back to calls to bzero()/memmove(). LLVM, specifically, will
+ * do that.
+ */
+
+#include <config.h>
+
+#include "metadata/gc-internal.h"
+
+#define ptr_mask ((sizeof (void*) - 1))
+#define _toi(ptr) ((size_t)ptr)
+#define unaligned_bytes(ptr) (_toi(ptr) & ptr_mask)
+#define align_down(ptr) ((void*)(_toi(ptr) & ~ptr_mask))
+#define align_up(ptr) ((void*) ((_toi(ptr) + ptr_mask) & ~ptr_mask))
+#if SIZEOF_VOID_P == 4
+#define bytes_to_words(n) ((size_t)(n) >> 2)
+#elif SIZEOF_VOID_P == 8
+#define bytes_to_words(n) ((size_t)(n) >> 3)
+#else
+#error We only support 32 and 64 bit architectures.
+#endif
+
+#define BZERO_WORDS(dest,words) do { \
+ void * volatile *__d = (void* volatile*)(dest); \
+ int __n = (words); \
+ int __i; \
+ for (__i = 0; __i < __n; ++__i) \
+ __d [__i] = NULL; \
+ } while (0)
+
+
+/**
+ * mono_gc_bzero_aligned:
+ * @dest: address to start to clear
+ * @size: size of the region to clear
+ *
+ * Zero @size bytes starting at @dest.
+ * The address of @dest MUST be aligned to word boundaries
+ *
+ * FIXME borrow faster code from some BSD libc or bionic
+ */
+void
+mono_gc_bzero_aligned (void *dest, size_t size)
+{
+ volatile char *d = (char*)dest;
+ size_t tail_bytes, word_bytes;
+
+ g_assert (unaligned_bytes (dest) == 0);
+
+ /* copy all words with memmove */
+ word_bytes = (size_t)align_down (size);
+ switch (word_bytes) {
+ case sizeof (void*) * 1:
+ BZERO_WORDS (d, 1);
+ break;
+ case sizeof (void*) * 2:
+ BZERO_WORDS (d, 2);
+ break;
+ case sizeof (void*) * 3:
+ BZERO_WORDS (d, 3);
+ break;
+ case sizeof (void*) * 4:
+ BZERO_WORDS (d, 4);
+ break;
+ default:
+ BZERO_WORDS (d, bytes_to_words (word_bytes));
+ }
+
+ tail_bytes = unaligned_bytes (size);
+ if (tail_bytes) {
+ d += word_bytes;
+ do {
+ *d++ = 0;
+ } while (--tail_bytes);
+ }
+}
+
+/**
+ * mono_gc_bzero_atomic:
+ * @dest: address to start to clear
+ * @size: size of the region to clear
+ *
+ * Zero @size bytes starting at @dest.
+ *
+ * Use this to zero memory without word tearing when dest is aligned.
+ */
+void
+mono_gc_bzero_atomic (void *dest, size_t size)
+{
+ if (unaligned_bytes (dest))
+ memset (dest, 0, size);
+ else
+ mono_gc_bzero_aligned (dest, size);
+}
+
+#define MEMMOVE_WORDS_UPWARD(dest,src,words) do { \
+ void * volatile *__d = (void* volatile*)(dest); \
+ void **__s = (void**)(src); \
+ int __n = (int)(words); \
+ int __i; \
+ for (__i = 0; __i < __n; ++__i) \
+ __d [__i] = __s [__i]; \
+ } while (0)
+
+#define MEMMOVE_WORDS_DOWNWARD(dest,src,words) do { \
+ void * volatile *__d = (void* volatile*)(dest); \
+ void **__s = (void**)(src); \
+ int __n = (int)(words); \
+ int __i; \
+ for (__i = __n - 1; __i >= 0; --__i) \
+ __d [__i] = __s [__i]; \
+ } while (0)
+
+
+/**
+ * mono_gc_memmove_aligned:
+ * @dest: destination of the move
+ * @src: source
+ * @size: size of the block to move
+ *
+ * Move @size bytes from @src to @dest.
+ *
+ * Use this to copy memory without word tearing when both pointers are aligned
+ */void
+mono_gc_memmove_aligned (void *dest, const void *src, size_t size)
+{
+ g_assert (unaligned_bytes (dest) == 0);
+ g_assert (unaligned_bytes (src) == 0);
+
+ /*
+ If we're copying less than a word we don't need to worry about word tearing
+ so we bailout to memmove early.
+ */
+ if (size < sizeof(void*)) {
+ memmove (dest, src, size);
+ return;
+ }
+
+ /*
+ * A bit of explanation on why we align only dest before doing word copies.
+ * Pointers to managed objects must always be stored in word aligned addresses, so
+ * even if dest is misaligned, src will be by the same amount - this ensure proper atomicity of reads.
+ *
+ * We don't need to case when source and destination have different alignments since we only do word stores
+ * using memmove, which must handle it.
+ */
+ if (dest > src && ((size_t)((char*)dest - (char*)src) < size)) { /*backward copy*/
+ volatile char *p = (char*)dest + size;
+ char *s = (char*)src + size;
+ char *start = (char*)dest;
+ char *align_end = MAX((char*)dest, (char*)align_down (p));
+ char *word_start;
+ size_t bytes_to_memmove;
+
+ while (p > align_end)
+ *--p = *--s;
+
+ word_start = align_up (start);
+ bytes_to_memmove = p - word_start;
+ p -= bytes_to_memmove;
+ s -= bytes_to_memmove;
+ MEMMOVE_WORDS_DOWNWARD (p, s, bytes_to_words (bytes_to_memmove));
+ } else {
+ volatile char *d = (char*)dest;
+ const char *s = (const char*)src;
+ size_t tail_bytes;
+
+ /* copy all words with memmove */
+ MEMMOVE_WORDS_UPWARD (d, s, bytes_to_words (align_down (size)));
+
+ tail_bytes = unaligned_bytes (size);
+ if (tail_bytes) {
+ d += (size_t)align_down (size);
+ s += (size_t)align_down (size);
+ do {
+ *d++ = *s++;
+ } while (--tail_bytes);
+ }
+ }
+}
+
+/**
+ * mono_gc_memmove_atomic:
+ * @dest: destination of the move
+ * @src: source
+ * @size: size of the block to move
+ *
+ * Move @size bytes from @src to @dest.
+ *
+ * Use this to copy memory without word tearing when both pointers are aligned
+ */
+void
+mono_gc_memmove_atomic (void *dest, const void *src, size_t size)
+{
+ if (unaligned_bytes (_toi (dest) | _toi (src)))
+ memmove (dest, src, size);
+ else
+ mono_gc_memmove_aligned (dest, src, size);
+}
diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c
index 7a46d49301..4a605fb17e 100644
--- a/mono/metadata/gc.c
+++ b/mono/metadata/gc.c
@@ -676,7 +676,7 @@ alloc_handle (HandleData *handles, MonoObject *obj, gboolean track)
gpointer *entries;
entries = mono_gc_alloc_fixed (sizeof (gpointer) * new_size, make_root_descr_all_refs (new_size, handles->type == HANDLE_PINNED));
- mono_gc_memmove (entries, handles->entries, sizeof (gpointer) * handles->size);
+ mono_gc_memmove_aligned (entries, handles->entries, sizeof (gpointer) * handles->size);
mono_gc_free_fixed (handles->entries);
handles->entries = entries;
@@ -1473,16 +1473,20 @@ reference_queue_clear_for_domain (MonoDomain *domain)
}
/**
* mono_gc_reference_queue_new:
- * @callback callback used when processing dead entries.
+ * @callback callback used when processing collected entries.
*
* Create a new reference queue used to process collected objects.
- * A reference queue let you queue a pair (managed object, user data)
+ * A reference queue let you add a pair of (managed object, user data)
* using the mono_gc_reference_queue_add method.
*
* Once the managed object is collected @callback will be called
* in the finalizer thread with 'user data' as argument.
*
- * The callback is called without any locks held.
+ * The callback is called from the finalizer thread without any locks held.
+ * When a AppDomain is unloaded, all callbacks for objects belonging to it
+ * will be invoked.
+ *
+ * @returns the new queue.
*/
MonoReferenceQueue*
mono_gc_reference_queue_new (mono_reference_queue_callback callback)
@@ -1506,7 +1510,7 @@ mono_gc_reference_queue_new (mono_reference_queue_callback callback)
*
* Queue an object to be watched for collection, when the @obj is
* collected, the callback that was registered for the @queue will
- * be invoked with the @obj and @user_data arguments.
+ * be invoked with @user_data as argument.
*
* @returns false if the queue is scheduled to be freed.
*/
@@ -1534,9 +1538,9 @@ mono_gc_reference_queue_add (MonoReferenceQueue *queue, MonoObject *obj, void *u
/**
* mono_gc_reference_queue_free:
- * @queue the queue that should be deleted.
+ * @queue the queue that should be freed.
*
- * This operation signals that @queue should be deleted. This operation is deferred
+ * This operation signals that @queue should be freed. This operation is deferred
* as it happens on the finalizer thread.
*
* After this call, no further objects can be queued. It's the responsibility of the
@@ -1547,157 +1551,3 @@ mono_gc_reference_queue_free (MonoReferenceQueue *queue)
{
queue->should_be_deleted = TRUE;
}
-
-#define ptr_mask ((sizeof (void*) - 1))
-#define _toi(ptr) ((size_t)ptr)
-#define unaligned_bytes(ptr) (_toi(ptr) & ptr_mask)
-#define align_down(ptr) ((void*)(_toi(ptr) & ~ptr_mask))
-#define align_up(ptr) ((void*) ((_toi(ptr) + ptr_mask) & ~ptr_mask))
-
-#define BZERO_WORDS(dest,words) do { \
- int __i; \
- for (__i = 0; __i < (words); ++__i) \
- ((void **)(dest))[__i] = 0; \
-} while (0)
-
-/**
- * mono_gc_bzero:
- * @dest: address to start to clear
- * @size: size of the region to clear
- *
- * Zero @size bytes starting at @dest.
- *
- * Use this to zero memory that can hold managed pointers.
- *
- * FIXME borrow faster code from some BSD libc or bionic
- */
-void
-mono_gc_bzero (void *dest, size_t size)
-{
- char *d = (char*)dest;
- size_t tail_bytes, word_bytes;
-
- /*
- If we're copying less than a word, just use memset.
-
- We cannot bail out early if both are aligned because some implementations
- use byte copying for sizes smaller than 16. OSX, on this case.
- */
- if (size < sizeof(void*)) {
- memset (dest, 0, size);
- return;
- }
-
- /*align to word boundary */
- while (unaligned_bytes (d) && size) {
- *d++ = 0;
- --size;
- }
-
- /* copy all words with memmove */
- word_bytes = (size_t)align_down (size);
- switch (word_bytes) {
- case sizeof (void*) * 1:
- BZERO_WORDS (d, 1);
- break;
- case sizeof (void*) * 2:
- BZERO_WORDS (d, 2);
- break;
- case sizeof (void*) * 3:
- BZERO_WORDS (d, 3);
- break;
- case sizeof (void*) * 4:
- BZERO_WORDS (d, 4);
- break;
- default:
- memset (d, 0, word_bytes);
- }
-
- tail_bytes = unaligned_bytes (size);
- if (tail_bytes) {
- d += word_bytes;
- do {
- *d++ = 0;
- } while (--tail_bytes);
- }
-}
-
-/**
- * mono_gc_memmove:
- * @dest: destination of the move
- * @src: source
- * @size: size of the block to move
- *
- * Move @size bytes from @src to @dest.
- * size MUST be a multiple of sizeof (gpointer)
- *
- */
-void
-mono_gc_memmove (void *dest, const void *src, size_t size)
-{
- /*
- If we're copying less than a word we don't need to worry about word tearing
- so we bailout to memmove early.
-
- If both dest is aligned and size is a multiple of word size, we can go straigh
- to memmove.
-
- */
- if (size < sizeof(void*) || !((_toi (dest) | (size)) & sizeof (void*))) {
- memmove (dest, src, size);
- return;
- }
-
- /*
- * A bit of explanation on why we align only dest before doing word copies.
- * Pointers to managed objects must always be stored in word aligned addresses, so
- * even if dest is misaligned, src will be by the same amount - this ensure proper atomicity of reads.
- *
- * We don't need to case when source and destination have different alignments since we only do word stores
- * using memmove, which must handle it.
- */
- if (dest > src && ((size_t)((char*)dest - (char*)src) < size)) { /*backward copy*/
- char *p = (char*)dest + size;
- char *s = (char*)src + size;
- char *start = (char*)dest;
- char *align_end = MAX((char*)dest, (char*)align_down (p));
- char *word_start;
- size_t bytes_to_memmove;
-
- while (p > align_end)
- *--p = *--s;
-
- word_start = align_up (start);
- bytes_to_memmove = p - word_start;
- p -= bytes_to_memmove;
- s -= bytes_to_memmove;
- memmove (p, s, bytes_to_memmove);
-
- while (p > start)
- *--p = *--s;
- } else {
- char *d = (char*)dest;
- const char *s = (const char*)src;
- size_t tail_bytes;
-
- /*align to word boundary */
- while (unaligned_bytes (d)) {
- *d++ = *s++;
- --size;
- }
-
- /* copy all words with memmove */
- memmove (d, s, (size_t)align_down (size));
-
- tail_bytes = unaligned_bytes (size);
- if (tail_bytes) {
- d += (size_t)align_down (size);
- s += (size_t)align_down (size);
- do {
- *d++ = *s++;
- } while (--tail_bytes);
- }
- }
-}
-
-
diff --git a/mono/metadata/icall-def.h b/mono/metadata/icall-def.h
index 3f17c54959..63fb708d20 100644
--- a/mono/metadata/icall-def.h
+++ b/mono/metadata/icall-def.h
@@ -286,11 +286,10 @@ ICALL(COMPINF_6, "internal_index(string,int,int,string,System.Globalization.Comp
ICALL_TYPE(CULINF, "System.Globalization.CultureInfo", CULINF_2)
ICALL(CULINF_2, "construct_datetime_format", ves_icall_System_Globalization_CultureInfo_construct_datetime_format)
-ICALL(CULINF_4, "construct_internal_locale_from_current_locale", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_current_locale)
ICALL(CULINF_5, "construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid)
ICALL(CULINF_6, "construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name)
-ICALL(CULINF_7, "construct_internal_locale_from_specific_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name)
ICALL(CULINF_8, "construct_number_format", ves_icall_System_Globalization_CultureInfo_construct_number_format)
+ICALL(CULINF_7, "get_current_locale_name", ves_icall_System_Globalization_CultureInfo_get_current_locale_name)
ICALL(CULINF_9, "internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures)
//ICALL(CULINF_10, "internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral)
@@ -890,7 +889,7 @@ ICALL(THREAD_28, "VolatileRead(int&)", ves_icall_System_Threading_Thread_Volatil
ICALL(THREAD_29, "VolatileRead(int16&)", ves_icall_System_Threading_Thread_VolatileRead2)
ICALL(THREAD_30, "VolatileRead(intptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr)
ICALL(THREAD_31, "VolatileRead(long&)", ves_icall_System_Threading_Thread_VolatileRead8)
-ICALL(THREAD_32, "VolatileRead(object&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr)
+ICALL(THREAD_32, "VolatileRead(object&)", ves_icall_System_Threading_Thread_VolatileReadObject)
ICALL(THREAD_33, "VolatileRead(sbyte&)", ves_icall_System_Threading_Thread_VolatileRead1)
ICALL(THREAD_34, "VolatileRead(single&)", ves_icall_System_Threading_Thread_VolatileReadFloat)
ICALL(THREAD_35, "VolatileRead(uint&)", ves_icall_System_Threading_Thread_VolatileRead4)
@@ -923,33 +922,33 @@ ICALL(THREADP_5, "pool_queue", icall_append_job)
ICALL_TYPE(VOLATILE, "System.Threading.Volatile", VOLATILE_28)
ICALL(VOLATILE_28, "Read(T&)", ves_icall_System_Threading_Volatile_Read_T)
-ICALL(VOLATILE_1, "Read(bool&)", ves_icall_System_Threading_Thread_VolatileRead1)
-ICALL(VOLATILE_2, "Read(byte&)", ves_icall_System_Threading_Thread_VolatileRead1)
-ICALL(VOLATILE_3, "Read(double&)", ves_icall_System_Threading_Thread_VolatileReadDouble)
-ICALL(VOLATILE_4, "Read(int&)", ves_icall_System_Threading_Thread_VolatileRead4)
-ICALL(VOLATILE_5, "Read(int16&)", ves_icall_System_Threading_Thread_VolatileRead2)
-ICALL(VOLATILE_6, "Read(intptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr)
-ICALL(VOLATILE_7, "Read(long&)", ves_icall_System_Threading_Thread_VolatileRead8)
-ICALL(VOLATILE_8, "Read(sbyte&)", ves_icall_System_Threading_Thread_VolatileRead1)
-ICALL(VOLATILE_9, "Read(single&)", ves_icall_System_Threading_Thread_VolatileReadFloat)
-ICALL(VOLATILE_10, "Read(uint&)", ves_icall_System_Threading_Thread_VolatileRead4)
-ICALL(VOLATILE_11, "Read(uint16&)", ves_icall_System_Threading_Thread_VolatileRead2)
-ICALL(VOLATILE_12, "Read(uintptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr)
-ICALL(VOLATILE_13, "Read(ulong&)", ves_icall_System_Threading_Thread_VolatileRead8)
+ICALL(VOLATILE_1, "Read(bool&)", ves_icall_System_Threading_Volatile_Read1)
+ICALL(VOLATILE_2, "Read(byte&)", ves_icall_System_Threading_Volatile_Read1)
+ICALL(VOLATILE_3, "Read(double&)", ves_icall_System_Threading_Volatile_ReadDouble)
+ICALL(VOLATILE_4, "Read(int&)", ves_icall_System_Threading_Volatile_Read4)
+ICALL(VOLATILE_5, "Read(int16&)", ves_icall_System_Threading_Volatile_Read2)
+ICALL(VOLATILE_6, "Read(intptr&)", ves_icall_System_Threading_Volatile_ReadIntPtr)
+ICALL(VOLATILE_7, "Read(long&)", ves_icall_System_Threading_Volatile_Read8)
+ICALL(VOLATILE_8, "Read(sbyte&)", ves_icall_System_Threading_Volatile_Read1)
+ICALL(VOLATILE_9, "Read(single&)", ves_icall_System_Threading_Volatile_ReadFloat)
+ICALL(VOLATILE_10, "Read(uint&)", ves_icall_System_Threading_Volatile_Read4)
+ICALL(VOLATILE_11, "Read(uint16&)", ves_icall_System_Threading_Volatile_Read2)
+ICALL(VOLATILE_12, "Read(uintptr&)", ves_icall_System_Threading_Volatile_ReadIntPtr)
+ICALL(VOLATILE_13, "Read(ulong&)", ves_icall_System_Threading_Volatile_Read8)
ICALL(VOLATILE_27, "Write(T&,T)", ves_icall_System_Threading_Volatile_Write_T)
-ICALL(VOLATILE_14, "Write(bool&,bool)", ves_icall_System_Threading_Thread_VolatileWrite1)
-ICALL(VOLATILE_15, "Write(byte&,byte)", ves_icall_System_Threading_Thread_VolatileWrite1)
-ICALL(VOLATILE_16, "Write(double&,double)", ves_icall_System_Threading_Thread_VolatileWriteDouble)
-ICALL(VOLATILE_17, "Write(int&,int)", ves_icall_System_Threading_Thread_VolatileWrite4)
-ICALL(VOLATILE_18, "Write(int16&,int16)", ves_icall_System_Threading_Thread_VolatileWrite2)
-ICALL(VOLATILE_19, "Write(intptr&,intptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr)
-ICALL(VOLATILE_20, "Write(long&,long)", ves_icall_System_Threading_Thread_VolatileWrite8)
-ICALL(VOLATILE_21, "Write(sbyte&,sbyte)", ves_icall_System_Threading_Thread_VolatileWrite1)
-ICALL(VOLATILE_22, "Write(single&,single)", ves_icall_System_Threading_Thread_VolatileWriteFloat)
-ICALL(VOLATILE_23, "Write(uint&,uint)", ves_icall_System_Threading_Thread_VolatileWrite4)
-ICALL(VOLATILE_24, "Write(uint16&,uint16)", ves_icall_System_Threading_Thread_VolatileWrite2)
-ICALL(VOLATILE_25, "Write(uintptr&,uintptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr)
-ICALL(VOLATILE_26, "Write(ulong&,ulong)", ves_icall_System_Threading_Thread_VolatileWrite8)
+ICALL(VOLATILE_14, "Write(bool&,bool)", ves_icall_System_Threading_Volatile_Write1)
+ICALL(VOLATILE_15, "Write(byte&,byte)", ves_icall_System_Threading_Volatile_Write1)
+ICALL(VOLATILE_16, "Write(double&,double)", ves_icall_System_Threading_Volatile_WriteDouble)
+ICALL(VOLATILE_17, "Write(int&,int)", ves_icall_System_Threading_Volatile_Write4)
+ICALL(VOLATILE_18, "Write(int16&,int16)", ves_icall_System_Threading_Volatile_Write2)
+ICALL(VOLATILE_19, "Write(intptr&,intptr)", ves_icall_System_Threading_Volatile_WriteIntPtr)
+ICALL(VOLATILE_20, "Write(long&,long)", ves_icall_System_Threading_Volatile_Write8)
+ICALL(VOLATILE_21, "Write(sbyte&,sbyte)", ves_icall_System_Threading_Volatile_Write1)
+ICALL(VOLATILE_22, "Write(single&,single)", ves_icall_System_Threading_Volatile_WriteFloat)
+ICALL(VOLATILE_23, "Write(uint&,uint)", ves_icall_System_Threading_Volatile_Write4)
+ICALL(VOLATILE_24, "Write(uint16&,uint16)", ves_icall_System_Threading_Volatile_Write2)
+ICALL(VOLATILE_25, "Write(uintptr&,uintptr)", ves_icall_System_Threading_Volatile_WriteIntPtr)
+ICALL(VOLATILE_26, "Write(ulong&,ulong)", ves_icall_System_Threading_Volatile_Write8)
ICALL_TYPE(WAITH, "System.Threading.WaitHandle", WAITH_1)
ICALL(WAITH_1, "SignalAndWait_Internal", ves_icall_System_Threading_WaitHandle_SignalAndWait_Internal)
diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c
index c78b8f8411..a7d40d18cf 100644
--- a/mono/metadata/icall.c
+++ b/mono/metadata/icall.c
@@ -85,6 +85,7 @@
#include <mono/utils/mono-io-portability.h>
#include <mono/utils/mono-digest.h>
#include <mono/utils/bsearch.h>
+#include <mono/utils/mono-mutex.h>
#if defined (HOST_WIN32)
#include <windows.h>
@@ -238,7 +239,7 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32
}
if (!value) {
- mono_gc_bzero (ea, esize);
+ mono_gc_bzero_atomic (ea, esize);
return;
}
@@ -301,7 +302,7 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32
if (ec->has_references)
mono_value_copy (ea, (char*)value + sizeof (MonoObject), ec);
else
- mono_gc_memmove (ea, (char *)value + sizeof (MonoObject), esize);
+ mono_gc_memmove_atomic (ea, (char *)value + sizeof (MonoObject), esize);
return;
}
@@ -685,7 +686,7 @@ ICALL_EXPORT void
ves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)
{
int sz = mono_array_element_size (mono_object_class (arr));
- mono_gc_bzero (mono_array_addr_with_size (arr, sz, idx), length * sz);
+ mono_gc_bzero_atomic (mono_array_addr_with_size_fast (arr, sz, idx), length * sz);
}
ICALL_EXPORT gboolean
@@ -694,92 +695,59 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
int element_size;
void * dest_addr;
void * source_addr;
+ MonoVTable *src_vtable;
+ MonoVTable *dest_vtable;
MonoClass *src_class;
MonoClass *dest_class;
- MONO_ARCH_SAVE_REGS;
+ src_vtable = source->obj.vtable;
+ dest_vtable = dest->obj.vtable;
- if (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)
+ if (src_vtable->rank != dest_vtable->rank)
return FALSE;
if (source->bounds || dest->bounds)
return FALSE;
/* there's no integer overflow since mono_array_length returns an unsigned integer */
- if ((dest_idx + length > mono_array_length (dest)) ||
- (source_idx + length > mono_array_length (source)))
+ if ((dest_idx + length > mono_array_length_fast (dest)) ||
+ (source_idx + length > mono_array_length_fast (source)))
return FALSE;
- src_class = source->obj.vtable->klass->element_class;
- dest_class = dest->obj.vtable->klass->element_class;
+ src_class = src_vtable->klass->element_class;
+ dest_class = dest_vtable->klass->element_class;
/*
* Handle common cases.
*/
- /* Case1: object[] -> valuetype[] (ArrayList::ToArray) */
- if (src_class == mono_defaults.object_class && dest_class->valuetype) {
- // FIXME: This is racy
+ /* Case1: object[] -> valuetype[] (ArrayList::ToArray)
+ We fallback to managed here since we need to typecheck each boxed valuetype before storing them in the dest array.
+ */
+ if (src_class == mono_defaults.object_class && dest_class->valuetype)
return FALSE;
- /*
- int i;
- int has_refs = dest_class->has_references;
- for (i = source_idx; i < source_idx + length; ++i) {
- MonoObject *elem = mono_array_get (source, MonoObject*, i);
- if (elem && !mono_object_isinst (elem, dest_class))
- return FALSE;
- }
-
- element_size = mono_array_element_size (dest->obj.vtable->klass);
- memset (mono_array_addr_with_size (dest, element_size, dest_idx), 0, element_size * length);
- for (i = 0; i < length; ++i) {
- MonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);
- void *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);
- if (!elem)
- continue;
- if (has_refs)
- mono_value_copy (addr, (char *)elem + sizeof (MonoObject), dest_class);
- else
- memcpy (addr, (char *)elem + sizeof (MonoObject), element_size);
- }
- return TRUE;
- */
- }
/* Check if we're copying a char[] <==> (u)short[] */
if (src_class != dest_class) {
if (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)
return FALSE;
- if (mono_class_is_subclass_of (src_class, dest_class, FALSE))
- ;
- /* Case2: object[] -> reftype[] (ArrayList::ToArray) */
- else if (mono_class_is_subclass_of (dest_class, src_class, FALSE)) {
- // FIXME: This is racy
- return FALSE;
- /*
- int i;
- for (i = source_idx; i < source_idx + length; ++i) {
- MonoObject *elem = mono_array_get (source, MonoObject*, i);
- if (elem && !mono_object_isinst (elem, dest_class))
- return FALSE;
- }
- */
- } else
+ /* It's only safe to copy between arrays if we can ensure the source will always have a subtype of the destination. We bail otherwise. */
+ if (!mono_class_is_subclass_of (src_class, dest_class, FALSE))
return FALSE;
}
if (dest_class->valuetype) {
element_size = mono_array_element_size (source->obj.vtable->klass);
- source_addr = mono_array_addr_with_size (source, element_size, source_idx);
+ source_addr = mono_array_addr_with_size_fast (source, element_size, source_idx);
if (dest_class->has_references) {
mono_value_copy_array (dest, dest_idx, source_addr, length);
} else {
- dest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);
- mono_gc_memmove (dest_addr, source_addr, element_size * length);
+ dest_addr = mono_array_addr_with_size_fast (dest, element_size, dest_idx);
+ mono_gc_memmove_atomic (dest_addr, source_addr, element_size * length);
}
} else {
- mono_array_memcpy_refs (dest, dest_idx, source, source_idx, length);
+ mono_array_memcpy_refs_fast (dest, dest_idx, source, source_idx, length);
}
return TRUE;
@@ -801,7 +769,7 @@ ves_icall_System_Array_GetGenericValueImpl (MonoObject *this, guint32 pos, gpoin
esize = mono_array_element_size (ac);
ea = (gpointer*)((char*)ao->vector + (pos * esize));
- mono_gc_memmove (value, ea, esize);
+ mono_gc_memmove_atomic (value, ea, esize);
}
ICALL_EXPORT void
@@ -830,7 +798,7 @@ ves_icall_System_Array_SetGenericValueImpl (MonoObject *this, guint32 pos, gpoin
if (ec->has_references)
mono_gc_wbarrier_value_copy (ea, value, 1, ec);
else
- mono_gc_memmove (ea, value, esize);
+ mono_gc_memmove_atomic (ea, value, esize);
}
}
@@ -963,6 +931,11 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_SufficientExecutionStac
/* if we have no info we are optimistic and assume there is enough room */
if (!stack_addr)
return TRUE;
+#ifdef HOST_WIN32
+ // FIXME: Windows dynamically extends the stack, so stack_addr might be close
+ // to the current sp
+ return TRUE;
+#endif
current = (guint8 *)&stack_addr;
if (current > stack_addr) {
if ((current - stack_addr) < min_size)
@@ -1147,7 +1120,7 @@ ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray
int i;
mono_gc_wbarrier_generic_store (fields, (MonoObject*) mono_array_new (mono_domain_get (), mono_defaults.object_class, count));
for (i = 0; i < count; ++i)
- mono_array_setref (*fields, i, values [i]);
+ mono_array_setref_fast (*fields, i, values [i]);
return FALSE;
} else {
return TRUE;
@@ -1543,10 +1516,8 @@ ves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, M
mono_class_init_or_throw (klass);
mono_class_init_or_throw (klassc);
} else if (!klass->supertypes || !klassc->supertypes) {
- mono_loader_lock ();
mono_class_setup_supertypes (klass);
mono_class_setup_supertypes (klassc);
- mono_loader_unlock ();
}
if (type->type->byref)
@@ -1588,9 +1559,6 @@ ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType
klass = mono_class_from_mono_type (type->type);
klassc = mono_class_from_mono_type (c->type);
- mono_class_init_or_throw (klass);
- mono_class_init_or_throw (klassc);
-
if (type->type->byref ^ c->type->byref)
return FALSE;
@@ -2702,9 +2670,9 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
* FIXME: Why is this stuff needed at all ? Why can't the code below work for
* the dynamic case as well ?
*/
- mono_loader_lock ();
+ mono_image_lock ((MonoImage*)image);
res = mono_g_hash_table_lookup (image->generic_def_objects, imethod);
- mono_loader_unlock ();
+ mono_image_unlock ((MonoImage*)image);
if (res)
return res;
@@ -5963,10 +5931,12 @@ ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray
struct tm start, tt;
time_t t;
- long int gmtoff;
- int is_daylight = 0, day;
+ long int gmtoff, gmtoff_after, gmtoff_st, gmtoff_ds;
+ int day, transitioned;
char tzone [64];
+ gmtoff_st = gmtoff_ds = transitioned = 0;
+
MONO_ARCH_SAVE_REGS;
MONO_CHECK_ARG_NULL (data);
@@ -6002,13 +5972,15 @@ ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray
gmtoff = gmt_offset (&start, t);
/* For each day of the year, calculate the tm_gmtoff. */
- for (day = 0; day < 365; day++) {
+ for (day = 0; day < 365 && transitioned < 2; day++) {
t += 3600*24;
tt = *localtime (&t);
+ gmtoff_after = gmt_offset(&tt, t);
+
/* Daylight saving starts or ends here. */
- if (gmt_offset (&tt, t) != gmtoff) {
+ if (gmtoff_after != gmtoff) {
struct tm tt1;
time_t t1;
@@ -6028,36 +6000,37 @@ ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray
strftime (tzone, sizeof (tzone), "%Z", &tt);
/* Write data, if we're already in daylight saving, we're done. */
- if (is_daylight) {
- mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
- mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
- return 1;
+ if (tt.tm_isdst) {
+ mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
+ mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
+ if (gmtoff_ds == 0) {
+ gmtoff_st = gmtoff;
+ gmtoff_ds = gmtoff_after;
+ }
+ transitioned++;
} else {
- struct tm end;
time_t te;
+ te = mktime (&tt);
- memset (&end, 0, sizeof (end));
- end.tm_year = year-1900 + 1;
- end.tm_mday = 1;
-
- te = mktime (&end);
-
- mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
- mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
- mono_array_set ((*data), gint64, 1, ((gint64)te + EPOCH_ADJUST) * 10000000L);
- is_daylight = 1;
+ mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
+ if (gmtoff_ds == 0) {
+ gmtoff_st = gmtoff_after;
+ gmtoff_ds = gmtoff;
+ }
+ transitioned++;
}
/* This is only set once when we enter daylight saving. */
- mono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);
- mono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);
-
+ if (tt1.tm_isdst) {
+ mono_array_set ((*data), gint64, 2, (gint64)gmtoff_st * 10000000L);
+ mono_array_set ((*data), gint64, 3, (gint64)(gmtoff_ds - gmtoff_st) * 10000000L);
+ }
gmtoff = gmt_offset (&tt, t);
}
}
- if (!is_daylight) {
+ if (transitioned < 2) {
strftime (tzone, sizeof (tzone), "%Z", &tt);
mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
@@ -6225,7 +6198,7 @@ ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, Mo
if (src != dest)
memcpy (dest_buf, src_buf, count);
else
- mono_gc_memmove (dest_buf, src_buf, count); /* Source and dest are the same array */
+ memmove (dest_buf, src_buf, count); /* Source and dest are the same array */
return TRUE;
}
@@ -6528,6 +6501,8 @@ ves_icall_System_Environment_Exit (int result)
{
MONO_ARCH_SAVE_REGS;
+ mono_environment_exitcode_set (result);
+
/* FIXME: There are some cleanup hangs that should be worked out, but
* if the program is going to exit, everything will be cleaned up when
* NaCl exits anyway.
@@ -7059,7 +7034,7 @@ ves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result,
ICALL_EXPORT MonoBoolean
ves_icall_System_Diagnostics_Debugger_IsAttached_internal (void)
{
- return mono_debug_using_mono_debugger () || mono_is_debugger_attached ();
+ return mono_is_debugger_attached ();
}
ICALL_EXPORT MonoBoolean
@@ -7885,6 +7860,7 @@ icall_symbols [] = {
#endif /* DISABLE_ICALL_TABLES */
+static mono_mutex_t icall_mutex;
static GHashTable *icall_hash = NULL;
static GHashTable *jit_icall_hash_name = NULL;
static GHashTable *jit_icall_hash_addr = NULL;
@@ -7922,6 +7898,19 @@ mono_icall_init (void)
#endif
icall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+ mono_mutex_init (&icall_mutex);
+}
+
+static void
+mono_icall_lock (void)
+{
+ mono_locks_mutex_acquire (&icall_mutex, IcallLock);
+}
+
+static void
+mono_icall_unlock (void)
+{
+ mono_locks_mutex_release (&icall_mutex, IcallLock);
}
void
@@ -7930,16 +7919,17 @@ mono_icall_cleanup (void)
g_hash_table_destroy (icall_hash);
g_hash_table_destroy (jit_icall_hash_name);
g_hash_table_destroy (jit_icall_hash_addr);
+ mono_mutex_destroy (&icall_mutex);
}
void
mono_add_internal_call (const char *name, gconstpointer method)
{
- mono_loader_lock ();
+ mono_icall_lock ();
g_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);
- mono_loader_unlock ();
+ mono_icall_unlock ();
}
#ifndef DISABLE_ICALL_TABLES
@@ -8102,23 +8092,23 @@ mono_lookup_internal_call (MonoMethod *method)
sigstart [siglen + 2] = 0;
g_free (tmpsig);
- mono_loader_lock ();
+ mono_icall_lock ();
res = g_hash_table_lookup (icall_hash, mname);
if (res) {
- mono_loader_unlock ();
+ mono_icall_unlock ();;
return res;
}
/* try without signature */
*sigstart = 0;
res = g_hash_table_lookup (icall_hash, mname);
if (res) {
- mono_loader_unlock ();
+ mono_icall_unlock ();
return res;
}
#ifdef DISABLE_ICALL_TABLES
- mono_loader_unlock ();
+ mono_icall_unlock ();
/* Fail only when the result is actually used */
/* mono_marshal_get_native_wrapper () depends on this */
if (method->klass == mono_defaults.string_class && !strcmp (method->name, ".ctor"))
@@ -8128,19 +8118,19 @@ mono_lookup_internal_call (MonoMethod *method)
#else
/* it wasn't found in the static call tables */
if (!imap) {
- mono_loader_unlock ();
+ mono_icall_unlock ();
return NULL;
}
res = find_method_icall (imap, sigstart - mlen);
if (res) {
- mono_loader_unlock ();
+ mono_icall_unlock ();
return res;
}
/* try _with_ signature */
*sigstart = '(';
res = find_method_icall (imap, sigstart - mlen);
if (res) {
- mono_loader_unlock ();
+ mono_icall_unlock ();
return res;
}
@@ -8152,7 +8142,7 @@ mono_lookup_internal_call (MonoMethod *method)
g_print ("If you see other errors or faults after this message they are probably related\n");
g_print ("and you need to fix your mono install first.\n");
- mono_loader_unlock ();
+ mono_icall_unlock ();
return NULL;
#endif
@@ -8277,20 +8267,24 @@ type_from_typename (char *typename)
return &klass->byval_arg;
}
+/**
+ * LOCKING: Take the corlib image lock.
+ */
MonoMethodSignature*
mono_create_icall_signature (const char *sigstr)
{
gchar **parts;
int i, len;
gchar **tmp;
- MonoMethodSignature *res;
+ MonoMethodSignature *res, *res2;
+ MonoImage *corlib = mono_defaults.corlib;
- mono_loader_lock ();
- res = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);
- if (res) {
- mono_loader_unlock ();
+ mono_image_lock (corlib);
+ res = g_hash_table_lookup (corlib->helper_signatures, sigstr);
+ mono_image_unlock (corlib);
+
+ if (res)
return res;
- }
parts = g_strsplit (sigstr, " ", 256);
@@ -8301,7 +8295,7 @@ mono_create_icall_signature (const char *sigstr)
tmp ++;
}
- res = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);
+ res = mono_metadata_signature_alloc (corlib, len - 1);
res->pinvoke = 1;
#ifdef HOST_WIN32
@@ -8319,9 +8313,13 @@ mono_create_icall_signature (const char *sigstr)
g_strfreev (parts);
- g_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);
-
- mono_loader_unlock ();
+ mono_image_lock (corlib);
+ res2 = g_hash_table_lookup (corlib->helper_signatures, sigstr);
+ if (res2)
+ res = res2; /*Value is allocated in the image pool*/
+ else
+ g_hash_table_insert (corlib->helper_signatures, (gpointer)sigstr, res);
+ mono_image_unlock (corlib);
return res;
}
@@ -8332,9 +8330,9 @@ mono_find_jit_icall_by_name (const char *name)
MonoJitICallInfo *info;
g_assert (jit_icall_hash_name);
- mono_loader_lock ();
+ mono_icall_lock ();
info = g_hash_table_lookup (jit_icall_hash_name, name);
- mono_loader_unlock ();
+ mono_icall_unlock ();
return info;
}
@@ -8344,9 +8342,9 @@ mono_find_jit_icall_by_addr (gconstpointer addr)
MonoJitICallInfo *info;
g_assert (jit_icall_hash_addr);
- mono_loader_lock ();
+ mono_icall_lock ();
info = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);
- mono_loader_unlock ();
+ mono_icall_unlock ();
return info;
}
@@ -8355,7 +8353,7 @@ mono_find_jit_icall_by_addr (gconstpointer addr)
* mono_get_jit_icall_info:
*
* Return the hashtable mapping JIT icall names to MonoJitICallInfo structures. The
- * caller should access it while holding the loader lock.
+ * caller should access it while holding the icall lock.
*/
GHashTable*
mono_get_jit_icall_info (void)
@@ -8374,20 +8372,20 @@ mono_lookup_jit_icall_symbol (const char *name)
MonoJitICallInfo *info;
const char *res = NULL;
- mono_loader_lock ();
+ mono_icall_lock ();
info = g_hash_table_lookup (jit_icall_hash_name, name);
if (info)
res = info->c_symbol;
- mono_loader_unlock ();
+ mono_icall_unlock ();
return res;
}
void
mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
{
- mono_loader_lock ();
+ mono_icall_lock ();
g_hash_table_insert (jit_icall_hash_addr, (gpointer)wrapper, info);
- mono_loader_unlock ();
+ mono_icall_unlock ();
}
MonoJitICallInfo *
@@ -8398,7 +8396,7 @@ mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSi
g_assert (func);
g_assert (name);
- mono_loader_lock ();
+ mono_icall_lock ();
if (!jit_icall_hash_name) {
jit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
@@ -8426,7 +8424,7 @@ mono_register_jit_icall_full (gconstpointer func, const char *name, MonoMethodSi
g_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);
g_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);
- mono_loader_unlock ();
+ mono_icall_unlock ();
return info;
}
diff --git a/mono/metadata/image.c b/mono/metadata/image.c
index 5b40a125c1..dcb5c399a6 100644
--- a/mono/metadata/image.c
+++ b/mono/metadata/image.c
@@ -151,7 +151,16 @@ mono_image_rva_map (MonoImage *image, guint32 addr)
const int top = iinfo->cli_section_count;
MonoSectionTable *tables = iinfo->cli_section_tables;
int i;
-
+
+#ifdef HOST_WIN32
+ if (image->is_module_handle) {
+ if (addr && addr < image->raw_data_len)
+ return image->raw_data + addr;
+ else
+ return NULL;
+ }
+#endif
+
for (i = 0; i < top; i++){
if ((addr >= tables->st_virtual_address) &&
(addr < tables->st_virtual_address + tables->st_raw_data_size)){
@@ -159,10 +168,6 @@ mono_image_rva_map (MonoImage *image, guint32 addr)
if (!mono_image_ensure_section_idx (image, i))
return NULL;
}
-#ifdef HOST_WIN32
- if (image->is_module_handle)
- return image->raw_data + addr;
-#endif
return (char*)iinfo->cli_sections [i] +
(addr - tables->st_virtual_address);
}
@@ -1483,7 +1488,6 @@ mono_image_close_except_pools (MonoImage *image)
MonoImage *image2;
GHashTable *loaded_images;
int i;
- GSList *free_list;
g_return_val_if_fail (image != NULL, FALSE);
@@ -1528,7 +1532,7 @@ mono_image_close_except_pools (MonoImage *image)
mono_image_invoke_unload_hook (image);
- free_list = mono_metadata_clean_for_image (image);
+ mono_metadata_clean_for_image (image);
/*
* The caches inside a MonoImage might refer to metadata which is stored in referenced
@@ -1646,11 +1650,10 @@ mono_image_close_except_pools (MonoImage *image)
free_hash (image->native_wrapper_aot_cache);
free_hash (image->pinvoke_scopes);
free_hash (image->pinvoke_scope_filenames);
+ free_hash (image->gsharedvt_types);
/* The ownership of signatures is not well defined */
- //g_hash_table_foreach (image->memberref_signatures, free_mr_signatures, NULL);
g_hash_table_destroy (image->memberref_signatures);
- //g_hash_table_foreach (image->helper_signatures, free_mr_signatures, NULL);
g_hash_table_destroy (image->helper_signatures);
g_hash_table_destroy (image->method_signatures);
@@ -1660,8 +1663,12 @@ mono_image_close_except_pools (MonoImage *image)
if (image->property_hash)
mono_property_hash_destroy (image->property_hash);
- g_slist_free (image->reflection_info_unregister_classes);
- image->reflection_info_unregister_classes = free_list;
+ /*
+ reflection_info_unregister_classes is only required by dynamic images, which will not be properly
+ cleared during shutdown as we don't perform regular appdomain unload for the root one.
+ */
+ g_assert (!image->reflection_info_unregister_classes || mono_runtime_is_shutting_down ());
+ image->reflection_info_unregister_classes = NULL;
if (image->interface_bitset) {
mono_unload_interface_ids (image->interface_bitset);
@@ -1705,12 +1712,6 @@ void
mono_image_close_finish (MonoImage *image)
{
int i;
- GSList *l;
-
- for (l = image->reflection_info_unregister_classes; l; l = l->next)
- g_free (l->data);
- g_slist_free (image->reflection_info_unregister_classes);
- image->reflection_info_unregister_classes = NULL;
if (image->references && !image->dynamic) {
for (i = 0; i < image->nreferences; i++) {
@@ -2358,3 +2359,13 @@ mono_image_property_remove (MonoImage *image, gpointer subject)
mono_property_hash_remove_object (image->property_hash, subject);
mono_image_unlock (image);
}
+
+void
+mono_image_append_class_to_reflection_info_set (MonoClass *class)
+{
+ MonoImage *image = class->image;
+ g_assert (image->dynamic);
+ mono_image_lock (image);
+ image->reflection_info_unregister_classes = g_slist_prepend_mempool (image->mempool, image->reflection_info_unregister_classes, class);
+ mono_image_unlock (image);
+}
diff --git a/mono/metadata/loader.c b/mono/metadata/loader.c
index fb9f012862..f950055953 100644
--- a/mono/metadata/loader.c
+++ b/mono/metadata/loader.c
@@ -129,6 +129,7 @@ mono_loader_cleanup (void)
static void
set_loader_error (MonoLoaderError *error)
{
+ mono_loader_clear_error ();
mono_native_tls_set_value (loader_error_thread_id, error);
}
@@ -531,13 +532,13 @@ mono_field_from_token (MonoImage *image, guint32 token, MonoClass **retklass,
return result;
}
- mono_loader_lock ();
+ mono_image_lock (image);
if ((field = g_hash_table_lookup (image->field_cache, GUINT_TO_POINTER (token)))) {
*retklass = field->parent;
- mono_loader_unlock ();
+ mono_image_unlock (image);
return field;
}
- mono_loader_unlock ();
+ mono_image_unlock (image);
if (mono_metadata_token_table (token) == MONO_TABLE_MEMBERREF)
field = field_from_memberref (image, token, retklass, context);
@@ -554,10 +555,10 @@ mono_field_from_token (MonoImage *image, guint32 token, MonoClass **retklass,
field = mono_class_get_field (k, token);
}
- mono_loader_lock ();
+ mono_image_lock (image);
if (field && field->parent && !field->parent->generic_class && !field->parent->generic_container)
g_hash_table_insert (image->field_cache, GUINT_TO_POINTER (token), field);
- mono_loader_unlock ();
+ mono_image_unlock (image);
return field;
}
@@ -1811,7 +1812,7 @@ MonoMethod *
mono_get_method_full (MonoImage *image, guint32 token, MonoClass *klass,
MonoGenericContext *context)
{
- MonoMethod *result;
+ MonoMethod *result = NULL;
gboolean used_context = FALSE;
/* We do everything inside the lock to prevent creation races */
@@ -1822,7 +1823,7 @@ mono_get_method_full (MonoImage *image, guint32 token, MonoClass *klass,
if (!image->method_cache)
image->method_cache = g_hash_table_new (NULL, NULL);
result = g_hash_table_lookup (image->method_cache, GINT_TO_POINTER (mono_metadata_token_index (token)));
- } else {
+ } else if (!image->dynamic) {
if (!image->methodref_cache)
image->methodref_cache = g_hash_table_new (NULL, NULL);
result = g_hash_table_lookup (image->methodref_cache, GINT_TO_POINTER (token));
@@ -1832,16 +1833,18 @@ mono_get_method_full (MonoImage *image, guint32 token, MonoClass *klass,
if (result)
return result;
+
result = mono_get_method_from_token (image, token, klass, context, &used_context);
if (!result)
return NULL;
mono_image_lock (image);
if (!used_context && !result->is_inflated) {
- MonoMethod *result2;
+ MonoMethod *result2 = NULL;
+
if (mono_metadata_token_table (token) == MONO_TABLE_METHOD)
result2 = g_hash_table_lookup (image->method_cache, GINT_TO_POINTER (mono_metadata_token_index (token)));
- else
+ else if (!image->dynamic)
result2 = g_hash_table_lookup (image->methodref_cache, GINT_TO_POINTER (token));
if (result2) {
@@ -1851,7 +1854,7 @@ mono_get_method_full (MonoImage *image, guint32 token, MonoClass *klass,
if (mono_metadata_token_table (token) == MONO_TABLE_METHOD)
g_hash_table_insert (image->method_cache, GINT_TO_POINTER (mono_metadata_token_index (token)), result);
- else
+ else if (!image->dynamic)
g_hash_table_insert (image->methodref_cache, GINT_TO_POINTER (token), result);
}
@@ -2252,7 +2255,7 @@ stack_walk_adapter (MonoStackFrameInfo *frame, MonoContext *ctx, gpointer data)
return FALSE;
case FRAME_TYPE_MANAGED:
g_assert (frame->ji);
- return d->func (frame->ji->method, frame->native_offset, frame->il_offset, frame->managed, d->user_data);
+ return d->func (mono_jit_info_get_method (frame->ji), frame->native_offset, frame->il_offset, frame->managed, d->user_data);
break;
default:
g_assert_not_reached ();
diff --git a/mono/metadata/locales.c b/mono/metadata/locales.c
index 1b8be8ade9..7fffad9cc8 100644
--- a/mono/metadata/locales.c
+++ b/mono/metadata/locales.c
@@ -306,28 +306,6 @@ construct_region (MonoRegionInfo *this, const RegionInfoEntry *ri)
return TRUE;
}
-static gboolean
-construct_culture_from_specific_name (MonoCultureInfo *ci, gchar *name)
-{
- const CultureInfoEntry *entry;
- const CultureInfoNameEntry *ne;
-
- MONO_ARCH_SAVE_REGS;
-
- ne = mono_binary_search (name, culture_name_entries, NUM_CULTURE_ENTRIES,
- sizeof (CultureInfoNameEntry), culture_name_locator);
-
- if (ne == NULL)
- return FALSE;
-
- entry = &culture_entries [ne->culture_entry_index];
-
- if (entry)
- return construct_culture (ci, entry);
- else
- return FALSE;
-}
-
static const CultureInfoEntry*
culture_info_entry_from_lcid (int lcid)
{
@@ -356,47 +334,18 @@ region_info_entry_from_lcid (int lcid)
return entry;
}
-/*
- * The following two methods are modified from the ICU source code. (http://oss.software.ibm.com/icu)
- * Copyright (c) 1995-2003 International Business Machines Corporation and others
- * All rights reserved.
- */
-static gchar*
-get_posix_locale (void)
-{
- const gchar* posix_locale = NULL;
-
- posix_locale = g_getenv("LC_ALL");
- if (posix_locale == 0) {
- posix_locale = g_getenv("LANG");
- if (posix_locale == 0) {
- posix_locale = setlocale(LC_ALL, NULL);
- }
- }
-
- if (posix_locale == NULL)
- return NULL;
-
- if ((strcmp ("C", posix_locale) == 0) || (strchr (posix_locale, ' ') != NULL)
- || (strchr (posix_locale, '/') != NULL)) {
- /*
- * HPUX returns 'C C C C C C C'
- * Solaris can return /en_US/C/C/C/C/C on the second try.
- * Maybe we got some garbage.
- */
- return NULL;
- }
-
- return g_strdup (posix_locale);
-}
-
#if defined (__APPLE__)
static gchar*
get_darwin_locale (void)
{
static gchar *darwin_locale = NULL;
CFLocaleRef locale = NULL;
+ CFStringRef locale_language = NULL;
+ CFStringRef locale_country = NULL;
+ CFStringRef locale_script = NULL;
CFStringRef locale_cfstr = NULL;
+ CFIndex bytes_converted;
+ CFIndex bytes_written;
CFIndex len;
int i;
@@ -406,21 +355,51 @@ get_darwin_locale (void)
locale = CFLocaleCopyCurrent ();
if (locale) {
- locale_cfstr = CFLocaleGetIdentifier (locale);
-
- if (locale_cfstr) {
- len = CFStringGetMaximumSizeForEncoding (CFStringGetLength (locale_cfstr), kCFStringEncodingMacRoman) + 1;
- darwin_locale = (char *) malloc (len);
- if (!CFStringGetCString (locale_cfstr, darwin_locale, len, kCFStringEncodingMacRoman)) {
- free (darwin_locale);
- CFRelease (locale);
- darwin_locale = NULL;
- return NULL;
+ locale_language = CFLocaleGetValue (locale, kCFLocaleLanguageCode);
+ if (locale_language != NULL && CFStringGetBytes(locale_language, CFRangeMake (0, CFStringGetLength (locale_language)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len = bytes_converted + 1;
+
+ locale_country = CFLocaleGetValue (locale, kCFLocaleCountryCode);
+ if (locale_country != NULL && CFStringGetBytes (locale_country, CFRangeMake (0, CFStringGetLength (locale_country)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len += bytes_converted + 1;
+
+ locale_script = CFLocaleGetValue (locale, kCFLocaleScriptCode);
+ if (locale_script != NULL && CFStringGetBytes (locale_script, CFRangeMake (0, CFStringGetLength (locale_script)), kCFStringEncodingMacRoman, 0, FALSE, NULL, 0, &bytes_converted) > 0) {
+ len += bytes_converted + 1;
+ }
+
+ darwin_locale = (char *) malloc (len + 1);
+ CFStringGetBytes (locale_language, CFRangeMake (0, CFStringGetLength (locale_language)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) darwin_locale, len, &bytes_converted);
+
+ darwin_locale[bytes_converted] = '-';
+ bytes_written = bytes_converted + 1;
+ if (locale_script != NULL && CFStringGetBytes (locale_script, CFRangeMake (0, CFStringGetLength (locale_script)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) &darwin_locale[bytes_written], len - bytes_written, &bytes_converted) > 0) {
+ darwin_locale[bytes_written + bytes_converted] = '-';
+ bytes_written += bytes_converted + 1;
+ }
+
+ CFStringGetBytes (locale_country, CFRangeMake (0, CFStringGetLength (locale_country)), kCFStringEncodingMacRoman, 0, FALSE, (UInt8 *) &darwin_locale[bytes_written], len - bytes_written, &bytes_converted);
+ darwin_locale[bytes_written + bytes_converted] = '\0';
}
+ }
+
+ if (darwin_locale == NULL) {
+ locale_cfstr = CFLocaleGetIdentifier (locale);
+
+ if (locale_cfstr) {
+ len = CFStringGetMaximumSizeForEncoding (CFStringGetLength (locale_cfstr), kCFStringEncodingMacRoman) + 1;
+ darwin_locale = (char *) malloc (len);
+ if (!CFStringGetCString (locale_cfstr, darwin_locale, len, kCFStringEncodingMacRoman)) {
+ free (darwin_locale);
+ CFRelease (locale);
+ darwin_locale = NULL;
+ return NULL;
+ }
- for (i = 0; i < strlen (darwin_locale); i++)
- if (darwin_locale [i] == '_')
- darwin_locale [i] = '-';
+ for (i = 0; i < strlen (darwin_locale); i++)
+ if (darwin_locale [i] == '_')
+ darwin_locale [i] = '-';
+ }
}
CFRelease (locale);
@@ -430,14 +409,34 @@ get_darwin_locale (void)
}
#endif
-static gchar*
-get_current_locale_name (void)
+static char *
+get_posix_locale (void)
{
- gchar *locale;
- gchar *corrected = NULL;
- const gchar *p;
- gchar *c;
+ const char *locale;
+ locale = g_getenv ("LC_ALL");
+ if (locale == NULL) {
+ locale = g_getenv ("LANG");
+ if (locale == NULL)
+ locale = setlocale (LC_ALL, NULL);
+ }
+ if (locale == NULL)
+ return NULL;
+
+ /* Skip English-only locale 'C' */
+ if (strcmp (locale, "C") == 0)
+ return NULL;
+
+ return g_strdup (locale);
+}
+
+
+static gchar *
+get_current_locale_name (void)
+{
+ char *locale;
+ char *p, *ret;
+
#ifdef HOST_WIN32
locale = g_win32_getlocale ();
#elif defined (__APPLE__)
@@ -446,69 +445,43 @@ get_current_locale_name (void)
locale = get_posix_locale ();
#else
locale = get_posix_locale ();
-#endif
+#endif
if (locale == NULL)
return NULL;
- if ((p = strchr (locale, '.')) != NULL) {
- /* assume new locale can't be larger than old one? */
- corrected = g_malloc (strlen (locale));
- strncpy (corrected, locale, p - locale);
- corrected [p - locale] = 0;
-
- /* do not copy after the @ */
- if ((p = strchr (corrected, '@')) != NULL)
- corrected [p - corrected] = 0;
- }
-
- /* Note that we scan the *uncorrected* ID. */
- if ((p = strrchr (locale, '@')) != NULL) {
-
- /*
- * In Mono we dont handle the '@' modifier because we do
- * not have any cultures that use it. We just trim it
- * off of the end of the name.
- */
-
- if (corrected == NULL) {
- corrected = g_malloc (strlen (locale));
- strncpy (corrected, locale, p - locale);
- corrected [p - locale] = 0;
- }
- }
-
- if (corrected == NULL)
- corrected = locale;
- else
- g_free (locale);
-
- if ((c = strchr (corrected, '_')) != NULL)
- *c = '-';
-
- c = corrected;
- corrected = g_ascii_strdown (c, -1);
- g_free (c);
+ p = strchr (locale, '.');
+ if (p != NULL)
+ *p = 0;
+ p = strchr (locale, '@');
+ if (p != NULL)
+ *p = 0;
+ p = strchr (locale, '_');
+ if (p != NULL)
+ *p = '-';
+
+ ret = g_ascii_strdown (locale, -1);
+ g_free (locale);
- return corrected;
-}
+ return ret;
+}
-MonoBoolean
-ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_current_locale (MonoCultureInfo *ci)
+MonoString*
+ves_icall_System_Globalization_CultureInfo_get_current_locale_name (void)
{
gchar *locale;
- gboolean ret;
+ MonoString* ret;
+ MonoDomain *domain;
MONO_ARCH_SAVE_REGS;
locale = get_current_locale_name ();
if (locale == NULL)
- return FALSE;
+ return NULL;
- ret = construct_culture_from_specific_name (ci, locale);
+ domain = mono_domain_get ();
+ ret = mono_string_new (domain, locale);
g_free (locale);
- ci->is_read_only = TRUE;
- ci->use_user_override = TRUE;
return ret;
}
@@ -550,7 +523,7 @@ ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (
return construct_culture (this, &culture_entries [ne->culture_entry_index]);
}
-
+/*
MonoBoolean
ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name (MonoCultureInfo *ci,
MonoString *name)
@@ -566,7 +539,7 @@ ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specif
return ret;
}
-
+*/
MonoBoolean
ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid (MonoRegionInfo *this,
gint lcid)
diff --git a/mono/metadata/locales.h b/mono/metadata/locales.h
index c0ec106792..7ebdde0133 100644
--- a/mono/metadata/locales.h
+++ b/mono/metadata/locales.h
@@ -27,10 +27,9 @@ typedef enum {
} MonoCompareOptions;
extern void ves_icall_System_Globalization_CultureInfo_construct_internal_locale (MonoCultureInfo *this, MonoString *locale) MONO_INTERNAL;
-extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_current_locale (MonoCultureInfo *ci) MONO_INTERNAL;
+extern MonoString* ves_icall_System_Globalization_CultureInfo_get_current_locale_name (void) MONO_INTERNAL;
extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid (MonoCultureInfo *this, gint lcid) MONO_INTERNAL;
extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name (MonoCultureInfo *this, MonoString *name) MONO_INTERNAL;
-extern MonoBoolean ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name (MonoCultureInfo *ci, MonoString *name) MONO_INTERNAL;
extern MonoArray *ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean neutral, MonoBoolean specific, MonoBoolean installed) MONO_INTERNAL;
extern void ves_icall_System_Globalization_CultureInfo_construct_datetime_format (MonoCultureInfo *this) MONO_INTERNAL;
extern void ves_icall_System_Globalization_CultureInfo_construct_number_format (MonoCultureInfo *this) MONO_INTERNAL;
diff --git a/mono/metadata/lock-tracer.c b/mono/metadata/lock-tracer.c
index d75e9c302c..0f04817ced 100644
--- a/mono/metadata/lock-tracer.c
+++ b/mono/metadata/lock-tracer.c
@@ -24,6 +24,7 @@
#include "lock-tracer.h"
+
/*
* This is a very simple lock trace implementation. It can be used to verify that the runtime is
* correctly following all locking rules.
@@ -48,8 +49,13 @@
#ifdef LOCK_TRACER
+#ifdef TARGET_OSX
+#include <dlfcn.h>
+#endif
+
static FILE *trace_file;
static CRITICAL_SECTION tracer_lock;
+static size_t base_address;
typedef enum {
RECORD_MUST_NOT_HOLD_ANY,
@@ -62,6 +68,8 @@ typedef enum {
void
mono_locks_tracer_init (void)
{
+ Dl_info info;
+ int res;
char *name;
InitializeCriticalSection (&tracer_lock);
if (!g_getenv ("MONO_ENABLE_LOCK_TRACER"))
@@ -69,6 +77,13 @@ mono_locks_tracer_init (void)
name = g_strdup_printf ("locks.%d", getpid ());
trace_file = fopen (name, "w+");
g_free (name);
+
+#ifdef TARGET_OSX
+ res = dladdr ((void*)&mono_locks_tracer_init, &info);
+ /* The 0x1000 offset was found by empirically trying it. */
+ if (res)
+ base_address = (size_t)info.dli_fbase - 0x1000;
+#endif
}
@@ -93,6 +108,7 @@ mono_backtrace (gpointer array[], int traces)
static void
add_record (RecordType record_kind, RuntimeLocks kind, gpointer lock)
{
+ int i = 0;
gpointer frames[10];
char *msg;
if (!trace_file)
@@ -100,6 +116,8 @@ add_record (RecordType record_kind, RuntimeLocks kind, gpointer lock)
memset (frames, 0, sizeof (gpointer));
mono_backtrace (frames, 6);
+ for (i = 0; i < 6; ++i)
+ frames [i] = (gpointer)((size_t)frames[i] - base_address);
/*We only dump 5 frames, which should be more than enough to most analysis.*/
msg = g_strdup_printf ("%x,%d,%d,%p,%p,%p,%p,%p,%p\n", (guint32)GetCurrentThreadId (), record_kind, kind, lock, frames [1], frames [2], frames [3], frames [4], frames [5]);
diff --git a/mono/metadata/lock-tracer.h b/mono/metadata/lock-tracer.h
index 40beac748e..215b683ba4 100644
--- a/mono/metadata/lock-tracer.h
+++ b/mono/metadata/lock-tracer.h
@@ -15,6 +15,9 @@ typedef enum {
DomainLock,
DomainAssembliesLock,
DomainJitCodeHashLock,
+ IcallLock,
+ AssemblyBindingLock,
+ MarshalLock
} RuntimeLocks;
#ifdef LOCK_TRACER
@@ -43,6 +46,15 @@ void mono_locks_lock_released (RuntimeLocks kind, gpointer lock) MONO_INTERNAL;
LeaveCriticalSection (LOCK); \
} while (0)
+#define mono_locks_mutex_acquire(LOCK, NAME) do { \
+ mono_mutex_lock (LOCK); \
+ mono_locks_lock_acquired (NAME, LOCK); \
+} while (0)
+
+#define mono_locks_mutex_release(LOCK, NAME) do { \
+ mono_locks_lock_released (NAME, LOCK); \
+ mono_mutex_unlock (LOCK); \
+} while (0)
G_END_DECLS
#endif /* __MONO_METADATA_LOCK_TRACER_H__ */
diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c
index 02129d8624..9aa3badf70 100644
--- a/mono/metadata/marshal.c
+++ b/mono/metadata/marshal.c
@@ -72,11 +72,12 @@ typedef struct _MonoRemotingMethods MonoRemotingMethods;
/*
* This mutex protects the various marshalling related caches in MonoImage
* and a few other data structures static to this file.
- * Note that when this lock is held it is not possible to take other runtime
- * locks like the loader lock.
+ *
+ * The marshal lock is a non-recursive complex lock that sits below the domain lock in the
+ * runtime locking latice. Which means it can take simple locks suck as the image lock.
*/
-#define mono_marshal_lock() EnterCriticalSection (&marshal_mutex)
-#define mono_marshal_unlock() LeaveCriticalSection (&marshal_mutex)
+#define mono_marshal_lock() mono_locks_acquire (&marshal_mutex, MarshalLock)
+#define mono_marshal_unlock() mono_locks_release (&marshal_mutex, MarshalLock)
static CRITICAL_SECTION marshal_mutex;
static gboolean marshal_mutex_initialized;
@@ -555,10 +556,13 @@ mono_delegate_free_ftnptr (MonoDelegate *delegate)
if (ptr) {
uint32_t gchandle;
void **method_data;
+ MonoMethod *method;
+
ji = mono_jit_info_table_find (mono_domain_get (), mono_get_addr_from_ftnptr (ptr));
g_assert (ji);
- method_data = ((MonoMethodWrapper*)ji->method)->method_data;
+ method = mono_jit_info_get_method (ji);
+ method_data = ((MonoMethodWrapper*)method)->method_data;
/*the target gchandle is the first entry after size and the wrapper itself.*/
gchandle = GPOINTER_TO_UINT (method_data [2]);
@@ -566,7 +570,7 @@ mono_delegate_free_ftnptr (MonoDelegate *delegate)
if (gchandle)
mono_gchandle_free (gchandle);
- mono_runtime_free_method (mono_object_domain (delegate), ji->method);
+ mono_runtime_free_method (mono_object_domain (delegate), method);
}
}
@@ -5206,14 +5210,14 @@ mono_marshal_get_runtime_invoke_dynamic (void)
mono_mb_emit_byte (mb, CEE_RET);
#endif /* DISABLE_JIT */
- mono_loader_lock ();
+ mono_marshal_lock ();
/* double-checked locking */
if (!method) {
method = mono_mb_create_method (mb, csig, 16);
info = mono_wrapper_info_create (method, WRAPPER_SUBTYPE_RUNTIME_INVOKE_DYNAMIC);
mono_marshal_set_wrapper_info (method, info);
}
- mono_loader_unlock ();
+ mono_marshal_unlock ();
mono_mb_free (mb);
@@ -8877,13 +8881,14 @@ mono_marshal_get_native_wrapper (MonoMethod *method, gboolean check_exceptions,
pinvoke = TRUE;
if (!piinfo->addr) {
- if (pinvoke)
+ if (pinvoke) {
if (method->iflags & METHOD_IMPL_ATTRIBUTE_NATIVE)
exc_arg = "Method contains unsupported native code";
- else
+ else if (!aot)
mono_lookup_pinvoke_call (method, &exc_class, &exc_arg);
- else
+ } else {
piinfo->addr = mono_lookup_internal_call (method);
+ }
}
/* hack - redirect certain string constructors to CreateString */
@@ -10458,7 +10463,7 @@ mono_marshal_get_synchronized_wrapper (MonoMethod *method)
clause->flags = MONO_EXCEPTION_CLAUSE_FINALLY;
#endif
- mono_loader_lock ();
+ mono_marshal_lock ();
if (!enter_method) {
MonoMethodDesc *desc;
@@ -10479,7 +10484,7 @@ mono_marshal_get_synchronized_wrapper (MonoMethod *method)
mono_method_desc_free (desc);
}
- mono_loader_unlock ();
+ mono_marshal_unlock ();
#ifndef DISABLE_JIT
/* Push this or the type object */
@@ -11676,7 +11681,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged (MonoArray *s
element_size = mono_array_element_size (src->obj.vtable->klass);
/* no references should be involved */
- source_addr = mono_array_addr_with_size (src, element_size, start_index);
+ source_addr = mono_array_addr_with_size_fast (src, element_size, start_index);
memcpy (dest, source_addr, length * element_size);
}
@@ -11705,7 +11710,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged (gpointer s
element_size = mono_array_element_size (dest->obj.vtable->klass);
/* no references should be involved */
- dest_addr = mono_array_addr_with_size (dest, element_size, start_index);
+ dest_addr = mono_array_addr_with_size_fast (dest, element_size, start_index);
memcpy (dest_addr, src, length * element_size);
}
@@ -12153,7 +12158,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_ReAllocCoTaskMem (gpointer ptr,
void*
ves_icall_System_Runtime_InteropServices_Marshal_UnsafeAddrOfPinnedArrayElement (MonoArray *arrayobj, int index)
{
- return mono_array_addr_with_size (arrayobj, mono_array_element_size (arrayobj->obj.vtable->klass), index);
+ return mono_array_addr_with_size_fast (arrayobj, mono_array_element_size (arrayobj->obj.vtable->klass), index);
}
MonoDelegate*
@@ -12208,12 +12213,8 @@ mono_marshal_load_type_info (MonoClass* klass)
if (!klass->inited)
mono_class_init (klass);
- mono_loader_lock ();
-
- if (klass->marshal_info) {
- mono_loader_unlock ();
+ if (klass->marshal_info)
return klass->marshal_info;
- }
/*
* This function can recursively call itself, so we keep the list of classes which are
@@ -12289,7 +12290,7 @@ mono_marshal_load_type_info (MonoClass* klass)
case TYPE_ATTRIBUTE_EXPLICIT_LAYOUT:
size = mono_marshal_type_size (field->type, info->fields [j].mspec,
&align, TRUE, klass->unicode);
- min_align = packing;
+ min_align = MAX (align, min_align);
info->fields [j].offset = field->offset - sizeof (MonoObject);
info->native_size = MAX (info->native_size, info->fields [j].offset + size);
break;
@@ -12303,9 +12304,12 @@ mono_marshal_load_type_info (MonoClass* klass)
* If the provided Size is equal or larger than the calculated size, and there
* was no Pack attribute, we set min_align to 1 to avoid native_size being increased
*/
- if (layout == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT)
+ if (layout == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) {
if (native_size && native_size == info->native_size && klass->packing_size == 0)
min_align = 1;
+ else
+ min_align = MIN (min_align, packing);
+ }
}
if (info->native_size & (min_align - 1)) {
@@ -12328,12 +12332,13 @@ mono_marshal_load_type_info (MonoClass* klass)
loads_list = g_slist_remove (loads_list, klass);
mono_native_tls_set_value (load_type_info_tls_id, loads_list);
- /*We do double-checking locking on marshal_info */
- mono_memory_barrier ();
-
- klass->marshal_info = info;
-
- mono_loader_unlock ();
+ mono_marshal_lock ();
+ if (!klass->marshal_info) {
+ /*We do double-checking locking on marshal_info */
+ mono_memory_barrier ();
+ klass->marshal_info = info;
+ }
+ mono_marshal_unlock ();
return klass->marshal_info;
}
diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h
index bbf66fbefa..ed403c65dc 100644
--- a/mono/metadata/metadata-internals.h
+++ b/mono/metadata/metadata-internals.h
@@ -44,6 +44,7 @@ struct _MonoType {
#define MONO_PROCESSOR_ARCHITECTURE_X86 2
#define MONO_PROCESSOR_ARCHITECTURE_IA64 3
#define MONO_PROCESSOR_ARCHITECTURE_AMD64 4
+#define MONO_PROCESSOR_ARCHITECTURE_ARM 5
struct _MonoAssemblyName {
const char *name;
@@ -223,7 +224,7 @@ struct _MonoImage {
/*
* Indexed by fielddef and memberref tokens
*/
- GHashTable *field_cache;
+ GHashTable *field_cache; /*protected by the image lock*/
/* indexed by typespec tokens. */
GHashTable *typespec_cache;
@@ -336,6 +337,9 @@ struct _MonoImage {
/* Maps malloc-ed char* pinvoke scope -> malloced-ed char* filename */
GHashTable *pinvoke_scope_filenames;
+ /* Indexed by MonoGenericParam pointers */
+ GHashTable *gsharedvt_types;
+
/*
* No other runtime locks must be taken while holding this lock.
* It's meant to be used only to mutate and query structures part of this image.
@@ -571,6 +575,9 @@ mono_install_image_unload_hook (MonoImageUnloadFunc func, gpointer user_data) MO
void
mono_remove_image_unload_hook (MonoImageUnloadFunc func, gpointer user_data) MONO_INTERNAL;
+void
+mono_image_append_class_to_reflection_info_set (MonoClass *class) MONO_INTERNAL;
+
gpointer
mono_image_set_alloc (MonoImageSet *set, guint size) MONO_INTERNAL;
@@ -585,7 +592,7 @@ mono_image_set_strdup (MonoImageSet *set, const char *s) MONO_INTERNAL;
MonoType*
mono_metadata_get_shared_type (MonoType *type) MONO_INTERNAL;
-GSList*
+void
mono_metadata_clean_for_image (MonoImage *image) MONO_INTERNAL;
void
diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c
index eea4a8cd39..e1452cb77b 100644
--- a/mono/metadata/metadata.c
+++ b/mono/metadata/metadata.c
@@ -2609,11 +2609,11 @@ check_image_sets (MonoImage *image)
}
}
-GSList*
+void
mono_metadata_clean_for_image (MonoImage *image)
{
CleanForImageUserData ginst_data, gclass_data;
- GSList *l, *set_list, *free_list = NULL;
+ GSList *l, *set_list;
//check_image_sets (image);
@@ -2653,8 +2653,6 @@ mono_metadata_clean_for_image (MonoImage *image)
g_slist_free (set_list);
mono_loader_unlock ();
-
- return free_list;
}
static void
@@ -6204,6 +6202,21 @@ mono_signature_is_instance (MonoMethodSignature *sig)
}
/**
+ * mono_signature_param_is_out
+ * @sig: the method signature inspected
+ * @param_num: the 0-based index of the inspected parameter
+ *
+ * Returns: #TRUE if the parameter is an out parameter, #FALSE
+ * otherwise.
+ */
+mono_bool
+mono_signature_param_is_out (MonoMethodSignature *sig, int param_num)
+{
+ g_assert (param_num >= 0 && param_num < sig->param_count);
+ return (sig->params [param_num]->attrs & PARAM_ATTRIBUTE_OUT) != 0;
+}
+
+/**
* mono_signature_explicit_this:
* @sig: the method signature inspected
*
diff --git a/mono/metadata/metadata.h b/mono/metadata/metadata.h
index b9c591bf77..4b880c7bab 100644
--- a/mono/metadata/metadata.h
+++ b/mono/metadata/metadata.h
@@ -379,6 +379,9 @@ mono_signature_is_instance (MonoMethodSignature *sig);
MONO_API mono_bool
mono_signature_explicit_this (MonoMethodSignature *sig);
+MONO_API mono_bool
+mono_signature_param_is_out (MonoMethodSignature *sig, int param_num);
+
MONO_API uint32_t mono_metadata_parse_typedef_or_ref (MonoImage *m,
const char *ptr,
const char **rptr);
diff --git a/mono/metadata/method-builder.c b/mono/metadata/method-builder.c
index 43a5e83933..0ed15e721a 100644
--- a/mono/metadata/method-builder.c
+++ b/mono/metadata/method-builder.c
@@ -116,7 +116,6 @@ mono_mb_free (MonoMethodBuilder *mb)
* Create a MonoMethod from this method builder.
* Returns: the newly created method.
*
- * LOCKING: Takes the loader lock.
*/
MonoMethod *
mono_mb_create_method (MonoMethodBuilder *mb, MonoMethodSignature *signature, int max_stack)
@@ -134,7 +133,6 @@ mono_mb_create_method (MonoMethodBuilder *mb, MonoMethodSignature *signature, in
image = mb->method->klass->image;
- mono_loader_lock (); /*FIXME I think this lock can go.*/
#ifndef DISABLE_JIT
if (mb->dynamic) {
method = mb->method;
@@ -245,7 +243,6 @@ mono_mb_create_method (MonoMethodBuilder *mb, MonoMethodSignature *signature, in
}
#endif
- mono_loader_unlock ();
return method;
}
diff --git a/mono/metadata/monitor.c b/mono/metadata/monitor.c
index b701fb6221..9784437db4 100644
--- a/mono/metadata/monitor.c
+++ b/mono/metadata/monitor.c
@@ -947,7 +947,7 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
mono_mb_emit_byte (mb, CEE_MONO_TLS);
- mono_mb_emit_i4 (mb, thread_tls_offset);
+ mono_mb_emit_i4 (mb, TLS_KEY_THREAD);
mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoInternalThread, tid));
mono_mb_emit_byte (mb, CEE_ADD);
mono_mb_emit_byte (mb, CEE_LDIND_I);
@@ -1109,7 +1109,7 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
mono_mb_emit_byte (mb, CEE_LDIND_I);
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
mono_mb_emit_byte (mb, CEE_MONO_TLS);
- mono_mb_emit_i4 (mb, thread_tls_offset);
+ mono_mb_emit_i4 (mb, TLS_KEY_THREAD);
mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoInternalThread, tid));
mono_mb_emit_byte (mb, CEE_ADD);
mono_mb_emit_byte (mb, CEE_LDIND_I);
diff --git a/mono/metadata/mono-cq.c b/mono/metadata/mono-cq.c
index 3ab5bf6ffe..c2bf26db94 100644
--- a/mono/metadata/mono-cq.c
+++ b/mono/metadata/mono-cq.c
@@ -82,7 +82,7 @@ mono_cq_destroy (MonoCQ *cq)
if (!cq)
return;
- mono_gc_bzero (cq, sizeof (MonoCQ));
+ mono_gc_bzero_aligned (cq, sizeof (MonoCQ));
MONO_GC_UNREGISTER_ROOT (cq->tail);
MONO_GC_UNREGISTER_ROOT (cq->head);
g_free (cq);
@@ -132,9 +132,9 @@ mono_cqitem_try_enqueue (MonoCQ *cq, MonoObject *obj)
}
if (InterlockedCompareExchange (&queue->last, pos + 1, pos) == pos) {
- mono_array_setref (queue->array, pos, obj);
+ mono_array_setref_fast (queue->array, pos, obj);
STORE_STORE_FENCE;
- mono_array_set (queue->array_state, char, pos, TRUE);
+ mono_array_set_fast (queue->array_state, char, pos, TRUE);
if ((pos + 1) == CQ_ARRAY_SIZE) {
CQ_DEBUG ("enqueue(): pos + 1 == CQ_ARRAY_SIZE, %d. Adding node.", CQ_ARRAY_SIZE);
mono_cq_add_node (cq);
diff --git a/mono/metadata/mono-debug-debugger.c b/mono/metadata/mono-debug-debugger.c
index 929c3fbb20..2891c2eb46 100644
--- a/mono/metadata/mono-debug-debugger.c
+++ b/mono/metadata/mono-debug-debugger.c
@@ -29,11 +29,6 @@
static guint32 debugger_lock_level = 0;
static CRITICAL_SECTION debugger_lock_mutex;
-static gboolean mono_debugger_use_debugger = FALSE;
-static MonoObject *last_exception = NULL;
-volatile gint32 _mono_debugger_interruption_request = 0;
-
-void (*mono_debugger_event_handler) (MonoDebuggerEvent event, guint64 data, guint64 arg) = NULL;
typedef struct
{
@@ -42,24 +37,6 @@ typedef struct
MonoDebugMethodAddressList *address_list;
} MethodBreakpointInfo;
-typedef struct {
- MonoImage *image;
- guint64 index;
- guint32 token;
- gchar *name_space;
- gchar *name;
-} ClassInitCallback;
-
-typedef struct {
- guint32 id;
- guint32 shadow_path_len;
- gchar *shadow_path;
- MonoDomain *domain;
- MonoAppDomainSetup *setup;
-} AppDomainSetupInfo;
-
-static GPtrArray *class_init_callbacks = NULL;
-
static int initialized = 0;
void
@@ -79,64 +56,12 @@ mono_debugger_unlock (void)
}
void
-mono_debugger_initialize (gboolean use_debugger)
+mono_debugger_initialize ()
{
- MONO_GC_REGISTER_ROOT_SINGLE (last_exception);
-
- g_assert (!mono_debugger_use_debugger);
-
InitializeCriticalSection (&debugger_lock_mutex);
- mono_debugger_use_debugger = use_debugger;
initialized = 1;
}
-void
-mono_debugger_event (MonoDebuggerEvent event, guint64 data, guint64 arg)
-{
- if (mono_debugger_event_handler)
- (* mono_debugger_event_handler) (event, data, arg);
-}
-
-void
-mono_debugger_event_create_appdomain (MonoDomain *domain, gchar *shadow_path)
-{
- AppDomainSetupInfo info;
-
- info.id = mono_domain_get_id (domain);
- info.shadow_path_len = shadow_path ? strlen (shadow_path) : 0;
- info.shadow_path = shadow_path;
-
- info.domain = domain;
- info.setup = domain->setup;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_CREATE_APPDOMAIN, (guint64) (gsize) &info, 0);
-}
-
-void
-mono_debugger_event_unload_appdomain (MonoDomain *domain)
-{
- mono_debugger_event (MONO_DEBUGGER_EVENT_UNLOAD_APPDOMAIN,
- (guint64) (gsize) domain, (guint64) mono_domain_get_id (domain));
-}
-
-void
-mono_debugger_cleanup (void)
-{
- mono_debugger_event (MONO_DEBUGGER_EVENT_FINALIZE_MANAGED_CODE, 0, 0);
- mono_debugger_event_handler = NULL;
-}
-
-void
-mono_debugger_check_interruption (void)
-{
- if (!_mono_debugger_interruption_request)
- return;
-
- mono_debugger_lock ();
- mono_debugger_event (MONO_DEBUGGER_EVENT_INTERRUPTION_REQUEST, 0, 0);
- mono_debugger_unlock ();
-}
-
/*
* Debugger breakpoint interface.
*
@@ -188,138 +113,3 @@ mono_debugger_remove_method_breakpoint (guint64 index)
return 0;
}
-
-void
-mono_debugger_check_breakpoints (MonoMethod *method, MonoDebugMethodAddress *debug_info)
-{
- int i;
-
- if (method->is_inflated)
- method = ((MonoMethodInflated *) method)->declaring;
-
- if (method_breakpoints) {
- for (i = 0; i < method_breakpoints->len; i++) {
- MethodBreakpointInfo *info = g_ptr_array_index (method_breakpoints, i);
-
- if (method != info->method)
- continue;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_JIT_BREAKPOINT,
- (guint64) (gsize) debug_info, info->index);
- }
- }
-
- if (class_init_callbacks) {
- for (i = 0; i < class_init_callbacks->len; i++) {
- ClassInitCallback *info = g_ptr_array_index (class_init_callbacks, i);
-
- if ((method->token != info->token) || (method->klass->image != info->image))
- continue;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_JIT_BREAKPOINT,
- (guint64) (gsize) debug_info, info->index);
- }
- }
-}
-
-MonoClass *
-mono_debugger_register_class_init_callback (MonoImage *image, const gchar *full_name,
- guint32 method_token, guint32 index)
-{
- ClassInitCallback *info;
- MonoClass *klass;
- gchar *name_space, *name, *pos;
-
- name = g_strdup (full_name);
-
- pos = strrchr (name, '.');
- if (pos) {
- name_space = name;
- *pos = 0;
- name = pos + 1;
- } else {
- name_space = NULL;
- }
-
- mono_loader_lock ();
-
- klass = mono_class_from_name (image, name_space ? name_space : "", name);
-
- info = g_new0 (ClassInitCallback, 1);
- info->image = image;
- info->index = index;
- info->token = method_token;
- info->name_space = name_space;
- info->name = name;
-
- if (!class_init_callbacks)
- class_init_callbacks = g_ptr_array_new ();
-
- g_ptr_array_add (class_init_callbacks, info);
- mono_loader_unlock ();
- return klass;
-}
-
-void
-mono_debugger_remove_class_init_callback (int index)
-{
- int i;
-
- if (!class_init_callbacks)
- return;
-
- for (i = 0; i < class_init_callbacks->len; i++) {
- ClassInitCallback *info = g_ptr_array_index (class_init_callbacks, i);
-
- if (info->index != index)
- continue;
-
- g_ptr_array_remove (class_init_callbacks, info);
- if (info->name_space)
- g_free (info->name_space);
- else
- g_free (info->name);
- g_free (info);
- }
-}
-
-void
-mono_debugger_class_initialized (MonoClass *klass)
-{
- int i;
-
- if (!class_init_callbacks)
- return;
-
- again:
- for (i = 0; i < class_init_callbacks->len; i++) {
- ClassInitCallback *info = g_ptr_array_index (class_init_callbacks, i);
-
- if (info->name_space && strcmp (info->name_space, klass->name_space))
- continue;
- if (strcmp (info->name, klass->name))
- continue;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_CLASS_INITIALIZED,
- (guint64) (gsize) klass, info->index);
-
- if (info->token) {
- int j;
-
- for (j = 0; j < klass->method.count; j++) {
- if (klass->methods [j]->token != info->token)
- continue;
-
- mono_debugger_insert_method_breakpoint (klass->methods [j], info->index);
- }
- }
-
- g_ptr_array_remove (class_init_callbacks, info);
- if (info->name_space)
- g_free (info->name_space);
- else
- g_free (info->name);
- g_free (info);
- goto again;
- }
-}
diff --git a/mono/metadata/mono-debug-debugger.h b/mono/metadata/mono-debug-debugger.h
index 838b7ef4fa..b8d13b6eec 100644
--- a/mono/metadata/mono-debug-debugger.h
+++ b/mono/metadata/mono-debug-debugger.h
@@ -7,85 +7,23 @@
#ifndef __MONO_DEBUG_DEBUGGER_H__
#define __MONO_DEBUG_DEBUGGER_H__
-#include <glib.h>
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/debug-mono-symfile.h>
-#include <mono/utils/mono-codeman.h>
-#include <mono/io-layer/io-layer.h>
+#include <mono/utils/mono-compiler.h>
-typedef enum {
- MONO_DEBUGGER_EVENT_INITIALIZE_MANAGED_CODE = 1,
- MONO_DEBUGGER_EVENT_INITIALIZE_CORLIB,
- MONO_DEBUGGER_EVENT_JIT_BREAKPOINT,
- MONO_DEBUGGER_EVENT_INITIALIZE_THREAD_MANAGER,
- MONO_DEBUGGER_EVENT_ACQUIRE_GLOBAL_THREAD_LOCK,
- MONO_DEBUGGER_EVENT_RELEASE_GLOBAL_THREAD_LOCK,
- MONO_DEBUGGER_EVENT_WRAPPER_MAIN,
- MONO_DEBUGGER_EVENT_MAIN_EXITED,
- MONO_DEBUGGER_EVENT_UNHANDLED_EXCEPTION,
- MONO_DEBUGGER_EVENT_THROW_EXCEPTION,
- MONO_DEBUGGER_EVENT_HANDLE_EXCEPTION,
- MONO_DEBUGGER_EVENT_THREAD_CREATED,
- MONO_DEBUGGER_EVENT_THREAD_CLEANUP,
- MONO_DEBUGGER_EVENT_GC_THREAD_CREATED,
- MONO_DEBUGGER_EVENT_GC_THREAD_EXITED,
- MONO_DEBUGGER_EVENT_REACHED_MAIN,
- MONO_DEBUGGER_EVENT_FINALIZE_MANAGED_CODE,
- MONO_DEBUGGER_EVENT_LOAD_MODULE,
- MONO_DEBUGGER_EVENT_UNLOAD_MODULE,
- MONO_DEBUGGER_EVENT_DOMAIN_CREATE,
- MONO_DEBUGGER_EVENT_DOMAIN_UNLOAD,
- MONO_DEBUGGER_EVENT_CLASS_INITIALIZED,
- MONO_DEBUGGER_EVENT_INTERRUPTION_REQUEST,
- MONO_DEBUGGER_EVENT_CREATE_APPDOMAIN,
- MONO_DEBUGGER_EVENT_UNLOAD_APPDOMAIN,
- /* Obsolete, only for backwards compatibility with older debugger versions */
- MONO_DEBUGGER_EVENT_OLD_TRAMPOLINE = 256,
+void mono_debugger_initialize (void) MONO_INTERNAL;
- MONO_DEBUGGER_EVENT_TRAMPOLINE = 512
-} MonoDebuggerEvent;
+void mono_debugger_lock (void) MONO_INTERNAL;
+void mono_debugger_unlock (void) MONO_INTERNAL;
-extern volatile gint32 _mono_debugger_interruption_request;
+gchar *
+mono_debugger_check_runtime_version (const char *filename) MONO_INTERNAL;
-extern void (*mono_debugger_event_handler) (MonoDebuggerEvent event, guint64 data, guint64 arg);
+MonoDebugMethodAddressList *
+mono_debugger_insert_method_breakpoint (MonoMethod *method, guint64 idx) MONO_INTERNAL;
-MONO_API void mono_debugger_initialize (gboolean use_debugger);
-MONO_API void mono_debugger_cleanup (void);
-
-MONO_API void mono_debugger_lock (void);
-MONO_API void mono_debugger_unlock (void);
-MONO_API void mono_debugger_event (MonoDebuggerEvent event, guint64 data, guint64 arg);
-
-MONO_API gchar *
-mono_debugger_check_runtime_version (const char *filename);
-
-MONO_API void
-mono_debugger_class_initialized (MonoClass *klass);
-
-MONO_API void
-mono_debugger_check_interruption (void);
-
-MONO_API void
-mono_debugger_event_create_appdomain (MonoDomain *domain, gchar *shadow_path);
-
-MONO_API void
-mono_debugger_event_unload_appdomain (MonoDomain *domain);
-
-MONO_API MonoDebugMethodAddressList *
-mono_debugger_insert_method_breakpoint (MonoMethod *method, guint64 idx);
-
-MONO_API int
-mono_debugger_remove_method_breakpoint (guint64 index);
-
-MONO_API void
-mono_debugger_check_breakpoints (MonoMethod *method, MonoDebugMethodAddress *debug_info);
-
-MONO_API MonoClass *
-mono_debugger_register_class_init_callback (MonoImage *image, const gchar *full_name,
- guint32 token, guint32 index);
-
-MONO_API void
-mono_debugger_remove_class_init_callback (int index);
+int
+mono_debugger_remove_method_breakpoint (guint64 index) MONO_INTERNAL;
#endif /* __MONO_DEBUG_DEBUGGER_H__ */
diff --git a/mono/metadata/mono-debug.c b/mono/metadata/mono-debug.c
index 6eff0ecbda..df012ee827 100644
--- a/mono/metadata/mono-debug.c
+++ b/mono/metadata/mono-debug.c
@@ -106,10 +106,9 @@ typedef struct {
guint32 size;
} MonoDebugDelegateTrampolineEntry;
-MonoSymbolTable *mono_symbol_table = NULL;
-MonoDebugFormat mono_debug_format = MONO_DEBUG_FORMAT_NONE;
-gint32 mono_debug_debugger_version = 5;
-gint32 _mono_debug_using_mono_debugger = 0;
+static MonoSymbolTable *mono_symbol_table = NULL;
+static MonoDebugFormat mono_debug_format = MONO_DEBUG_FORMAT_NONE;
+static gint32 mono_debug_debugger_version = 5;
static gboolean mono_debug_initialized = FALSE;
static GHashTable *mono_debug_handles = NULL;
@@ -129,7 +128,6 @@ static MonoDebugHandle *open_symfile_from_bundle (MonoImage *image);
void _mono_debug_init_corlib (MonoDomain *domain);
extern void (*mono_debugger_class_init_func) (MonoClass *klass);
-extern void (*mono_debugger_class_loaded_methods_func) (MonoClass *klass);
static MonoDebugDataTable *
create_data_table (MonoDomain *domain)
@@ -228,9 +226,9 @@ void
mono_debug_init (MonoDebugFormat format)
{
g_assert (!mono_debug_initialized);
+ if (format == MONO_DEBUG_FORMAT_DEBUGGER)
+ g_error ("The mdb debugger is no longer supported.");
- if (_mono_debug_using_mono_debugger)
- format = MONO_DEBUG_FORMAT_DEBUGGER;
mono_debug_initialized = TRUE;
mono_debug_format = format;
@@ -241,7 +239,7 @@ mono_debug_init (MonoDebugFormat format)
*/
mono_gc_base_init ();
- mono_debugger_initialize (_mono_debug_using_mono_debugger);
+ mono_debugger_initialize ();
mono_debugger_lock ();
@@ -256,8 +254,8 @@ mono_debug_init (MonoDebugFormat format)
data_table_hash = g_hash_table_new_full (
NULL, NULL, NULL, (GDestroyNotify) free_data_table);
+ /* FIXME this is a disgusting hack. Kill it */
mono_debugger_class_init_func = mono_debug_add_type;
- mono_debugger_class_loaded_methods_func = mono_debugger_class_initialized;
mono_install_assembly_load_hook (mono_debug_add_assembly, NULL);
mono_symbol_table->global_data_table = create_data_table (NULL);
@@ -267,6 +265,7 @@ mono_debug_init (MonoDebugFormat format)
/*
* INTERNAL USE ONLY !
+ * FIXME this can have a decent name and exist in an internal header
*/
void
_mono_debug_init_corlib (MonoDomain *domain)
@@ -275,8 +274,6 @@ _mono_debug_init_corlib (MonoDomain *domain)
return;
mono_symbol_table->corlib = mono_debug_open_image (mono_defaults.corlib, NULL, 0);
- mono_debugger_event (MONO_DEBUGGER_EVENT_INITIALIZE_CORLIB,
- (guint64) (gsize) mono_symbol_table->corlib, 0);
}
void
@@ -288,13 +285,6 @@ mono_debug_open_image_from_memory (MonoImage *image, const guint8 *raw_contents,
mono_debug_open_image (image, raw_contents, size);
}
-
-gboolean
-mono_debug_using_mono_debugger (void)
-{
- return _mono_debug_using_mono_debugger;
-}
-
void
mono_debug_cleanup (void)
{
@@ -328,9 +318,6 @@ mono_debug_domain_create (MonoDomain *domain)
table = create_data_table (domain);
- mono_debugger_event (MONO_DEBUGGER_EVENT_DOMAIN_CREATE, (guint64) (gsize) table,
- mono_domain_get_id (domain));
-
mono_debugger_unlock ();
}
@@ -352,9 +339,6 @@ mono_debug_domain_unload (MonoDomain *domain)
return;
}
- mono_debugger_event (MONO_DEBUGGER_EVENT_DOMAIN_UNLOAD, (guint64) (gsize) table,
- mono_domain_get_id (domain));
-
g_hash_table_remove (data_table_hash, domain);
mono_debugger_unlock ();
@@ -385,9 +369,6 @@ mono_debug_close_image (MonoImage *image)
return;
}
- mono_debugger_event (MONO_DEBUGGER_EVENT_UNLOAD_MODULE, (guint64) (gsize) handle,
- handle->index);
-
mono_debug_list_remove (&mono_symbol_table->symbol_files, handle);
g_hash_table_remove (mono_debug_handles, image);
@@ -420,16 +401,12 @@ mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size)
handle->type_table = create_data_table (NULL);
handle->symfile = mono_debug_open_mono_symbols (
- handle, raw_contents, size, _mono_debug_using_mono_debugger);
+ handle, raw_contents, size, FALSE);
mono_debug_list_add (&mono_symbol_table->symbol_files, handle);
g_hash_table_insert (mono_debug_handles, image, handle);
- if (mono_symbol_table->corlib)
- mono_debugger_event (MONO_DEBUGGER_EVENT_LOAD_MODULE,
- (guint64) (gsize) handle, 0);
-
mono_debugger_unlock ();
return handle;
@@ -1301,3 +1278,14 @@ open_symfile_from_bundle (MonoImage *image)
return NULL;
}
+
+/**
+ * mono_debug_enabled:
+ *
+ * Returns true is debug information is enabled. This doesn't relate if a debugger is present or not.
+ */
+mono_bool
+mono_debug_enabled (void)
+{
+ return mono_debug_format != MONO_DEBUG_FORMAT_NONE;
+}
diff --git a/mono/metadata/mono-debug.h b/mono/metadata/mono-debug.h
index 5f8b025814..2106a6f3e5 100644
--- a/mono/metadata/mono-debug.h
+++ b/mono/metadata/mono-debug.h
@@ -36,6 +36,7 @@ typedef struct _MonoDebugList MonoDebugList;
typedef enum {
MONO_DEBUG_FORMAT_NONE,
MONO_DEBUG_FORMAT_MONO,
+ /* Deprecated, the mdb debugger is not longer supported. */
MONO_DEBUG_FORMAT_DEBUGGER
} MonoDebugFormat;
@@ -104,6 +105,8 @@ struct _MonoDebugSourceLocation {
uint32_t il_offset;
};
+MONO_API mono_bool mono_debug_enabled (void);
+
/*
* These bits of the MonoDebugLocalInfo's "index" field are flags specifying
* where the variable is actually stored.
@@ -146,11 +149,6 @@ struct _MonoDebugVarInfo {
#define MONO_DEBUGGER_MINOR_VERSION 6
#define MONO_DEBUGGER_MAGIC 0x7aff65af4253d427ULL
-extern MonoSymbolTable *mono_symbol_table;
-extern MonoDebugFormat mono_debug_format;
-extern int32_t mono_debug_debugger_version;
-extern int32_t _mono_debug_using_mono_debugger;
-
MONO_API void mono_debug_list_add (MonoDebugList **list, const void* data);
MONO_API void mono_debug_list_remove (MonoDebugList **list, const void* data);
@@ -163,8 +161,6 @@ MONO_API void mono_debug_close_image (MonoImage *image);
MONO_API void mono_debug_domain_unload (MonoDomain *domain);
MONO_API void mono_debug_domain_create (MonoDomain *domain);
-MONO_API mono_bool mono_debug_using_mono_debugger (void);
-
MONO_API MonoDebugMethodAddress *
mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDomain *domain);
diff --git a/mono/metadata/mono-hash.h b/mono/metadata/mono-hash.h
index b5491f3305..9d382f1547 100644
--- a/mono/metadata/mono-hash.h
+++ b/mono/metadata/mono-hash.h
@@ -11,6 +11,7 @@
#ifndef __MONO_G_HASH_H__
#define __MONO_G_HASH_H__
+MONO_BEGIN_DECLS
/* do not change the values of this enum */
typedef enum {
MONO_HASH_CONSERVATIVE_GC,
@@ -37,4 +38,5 @@ MONO_API void mono_g_hash_table_insert (MonoGHashTable *h, gpointer
MONO_API void mono_g_hash_table_replace (MonoGHashTable *h, gpointer k, gpointer v);
MONO_API void mono_g_hash_table_print_stats (MonoGHashTable *table);
+MONO_END_DECLS
#endif /* __MONO_G_HASH_H__ */
diff --git a/mono/metadata/mono-ptr-array.h b/mono/metadata/mono-ptr-array.h
index a828f4e9f4..1fc166ef5c 100644
--- a/mono/metadata/mono-ptr-array.h
+++ b/mono/metadata/mono-ptr-array.h
@@ -41,7 +41,7 @@ typedef struct {
#define mono_ptr_array_append(ARRAY, VALUE) do { \
if ((ARRAY).size >= (ARRAY).capacity) {\
void *__tmp = mono_gc_alloc_fixed (sizeof (void*) * (ARRAY).capacity * 2, mono_gc_make_root_descr_all_refs ((ARRAY).capacity * 2)); \
- mono_gc_memmove (__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \
+ mono_gc_memmove_aligned (__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \
if ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \
mono_gc_free_fixed ((ARRAY).data); \
(ARRAY).data = __tmp; \
@@ -68,7 +68,7 @@ typedef struct {
#define mono_ptr_array_clear(ARRAY) do { \
(ARRAY).size = 0; \
- mono_gc_bzero ((ARRAY).data, (ARRAY).capacity * sizeof (void*)); \
+ mono_gc_bzero_aligned ((ARRAY).data, (ARRAY).capacity * sizeof (void*)); \
} while (0)
#endif
diff --git a/mono/metadata/mono-wsq.c b/mono/metadata/mono-wsq.c
index 157b529fe9..7a9d2258d1 100644
--- a/mono/metadata/mono-wsq.c
+++ b/mono/metadata/mono-wsq.c
@@ -133,7 +133,7 @@ mono_wsq_local_push (void *obj)
for (i = 0; i < length; i++)
mono_array_setref (new_array, i, mono_array_get (wsq->queue, MonoObject*, (i + head) & wsq->mask));
- mono_gc_bzero (mono_array_addr (wsq->queue, MonoObject *, 0), sizeof (MonoObject*) * length);
+ mono_gc_bzero_aligned (mono_array_addr (wsq->queue, MonoObject *, 0), sizeof (MonoObject*) * length);
wsq->queue = new_array;
wsq->head = 0;
wsq->tail = tail = count;
diff --git a/mono/metadata/null-gc.c b/mono/metadata/null-gc.c
index 13446ee0ec..86a2528b09 100644
--- a/mono/metadata/null-gc.c
+++ b/mono/metadata/null-gc.c
@@ -193,6 +193,12 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
}
void
+mono_gc_wbarrier_generic_store_atomic (gpointer ptr, MonoObject *value)
+{
+ InterlockedWritePointer (ptr, value);
+}
+
+void
mono_gc_wbarrier_generic_nostore (gpointer ptr)
{
}
diff --git a/mono/metadata/object-internals.h b/mono/metadata/object-internals.h
index a856c1cfa6..d969533904 100644
--- a/mono/metadata/object-internals.h
+++ b/mono/metadata/object-internals.h
@@ -194,6 +194,27 @@ struct _MonoString {
#define mono_array_length_fast(array) ((array)->max_length)
#define mono_array_addr_with_size_fast(array,size,index) ( ((char*)(array)->vector) + (size) * (index) )
+#define mono_array_addr_fast(array,type,index) ((type*)(void*) mono_array_addr_with_size_fast (array, sizeof (type), index))
+#define mono_array_get_fast(array,type,index) ( *(type*)mono_array_addr_fast ((array), type, (index)) )
+#define mono_array_set_fast(array,type,index,value) \
+ do { \
+ type *__p = (type *) mono_array_addr_fast ((array), type, (index)); \
+ *__p = (value); \
+ } while (0)
+#define mono_array_setref_fast(array,index,value) \
+ do { \
+ void **__p = (void **) mono_array_addr_fast ((array), void*, (index)); \
+ mono_gc_wbarrier_set_arrayref ((array), __p, (MonoObject*)(value)); \
+ /* *__p = (value);*/ \
+ } while (0)
+#define mono_array_memcpy_refs_fast(dest,destidx,src,srcidx,count) \
+ do { \
+ void **__p = (void **) mono_array_addr_fast ((dest), void*, (destidx)); \
+ void **__s = mono_array_addr_fast ((src), void*, (srcidx)); \
+ mono_gc_wbarrier_arrayref_copy (__p, __s, (count)); \
+ } while (0)
+
+
typedef struct {
MonoObject obj;
MonoObject *identity;
diff --git a/mono/metadata/object.c b/mono/metadata/object.c
index c7606bf4d4..a039e9e0df 100644
--- a/mono/metadata/object.c
+++ b/mono/metadata/object.c
@@ -1311,6 +1311,7 @@ build_imt_slots (MonoClass *klass, MonoVTable *vt, MonoDomain *domain, gpointer*
if (mono_class_has_variant_generic_params (iface))
has_variant_iface = TRUE;
+ mono_class_setup_methods (iface);
vt_slot = interface_offset;
for (method_slot_in_interface = 0; method_slot_in_interface < iface->method.count; method_slot_in_interface++) {
MonoMethod *method;
@@ -2013,7 +2014,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean
bitmap = default_bitmap;
} else if (mono_type_is_struct (field->type)) {
fclass = mono_class_from_mono_type (field->type);
- bitmap = compute_class_bitmap (fclass, default_bitmap, sizeof (default_bitmap) * 8, 0, &max_set, FALSE);
+ bitmap = compute_class_bitmap (fclass, default_bitmap, sizeof (default_bitmap) * 8, - (int)(sizeof (MonoObject) / sizeof (gpointer)), &max_set, FALSE);
numbits = max_set + 1;
} else {
default_bitmap [0] = 0;
@@ -2969,7 +2970,7 @@ handle_enum:
MonoClass *class = mono_class_from_mono_type (type);
int size = mono_class_value_size (class, NULL);
if (value == NULL)
- mono_gc_bzero (dest, size);
+ mono_gc_bzero_atomic (dest, size);
else
mono_gc_wbarrier_value_copy (dest, value, 1, class);
}
@@ -3418,9 +3419,9 @@ mono_nullable_init (guint8 *buf, MonoObject *value, MonoClass *klass)
if (param_class->has_references)
mono_gc_wbarrier_value_copy (buf + klass->fields [0].offset - sizeof (MonoObject), mono_object_unbox (value), 1, param_class);
else
- mono_gc_memmove (buf + klass->fields [0].offset - sizeof (MonoObject), mono_object_unbox (value), mono_class_value_size (param_class, NULL));
+ mono_gc_memmove_atomic (buf + klass->fields [0].offset - sizeof (MonoObject), mono_object_unbox (value), mono_class_value_size (param_class, NULL));
} else {
- mono_gc_bzero (buf + klass->fields [0].offset - sizeof (MonoObject), mono_class_value_size (param_class, NULL));
+ mono_gc_bzero_atomic (buf + klass->fields [0].offset - sizeof (MonoObject), mono_class_value_size (param_class, NULL));
}
}
@@ -3448,7 +3449,7 @@ mono_nullable_box (guint8 *buf, MonoClass *klass)
if (param_class->has_references)
mono_gc_wbarrier_value_copy (mono_object_unbox (o), buf + klass->fields [0].offset - sizeof (MonoObject), 1, param_class);
else
- mono_gc_memmove (mono_object_unbox (o), buf + klass->fields [0].offset - sizeof (MonoObject), mono_class_value_size (param_class, NULL));
+ mono_gc_memmove_atomic (mono_object_unbox (o), buf + klass->fields [0].offset - sizeof (MonoObject), mono_class_value_size (param_class, NULL));
return o;
}
else
@@ -4046,8 +4047,6 @@ mono_runtime_exec_main (MonoMethod *method, MonoArray *args, MonoObject **exc)
}
mono_thread_init_apartment_state ();
- mono_debugger_event (MONO_DEBUGGER_EVENT_REACHED_MAIN, 0, 0);
-
/* FIXME: check signature of method */
if (mono_method_signature (method)->ret->type == MONO_TYPE_I4) {
MonoObject *res;
@@ -4073,8 +4072,6 @@ mono_runtime_exec_main (MonoMethod *method, MonoArray *args, MonoObject **exc)
}
}
- mono_debugger_event (MONO_DEBUGGER_EVENT_MAIN_EXITED, (guint64) (gsize) rval, 0);
-
return rval;
}
@@ -4594,7 +4591,7 @@ mono_object_clone (MonoObject *obj)
} else {
int size = obj->vtable->klass->instance_size;
/* do not copy the sync state */
- mono_gc_memmove ((char*)o + sizeof (MonoObject), (char*)obj + sizeof (MonoObject), size - sizeof (MonoObject));
+ mono_gc_memmove_atomic ((char*)o + sizeof (MonoObject), (char*)obj + sizeof (MonoObject), size - sizeof (MonoObject));
}
if (G_UNLIKELY (profile_allocs))
mono_profiler_allocation (o, obj->vtable->klass);
@@ -4627,14 +4624,14 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest)
#ifdef HAVE_SGEN_GC
if (klass->element_class->valuetype) {
if (klass->element_class->has_references)
- mono_value_copy_array (dest, 0, mono_array_addr_with_size (src, 0, 0), mono_array_length (src));
+ mono_value_copy_array (dest, 0, mono_array_addr_with_size_fast (src, 0, 0), mono_array_length (src));
else
- mono_gc_memmove (&dest->vector, &src->vector, size);
+ mono_gc_memmove_atomic (&dest->vector, &src->vector, size);
} else {
mono_array_memcpy_refs (dest, 0, src, 0, mono_array_length (src));
}
#else
- mono_gc_memmove (&dest->vector, &src->vector, size);
+ mono_gc_memmove_atomic (&dest->vector, &src->vector, size);
#endif
}
@@ -4664,14 +4661,14 @@ mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array)
#ifdef HAVE_SGEN_GC
if (klass->element_class->valuetype) {
if (klass->element_class->has_references)
- mono_value_copy_array (o, 0, mono_array_addr_with_size (array, 0, 0), mono_array_length (array));
+ mono_value_copy_array (o, 0, mono_array_addr_with_size_fast (array, 0, 0), mono_array_length (array));
else
- mono_gc_memmove (&o->vector, &array->vector, size);
+ mono_gc_memmove_atomic (&o->vector, &array->vector, size);
} else {
mono_array_memcpy_refs (o, 0, array, 0, mono_array_length (array));
}
#else
- mono_gc_memmove (&o->vector, &array->vector, size);
+ mono_gc_memmove_atomic (&o->vector, &array->vector, size);
#endif
return o;
}
@@ -4687,14 +4684,14 @@ mono_array_clone_in_domain (MonoDomain *domain, MonoArray *array)
#ifdef HAVE_SGEN_GC
if (klass->element_class->valuetype) {
if (klass->element_class->has_references)
- mono_value_copy_array (o, 0, mono_array_addr_with_size (array, 0, 0), mono_array_length (array));
+ mono_value_copy_array (o, 0, mono_array_addr_with_size_fast (array, 0, 0), mono_array_length (array));
else
- mono_gc_memmove (&o->vector, &array->vector, size);
+ mono_gc_memmove_atomic (&o->vector, &array->vector, size);
} else {
mono_array_memcpy_refs (o, 0, array, 0, mono_array_length (array));
}
#else
- mono_gc_memmove (&o->vector, &array->vector, size);
+ mono_gc_memmove_atomic (&o->vector, &array->vector, size);
#endif
return o;
@@ -5111,7 +5108,7 @@ mono_value_box (MonoDomain *domain, MonoClass *class, gpointer value)
mono_gc_wbarrier_value_copy ((char *)res + sizeof (MonoObject), value, 1, class);
#else
#if NO_UNALIGNED_ACCESS
- mono_gc_memmove ((char *)res + sizeof (MonoObject), value, size);
+ mono_gc_memmove_atomic ((char *)res + sizeof (MonoObject), value, size);
#else
switch (size) {
case 1:
@@ -5127,7 +5124,7 @@ mono_value_box (MonoDomain *domain, MonoClass *class, gpointer value)
*(guint64 *)((guint8 *) res + sizeof (MonoObject)) = *(guint64 *) value;
break;
default:
- mono_gc_memmove ((char *)res + sizeof (MonoObject), value, size);
+ mono_gc_memmove_atomic ((char *)res + sizeof (MonoObject), value, size);
}
#endif
#endif
@@ -5166,7 +5163,7 @@ void
mono_value_copy_array (MonoArray *dest, int dest_idx, gpointer src, int count)
{
int size = mono_array_element_size (dest->obj.vtable->klass);
- char *d = mono_array_addr_with_size (dest, size, dest_idx);
+ char *d = mono_array_addr_with_size_fast (dest, size, dest_idx);
g_assert (size == mono_class_value_size (mono_object_class (dest)->element_class, NULL));
mono_gc_wbarrier_value_copy (d, src, count, mono_object_class (dest)->element_class);
}
@@ -6189,7 +6186,7 @@ mono_delegate_ctor (MonoObject *this, MonoObject *target, gpointer addr)
if (!ji && domain != mono_get_root_domain ())
ji = mono_jit_info_table_find (mono_get_root_domain (), mono_get_addr_from_ftnptr (addr));
if (ji) {
- method = ji->method;
+ method = mono_jit_info_get_method (ji);
g_assert (!method->klass->generic_container);
}
@@ -6294,10 +6291,10 @@ mono_method_return_message_restore (MonoMethod *method, gpointer *params, MonoAr
if (class->has_references)
mono_gc_wbarrier_value_copy (*((gpointer *)params [i]), arg + sizeof (MonoObject), 1, class);
else
- mono_gc_memmove (*((gpointer *)params [i]), arg + sizeof (MonoObject), size);
+ mono_gc_memmove_atomic (*((gpointer *)params [i]), arg + sizeof (MonoObject), size);
} else {
size = mono_class_value_size (mono_class_from_mono_type (pt), NULL);
- mono_gc_bzero (*((gpointer *)params [i]), size);
+ mono_gc_bzero_atomic (*((gpointer *)params [i]), size);
}
}
diff --git a/mono/metadata/object.h b/mono/metadata/object.h
index 70ff5814b3..3015159d7f 100644
--- a/mono/metadata/object.h
+++ b/mono/metadata/object.h
@@ -311,11 +311,30 @@ MONO_API uint32_t mono_gchandle_new_weakref (MonoObject *obj, mono_bool tra
MONO_API MonoObject* mono_gchandle_get_target (uint32_t gchandle);
MONO_API void mono_gchandle_free (uint32_t gchandle);
+/* Reference queue support
+ *
+ * A reference queue is used to get notifications of when objects are collected.
+ * Call mono_gc_reference_queue_new to create a new queue and pass the callback that
+ * will be invoked when registered objects are collected.
+ * Call mono_gc_reference_queue_add to register a pair of objects and data within a queue.
+ * The callback will be triggered once an object is both unreachable and finalized.
+ */
+
+typedef void (*mono_reference_queue_callback) (void *user_data);
+typedef struct _MonoReferenceQueue MonoReferenceQueue;
+
+MONO_API MonoReferenceQueue* mono_gc_reference_queue_new (mono_reference_queue_callback callback);
+MONO_API void mono_gc_reference_queue_free (MonoReferenceQueue *queue);
+MONO_API mono_bool mono_gc_reference_queue_add (MonoReferenceQueue *queue, MonoObject *obj, void *user_data);
+
+
+
/* GC write barriers support */
MONO_API void mono_gc_wbarrier_set_field (MonoObject *obj, void* field_ptr, MonoObject* value);
MONO_API void mono_gc_wbarrier_set_arrayref (MonoArray *arr, void* slot_ptr, MonoObject* value);
MONO_API void mono_gc_wbarrier_arrayref_copy (void* dest_ptr, void* src_ptr, int count);
MONO_API void mono_gc_wbarrier_generic_store (void* ptr, MonoObject* value);
+MONO_API void mono_gc_wbarrier_generic_store_atomic (void *ptr, MonoObject *value);
MONO_API void mono_gc_wbarrier_generic_nostore (void* ptr);
MONO_API void mono_gc_wbarrier_value_copy (void* dest, void* src, int count, MonoClass *klass);
MONO_API void mono_gc_wbarrier_object_copy (MonoObject* obj, MonoObject *src);
diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c
index 4605e587f7..5b89366554 100644
--- a/mono/metadata/reflection.c
+++ b/mono/metadata/reflection.c
@@ -7228,9 +7228,9 @@ static int
_mono_reflection_parse_type (char *name, char **endptr, gboolean is_recursed,
MonoTypeNameParse *info)
{
- char *start, *p, *w, *temp, *last_point, *startn;
+ char *start, *p, *w, *last_point, *startn;
int in_modifiers = 0;
- int isbyref = 0, rank, arity = 0, i;
+ int isbyref = 0, rank = 0;
start = p = w = name;
@@ -7277,14 +7277,6 @@ _mono_reflection_parse_type (char *name, char **endptr, gboolean is_recursed,
case ']':
in_modifiers = 1;
break;
- case '`':
- ++p;
- i = strtol (p, &temp, 10);
- arity += i;
- if (p == temp)
- return 0;
- p = temp-1;
- break;
default:
break;
}
@@ -7318,10 +7310,32 @@ _mono_reflection_parse_type (char *name, char **endptr, gboolean is_recursed,
*p++ = 0;
break;
case '[':
- if (arity != 0) {
- *p++ = 0;
+ //Decide if it's an array of a generic argument list
+ *p++ = 0;
+
+ if (!*p) //XXX test
+ return 0;
+ if (*p == ',' || *p == '*' || *p == ']') { //array
+ rank = 1;
+ while (*p) {
+ if (*p == ']')
+ break;
+ if (*p == ',')
+ rank++;
+ else if (*p == '*') /* '*' means unknown lower bound */
+ info->modifiers = g_list_append (info->modifiers, GUINT_TO_POINTER (-2));
+ else
+ return 0;
+ ++p;
+ }
+ if (*p++ != ']')
+ return 0;
+ info->modifiers = g_list_append (info->modifiers, GUINT_TO_POINTER (rank));
+ } else {
+ if (rank) /* generic args after array spec*/ //XXX test
+ return 0;
info->type_arguments = g_ptr_array_new ();
- for (i = 0; i < arity; i++) {
+ while (*p) {
MonoTypeNameParse *subinfo = g_new0 (MonoTypeNameParse, 1);
gboolean fqname = FALSE;
@@ -7364,36 +7378,15 @@ _mono_reflection_parse_type (char *name, char **endptr, gboolean is_recursed,
} else if (fqname && (*p == ']')) {
*p++ = 0;
}
-
- if (i + 1 < arity) {
- if (*p != ',')
- return 0;
- } else {
- if (*p != ']')
- return 0;
+ if (*p == ']') {
+ *p++ = 0;
+ break;
+ } else if (!*p) {
+ return 0;
}
*p++ = 0;
}
-
- arity = 0;
- break;
- }
- rank = 1;
- *p++ = 0;
- while (*p) {
- if (*p == ']')
- break;
- if (*p == ',')
- rank++;
- else if (*p == '*') /* '*' means unknown lower bound */
- info->modifiers = g_list_append (info->modifiers, GUINT_TO_POINTER (-2));
- else
- return 0;
- ++p;
}
- if (*p++ != ']')
- return 0;
- info->modifiers = g_list_append (info->modifiers, GUINT_TO_POINTER (rank));
break;
case ']':
if (is_recursed)
@@ -7958,7 +7951,7 @@ handle_type:
val = load_cattr_value (image, &subc->byval_arg, p, end);
obj = mono_object_new (mono_domain_get (), subc);
g_assert (!subc->has_references);
- mono_gc_memmove ((char*)obj + sizeof (MonoObject), val, mono_class_value_size (subc, NULL));
+ mono_gc_memmove_atomic ((char*)obj + sizeof (MonoObject), val, mono_class_value_size (subc, NULL));
g_free (val);
return obj;
}
@@ -9847,12 +9840,16 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb)
/* Put into cache so mono_class_get () will find it.
Skip nested types as those should not be available on the global scope. */
- if (!tb->nesting_type) {
+ if (!tb->nesting_type)
mono_image_add_to_name_cache (klass->image, klass->name_space, klass->name, tb->table_idx);
- } else {
- klass->image->reflection_info_unregister_classes =
- g_slist_prepend (klass->image->reflection_info_unregister_classes, klass);
- }
+
+ /*
+ We must register all types as we cannot rely on the name_cache hashtable since we find the class
+ by performing a mono_class_get which does the full resolution.
+
+ Working around this semantics would require us to write a lot of code for no clear advantage.
+ */
+ mono_image_append_class_to_reflection_info_set (klass);
} else {
g_assert (mono_class_get_ref_info (klass) == tb);
}
@@ -10578,9 +10575,9 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
* This table maps metadata structures representing inflated methods/fields
* to the reflection objects representing their generic definitions.
*/
- mono_loader_lock ();
+ mono_image_lock ((MonoImage*)image);
mono_g_hash_table_insert (image->generic_def_objects, imethod, rmethod);
- mono_loader_unlock ();
+ mono_image_unlock ((MonoImage*)image);
}
if (!mono_verifier_is_method_valid_generic_instantiation (inflated))
@@ -10624,9 +10621,9 @@ inflate_mono_method (MonoClass *klass, MonoMethod *method, MonoObject *obj)
if (method->is_generic && method->klass->image->dynamic) {
MonoDynamicImage *image = (MonoDynamicImage*)method->klass->image;
- mono_loader_lock ();
+ mono_image_lock ((MonoImage*)image);
mono_g_hash_table_insert (image->generic_def_objects, imethod, obj);
- mono_loader_unlock ();
+ mono_image_unlock ((MonoImage*)image);
}
return (MonoMethod *) imethod;
}
@@ -11465,9 +11462,7 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
gparam->type.type = &pklass->byval_arg;
mono_class_set_ref_info (pklass, gparam);
- mono_image_lock (image);
- image->reflection_info_unregister_classes = g_slist_prepend (image->reflection_info_unregister_classes, pklass);
- mono_image_unlock (image);
+ mono_image_append_class_to_reflection_info_set (pklass);
}
MonoArray *
diff --git a/mono/metadata/sgen-alloc.c b/mono/metadata/sgen-alloc.c
index 4f4ffb18e6..8376aafac6 100644
--- a/mono/metadata/sgen-alloc.c
+++ b/mono/metadata/sgen-alloc.c
@@ -704,6 +704,9 @@ create_allocator (int atype)
MONO_THREAD_VAR_OFFSET (tlab_next_addr, tlab_next_addr_offset);
MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset);
+ mono_tls_key_set_offset (TLS_KEY_SGEN_TLAB_NEXT_ADDR, tlab_next_addr_offset);
+ mono_tls_key_set_offset (TLS_KEY_SGEN_TLAB_TEMP_END, tlab_temp_end_offset);
+
g_assert (tlab_next_addr_offset != -1);
g_assert (tlab_temp_end_offset != -1);
#endif
@@ -851,7 +854,7 @@ create_allocator (int atype)
/* tlab_next_addr (local) = tlab_next_addr (TLS var) */
tlab_next_addr_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
- EMIT_TLS_ACCESS (mb, tlab_next_addr, tlab_next_addr_offset);
+ EMIT_TLS_ACCESS (mb, tlab_next_addr, TLS_KEY_SGEN_TLAB_NEXT_ADDR);
mono_mb_emit_stloc (mb, tlab_next_addr_var);
/* p = (void**)tlab_next; */
@@ -870,7 +873,7 @@ create_allocator (int atype)
/* if (G_LIKELY (new_next < tlab_temp_end)) */
mono_mb_emit_ldloc (mb, new_next_var);
- EMIT_TLS_ACCESS (mb, tlab_temp_end, tlab_temp_end_offset);
+ EMIT_TLS_ACCESS (mb, tlab_temp_end, TLS_KEY_SGEN_TLAB_TEMP_END);
slowpath_branch = mono_mb_emit_short_branch (mb, MONO_CEE_BLT_UN_S);
/* Slowpath */
@@ -1057,11 +1060,21 @@ mono_gc_get_managed_allocator_by_type (int atype)
if (!mono_runtime_has_tls_get ())
return NULL;
- mono_loader_lock ();
res = alloc_method_cache [atype];
- if (!res)
- res = alloc_method_cache [atype] = create_allocator (atype);
- mono_loader_unlock ();
+ if (res)
+ return res;
+
+ res = create_allocator (atype);
+ LOCK_GC;
+ if (alloc_method_cache [atype]) {
+ mono_free_method (res);
+ res = alloc_method_cache [atype];
+ } else {
+ mono_memory_barrier ();
+ alloc_method_cache [atype] = res;
+ }
+ UNLOCK_GC;
+
return res;
#else
return NULL;
diff --git a/mono/metadata/sgen-archdep.h b/mono/metadata/sgen-archdep.h
index 741d75735b..5e7b5f8f1a 100755
--- a/mono/metadata/sgen-archdep.h
+++ b/mono/metadata/sgen-archdep.h
@@ -89,7 +89,7 @@
#define ARCH_COPY_SIGCTX_REGS(a,ctx) do { \
int __i; \
for (__i = 0; __i < 32; ++__i) \
- ((a)[__i]) = UCONTEXT_REG_Rn((ctx), __i); \
+ ((a)[__i]) = (gpointer) UCONTEXT_REG_Rn((ctx), __i); \
} while (0)
#elif defined(TARGET_ARM)
@@ -135,8 +135,12 @@
#define USE_MONO_CTX
#define ARCH_NUM_REGS 32
-#define ARCH_SIGCTX_SP(ctx) (UCONTEXT_GREGS((ctx))[29])
-#define ARCH_SIGCTX_IP(ctx) (UCONTEXT_REG_PC((ctx)))
+/*
+ * These casts are necessary since glibc always makes the
+ * gregs 64-bit values in userland.
+ */
+#define ARCH_SIGCTX_SP(ctx) ((gsize) UCONTEXT_GREGS((ctx))[29])
+#define ARCH_SIGCTX_IP(ctx) ((gsize) UCONTEXT_REG_PC((ctx)))
#elif defined(__s390x__)
@@ -201,6 +205,10 @@
)
#endif
+#ifndef REG_SP
+#define REG_SP REG_O6
+#endif
+
#define ARCH_SIGCTX_SP(ctx) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_SP])
#define ARCH_SIGCTX_IP(ctx) (((ucontext_t *)(ctx))->uc_mcontext.gregs [REG_PC])
#define ARCH_COPY_SIGCTX_REGS(a,ctx) do { \
diff --git a/mono/metadata/sgen-bridge.c b/mono/metadata/sgen-bridge.c
index 40448b2869..774baa63bb 100644
--- a/mono/metadata/sgen-bridge.c
+++ b/mono/metadata/sgen-bridge.c
@@ -558,7 +558,6 @@ sgen_bridge_processing_stw_step (void)
* bridge_processing_in_progress must be set with the world
* stopped. If not there would be race conditions.
*/
- g_assert (!bridge_processing_in_progress);
bridge_processing_in_progress = TRUE;
SGEN_TV_GETTIME (btv);
@@ -637,7 +636,7 @@ sgen_bridge_processing_finish (int generation)
/* sort array according to decreasing finishing time */
- qsort (all_entries, hash_table.num_entries, sizeof (HashEntry*), compare_hash_entries);
+ sgen_qsort (all_entries, hash_table.num_entries, sizeof (HashEntry*), compare_hash_entries);
SGEN_TV_GETTIME (btv);
step_3 = SGEN_TV_ELAPSED (atv, btv);
@@ -817,6 +816,28 @@ sgen_bridge_processing_finish (int generation)
bridge_processing_in_progress = FALSE;
}
+void
+sgen_bridge_describe_pointer (MonoObject *obj)
+{
+ HashEntry *entry;
+ int i;
+
+ for (i = 0; i < registered_bridges.size; ++i) {
+ if (obj == DYN_ARRAY_PTR_REF (&registered_bridges, i)) {
+ printf ("Pointer is a registered bridge object.\n");
+ break;
+ }
+ }
+
+ entry = sgen_hash_table_lookup (&hash_table, obj);
+ if (!entry)
+ return;
+
+ printf ("Bridge hash table entry %p:\n", entry);
+ printf (" is bridge: %d\n", (int)entry->is_bridge);
+ printf (" is visited: %d\n", (int)entry->is_visited);
+}
+
static const char *bridge_class;
static gboolean
@@ -841,7 +862,7 @@ bridge_test_cross_reference (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs
for (j = 0; j < sccs [i]->num_objs; ++j) {
// g_print (" %s\n", sgen_safe_name (sccs [i]->objs [j]));
if (i & 1) /*retain half of the bridged objects */
- sccs [i]->objs [0] = NULL;
+ sccs [i]->is_alive = TRUE;
}
}
for (i = 0; i < num_xrefs; ++i) {
@@ -851,6 +872,84 @@ bridge_test_cross_reference (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs
}
}
+static MonoClassField *mono_bridge_test_field;
+
+enum {
+ BRIDGE_DEAD,
+ BRIDGE_ROOT,
+ BRIDGE_SAME_SCC,
+ BRIDGE_XREF,
+};
+
+static gboolean
+test_scc (MonoGCBridgeSCC *scc, int i)
+{
+ int status = BRIDGE_DEAD;
+ mono_field_get_value (scc->objs [i], mono_bridge_test_field, &status);
+ return status > 0;
+}
+
+static void
+mark_scc (MonoGCBridgeSCC *scc, int value)
+{
+ int i;
+ for (i = 0; i < scc->num_objs; ++i) {
+ if (!test_scc (scc, i)) {
+ int status = value;
+ mono_field_set_value (scc->objs [i], mono_bridge_test_field, &status);
+ }
+ }
+}
+
+static void
+bridge_test_cross_reference2 (int num_sccs, MonoGCBridgeSCC **sccs, int num_xrefs, MonoGCBridgeXRef *xrefs)
+{
+ int i;
+ gboolean modified;
+
+ if (!mono_bridge_test_field) {
+ mono_bridge_test_field = mono_class_get_field_from_name (mono_object_get_class (sccs[0]->objs [0]), "__test");
+ g_assert (mono_bridge_test_field);
+ }
+
+ /*We mark all objects in a scc with live objects as reachable by scc*/
+ for (i = 0; i < num_sccs; ++i) {
+ int j;
+ gboolean live = FALSE;
+ for (j = 0; j < sccs [i]->num_objs; ++j) {
+ if (test_scc (sccs [i], j)) {
+ live = TRUE;
+ break;
+ }
+ }
+ if (!live)
+ continue;
+ for (j = 0; j < sccs [i]->num_objs; ++j) {
+ if (!test_scc (sccs [i], j)) {
+ int status = BRIDGE_SAME_SCC;
+ mono_field_set_value (sccs [i]->objs [j], mono_bridge_test_field, &status);
+ }
+ }
+ }
+
+ /*Now we mark the transitive closure of reachable objects from the xrefs*/
+ modified = TRUE;
+ while (modified) {
+ modified = FALSE;
+ /* Mark all objects that are brought to life due to xrefs*/
+ for (i = 0; i < num_xrefs; ++i) {
+ MonoGCBridgeXRef ref = xrefs [i];
+ if (test_scc (sccs [ref.src_scc_index], 0) && !test_scc (sccs [ref.dst_scc_index], 0)) {
+ modified = TRUE;
+ mark_scc (sccs [ref.dst_scc_index], BRIDGE_XREF);
+ }
+ }
+ }
+
+ /* keep everything in memory, all we want to do is test persistence */
+ for (i = 0; i < num_sccs; ++i)
+ sccs [i]->is_alive = TRUE;
+}
void
sgen_register_test_bridge_callbacks (const char *bridge_class_name)
@@ -859,9 +958,9 @@ sgen_register_test_bridge_callbacks (const char *bridge_class_name)
callbacks.bridge_version = SGEN_BRIDGE_VERSION;
callbacks.is_bridge_class = bridge_test_is_bridge_class;
callbacks.is_bridge_object = bridge_test_is_bridge_object;
- callbacks.cross_references = bridge_test_cross_reference;
+ callbacks.cross_references = bridge_class_name[0] == '2' ? bridge_test_cross_reference2 : bridge_test_cross_reference;
mono_gc_register_bridge_callbacks (&callbacks);
- bridge_class = bridge_class_name;
+ bridge_class = bridge_class_name + (bridge_class_name[0] == '2' ? 1 : 0);
}
#endif
diff --git a/mono/metadata/sgen-cardtable.c b/mono/metadata/sgen-cardtable.c
index 4ce7384f1c..d41cbc66ea 100644
--- a/mono/metadata/sgen-cardtable.c
+++ b/mono/metadata/sgen-cardtable.c
@@ -140,7 +140,7 @@ sgen_card_table_wbarrier_value_copy (gpointer dest, gpointer src, int count, Mon
TLAB_ACCESS_INIT;
ENTER_CRITICAL_REGION;
#endif
- mono_gc_memmove (dest, src, size);
+ mono_gc_memmove_atomic (dest, src, size);
sgen_card_table_mark_range ((mword)dest, size);
#ifdef DISABLE_CRITICAL_REGION
UNLOCK_GC;
@@ -160,7 +160,7 @@ sgen_card_table_wbarrier_object_copy (MonoObject* obj, MonoObject *src)
TLAB_ACCESS_INIT;
ENTER_CRITICAL_REGION;
#endif
- mono_gc_memmove ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
+ mono_gc_memmove_aligned ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
size - sizeof (MonoObject));
sgen_card_table_mark_range ((mword)obj, size);
#ifdef DISABLE_CRITICAL_REGION
@@ -629,7 +629,7 @@ LOOP_HEAD:
else
index = ARRAY_OBJ_INDEX (start, obj, elem_size);
- elem = first_elem = (char*)mono_array_addr_with_size ((MonoArray*)obj, elem_size, index);
+ elem = first_elem = (char*)mono_array_addr_with_size_fast ((MonoArray*)obj, elem_size, index);
if (klass->element_class->valuetype) {
ScanVTypeFunc scan_vtype_func = sgen_get_current_object_ops ()->scan_vtype;
diff --git a/mono/metadata/sgen-copy-object.h b/mono/metadata/sgen-copy-object.h
index b4929d7784..dec0d073fe 100644
--- a/mono/metadata/sgen-copy-object.h
+++ b/mono/metadata/sgen-copy-object.h
@@ -74,10 +74,10 @@ par_copy_object_no_checks (char *destination, MonoVTable *vt, void *obj, mword o
;
} else {
/*can't trust memcpy doing word copies */
- mono_gc_memmove (destination + sizeof (mword), (char*)obj + sizeof (mword), objsize - sizeof (mword));
+ mono_gc_memmove_aligned (destination + sizeof (mword), (char*)obj + sizeof (mword), objsize - sizeof (mword));
}
#else
- mono_gc_memmove (destination + sizeof (mword), (char*)obj + sizeof (mword), objsize - sizeof (mword));
+ mono_gc_memmove_aligned (destination + sizeof (mword), (char*)obj + sizeof (mword), objsize - sizeof (mword));
#endif
/* adjust array->bounds */
SGEN_ASSERT (9, vt->gc_descr, "vtable %p for class %s:%s has no gc descriptor", vt, vt->klass->name_space, vt->klass->name);
diff --git a/mono/metadata/sgen-debug.c b/mono/metadata/sgen-debug.c
index 45c6f2093a..a04e1a7c1f 100644
--- a/mono/metadata/sgen-debug.c
+++ b/mono/metadata/sgen-debug.c
@@ -77,6 +77,7 @@ describe_pointer (char *ptr, gboolean need_setup)
if (!start)
return;
ptr = start;
+ vtable = (MonoVTable*)LOAD_VTABLE (ptr);
} else {
if (sgen_ptr_is_in_los (ptr, &start)) {
if (ptr == start)
@@ -85,6 +86,7 @@ describe_pointer (char *ptr, gboolean need_setup)
printf ("Pointer is at offset 0x%x of object %p in LOS space.\n", (int)(ptr - start), start);
ptr = start;
mono_sgen_los_describe_pointer (ptr);
+ vtable = (MonoVTable*)LOAD_VTABLE (ptr);
} else if (major_collector.ptr_is_in_non_pinned_space (ptr, &start)) {
if (ptr == start)
printf ("Pointer is the start of object %p in oldspace.\n", start);
@@ -94,9 +96,11 @@ describe_pointer (char *ptr, gboolean need_setup)
printf ("Pointer inside oldspace.\n");
if (start)
ptr = start;
- major_collector.describe_pointer (ptr);
+ vtable = major_collector.describe_pointer (ptr);
} else if (major_collector.obj_is_from_pinned_alloc (ptr)) {
+ // FIXME: Handle pointers to the inside of objects
printf ("Pointer is inside a pinned chunk.\n");
+ vtable = (MonoVTable*)LOAD_VTABLE (ptr);
} else {
printf ("Pointer unknown.\n");
return;
@@ -112,17 +116,14 @@ describe_pointer (char *ptr, gboolean need_setup)
goto restart;
}
- // FIXME: Handle pointers to the inside of objects
- vtable = (MonoVTable*)LOAD_VTABLE (ptr);
-
printf ("VTable: %p\n", vtable);
if (vtable == NULL) {
printf ("VTable is invalid (empty).\n");
- return;
+ goto bridge;
}
if (sgen_ptr_in_nursery (vtable)) {
printf ("VTable is invalid (points inside nursery).\n");
- return;
+ goto bridge;
}
printf ("Class: %s\n", vtable->klass->name);
@@ -133,7 +134,10 @@ describe_pointer (char *ptr, gboolean need_setup)
printf ("Descriptor type: %d (%s)\n", type, descriptor_types [type]);
size = sgen_safe_object_get_size ((MonoObject*)ptr);
- printf ("Size: %td\n", size);
+ printf ("Size: %d\n", (int)size);
+
+ bridge:
+ sgen_bridge_describe_pointer ((MonoObject*)ptr);
}
void
diff --git a/mono/metadata/sgen-descriptor.h b/mono/metadata/sgen-descriptor.h
index cd53a862c3..f07ad4a6ba 100644
--- a/mono/metadata/sgen-descriptor.h
+++ b/mono/metadata/sgen-descriptor.h
@@ -137,6 +137,7 @@ sgen_gc_descr_has_references (mword desc)
#define SGEN_VTABLE_HAS_REFERENCES(vt) (sgen_gc_descr_has_references ((mword)((MonoVTable*)(vt))->gc_descr))
#define SGEN_CLASS_HAS_REFERENCES(c) (sgen_gc_descr_has_references ((mword)(c)->gc_descr))
+#define SGEN_OBJECT_HAS_REFERENCES(o) (SGEN_VTABLE_HAS_REFERENCES (SGEN_LOAD_VTABLE ((o))))
/* helper macros to scan and traverse objects, macros because we resue them in many functions */
#define OBJ_RUN_LEN_SIZE(size,desc,obj) do { \
@@ -153,6 +154,12 @@ sgen_gc_descr_has_references (mword desc)
#define PREFETCH(addr)
#endif
+#if defined(__GNUC__) && SIZEOF_VOID_P==4
+#define GNUC_BUILTIN_CTZ(bmap) __builtin_ctz(bmap)
+#elif defined(__GNUC__) && SIZEOF_VOID_P==8
+#define GNUC_BUILTIN_CTZ(bmap) __builtin_ctzl(bmap)
+#endif
+
/* code using these macros must define a HANDLE_PTR(ptr) macro that does the work */
#define OBJ_RUN_LEN_FOREACH_PTR(desc,obj) do { \
if ((desc) & 0xffff0000) { \
@@ -170,21 +177,21 @@ sgen_gc_descr_has_references (mword desc)
} \
} while (0)
-#ifdef __GNUC__
+#if defined(__GNUC__)
#define OBJ_BITMAP_FOREACH_PTR(desc,obj) do { \
/* there are pointers */ \
void **_objptr = (void**)(obj); \
gsize _bmap = (desc) >> 16; \
_objptr += OBJECT_HEADER_WORDS; \
{ \
- int _index = __builtin_ctz (_bmap); \
+ int _index = GNUC_BUILTIN_CTZ (_bmap); \
_objptr += _index; \
_bmap >>= (_index + 1); \
HANDLE_PTR (_objptr, (obj)); \
_objptr ++; \
} \
while (_bmap) { \
- int _index = __builtin_ctz (_bmap); \
+ int _index = GNUC_BUILTIN_CTZ (_bmap); \
_objptr += _index; \
_bmap >>= (_index + 1); \
HANDLE_PTR (_objptr, (obj)); \
diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c
index 8ce0994b50..12e8ce69a4 100644
--- a/mono/metadata/sgen-gc.c
+++ b/mono/metadata/sgen-gc.c
@@ -317,6 +317,7 @@ static int stat_wbarrier_set_field = 0;
static int stat_wbarrier_set_arrayref = 0;
static int stat_wbarrier_arrayref_copy = 0;
static int stat_wbarrier_generic_store = 0;
+static int stat_wbarrier_generic_store_atomic = 0;
static int stat_wbarrier_set_root = 0;
static int stat_wbarrier_value_copy = 0;
static int stat_wbarrier_object_copy = 0;
@@ -400,6 +401,7 @@ sgen_safe_name (void* obj)
* ######################################################################
*/
LOCK_DECLARE (gc_mutex);
+gboolean sgen_try_free_some_memory;
#define SCAN_START_SIZE SGEN_SCAN_START_SIZE
@@ -1916,7 +1918,8 @@ finish_gray_stack (int generation, GrayQueue *queue)
We must reset the gathered bridges since their original block might be evacuated due to major
fragmentation in the meanwhile and the bridge code should not have to deal with that.
*/
- sgen_bridge_reset_data ();
+ if (sgen_need_bridge_processing ())
+ sgen_bridge_reset_data ();
/*
* Walk the ephemeron tables marking all values with reachable keys. This must be completely done
@@ -1933,9 +1936,25 @@ finish_gray_stack (int generation, GrayQueue *queue)
sgen_scan_togglerefs (start_addr, end_addr, ctx);
if (sgen_need_bridge_processing ()) {
+ /*Make sure the gray stack is empty before we process bridge objects so we get liveness right*/
+ sgen_drain_gray_stack (-1, ctx);
sgen_collect_bridge_objects (generation, ctx);
if (generation == GENERATION_OLD)
sgen_collect_bridge_objects (GENERATION_NURSERY, ctx);
+
+ /*
+ Do the first bridge step here, as the collector liveness state will become useless after that.
+
+ An important optimization is to only proccess the possibly dead part of the object graph and skip
+ over all live objects as we transitively know everything they point must be alive too.
+
+ The above invariant is completely wrong if we let the gray queue be drained and mark/copy everything.
+
+ This has the unfortunate side effect of making overflow collections perform the first step twice, but
+ given we now have heuristics that perform major GC in anticipation of minor overflows this should not
+ be a big deal.
+ */
+ sgen_bridge_processing_stw_step ();
}
/*
@@ -2217,6 +2236,7 @@ init_stats (void)
mono_counters_register ("WBarrier set arrayref", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_set_arrayref);
mono_counters_register ("WBarrier arrayref copy", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_arrayref_copy);
mono_counters_register ("WBarrier generic store called", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_generic_store);
+ mono_counters_register ("WBarrier generic atomic store called", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_generic_store_atomic);
mono_counters_register ("WBarrier set root", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_set_root);
mono_counters_register ("WBarrier value copy", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_value_copy);
mono_counters_register ("WBarrier object copy", MONO_COUNTER_GC | MONO_COUNTER_INT, &stat_wbarrier_object_copy);
@@ -2900,8 +2920,8 @@ major_copy_or_mark_from_roots (int *old_next_pin_slot, gboolean finish_up_concur
continue;
}
sgen_los_pin_object (bigobj->data);
- /* FIXME: only enqueue if object has references */
- GRAY_OBJECT_ENQUEUE (WORKERS_DISTRIBUTE_GRAY_QUEUE, bigobj->data);
+ if (SGEN_OBJECT_HAS_REFERENCES (bigobj->data))
+ GRAY_OBJECT_ENQUEUE (WORKERS_DISTRIBUTE_GRAY_QUEUE, bigobj->data);
if (G_UNLIKELY (do_pin_stats))
sgen_pin_stats_register_object ((char*) bigobj->data, safe_object_get_size ((MonoObject*) bigobj->data));
SGEN_LOG (6, "Marked large object %p (%s) size: %lu from roots", bigobj->data, safe_name (bigobj->data), (unsigned long)sgen_los_object_size (bigobj));
@@ -3087,6 +3107,13 @@ major_start_collection (gboolean concurrent, int *old_next_pin_slot)
static void
wait_for_workers_to_finish (void)
{
+ while (!sgen_workers_all_done ())
+ g_usleep (200);
+}
+
+static void
+join_workers (void)
+{
if (concurrent_collection_in_progress || major_collector.is_parallel) {
gray_queue_redirect (&gray_queue);
sgen_workers_join ();
@@ -3109,13 +3136,13 @@ major_finish_collection (const char *reason, int old_next_pin_slot, gboolean sca
TV_GETTIME (btv);
if (concurrent_collection_in_progress || major_collector.is_parallel)
- wait_for_workers_to_finish ();
+ join_workers ();
if (concurrent_collection_in_progress) {
current_object_ops = major_collector.major_concurrent_ops;
major_copy_or_mark_from_roots (NULL, TRUE, scan_mod_union);
- wait_for_workers_to_finish ();
+ join_workers ();
g_assert (sgen_gray_object_queue_is_empty (&gray_queue));
@@ -3322,19 +3349,30 @@ major_update_or_finish_concurrent_collection (gboolean force_finish)
g_assert (sgen_gray_object_queue_is_empty (&gray_queue));
- major_collector.update_cardtable_mod_union ();
- sgen_los_update_cardtable_mod_union ();
-
if (!force_finish && !sgen_workers_all_done ()) {
+ major_collector.update_cardtable_mod_union ();
+ sgen_los_update_cardtable_mod_union ();
+
MONO_GC_CONCURRENT_UPDATE_END (GENERATION_OLD, major_collector.get_and_reset_num_major_objects_marked ());
return FALSE;
}
- if (mod_union_consistency_check)
- sgen_check_mod_union_consistency ();
+ /*
+ * The major collector can add global remsets which are processed in the finishing
+ * nursery collection, below. That implies that the workers must have finished
+ * marking before the nursery collection is allowed to run, otherwise we might miss
+ * some remsets.
+ */
+ wait_for_workers_to_finish ();
+
+ major_collector.update_cardtable_mod_union ();
+ sgen_los_update_cardtable_mod_union ();
collect_nursery (&unpin_queue, TRUE);
+ if (mod_union_consistency_check)
+ sgen_check_mod_union_consistency ();
+
current_collection_generation = GENERATION_OLD;
major_finish_collection ("finishing", -1, TRUE);
@@ -4001,34 +4039,30 @@ scan_thread_data (void *start_nursery, void *end_nursery, gboolean precise, Gray
SGEN_LOG (3, "GC disabled for thread %p, range: %p-%p, size: %td", info, info->stack_start, info->stack_end, (char*)info->stack_end - (char*)info->stack_start);
continue;
}
-
- if (!info->joined_stw) {
- SGEN_LOG (3, "Skipping thread not seen in STW %p, range: %p-%p, size: %td", info, info->stack_start, info->stack_end, (char*)info->stack_end - (char*)info->stack_start);
+ if (mono_thread_info_run_state (info) != STATE_RUNNING) {
+ SGEN_LOG (3, "Skipping non-running thread %p, range: %p-%p, size: %td (state %d)", info, info->stack_start, info->stack_end, (char*)info->stack_end - (char*)info->stack_start, mono_thread_info_run_state (info));
continue;
}
-
SGEN_LOG (3, "Scanning thread %p, range: %p-%p, size: %td, pinned=%d", info, info->stack_start, info->stack_end, (char*)info->stack_end - (char*)info->stack_start, sgen_get_pinned_count ());
- if (!info->thread_is_dying) {
- if (gc_callbacks.thread_mark_func && !conservative_stack_mark) {
- UserCopyOrMarkData data = { NULL, queue };
- set_user_copy_or_mark_data (&data);
- gc_callbacks.thread_mark_func (info->runtime_data, info->stack_start, info->stack_end, precise);
- set_user_copy_or_mark_data (NULL);
- } else if (!precise) {
- if (!conservative_stack_mark) {
- fprintf (stderr, "Precise stack mark not supported - disabling.\n");
- conservative_stack_mark = TRUE;
- }
- conservatively_pin_objects_from (info->stack_start, info->stack_end, start_nursery, end_nursery, PIN_TYPE_STACK);
+ if (gc_callbacks.thread_mark_func && !conservative_stack_mark) {
+ UserCopyOrMarkData data = { NULL, queue };
+ set_user_copy_or_mark_data (&data);
+ gc_callbacks.thread_mark_func (info->runtime_data, info->stack_start, info->stack_end, precise);
+ set_user_copy_or_mark_data (NULL);
+ } else if (!precise) {
+ if (!conservative_stack_mark) {
+ fprintf (stderr, "Precise stack mark not supported - disabling.\n");
+ conservative_stack_mark = TRUE;
}
+ conservatively_pin_objects_from (info->stack_start, info->stack_end, start_nursery, end_nursery, PIN_TYPE_STACK);
}
- if (!info->thread_is_dying && !precise) {
+ if (!precise) {
#ifdef USE_MONO_CTX
conservatively_pin_objects_from ((void**)&info->ctx, (void**)&info->ctx + ARCH_NUM_REGS,
start_nursery, end_nursery, PIN_TYPE_STACK);
#else
- conservatively_pin_objects_from (&info->regs, &info->regs + ARCH_NUM_REGS,
+ conservatively_pin_objects_from ((void**)&info->regs, (void**)&info->regs + ARCH_NUM_REGS,
start_nursery, end_nursery, PIN_TYPE_STACK);
#endif
}
@@ -4049,7 +4083,6 @@ ptr_on_stack (void *ptr)
static void*
sgen_thread_register (SgenThreadInfo* info, void *addr)
{
- LOCK_GC;
#ifndef HAVE_KW_THREAD
info->tlab_start = info->tlab_next = info->tlab_temp_end = info->tlab_real_end = NULL;
@@ -4059,14 +4092,11 @@ sgen_thread_register (SgenThreadInfo* info, void *addr)
sgen_thread_info = info;
#endif
-#if !defined(__MACH__)
+#ifdef SGEN_POSIX_STW
info->stop_count = -1;
info->signal = 0;
#endif
info->skip = 0;
- info->joined_stw = FALSE;
- info->doing_handshake = FALSE;
- info->thread_is_dying = FALSE;
info->stack_start = NULL;
info->stopped_ip = NULL;
info->stopped_domain = NULL;
@@ -4080,6 +4110,7 @@ sgen_thread_register (SgenThreadInfo* info, void *addr)
binary_protocol_thread_register ((gpointer)mono_thread_info_get_tid (info));
+ // FIXME: Unift with mono_thread_get_stack_bounds ()
/* try to get it with attributes first */
#if (defined(HAVE_PTHREAD_GETATTR_NP) || defined(HAVE_PTHREAD_ATTR_GET_NP)) && defined(HAVE_PTHREAD_ATTR_GETSTACK)
{
@@ -4104,8 +4135,14 @@ sgen_thread_register (SgenThreadInfo* info, void *addr)
pthread_attr_destroy (&attr);
}
#elif defined(HAVE_PTHREAD_GET_STACKSIZE_NP) && defined(HAVE_PTHREAD_GET_STACKADDR_NP)
- info->stack_end = (char*)pthread_get_stackaddr_np (pthread_self ());
- info->stack_start_limit = (char*)info->stack_end - pthread_get_stacksize_np (pthread_self ());
+ {
+ size_t stsize = 0;
+ guint8 *staddr = NULL;
+
+ mono_thread_get_stack_bounds (&staddr, &stsize);
+ info->stack_start_limit = staddr;
+ info->stack_end = staddr + stsize;
+ }
#else
{
/* FIXME: we assume the stack grows down */
@@ -4124,13 +4161,11 @@ sgen_thread_register (SgenThreadInfo* info, void *addr)
if (gc_callbacks.thread_attach_func)
info->runtime_data = gc_callbacks.thread_attach_func ();
-
- UNLOCK_GC;
return info;
}
static void
-sgen_thread_unregister (SgenThreadInfo *p)
+sgen_thread_detach (SgenThreadInfo *p)
{
/* If a delegate is passed to native code and invoked on a thread we dont
* know about, the jit will register it with mono_jit_thread_attach, but
@@ -4140,47 +4175,11 @@ sgen_thread_unregister (SgenThreadInfo *p)
*/
if (mono_domain_get ())
mono_thread_detach (mono_thread_current ());
+}
- p->thread_is_dying = TRUE;
-
- /*
- There is a race condition between a thread finishing executing and been removed
- from the GC thread set.
- This happens on posix systems when TLS data is been cleaned-up, libpthread will
- set the thread_info slot to NULL before calling the cleanup function. This
- opens a window in which the thread is registered but has a NULL TLS.
-
- The suspend signal handler needs TLS data to know where to store thread state
- data or otherwise it will simply ignore the thread.
-
- This solution works because the thread doing STW will wait until all threads been
- suspended handshake back, so there is no race between the doing_hankshake test
- and the suspend_thread call.
-
- This is not required on systems that do synchronous STW as those can deal with
- the above race at suspend time.
-
- FIXME: I believe we could avoid this by using mono_thread_info_lookup when
- mono_thread_info_current returns NULL. Or fix mono_thread_info_lookup to do so.
- */
-#if (defined(__MACH__) && MONO_MACH_ARCH_SUPPORTED) || !defined(HAVE_PTHREAD_KILL)
- LOCK_GC;
-#else
- while (!TRYLOCK_GC) {
- SgenThreadInfo *current = mono_thread_info_current ();
- if (current)
- SGEN_ASSERT (0, current == p, "If there's a current thread info, it must be correct.");
- /*
- * If we have a current thread info, the signal
- * handler will eventually suspend us. If not, we
- * need to do it by hand.
- */
- if (current || !sgen_park_current_thread_if_doing_handshake (p))
- g_usleep (50);
- }
- MONO_GC_LOCKED ();
-#endif
-
+static void
+sgen_thread_unregister (SgenThreadInfo *p)
+{
binary_protocol_thread_unregister ((gpointer)mono_thread_info_get_tid (p));
SGEN_LOG (3, "unregister thread %p (%p)", p, (gpointer)mono_thread_info_get_tid (p));
@@ -4188,9 +4187,6 @@ sgen_thread_unregister (SgenThreadInfo *p)
gc_callbacks.thread_detach_func (p->runtime_data);
p->runtime_data = NULL;
}
-
- mono_threads_unregister_current_thread (p);
- UNLOCK_GC;
}
@@ -4309,7 +4305,7 @@ mono_gc_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int count)
HEAVY_STAT (++stat_wbarrier_arrayref_copy);
/*This check can be done without taking a lock since dest_ptr array is pinned*/
if (ptr_in_nursery (dest_ptr) || count <= 0) {
- mono_gc_memmove (dest_ptr, src_ptr, count * sizeof (gpointer));
+ mono_gc_memmove_aligned (dest_ptr, src_ptr, count * sizeof (gpointer));
return;
}
@@ -4424,6 +4420,24 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
sgen_dummy_use (value);
}
+/* Same as mono_gc_wbarrier_generic_store () but performs the store
+ * as an atomic operation with release semantics.
+ */
+void
+mono_gc_wbarrier_generic_store_atomic (gpointer ptr, MonoObject *value)
+{
+ HEAVY_STAT (++stat_wbarrier_generic_store_atomic);
+
+ SGEN_LOG (8, "Wbarrier atomic store at %p to %p (%s)", ptr, value, value ? safe_name (value) : "null");
+
+ InterlockedWritePointer (ptr, value);
+
+ if (ptr_in_nursery (value))
+ mono_gc_wbarrier_generic_nostore (ptr);
+
+ sgen_dummy_use (value);
+}
+
void mono_gc_wbarrier_value_copy_bitmap (gpointer _dest, gpointer _src, int size, unsigned bitmap)
{
mword *dest = _dest;
@@ -4470,7 +4484,7 @@ mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *
if (ptr_in_nursery (dest) || ptr_on_stack (dest) || !SGEN_CLASS_HAS_REFERENCES (klass)) {
size_t element_size = mono_class_value_size (klass, NULL);
size_t size = count * element_size;
- mono_gc_memmove (dest, src, size);
+ mono_gc_memmove_atomic (dest, src, size);
return;
}
@@ -4503,7 +4517,7 @@ mono_gc_wbarrier_object_copy (MonoObject* obj, MonoObject *src)
if (ptr_in_nursery (obj) || ptr_on_stack (obj)) {
size = mono_object_class (obj)->instance_size;
- mono_gc_memmove ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
+ mono_gc_memmove_aligned ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
size - sizeof (MonoObject));
return;
}
@@ -4856,6 +4870,7 @@ mono_gc_base_init (void)
gc_debug_file = stderr;
cb.thread_register = sgen_thread_register;
+ cb.thread_detach = sgen_thread_detach;
cb.thread_unregister = sgen_thread_unregister;
cb.thread_attach = sgen_thread_attach;
cb.mono_method_is_critical = (gpointer)is_critical_method;
@@ -4898,6 +4913,19 @@ mono_gc_base_init (void)
#ifndef HAVE_KW_THREAD
mono_native_tls_alloc (&thread_info_key, NULL);
+#if defined(__APPLE__) || defined (HOST_WIN32)
+ /*
+ * CEE_MONO_TLS requires the tls offset, not the key, so the code below only works on darwin,
+ * where the two are the same.
+ */
+ mono_tls_key_set_offset (TLS_KEY_SGEN_THREAD_INFO, thread_info_key);
+#endif
+#else
+ {
+ int tls_offset = -1;
+ MONO_THREAD_VAR_OFFSET (sgen_thread_info, tls_offset);
+ mono_tls_key_set_offset (TLS_KEY_SGEN_THREAD_INFO, tls_offset);
+ }
#endif
/*
@@ -5484,7 +5512,7 @@ mono_gc_get_write_barrier (void)
res = mono_mb_create_method (mb, sig, 16);
mono_mb_free (mb);
- mono_loader_lock ();
+ LOCK_GC;
if (write_barrier_method) {
/* Already created */
mono_free_method (res);
@@ -5493,7 +5521,7 @@ mono_gc_get_write_barrier (void)
mono_memory_barrier ();
write_barrier_method = res;
}
- mono_loader_unlock ();
+ UNLOCK_GC;
return write_barrier_method;
}
@@ -5570,7 +5598,12 @@ sgen_gc_lock (void)
void
sgen_gc_unlock (void)
{
- UNLOCK_GC;
+ gboolean try_free = sgen_try_free_some_memory;
+ sgen_try_free_some_memory = FALSE;
+ mono_mutex_unlock (&gc_mutex);
+ MONO_GC_UNLOCKED ();
+ if (try_free)
+ mono_thread_hazardous_try_free_some ();
}
void
diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h
index 7d442497a9..15afdbcd03 100644
--- a/mono/metadata/sgen-gc.h
+++ b/mono/metadata/sgen-gc.h
@@ -66,6 +66,10 @@ NurseryClearPolicy sgen_get_nursery_clear_policy (void) MONO_INTERNAL;
#define SGEN_TV_ELAPSED(start,end) (int)((end-start) / 10)
#define SGEN_TV_ELAPSED_MS(start,end) ((SGEN_TV_ELAPSED((start),(end)) + 500) / 1000)
+#if !defined(__MACH__) && !MONO_MACH_ARCH_SUPPORTED && defined(HAVE_PTHREAD_KILL)
+#define SGEN_POSIX_STW 1
+#endif
+
/* eventually share with MonoThread? */
/*
* This structure extends the MonoThreadInfo structure.
@@ -80,32 +84,6 @@ struct _SgenThreadInfo {
volatile int in_critical_region;
/*
- Since threads can be created concurrently during STW, it's possible to reach a stable
- state where we find that the world is stopped but there are registered threads that have
- not been suspended.
-
- Our hope is that those threads are harmlesly blocked in the GC lock trying to finish registration.
-
- To handle this scenario we set this field on each thread that have joined the current STW phase.
- The GC should ignore unjoined threads.
- */
- gboolean joined_stw;
-
- /*
- This is set to TRUE by STW when it initiates suspension of a thread.
- It's used so async suspend can catch the case where a thread is in the middle of unregistering
- and need to cooperatively suspend itself.
- */
- gboolean doing_handshake;
-
- /*
- This is set to TRUE when a thread start to dettach.
- This gives STW the oportunity to ignore a thread that started to
- unregister.
- */
- gboolean thread_is_dying;
-
- /*
This is set the argument of mono_gc_set_skip_thread.
A thread that knowingly holds no managed state can call this
@@ -122,11 +100,12 @@ struct _SgenThreadInfo {
char **tlab_real_end_addr;
gpointer runtime_data;
- /* Only used on POSIX platforms */
+#ifdef SGEN_POSIX_STW
+ /* This is -1 until the first suspend. */
int signal;
- /* Ditto */
/* FIXME: kill this, we only use signals on systems that have rt-posix, which doesn't have issues with duplicates. */
unsigned int stop_count; /* to catch duplicate signals. */
+#endif
gpointer stopped_ip; /* only valid if the thread is stopped */
MonoDomain *stopped_domain; /* dsto */
@@ -164,7 +143,7 @@ struct _GCMemSection {
/* in major collections indexes in the pin_queue for objects that pin this section */
void **pin_queue_start;
int pin_queue_num_entries;
- unsigned short num_scan_start;
+ unsigned int num_scan_start;
};
/*
@@ -179,10 +158,7 @@ struct _GCMemSection {
MONO_GC_LOCKED (); \
} while (0)
#define TRYLOCK_GC (mono_mutex_trylock (&gc_mutex) == 0)
-#define UNLOCK_GC do { \
- mono_mutex_unlock (&gc_mutex); \
- MONO_GC_UNLOCKED (); \
- } while (0)
+#define UNLOCK_GC do { sgen_gc_unlock (); } while (0)
extern LOCK_DECLARE (sgen_interruption_mutex);
@@ -300,19 +276,19 @@ extern int sgen_nursery_bits MONO_INTERNAL;
extern char *sgen_nursery_start MONO_INTERNAL;
extern char *sgen_nursery_end MONO_INTERNAL;
-static inline gboolean
+static inline MONO_ALWAYS_INLINE gboolean
sgen_ptr_in_nursery (void *p)
{
return SGEN_PTR_IN_NURSERY ((p), DEFAULT_NURSERY_BITS, sgen_nursery_start, sgen_nursery_end);
}
-static inline char*
+static inline MONO_ALWAYS_INLINE char*
sgen_get_nursery_start (void)
{
return sgen_nursery_start;
}
-static inline char*
+static inline MONO_ALWAYS_INLINE char*
sgen_get_nursery_end (void)
{
return sgen_nursery_end;
@@ -413,7 +389,6 @@ int sgen_thread_handshake (BOOL suspend) MONO_INTERNAL;
gboolean sgen_suspend_thread (SgenThreadInfo *info) MONO_INTERNAL;
gboolean sgen_resume_thread (SgenThreadInfo *info) MONO_INTERNAL;
void sgen_wait_for_suspend_ack (int count) MONO_INTERNAL;
-gboolean sgen_park_current_thread_if_doing_handshake (SgenThreadInfo *p) MONO_INTERNAL;
void sgen_os_init (void) MONO_INTERNAL;
gboolean sgen_is_worker_thread (MonoNativeThreadId thread) MONO_INTERNAL;
@@ -454,6 +429,7 @@ enum {
INTERNAL_MEM_JOB_QUEUE_ENTRY,
INTERNAL_MEM_TOGGLEREF_DATA,
INTERNAL_MEM_CARDTABLE_MOD_UNION,
+ INTERNAL_MEM_BINARY_PROTOCOL,
INTERNAL_MEM_MAX
};
@@ -697,7 +673,7 @@ struct _SgenMajorCollector {
void (*init_worker_thread) (void *data);
void (*reset_worker_data) (void *data);
gboolean (*is_valid_object) (char *object);
- gboolean (*describe_pointer) (char *pointer);
+ MonoVTable* (*describe_pointer) (char *pointer);
guint8* (*get_cardtable_mod_union_for_object) (char *object);
long long (*get_and_reset_num_major_objects_marked) (void);
};
@@ -816,6 +792,7 @@ gboolean sgen_is_bridge_object (MonoObject *obj) MONO_INTERNAL;
gboolean sgen_is_bridge_class (MonoClass *class) MONO_INTERNAL;
void sgen_mark_bridge_object (MonoObject *obj) MONO_INTERNAL;
void sgen_bridge_register_finalized_object (MonoObject *object) MONO_INTERNAL;
+void sgen_bridge_describe_pointer (MonoObject *object) MONO_INTERNAL;
void sgen_scan_togglerefs (char *start, char *end, ScanCopyContext ctx) MONO_INTERNAL;
void sgen_process_togglerefs (void) MONO_INTERNAL;
@@ -966,28 +943,24 @@ extern __thread char *stack_end;
#endif
#ifdef HAVE_KW_THREAD
-#define EMIT_TLS_ACCESS(mb,dummy,offset) do { \
+#define EMIT_TLS_ACCESS(mb,member,key) do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
- mono_mb_emit_i4 ((mb), (offset)); \
+ mono_mb_emit_i4 ((mb), (key)); \
} while (0)
#else
-/*
- * CEE_MONO_TLS requires the tls offset, not the key, so the code below only works on darwin,
- * where the two are the same.
- */
#if defined(__APPLE__) || defined (HOST_WIN32)
-#define EMIT_TLS_ACCESS(mb,member,dummy) do { \
+#define EMIT_TLS_ACCESS(mb,member,key) do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
- mono_mb_emit_i4 ((mb), thread_info_key); \
+ mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_THREAD_INFO); \
mono_mb_emit_icon ((mb), G_STRUCT_OFFSET (SgenThreadInfo, member)); \
mono_mb_emit_byte ((mb), CEE_ADD); \
mono_mb_emit_byte ((mb), CEE_LDIND_I); \
} while (0)
#else
-#define EMIT_TLS_ACCESS(mb,member,dummy) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
+#define EMIT_TLS_ACCESS(mb,member,key) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
#endif
#endif
@@ -1003,6 +976,7 @@ extern int degraded_mode;
extern int default_nursery_size;
extern guint32 tlab_size;
extern NurseryClearPolicy nursery_clear_policy;
+extern gboolean sgen_try_free_some_memory;
extern LOCK_DECLARE (gc_mutex);
@@ -1074,6 +1048,10 @@ sgen_dummy_use (gpointer v) {
gboolean sgen_parse_environment_string_extract_number (const char *str, glong *out) MONO_INTERNAL;
void sgen_env_var_error (const char *env_var, const char *fallback, const char *description_format, ...) MONO_INTERNAL;
+/* Utilities */
+
+void sgen_qsort (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*)) MONO_INTERNAL;
+
#endif /* HAVE_SGEN_GC */
#endif /* __MONO_SGENGC_H__ */
diff --git a/mono/metadata/sgen-internal.c b/mono/metadata/sgen-internal.c
index 6be8b0d285..8bf1c11234 100644
--- a/mono/metadata/sgen-internal.c
+++ b/mono/metadata/sgen-internal.c
@@ -110,6 +110,7 @@ description_for_type (int type)
case INTERNAL_MEM_JOB_QUEUE_ENTRY: return "job-queue-entry";
case INTERNAL_MEM_TOGGLEREF_DATA: return "toggleref-data";
case INTERNAL_MEM_CARDTABLE_MOD_UNION: return "cardtable-mod-union";
+ case INTERNAL_MEM_BINARY_PROTOCOL: return "binary-protocol";
default:
g_assert_not_reached ();
}
diff --git a/mono/metadata/sgen-los.c b/mono/metadata/sgen-los.c
index 5d51db7d86..58f825903e 100644
--- a/mono/metadata/sgen-los.c
+++ b/mono/metadata/sgen-los.c
@@ -510,10 +510,10 @@ mono_sgen_los_describe_pointer (char *ptr)
vtable = (MonoVTable*)SGEN_LOAD_VTABLE (obj->data);
if (obj->data == ptr) {
- SGEN_LOG (0, "%s (size %td pin %d)\n", los_kind, size, pinned ? 1 : 0);
+ SGEN_LOG (0, "%s (size %d pin %d)\n", los_kind, (int)size, pinned ? 1 : 0);
} else {
- SGEN_LOG (0, "%s (interior-ptr offset %td size %td pin %d)",
- los_kind, ptr - obj->data, size, pinned ? 1 : 0);
+ SGEN_LOG (0, "%s (interior-ptr offset %td size %d pin %d)",
+ los_kind, ptr - obj->data, (int)size, pinned ? 1 : 0);
}
return TRUE;
diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c
index 23e03b7ec3..1ef999b862 100755
--- a/mono/metadata/sgen-marksweep.c
+++ b/mono/metadata/sgen-marksweep.c
@@ -564,7 +564,13 @@ ms_alloc_block (int size_index, gboolean pinned, gboolean has_references)
info->pinned = pinned;
info->has_references = has_references;
info->has_pinned = pinned;
- info->is_to_space = (sgen_get_current_collection_generation () == GENERATION_OLD); /*FIXME WHY??? */
+ /*
+ * Blocks that are to-space are not evacuated from. During an major collection
+ * blocks are allocated for two reasons: evacuating objects from the nursery and
+ * evacuating them from major blocks marked for evacuation. In both cases we don't
+ * want further evacuation.
+ */
+ info->is_to_space = (sgen_get_current_collection_generation () == GENERATION_OLD);
info->swept = 1;
#ifndef FIXED_HEAP
info->block = ms_get_empty_block ();
@@ -947,7 +953,7 @@ major_is_valid_object (char *object)
}
-static gboolean
+static MonoVTable*
major_describe_pointer (char *ptr)
{
MSBlockInfo *block;
@@ -989,10 +995,10 @@ major_describe_pointer (char *ptr)
SGEN_LOG (0, " marked %d)\n", marked ? 1 : 0);
- return TRUE;
+ return vtable;
} END_FOREACH_BLOCK;
- return FALSE;
+ return NULL;
}
static void
@@ -1185,6 +1191,7 @@ major_copy_or_mark_object (void **ptr, void *obj, SgenGrayQueue *queue)
MS_CALC_MARK_BIT (word, bit, obj);
SGEN_ASSERT (9, !MS_MARK_BIT (block, word, bit), "object %p already marked", obj);
MS_PAR_SET_MARK_BIT (was_marked, block, word, bit);
+ binary_protocol_mark (obj, vt, sgen_safe_object_get_size ((MonoObject*)obj));
}
} else {
/*
@@ -1297,8 +1304,8 @@ major_copy_or_mark_object_concurrent (void **ptr, void *obj, SgenGrayQueue *queu
#endif
sgen_los_pin_object (obj);
- /* FIXME: only enqueue if object has references */
- GRAY_OBJECT_ENQUEUE (queue, obj);
+ if (SGEN_OBJECT_HAS_REFERENCES (obj))
+ GRAY_OBJECT_ENQUEUE (queue, obj);
INC_NUM_MAJOR_OBJECTS_MARKED ();
}
}
@@ -1436,8 +1443,8 @@ major_copy_or_mark_object (void **ptr, void *obj, SgenGrayQueue *queue)
#endif
sgen_los_pin_object (obj);
- /* FIXME: only enqueue if object has references */
- GRAY_OBJECT_ENQUEUE (queue, obj);
+ if (SGEN_OBJECT_HAS_REFERENCES (obj))
+ GRAY_OBJECT_ENQUEUE (queue, obj);
}
}
}
@@ -1538,6 +1545,7 @@ static void
sweep_block (MSBlockInfo *block, gboolean during_major_collection)
{
int count;
+ void *reversed = NULL;
if (!during_major_collection)
g_assert (!sgen_concurrent_collection_in_progress ());
@@ -1563,10 +1571,15 @@ sweep_block (MSBlockInfo *block, gboolean during_major_collection)
/* reset mark bits */
memset (block->mark_words, 0, sizeof (mword) * MS_NUM_MARK_WORDS);
- /*
- * FIXME: reverse free list so that it's in address
- * order
- */
+ /* Reverse free list so that it's in address order */
+ reversed = NULL;
+ while (block->free_list) {
+ void *next = *(void**)block->free_list;
+ *(void**)block->free_list = reversed;
+ reversed = block->free_list;
+ block->free_list = next;
+ }
+ block->free_list = reversed;
block->swept = 1;
}
@@ -1574,22 +1587,20 @@ sweep_block (MSBlockInfo *block, gboolean during_major_collection)
static inline int
bitcount (mword d)
{
-#if SIZEOF_VOID_P == 8
- /* http://www.jjj.de/bitwizardry/bitwizardrypage.html */
- d -= (d>>1) & 0x5555555555555555;
- d = ((d>>2) & 0x3333333333333333) + (d & 0x3333333333333333);
- d = ((d>>4) + d) & 0x0f0f0f0f0f0f0f0f;
- d *= 0x0101010101010101;
- return d >> 56;
+ int count = 0;
+
+#ifdef __GNUC__
+ if (sizeof (mword) == sizeof (unsigned long))
+ count += __builtin_popcountl (d);
+ else
+ count += __builtin_popcount (d);
#else
- /* http://aggregate.org/MAGIC/ */
- d -= ((d >> 1) & 0x55555555);
- d = (((d >> 2) & 0x33333333) + (d & 0x33333333));
- d = (((d >> 4) + d) & 0x0f0f0f0f);
- d += (d >> 8);
- d += (d >> 16);
- return (d & 0x0000003f);
+ while (d) {
+ count ++;
+ d &= (d - 1);
+ }
#endif
+ return count;
}
static void
@@ -1916,7 +1927,7 @@ major_have_computer_minor_collection_allowance (void)
empty_block_arr [i++] = block;
SGEN_ASSERT (0, i == num_empty_blocks, "empty block count wrong");
- qsort (empty_block_arr, num_empty_blocks, sizeof (void*), compare_pointers);
+ sgen_qsort (empty_block_arr, num_empty_blocks, sizeof (void*), compare_pointers);
/*
* We iterate over the free blocks, trying to find MS_BLOCK_ALLOC_NUM
diff --git a/mono/metadata/sgen-memory-governor.c b/mono/metadata/sgen-memory-governor.c
index 96cb905011..eb44627eee 100644
--- a/mono/metadata/sgen-memory-governor.c
+++ b/mono/metadata/sgen-memory-governor.c
@@ -139,11 +139,11 @@ sgen_memgov_try_calculate_minor_collection_allowance (gboolean overwrite)
if (debug_print_allowance) {
mword old_major = last_collection_old_num_major_sections * major_collector.section_size;
- SGEN_LOG (1, "Before collection: %td bytes (%td major, %td LOS)",
- old_major + last_collection_old_los_memory_usage, old_major, last_collection_old_los_memory_usage);
- SGEN_LOG (1, "After collection: %td bytes (%td major, %td LOS)",
- new_heap_size, new_major, last_collection_los_memory_usage);
- SGEN_LOG (1, "Allowance: %td bytes", minor_collection_allowance);
+ SGEN_LOG (1, "Before collection: %ld bytes (%ld major, %ld LOS)",
+ (long)(old_major + last_collection_old_los_memory_usage), (long)old_major, (long)last_collection_old_los_memory_usage);
+ SGEN_LOG (1, "After collection: %ld bytes (%ld major, %ld LOS)",
+ (long)new_heap_size, (long)new_major, (long)last_collection_los_memory_usage);
+ SGEN_LOG (1, "Allowance: %ld bytes", (long)minor_collection_allowance);
}
if (major_collector.have_computed_minor_collection_allowance)
diff --git a/mono/metadata/sgen-nursery-allocator.c b/mono/metadata/sgen-nursery-allocator.c
index d16b2b778a..0d90a79806 100644
--- a/mono/metadata/sgen-nursery-allocator.c
+++ b/mono/metadata/sgen-nursery-allocator.c
@@ -202,7 +202,7 @@ void
dump_alloc_records (void)
{
int i;
- qsort (alloc_records, next_record, sizeof (AllocRecord), comp_alloc_record);
+ sgen_qsort (alloc_records, next_record, sizeof (AllocRecord), comp_alloc_record);
printf ("------------------------------------DUMP RECORDS----------------------------\n");
for (i = 0; i < next_record; ++i) {
@@ -220,7 +220,7 @@ verify_alloc_records (void)
int max_hole = 0;
AllocRecord *prev = NULL;
- qsort (alloc_records, next_record, sizeof (AllocRecord), comp_alloc_record);
+ sgen_qsort (alloc_records, next_record, sizeof (AllocRecord), comp_alloc_record);
printf ("------------------------------------DUMP RECORDS- %d %d---------------------------\n", next_record, alloc_count);
for (i = 0; i < next_record; ++i) {
AllocRecord *rec = alloc_records + i;
diff --git a/mono/metadata/sgen-os-mach.c b/mono/metadata/sgen-os-mach.c
index 14290d373d..2a902bdd4f 100644
--- a/mono/metadata/sgen-os-mach.c
+++ b/mono/metadata/sgen-os-mach.c
@@ -92,7 +92,7 @@ sgen_suspend_thread (SgenThreadInfo *info)
if (mono_gc_get_gc_callbacks ()->thread_suspend_func)
mono_gc_get_gc_callbacks ()->thread_suspend_func (info->runtime_data, &ctx, NULL);
- SGEN_LOG (2, "thread %p stopped at %p stack_start=%p", (void*)info->info.native_handle, info->stopped_ip, info->stack_start);
+ SGEN_LOG (2, "thread %p stopped at %p stack_start=%p", (void*)(gsize)info->info.native_handle, info->stopped_ip, info->stack_start);
binary_protocol_thread_suspend ((gpointer)mono_thread_info_get_tid (info), info->stopped_ip);
@@ -116,25 +116,15 @@ sgen_thread_handshake (BOOL suspend)
int count = 0;
FOREACH_THREAD_SAFE (info) {
- if (info->joined_stw == suspend)
- continue;
- info->joined_stw = suspend;
-
if (info == cur_thread || sgen_is_worker_thread (mono_thread_info_get_tid (info)))
continue;
if (info->gc_disabled)
continue;
if (suspend) {
- g_assert (!info->doing_handshake);
- info->doing_handshake = TRUE;
-
if (!sgen_suspend_thread (info))
continue;
} else {
- g_assert (info->doing_handshake);
- info->doing_handshake = FALSE;
-
ret = thread_resume (info->info.native_handle);
if (ret != KERN_SUCCESS)
continue;
diff --git a/mono/metadata/sgen-os-posix.c b/mono/metadata/sgen-os-posix.c
index 15f7afa1b0..b0270c049c 100644
--- a/mono/metadata/sgen-os-posix.c
+++ b/mono/metadata/sgen-os-posix.c
@@ -34,6 +34,7 @@
#include "metadata/gc-internal.h"
#include "metadata/sgen-archdep.h"
#include "metadata/object-internals.h"
+#include "utils/mono-signal-handler.h"
#if defined(__APPLE__) || defined(__OpenBSD__) || defined(__FreeBSD__)
const static int suspend_signal_num = SIGXFSZ;
@@ -57,17 +58,9 @@ suspend_thread (SgenThreadInfo *info, void *context)
#endif
gpointer stack_start;
- /*
- * It's possible that a dying thread is parked via
- * sgen_park_current_thread_if_doing_handshake(), and, while parked, STW tries to
- * suspend it again. In that case doing_handshake will not be set anymore, and the
- * "nested" suspend must be ignored.
- */
- if (!info->doing_handshake)
- return;
-
info->stopped_domain = mono_domain_get ();
info->stopped_ip = context ? (gpointer) ARCH_SIGCTX_IP (context) : NULL;
+ info->signal = 0;
stop_count = sgen_global_stop_count;
/* duplicate signal */
if (0 && info->stop_count == stop_count)
@@ -118,7 +111,7 @@ suspend_thread (SgenThreadInfo *info, void *context)
do {
info->signal = 0;
sigsuspend (&suspend_signal_mask);
- } while (info->signal != restart_signal_num && info->doing_handshake);
+ } while (info->signal != restart_signal_num);
/* Unblock the restart signal. */
pthread_sigmask (SIG_UNBLOCK, &suspend_ack_signal_mask, NULL);
@@ -129,49 +122,25 @@ suspend_thread (SgenThreadInfo *info, void *context)
}
/* LOCKING: assumes the GC lock is held (by the stopping thread) */
-static void
-suspend_handler (int sig, siginfo_t *siginfo, void *context)
+MONO_SIGNAL_HANDLER_FUNC (static, suspend_handler, (int sig, siginfo_t *siginfo, void *context))
{
SgenThreadInfo *info;
int old_errno = errno;
info = mono_thread_info_current ();
-
- if (info) {
- suspend_thread (info, context);
- } else {
- /* This can happen while a thread is dying */
- //g_print ("no thread info in suspend\n");
- }
+ suspend_thread (info, context);
errno = old_errno;
}
-static void
-restart_handler (int sig)
+MONO_SIGNAL_HANDLER_FUNC (static, restart_handler, (int sig))
{
SgenThreadInfo *info;
int old_errno = errno;
info = mono_thread_info_current ();
- /*
- If the thread info is null is means we're currently in the process of cleaning up,
- the pthread destructor has already kicked in and it has explicitly invoked the suspend handler.
-
- This means this thread has been suspended, TLS is dead, so the only option we have is to
- rely on pthread_self () and seatch over the thread list.
- */
- if (!info)
- info = (SgenThreadInfo*)mono_thread_info_lookup (pthread_self ());
-
- /*
- * If a thread is dying there might be no thread info. In
- * that case we rely on info->doing_handshake.
- */
- if (info) {
- info->signal = restart_signal_num;
- SGEN_LOG (4, "Restart handler in %p %p", info, (gpointer)mono_native_thread_id_get ());
- }
+ info->signal = restart_signal_num;
+ SGEN_LOG (4, "Restart handler in %p %p", info, (gpointer)mono_native_thread_id_get ());
errno = old_errno;
}
@@ -201,16 +170,6 @@ sgen_wait_for_suspend_ack (int count)
}
}
-gboolean
-sgen_park_current_thread_if_doing_handshake (SgenThreadInfo *p)
-{
- if (!p->doing_handshake)
- return FALSE;
-
- suspend_thread (p, NULL);
- return TRUE;
-}
-
int
sgen_thread_handshake (BOOL suspend)
{
@@ -222,9 +181,6 @@ sgen_thread_handshake (BOOL suspend)
count = 0;
FOREACH_THREAD_SAFE (info) {
- if (info->joined_stw == suspend)
- continue;
- info->joined_stw = suspend;
if (mono_native_thread_id_equals (mono_thread_info_get_tid (info), me)) {
continue;
}
@@ -232,13 +188,6 @@ sgen_thread_handshake (BOOL suspend)
continue;
/*if (signum == suspend_signal_num && info->stop_count == global_stop_count)
continue;*/
- if (suspend) {
- g_assert (!info->doing_handshake);
- info->doing_handshake = TRUE;
- } else {
- g_assert (info->doing_handshake);
- info->doing_handshake = FALSE;
- }
result = mono_threads_pthread_kill (info, signum);
if (result == 0) {
count++;
@@ -249,6 +198,8 @@ sgen_thread_handshake (BOOL suspend)
sgen_wait_for_suspend_ack (count);
+ SGEN_LOG (4, "%s handshake for %d threads\n", suspend ? "suspend" : "resume", count);
+
return count;
}
@@ -267,7 +218,7 @@ sgen_os_init (void)
g_error ("failed sigaction");
}
- sinfo.sa_handler = restart_handler;
+ sinfo.sa_handler = (void*) restart_handler;
if (sigaction (restart_signal_num, &sinfo, NULL) != 0) {
g_error ("failed sigaction");
}
diff --git a/mono/metadata/sgen-os-win32.c b/mono/metadata/sgen-os-win32.c
index 760e3eb3cf..36769f35cb 100755
--- a/mono/metadata/sgen-os-win32.c
+++ b/mono/metadata/sgen-os-win32.c
@@ -57,11 +57,29 @@ sgen_suspend_thread (SgenThreadInfo *info)
CloseHandle (handle);
- info->stopped_ip = (gpointer)context.Eip;
- info->stack_start = (char*)context.Esp - REDZONE_SIZE;
-
#ifdef USE_MONO_CTX
memset (&info->ctx, 0, sizeof (MonoContext));
+#ifdef TARGET_AMD64
+ info->ctx.rip = context.Rip;
+ info->ctx.rax = context.Rax;
+ info->ctx.rcx = context.Rcx;
+ info->ctx.rdx = context.Rdx;
+ info->ctx.rbx = context.Rbx;
+ info->ctx.rsp = context.Rsp;
+ info->ctx.rbp = context.Rbp;
+ info->ctx.rsi = context.Rsi;
+ info->ctx.rdi = context.Rdi;
+ info->ctx.r8 = context.R8;
+ info->ctx.r9 = context.R9;
+ info->ctx.r10 = context.R10;
+ info->ctx.r11 = context.R11;
+ info->ctx.r12 = context.R12;
+ info->ctx.r13 = context.R13;
+ info->ctx.r14 = context.R14;
+ info->ctx.r15 = context.R15;
+ info->stopped_ip = info->ctx.rip;
+ info->stack_start = (char*)info->ctx.rsp - REDZONE_SIZE;
+#else
info->ctx.edi = context.Edi;
info->ctx.esi = context.Esi;
info->ctx.ebx = context.Ebx;
@@ -70,6 +88,10 @@ sgen_suspend_thread (SgenThreadInfo *info)
info->ctx.eax = context.Eax;
info->ctx.ebp = context.Ebp;
info->ctx.esp = context.Esp;
+ info->stopped_ip = (gpointer)context.Eip;
+ info->stack_start = (char*)context.Esp - REDZONE_SIZE;
+#endif
+
#else
info->regs [0] = context.Edi;
info->regs [1] = context.Esi;
@@ -79,6 +101,8 @@ sgen_suspend_thread (SgenThreadInfo *info)
info->regs [5] = context.Eax;
info->regs [6] = context.Ebp;
info->regs [7] = context.Esp;
+ info->stopped_ip = (gpointer)context.Eip;
+ info->stack_start = (char*)context.Esp - REDZONE_SIZE;
#endif
/* Notify the JIT */
@@ -102,23 +126,14 @@ sgen_thread_handshake (BOOL suspend)
int count = 0;
FOREACH_THREAD_SAFE (info) {
- if (info->joined_stw == suspend)
- continue;
- info->joined_stw = suspend;
if (info == current)
continue;
if (info->gc_disabled)
continue;
if (suspend) {
- g_assert (!info->doing_handshake);
- info->doing_handshake = TRUE;
-
if (!sgen_suspend_thread (info))
continue;
} else {
- g_assert (info->doing_handshake);
- info->doing_handshake = FALSE;
-
if (!sgen_resume_thread (info))
continue;
}
diff --git a/mono/metadata/sgen-protocol.c b/mono/metadata/sgen-protocol.c
index 611d6f6bef..c41df40339 100644
--- a/mono/metadata/sgen-protocol.c
+++ b/mono/metadata/sgen-protocol.c
@@ -27,6 +27,7 @@
#include "sgen-protocol.h"
#include "sgen-memory-governor.h"
#include "utils/mono-mmap.h"
+#include "utils/mono-threads.h"
#ifdef SGEN_BINARY_PROTOCOL
@@ -107,13 +108,8 @@ unlock_recursive (void)
}
static void
-binary_protocol_flush_buffers_rec (BinaryProtocolBuffer *buffer)
+binary_protocol_flush_buffer (BinaryProtocolBuffer *buffer)
{
- if (!buffer)
- return;
-
- binary_protocol_flush_buffers_rec (buffer->next);
-
g_assert (buffer->index > 0);
fwrite (buffer->buffer, 1, buffer->index, binary_protocol_file);
@@ -123,15 +119,30 @@ binary_protocol_flush_buffers_rec (BinaryProtocolBuffer *buffer)
void
binary_protocol_flush_buffers (gboolean force)
{
+ int num_buffers = 0, i;
+ BinaryProtocolBuffer *buf;
+ BinaryProtocolBuffer **bufs;
+
if (!binary_protocol_file)
return;
if (!force && !try_lock_exclusive ())
return;
- binary_protocol_flush_buffers_rec (binary_protocol_buffers);
+ for (buf = binary_protocol_buffers; buf != NULL; buf = buf->next)
+ ++num_buffers;
+ bufs = sgen_alloc_internal_dynamic (num_buffers * sizeof (BinaryProtocolBuffer*), INTERNAL_MEM_BINARY_PROTOCOL, TRUE);
+ for (buf = binary_protocol_buffers, i = 0; buf != NULL; buf = buf->next, i++)
+ bufs [i] = buf;
+ SGEN_ASSERT (0, i == num_buffers, "Binary protocol buffer count error");
+
binary_protocol_buffers = NULL;
+ for (i = num_buffers - 1; i >= 0; --i)
+ binary_protocol_flush_buffer (bufs [i]);
+
+ sgen_free_internal_dynamic (buf, num_buffers * sizeof (BinaryProtocolBuffer*), INTERNAL_MEM_BINARY_PROTOCOL);
+
if (!force)
unlock_exclusive ();
@@ -170,6 +181,9 @@ protocol_entry (unsigned char type, gpointer data, int size)
if (!binary_protocol_file)
return;
+ if (sgen_is_worker_thread (mono_native_thread_id_get ()))
+ type |= 0x80;
+
lock_recursive ();
retry:
diff --git a/mono/metadata/sgen-qsort.c b/mono/metadata/sgen-qsort.c
new file mode 100644
index 0000000000..4b57884b0f
--- /dev/null
+++ b/mono/metadata/sgen-qsort.c
@@ -0,0 +1,78 @@
+/*
+ * sgen-qsort.c: Quicksort.
+ *
+ * Copyright (C) 2013 Xamarin Inc
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License 2.0 as published by the Free Software Foundation;
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License 2.0 along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_SGEN_GC
+
+#include "metadata/sgen-gc.h"
+
+#define ELEM(i) (((unsigned char*)base) + ((i) * width))
+#define SWAP(i,j) do { \
+ size_t __i = (i), __j = (j); \
+ if (__i != __j) { \
+ memcpy (swap_tmp, ELEM (__i), width); \
+ memcpy (ELEM (__i), ELEM (__j), width); \
+ memcpy (ELEM (__j), swap_tmp, width); \
+ } \
+ } while (0)
+
+static size_t
+partition (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*), unsigned char *pivot_tmp, unsigned char *swap_tmp)
+{
+ size_t pivot_idx = nel >> 1;
+ size_t s, i;
+
+ memcpy (pivot_tmp, ELEM (pivot_idx), width);
+ SWAP (pivot_idx, nel - 1);
+ s = 0;
+ for (i = 0; i < nel - 1; ++i) {
+ if (compar (ELEM (i), pivot_tmp) <= 0) {
+ SWAP (i, s);
+ ++s;
+ }
+ }
+ SWAP (s, nel - 1);
+ return s;
+}
+
+static void
+qsort_rec (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*), unsigned char *pivot_tmp, unsigned char *swap_tmp)
+{
+ size_t pivot_idx;
+
+ if (nel <= 1)
+ return;
+
+ pivot_idx = partition (base, nel, width, compar, pivot_tmp, swap_tmp);
+ qsort_rec (base, pivot_idx, width, compar, pivot_tmp, swap_tmp);
+ if (pivot_idx < nel)
+ qsort_rec (ELEM (pivot_idx + 1), nel - pivot_idx - 1, width, compar, pivot_tmp, swap_tmp);
+}
+
+void
+sgen_qsort (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*))
+{
+ unsigned char pivot_tmp [width];
+ unsigned char swap_tmp [width];
+
+ qsort_rec (base, nel, width, compar, pivot_tmp, swap_tmp);
+}
+
+#endif
diff --git a/mono/metadata/sgen-stw.c b/mono/metadata/sgen-stw.c
index 404307a161..54dc218b58 100755
--- a/mono/metadata/sgen-stw.c
+++ b/mono/metadata/sgen-stw.c
@@ -101,7 +101,7 @@ is_ip_in_managed_allocator (MonoDomain *domain, gpointer ip)
if (!ji)
return FALSE;
- return sgen_is_critical_method (ji->method);
+ return sgen_is_critical_method (mono_jit_info_get_method (ji));
}
static int
@@ -117,9 +117,9 @@ restart_threads_until_none_in_managed_allocator (void)
allocator */
FOREACH_THREAD_SAFE (info) {
gboolean result;
- if (info->skip || info->gc_disabled || !info->joined_stw)
+ if (info->skip || info->gc_disabled)
continue;
- if (!info->thread_is_dying && (!info->stack_start || info->in_critical_region || info->info.inside_critical_region ||
+ if (mono_thread_info_run_state (info) == STATE_RUNNING && (!info->stack_start || info->in_critical_region || info->info.inside_critical_region ||
is_ip_in_managed_allocator (info->stopped_domain, info->stopped_ip))) {
binary_protocol_thread_restart ((gpointer)mono_thread_info_get_tid (info));
SGEN_LOG (3, "thread %p resumed.", (void*) (size_t) info->info.native_handle);
@@ -195,18 +195,6 @@ release_gc_locks (void)
UNLOCK_INTERRUPTION;
}
-static void
-stw_bridge_process (void)
-{
- sgen_bridge_processing_stw_step ();
-}
-
-static void
-bridge_process (int generation)
-{
- sgen_bridge_processing_finish (generation);
-}
-
static TV_DECLARE (stop_world_time);
static unsigned long max_pause_usec = 0;
@@ -269,9 +257,6 @@ sgen_restart_world (int generation, GGTimingInfo *timing)
#endif
} END_FOREACH_THREAD
- stw_bridge_process ();
- release_gc_locks ();
-
count = sgen_thread_handshake (FALSE);
TV_GETTIME (end_sw);
usec = TV_ELAPSED (stop_world_time, end_sw);
@@ -280,9 +265,21 @@ sgen_restart_world (int generation, GGTimingInfo *timing)
mono_profiler_gc_event (MONO_GC_EVENT_POST_START_WORLD, generation);
MONO_GC_WORLD_RESTART_END (generation);
- mono_thread_hazardous_try_free_some ();
+ /*
+ * We must release the thread info suspend lock after doing
+ * the thread handshake. Otherwise, if the GC stops the world
+ * and a thread is in the process of starting up, but has not
+ * yet registered (it's not in the thread_list), it is
+ * possible that the thread does register while the world is
+ * stopped. When restarting the GC will then try to restart
+ * said thread, but since it never got the suspend signal, it
+ * cannot answer the restart signal, so a deadlock results.
+ */
+ release_gc_locks ();
+
+ sgen_try_free_some_memory = TRUE;
- bridge_process (generation);
+ sgen_bridge_processing_finish (generation);
TV_GETTIME (end_bridge);
bridge_usec = TV_ELAPSED (end_sw, end_bridge);
diff --git a/mono/metadata/sgen-toggleref.c b/mono/metadata/sgen-toggleref.c
index a05c177603..7407e9d70e 100644
--- a/mono/metadata/sgen-toggleref.c
+++ b/mono/metadata/sgen-toggleref.c
@@ -136,7 +136,7 @@ ensure_toggleref_capacity (int capacity)
MonoGCToggleRef *tmp;
int old_capacity = toggleref_array_capacity;
while (toggleref_array_capacity < toggleref_array_size + capacity)
- toggleref_array_size *= 2;
+ toggleref_array_capacity *= 2;
tmp = sgen_alloc_internal_dynamic (
toggleref_array_capacity * sizeof (MonoGCToggleRef),
diff --git a/mono/metadata/socket-io.c b/mono/metadata/socket-io.c
index b1eafd15c8..145633f943 100644
--- a/mono/metadata/socket-io.c
+++ b/mono/metadata/socket-io.c
@@ -106,6 +106,15 @@
#define AI_ADDRCONFIG 0
#endif
+#ifdef __APPLE__
+/*
+ * We remove this until we have a Darwin implementation
+ * that can walk the result of struct ifconf. The current
+ * implementation only works for Linux
+ */
+#undef HAVE_SIOCGIFCONF
+#endif
+
static gint32 convert_family(MonoAddressFamily mono_family)
{
gint32 family=-1;
@@ -1405,19 +1414,13 @@ extern void ves_icall_System_Net_Sockets_Socket_Disconnect_internal(SOCKET sock,
*/
_wapi_disconnectex = NULL;
- /* Look up the TransmitFile extension function pointer
- * instead of calling TransmitFile() directly, because
- * apparently "Several of the extension functions have
- * been available since WinSock 1.1 and are exported
- * from MSWsock.dll, however it's not advisable to
- * link directly to this dll as this ties you to the
- * Microsoft WinSock provider. A provider neutral way
- * of accessing these extension functions is to load
- * them dynamically via WSAIoctl using the
- * SIO_GET_EXTENSION_FUNCTION_POINTER op code. This
- * should, theoretically, allow you to access these
- * functions from any provider that supports them..."
- * (http://www.codeproject.com/internet/jbsocketserver3.asp)
+ /*
+ * Use the SIO_GET_EXTENSION_FUNCTION_POINTER to
+ * determine the address of the disconnect method without
+ * taking a hard dependency on a single provider
+ *
+ * For an explanation of why this is done, you can read
+ * the article at http://www.codeproject.com/internet/jbsocketserver3.asp
*/
ret = WSAIoctl (sock, SIO_GET_EXTENSION_FUNCTION_POINTER,
(void *)&trans_guid, sizeof(GUID),
@@ -2231,12 +2234,15 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g
if(address) {
mreq.imr_address = ipaddress_to_struct_in_addr (address);
}
+
+ field = mono_class_get_field_from_name(obj_val->vtable->klass, "iface_index");
+ mreq.imr_ifindex = *(gint32 *)(((char *)obj_val)+field->offset);
#else
if(address) {
mreq.imr_interface = ipaddress_to_struct_in_addr (address);
}
#endif /* HAVE_STRUCT_IP_MREQN */
-
+
ret = _wapi_setsockopt (sock, system_level,
system_name, &mreq,
sizeof (mreq));
@@ -2275,6 +2281,23 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g
linger.l_linger = 0;
ret = _wapi_setsockopt (sock, system_level, system_name, &linger, sizeof (linger));
break;
+ case SocketOptionName_MulticastInterface:
+#ifndef HOST_WIN32
+#ifdef HAVE_STRUCT_IP_MREQN
+ int_val = GUINT32_FROM_BE (int_val);
+ if ((int_val & 0xff000000) == 0) {
+ /* int_val is interface index */
+ struct ip_mreqn mreq = {{0}};
+ mreq.imr_ifindex = int_val;
+ ret = _wapi_setsockopt (sock, system_level, system_name, (char *) &mreq, sizeof (mreq));
+ break;
+ }
+ int_val = GUINT32_TO_BE (int_val);
+#endif /* HAVE_STRUCT_IP_MREQN */
+#endif /* HOST_WIN32 */
+ /* int_val is in_addr */
+ ret = _wapi_setsockopt (sock, system_level, system_name, (char *) &int_val, sizeof (int_val));
+ break;
case SocketOptionName_DontFragment:
#ifdef HAVE_IP_MTU_DISCOVER
/* Fiddle with the value slightly if we're
diff --git a/mono/metadata/test-gc-memfuncs.c b/mono/metadata/test-gc-memfuncs.c
new file mode 100644
index 0000000000..a8ccf8833c
--- /dev/null
+++ b/mono/metadata/test-gc-memfuncs.c
@@ -0,0 +1,104 @@
+/*
+ * test-sgen-qsort.c: Unit test for our own bzero/memmove.
+ *
+ * Copyright (C) 2013 Xamarin Inc
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License 2.0 as published by the Free Software Foundation;
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License 2.0 along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "config.h"
+
+#include "metadata/gc-internal.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <assert.h>
+
+#define POOL_SIZE 2048
+#define START_OFFSET 128
+
+#define BZERO_OFFSETS 64
+#define BZERO_SIZES 256
+
+#define MEMMOVE_SRC_OFFSETS 32
+#define MEMMOVE_DEST_OFFSETS 32
+#define MEMMOVE_SIZES 256
+#define MEMMOVE_NONOVERLAP_START 1024
+
+int
+main (void)
+{
+ unsigned char *random_mem = malloc (POOL_SIZE);
+ unsigned char *reference = malloc (POOL_SIZE);
+ unsigned char *playground = malloc (POOL_SIZE);
+ long *long_random_mem;
+ int i, offset, size, src_offset, dest_offset;
+
+ srandom (time (NULL));
+
+ /* init random memory */
+ long_random_mem = (long*)random_mem;
+ for (i = 0; i < POOL_SIZE / sizeof (long); ++i)
+ long_random_mem [i] = random ();
+
+ /* test bzero */
+ for (offset = 0; offset <= BZERO_OFFSETS; ++offset) {
+ for (size = 0; size <= BZERO_SIZES; ++size) {
+ memcpy (reference, random_mem, POOL_SIZE);
+ memcpy (playground, random_mem, POOL_SIZE);
+
+ bzero (reference + START_OFFSET + offset, size);
+ mono_gc_bzero_atomic (playground + START_OFFSET + offset, size);
+
+ assert (!memcmp (reference, playground, POOL_SIZE));
+ }
+ }
+
+ /* test memmove */
+ for (src_offset = -MEMMOVE_SRC_OFFSETS; src_offset <= MEMMOVE_SRC_OFFSETS; ++src_offset) {
+ for (dest_offset = -MEMMOVE_DEST_OFFSETS; dest_offset <= MEMMOVE_DEST_OFFSETS; ++dest_offset) {
+ for (size = 0; size <= MEMMOVE_SIZES; ++size) {
+ /* overlapping */
+ memcpy (reference, random_mem, POOL_SIZE);
+ memcpy (playground, random_mem, POOL_SIZE);
+
+ memmove (reference + START_OFFSET + dest_offset, reference + START_OFFSET + src_offset, size);
+ mono_gc_memmove_atomic (playground + START_OFFSET + dest_offset, playground + START_OFFSET + src_offset, size);
+
+ assert (!memcmp (reference, playground, POOL_SIZE));
+
+ /* non-overlapping with dest < src */
+ memcpy (reference, random_mem, POOL_SIZE);
+ memcpy (playground, random_mem, POOL_SIZE);
+
+ memmove (reference + START_OFFSET + dest_offset, reference + MEMMOVE_NONOVERLAP_START + src_offset, size);
+ mono_gc_memmove_atomic (playground + START_OFFSET + dest_offset, playground + MEMMOVE_NONOVERLAP_START + src_offset, size);
+
+ assert (!memcmp (reference, playground, POOL_SIZE));
+
+ /* non-overlapping with dest > src */
+ memcpy (reference, random_mem, POOL_SIZE);
+ memcpy (playground, random_mem, POOL_SIZE);
+
+ memmove (reference + MEMMOVE_NONOVERLAP_START + dest_offset, reference + START_OFFSET + src_offset, size);
+ mono_gc_memmove_atomic (playground + MEMMOVE_NONOVERLAP_START + dest_offset, playground + START_OFFSET + src_offset, size);
+
+ assert (!memcmp (reference, playground, POOL_SIZE));
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/mono/metadata/test-sgen-qsort.c b/mono/metadata/test-sgen-qsort.c
new file mode 100644
index 0000000000..4a75ea298a
--- /dev/null
+++ b/mono/metadata/test-sgen-qsort.c
@@ -0,0 +1,103 @@
+/*
+ * test-sgen-qsort.c: Unit test for quicksort.
+ *
+ * Copyright (C) 2013 Xamarin Inc
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License 2.0 as published by the Free Software Foundation;
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License 2.0 along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "config.h"
+
+#include "metadata/sgen-gc.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <assert.h>
+
+static int
+compare_ints (const void *pa, const void *pb)
+{
+ int a = *(const int*)pa;
+ int b = *(const int*)pb;
+ if (a < b)
+ return -1;
+ if (a == b)
+ return 0;
+ return 1;
+}
+
+typedef struct {
+ int key;
+ int val;
+} teststruct_t;
+
+static int
+compare_teststructs (const void *pa, const void *pb)
+{
+ int a = ((const teststruct_t*)pa)->key;
+ int b = ((const teststruct_t*)pb)->key;
+ if (a < b)
+ return -1;
+ if (a == b)
+ return 0;
+ return 1;
+}
+
+static void
+compare_sorts (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*))
+{
+ size_t len = nel * width;
+ void *b1 = malloc (len);
+ void *b2 = malloc (len);
+
+ memcpy (b1, base, len);
+ memcpy (b2, base, len);
+
+ qsort (b1, nel, width, compar);
+ sgen_qsort (b2, nel, width, compar);
+
+ assert (!memcmp (b1, b2, len));
+
+ free (b1);
+ free (b2);
+}
+
+int
+main (void)
+{
+ int i;
+ for (i = 0; i < 4000; ++i) {
+ int a [i];
+ int j;
+
+ for (j = 0; j < i; ++j)
+ a [j] = i - j - 1;
+ compare_sorts (a, i, sizeof (int), compare_ints);
+ }
+
+ srandom (time (NULL));
+ for (i = 0; i < 2000; ++i) {
+ teststruct_t a [200];
+ int j;
+ for (j = 0; j < 200; ++j) {
+ a [j].key = random ();
+ a [j].val = random ();
+ }
+
+ compare_sorts (a, 200, sizeof (teststruct_t), compare_teststructs);
+ }
+
+ return 0;
+}
diff --git a/mono/metadata/threads-types.h b/mono/metadata/threads-types.h
index c430d62e98..b090fcb216 100644
--- a/mono/metadata/threads-types.h
+++ b/mono/metadata/threads-types.h
@@ -54,10 +54,6 @@ typedef struct _MonoInternalThread MonoInternalThread;
typedef void (*MonoThreadCleanupFunc) (MonoInternalThread* thread);
-gpointer mono_create_thread (WapiSecurityAttributes *security,
- guint32 stacksize, WapiThreadStart start,
- gpointer param, guint32 create, gsize *tid) MONO_INTERNAL;
-
MonoInternalThread* mono_thread_create_internal (MonoDomain *domain, gpointer func, gpointer arg, gboolean threadpool_thread, gboolean no_detach, guint32 stack_size) MONO_INTERNAL;
void mono_threads_install_cleanup (MonoThreadCleanupFunc func) MONO_INTERNAL;
@@ -140,6 +136,7 @@ gint16 ves_icall_System_Threading_Thread_VolatileRead2 (void *ptr) MONO_INTERNAL
gint32 ves_icall_System_Threading_Thread_VolatileRead4 (void *ptr) MONO_INTERNAL;
gint64 ves_icall_System_Threading_Thread_VolatileRead8 (void *ptr) MONO_INTERNAL;
void * ves_icall_System_Threading_Thread_VolatileReadIntPtr (void *ptr) MONO_INTERNAL;
+void * ves_icall_System_Threading_Thread_VolatileReadObject (void *ptr) MONO_INTERNAL;
double ves_icall_System_Threading_Thread_VolatileReadDouble (void *ptr) MONO_INTERNAL;
float ves_icall_System_Threading_Thread_VolatileReadFloat (void *ptr) MONO_INTERNAL;
@@ -148,11 +145,26 @@ void ves_icall_System_Threading_Thread_VolatileWrite2 (void *ptr, gint16) MONO_I
void ves_icall_System_Threading_Thread_VolatileWrite4 (void *ptr, gint32) MONO_INTERNAL;
void ves_icall_System_Threading_Thread_VolatileWrite8 (void *ptr, gint64) MONO_INTERNAL;
void ves_icall_System_Threading_Thread_VolatileWriteIntPtr (void *ptr, void *) MONO_INTERNAL;
-void ves_icall_System_Threading_Thread_VolatileWriteObject (void *ptr, void *) MONO_INTERNAL;
+void ves_icall_System_Threading_Thread_VolatileWriteObject (void *ptr, MonoObject *) MONO_INTERNAL;
void ves_icall_System_Threading_Thread_VolatileWriteFloat (void *ptr, float) MONO_INTERNAL;
void ves_icall_System_Threading_Thread_VolatileWriteDouble (void *ptr, double) MONO_INTERNAL;
+gint8 ves_icall_System_Threading_Volatile_Read1 (void *ptr) MONO_INTERNAL;
+gint16 ves_icall_System_Threading_Volatile_Read2 (void *ptr) MONO_INTERNAL;
+gint32 ves_icall_System_Threading_Volatile_Read4 (void *ptr) MONO_INTERNAL;
+gint64 ves_icall_System_Threading_Volatile_Read8 (void *ptr) MONO_INTERNAL;
+void * ves_icall_System_Threading_Volatile_ReadIntPtr (void *ptr) MONO_INTERNAL;
+double ves_icall_System_Threading_Volatile_ReadDouble (void *ptr) MONO_INTERNAL;
+float ves_icall_System_Threading_Volatile_ReadFloat (void *ptr) MONO_INTERNAL;
MonoObject* ves_icall_System_Threading_Volatile_Read_T (void *ptr) MONO_INTERNAL;
+
+void ves_icall_System_Threading_Volatile_Write1 (void *ptr, gint8) MONO_INTERNAL;
+void ves_icall_System_Threading_Volatile_Write2 (void *ptr, gint16) MONO_INTERNAL;
+void ves_icall_System_Threading_Volatile_Write4 (void *ptr, gint32) MONO_INTERNAL;
+void ves_icall_System_Threading_Volatile_Write8 (void *ptr, gint64) MONO_INTERNAL;
+void ves_icall_System_Threading_Volatile_WriteIntPtr (void *ptr, void *) MONO_INTERNAL;
+void ves_icall_System_Threading_Volatile_WriteFloat (void *ptr, float) MONO_INTERNAL;
+void ves_icall_System_Threading_Volatile_WriteDouble (void *ptr, double) MONO_INTERNAL;
void ves_icall_System_Threading_Volatile_Write_T (void *ptr, MonoObject *value) MONO_INTERNAL;
void ves_icall_System_Threading_Thread_MemoryBarrier (void) MONO_INTERNAL;
diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c
index a8720ba5bf..1b421c4a69 100755
--- a/mono/metadata/threads.c
+++ b/mono/metadata/threads.c
@@ -48,6 +48,7 @@
#include <mono/utils/hazard-pointer.h>
#include <mono/utils/mono-tls.h>
#include <mono/utils/atomic.h>
+#include <mono/utils/mono-memory-model.h>
#include <mono/metadata/gc-internal.h>
@@ -77,6 +78,9 @@ size_t pthread_get_stacksize_np(pthread_t);
#define SPIN_UNLOCK(i) i = 0
+#define LOCK_THREAD(thread) lock_thread((thread))
+#define UNLOCK_THREAD(thread) unlock_thread((thread))
+
/* Provide this for systems with glib < 2.6 */
#ifndef G_GSIZE_FORMAT
# if GLIB_SIZEOF_LONG == 8
@@ -86,13 +90,13 @@ size_t pthread_get_stacksize_np(pthread_t);
# endif
#endif
-struct StartInfo
+typedef struct
{
guint32 (*func)(void *);
MonoThread *obj;
MonoObject *delegate;
void *start_arg;
-};
+} StartInfo;
typedef union {
gint32 ival;
@@ -194,7 +198,6 @@ static void mono_free_static_data (gpointer* static_data, gboolean threadlocal);
static void mono_init_static_data_info (StaticDataInfo *static_data);
static guint32 mono_alloc_static_data_slot (StaticDataInfo *static_data, guint32 size, guint32 align);
static gboolean mono_thread_resume (MonoInternalThread* thread);
-static void mono_thread_start (MonoThread *thread);
static void signal_thread_state_change (MonoInternalThread *thread);
static void abort_thread_internal (MonoInternalThread *thread, gboolean can_raise_exception, gboolean install_async_abort);
static void suspend_thread_internal (MonoInternalThread *thread, gboolean interrupt);
@@ -323,14 +326,14 @@ static gboolean handle_remove(MonoInternalThread *thread)
static void ensure_synch_cs_set (MonoInternalThread *thread)
{
CRITICAL_SECTION *synch_cs;
-
+
if (thread->synch_cs != NULL) {
return;
}
-
+
synch_cs = g_new0 (CRITICAL_SECTION, 1);
InitializeCriticalSection (synch_cs);
-
+
if (InterlockedCompareExchangePointer ((gpointer *)&thread->synch_cs,
synch_cs, NULL) != NULL) {
/* Another thread must have installed this CS */
@@ -339,6 +342,22 @@ static void ensure_synch_cs_set (MonoInternalThread *thread)
}
}
+static inline void
+lock_thread (MonoInternalThread *thread)
+{
+ if (!thread->synch_cs)
+ ensure_synch_cs_set (thread);
+
+ g_assert (thread->synch_cs);
+ EnterCriticalSection (thread->synch_cs);
+}
+
+static inline void
+unlock_thread (MonoInternalThread *thread)
+{
+ LeaveCriticalSection (thread->synch_cs);
+}
+
/*
* NOTE: this function can be called also for threads different from the current one:
* make sure no code called from it will ever assume it is run on the thread that is
@@ -366,14 +385,16 @@ static void thread_cleanup (MonoInternalThread *thread)
mono_array_set (thread->cached_culture_info, MonoObject*, i, NULL);
}
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ if (thread->synch_cs)
+ LOCK_THREAD (thread);
+ else
+ g_assert (shutting_down);
thread->state |= ThreadState_Stopped;
thread->state &= ~ThreadState_Background;
- LeaveCriticalSection (thread->synch_cs);
+ if (thread->synch_cs)
+ UNLOCK_THREAD (thread);
/*
An interruption request has leaked to cleanup. Adjust the global counter.
@@ -429,7 +450,6 @@ static void thread_cleanup (MonoInternalThread *thread)
MONO_GC_UNREGISTER_ROOT (thread->thread_pinning_ref);
thread->thread_pinning_ref = NULL;
}
-
}
static gpointer
@@ -474,13 +494,6 @@ set_current_thread_for_domain (MonoDomain *domain, MonoInternalThread *thread, M
*current_thread_ptr = current;
}
-static MonoInternalThread*
-create_internal_thread_object (void)
-{
- MonoVTable *vt = mono_class_vtable (mono_get_root_domain (), mono_defaults.internal_thread_class);
- return (MonoInternalThread*)mono_gc_alloc_mature (vt);
-}
-
static MonoThread*
create_thread_object (MonoDomain *domain)
{
@@ -496,6 +509,28 @@ new_thread_with_internal (MonoDomain *domain, MonoInternalThread *internal)
return thread;
}
+static MonoInternalThread*
+create_internal_thread (void)
+{
+ MonoInternalThread *thread;
+ MonoVTable *vt;
+
+ vt = mono_class_vtable (mono_get_root_domain (), mono_defaults.internal_thread_class);
+ thread = (MonoInternalThread*)mono_gc_alloc_mature (vt);
+
+ thread->synch_cs = g_new0 (CRITICAL_SECTION, 1);
+ InitializeCriticalSection (thread->synch_cs);
+
+ thread->apartment_state = ThreadApartmentState_Unknown;
+ thread->managed_id = get_next_managed_thread_id ();
+ if (mono_gc_is_moving ()) {
+ thread->thread_pinning_ref = thread;
+ MONO_GC_REGISTER_ROOT_PINNING (thread->thread_pinning_ref);
+ }
+
+ return thread;
+}
+
static void
init_root_domain_thread (MonoInternalThread *thread, MonoThread *candidate)
{
@@ -511,7 +546,7 @@ init_root_domain_thread (MonoInternalThread *thread, MonoThread *candidate)
static guint32 WINAPI start_wrapper_internal(void *data)
{
MonoThreadInfo *info;
- struct StartInfo *start_info=(struct StartInfo *)data;
+ StartInfo *start_info = (StartInfo *)data;
guint32 (*start_func)(void *);
void *start_arg;
gsize tid;
@@ -653,106 +688,53 @@ static guint32 WINAPI start_wrapper(void *data)
return start_wrapper_internal (data);
}
-void mono_thread_new_init (intptr_t tid, gpointer stack_start, gpointer func)
-{
- if (mono_thread_start_cb) {
- mono_thread_start_cb (tid, stack_start, func);
- }
-}
-
-void mono_threads_set_default_stacksize (guint32 stacksize)
-{
- default_stacksize = stacksize;
-}
-
-guint32 mono_threads_get_default_stacksize (void)
-{
- return default_stacksize;
-}
-
/*
- * mono_create_thread:
+ * create_thread:
*
- * This is a wrapper around CreateThread which handles differences in the type of
- * the the 'tid' argument.
+ * Common thread creation code.
+ * LOCKING: Acquires the threads lock.
*/
-gpointer mono_create_thread (WapiSecurityAttributes *security,
- guint32 stacksize, WapiThreadStart start,
- gpointer param, guint32 create, gsize *tid)
-{
- gpointer res;
-
-#ifdef HOST_WIN32
- DWORD real_tid;
-
- res = mono_threads_CreateThread (security, stacksize, start, param, create, &real_tid);
- if (tid)
- *tid = real_tid;
-#else
- res = CreateThread (security, stacksize, start, param, create, tid);
-#endif
-
- return res;
-}
-
-/*
- * The thread start argument may be an object reference, and there is
- * no ref to keep it alive when the new thread is started but not yet
- * registered with the collector. So we store it in a GC tracked hash
- * table.
- *
- * LOCKING: Assumes the threads lock is held.
- */
-static void
-register_thread_start_argument (MonoThread *thread, struct StartInfo *start_info)
-{
- if (thread_start_args == NULL) {
- MONO_GC_REGISTER_ROOT_FIXED (thread_start_args);
- thread_start_args = mono_g_hash_table_new (NULL, NULL);
- }
- mono_g_hash_table_insert (thread_start_args, thread, start_info->start_arg);
-}
-
-/*
- * mono_thread_create_internal:
- *
- * If NO_DETACH is TRUE, then the thread is not detached using pthread_detach (). This is needed to fix the race condition where waiting for a thred to exit only waits for its exit event to be
- * signalled, which can cause shutdown crashes if the thread shutdown code accesses data already freed by the runtime shutdown.
- * Currently, this is only used for the finalizer thread.
- */
-MonoInternalThread*
-mono_thread_create_internal (MonoDomain *domain, gpointer func, gpointer arg, gboolean threadpool_thread, gboolean no_detach, guint32 stack_size)
+static gboolean
+create_thread (MonoThread *thread, MonoInternalThread *internal, StartInfo *start_info, gboolean threadpool_thread, gboolean no_detach, guint32 stack_size,
+ gboolean throw_on_failure)
{
- MonoThread *thread;
- MonoInternalThread *internal;
HANDLE thread_handle;
- struct StartInfo *start_info;
- gsize tid;
+ MonoNativeThreadId tid;
guint32 create_flags;
- thread = create_thread_object (domain);
- internal = create_internal_thread_object ();
- MONO_OBJECT_SETREF (thread, internal_thread, internal);
-
- start_info=g_new0 (struct StartInfo, 1);
- start_info->func = func;
- start_info->obj = thread;
- start_info->start_arg = arg;
-
mono_threads_lock ();
if (shutting_down) {
- mono_threads_unlock ();
g_free (start_info);
- return NULL;
+ mono_threads_unlock ();
+ return FALSE;
+ }
+ /*
+ * The thread start argument may be an object reference, and there is
+ * no ref to keep it alive when the new thread is started but not yet
+ * registered with the collector. So we store it in a GC tracked hash
+ * table.
+ */
+ if (thread_start_args == NULL) {
+ MONO_GC_REGISTER_ROOT_FIXED (thread_start_args);
+ thread_start_args = mono_g_hash_table_new (NULL, NULL);
}
+ mono_g_hash_table_insert (thread_start_args, thread, start_info->start_arg);
if (threads_starting_up == NULL) {
MONO_GC_REGISTER_ROOT_FIXED (threads_starting_up);
threads_starting_up = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_KEY_VALUE_GC);
}
+ mono_g_hash_table_insert (threads_starting_up, thread, thread);
+ mono_threads_unlock ();
- register_thread_start_argument (thread, start_info);
- mono_g_hash_table_insert (threads_starting_up, thread, thread);
- mono_threads_unlock ();
+ internal->start_notify = CreateSemaphore (NULL, 0, 0x7fffffff, NULL);
+ if (!internal->start_notify) {
+ mono_threads_lock ();
+ mono_g_hash_table_remove (threads_starting_up, thread);
+ mono_threads_unlock ();
+ g_warning ("%s: CreateSemaphore error 0x%x", __func__, GetLastError ());
+ g_free (start_info);
+ return FALSE;
+ }
if (stack_size == 0)
stack_size = default_stacksize_for_thread (internal);
@@ -765,37 +747,103 @@ mono_thread_create_internal (MonoDomain *domain, gpointer func, gpointer arg, gb
if (no_detach)
create_flags |= CREATE_NO_DETACH;
#endif
- thread_handle = mono_create_thread (NULL, stack_size, (LPTHREAD_START_ROUTINE)start_wrapper, start_info,
- create_flags, &tid);
- THREAD_DEBUG (g_message ("%s: Started thread ID %"G_GSIZE_FORMAT" (handle %p)", __func__, tid, thread_handle));
+ thread_handle = mono_threads_create_thread ((LPTHREAD_START_ROUTINE)start_wrapper, start_info,
+ stack_size, create_flags, &tid);
if (thread_handle == NULL) {
/* The thread couldn't be created, so throw an exception */
mono_threads_lock ();
mono_g_hash_table_remove (threads_starting_up, thread);
mono_threads_unlock ();
g_free (start_info);
- mono_raise_exception (mono_get_exception_execution_engine ("Couldn't create thread"));
- return NULL;
- }
-
- internal->handle=thread_handle;
- internal->tid=tid;
- internal->apartment_state=ThreadApartmentState_Unknown;
- internal->managed_id = get_next_managed_thread_id ();
- if (mono_gc_is_moving ()) {
- internal->thread_pinning_ref = internal;
- MONO_GC_REGISTER_ROOT_PINNING (internal->thread_pinning_ref);
+ if (throw_on_failure)
+ mono_raise_exception (mono_get_exception_execution_engine ("Couldn't create thread"));
+ else
+ g_warning ("%s: CreateThread error 0x%x", __func__, GetLastError ());
+ return FALSE;
}
+ THREAD_DEBUG (g_message ("%s: Started thread ID %"G_GSIZE_FORMAT" (handle %p)", __func__, tid, thread_handle));
- internal->synch_cs = g_new0 (CRITICAL_SECTION, 1);
- InitializeCriticalSection (internal->synch_cs);
+ internal->handle = thread_handle;
+ internal->tid = MONO_NATIVE_THREAD_ID_TO_UINT (tid);
internal->threadpool_thread = threadpool_thread;
if (threadpool_thread)
mono_thread_set_state (internal, ThreadState_Background);
- if (handle_store (thread, FALSE))
- ResumeThread (thread_handle);
+ THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") Launching thread %p (%"G_GSIZE_FORMAT")", __func__, GetCurrentThreadId (), internal, (gsize)internal->tid));
+
+ /* Only store the handle when the thread is about to be
+ * launched, to avoid the main thread deadlocking while trying
+ * to clean up a thread that will never be signalled.
+ */
+ if (!handle_store (thread, FALSE))
+ return FALSE;
+
+ ResumeThread (internal->handle);
+
+ if (internal->start_notify) {
+ /*
+ * Wait for the thread to set up its TLS data etc, so
+ * theres no potential race condition if someone tries
+ * to look up the data believing the thread has
+ * started
+ */
+ THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") waiting for thread %p (%"G_GSIZE_FORMAT") to start", __func__, GetCurrentThreadId (), internal, (gsize)internal->tid));
+
+ WaitForSingleObjectEx (internal->start_notify, INFINITE, FALSE);
+ CloseHandle (internal->start_notify);
+ internal->start_notify = NULL;
+ }
+
+ THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") Done launching thread %p (%"G_GSIZE_FORMAT")", __func__, GetCurrentThreadId (), internal, (gsize)internal->tid));
+
+ return TRUE;
+}
+
+void mono_thread_new_init (intptr_t tid, gpointer stack_start, gpointer func)
+{
+ if (mono_thread_start_cb) {
+ mono_thread_start_cb (tid, stack_start, func);
+ }
+}
+
+void mono_threads_set_default_stacksize (guint32 stacksize)
+{
+ default_stacksize = stacksize;
+}
+
+guint32 mono_threads_get_default_stacksize (void)
+{
+ return default_stacksize;
+}
+
+/*
+ * mono_thread_create_internal:
+ *
+ * If NO_DETACH is TRUE, then the thread is not detached using pthread_detach (). This is needed to fix the race condition where waiting for a thred to exit only waits for its exit event to be
+ * signalled, which can cause shutdown crashes if the thread shutdown code accesses data already freed by the runtime shutdown.
+ * Currently, this is only used for the finalizer thread.
+ */
+MonoInternalThread*
+mono_thread_create_internal (MonoDomain *domain, gpointer func, gpointer arg, gboolean threadpool_thread, gboolean no_detach, guint32 stack_size)
+{
+ MonoThread *thread;
+ MonoInternalThread *internal;
+ StartInfo *start_info;
+ gboolean res;
+
+ thread = create_thread_object (domain);
+ internal = create_internal_thread ();
+ MONO_OBJECT_SETREF (thread, internal_thread, internal);
+
+ start_info = g_new0 (StartInfo, 1);
+ start_info->func = func;
+ start_info->obj = thread;
+ start_info->start_arg = arg;
+
+ res = create_thread (thread, internal, start_info, threadpool_thread, no_detach, stack_size, TRUE);
+ if (!res)
+ return NULL;
/* Check that the managed and unmanaged layout of MonoInternalThread matches */
if (mono_check_corlib_version () == NULL)
@@ -810,9 +858,8 @@ mono_thread_create (MonoDomain *domain, gpointer func, gpointer arg)
mono_thread_create_internal (domain, func, arg, FALSE, FALSE, 0);
}
-#if defined(HOST_WIN32) && defined(__GNUC__)
+#if defined(HOST_WIN32) && HAVE_DECL___READFSDWORD==0
static __inline__ __attribute__((always_inline))
-/* This is not defined by gcc */
unsigned long long
__readfsdword (unsigned long offset)
{
@@ -849,6 +896,17 @@ mono_thread_get_stack_bounds (guint8 **staddr, size_t *stsize)
*staddr = (guint8*)pthread_get_stackaddr_np (pthread_self());
*stsize = pthread_get_stacksize_np (pthread_self());
+
+#ifdef TARGET_OSX
+ /*
+ * Mavericks reports stack sizes as 512kb:
+ * http://permalink.gmane.org/gmane.comp.java.openjdk.hotspot.devel/11590
+ * https://bugs.openjdk.java.net/browse/JDK-8020753
+ */
+ if (*stsize == 512 * 1024)
+ *stsize = 2048 * mono_pagesize ();
+#endif
+
/* staddr points to the start of the stack, not the end */
*staddr -= *stsize;
@@ -964,7 +1022,7 @@ mono_thread_attach_full (MonoDomain *domain, gboolean force_attach)
g_error ("Thread %"G_GSIZE_FORMAT" calling into managed code is not registered with the GC. On UNIX, this can be fixed by #include-ing <gc.h> before <pthread.h> in the file containing the thread creation code.", GetCurrentThreadId ());
}
- thread = create_internal_thread_object ();
+ thread = create_internal_thread ();
thread_handle = GetCurrentThread ();
g_assert (thread_handle);
@@ -983,18 +1041,8 @@ mono_thread_attach_full (MonoDomain *domain, gboolean force_attach)
#ifdef PLATFORM_ANDROID
thread->android_tid = (gpointer) gettid ();
#endif
- thread->apartment_state=ThreadApartmentState_Unknown;
- thread->managed_id = get_next_managed_thread_id ();
- if (mono_gc_is_moving ()) {
- thread->thread_pinning_ref = thread;
- MONO_GC_REGISTER_ROOT_PINNING (thread->thread_pinning_ref);
- }
-
thread->stack_ptr = &tid;
- thread->synch_cs = g_new0 (CRITICAL_SECTION, 1);
- InitializeCriticalSection (thread->synch_cs);
-
THREAD_DEBUG (g_message ("%s: Attached thread ID %"G_GSIZE_FORMAT" (handle %p)", __func__, tid, thread_handle));
info = mono_thread_info_current ();
@@ -1079,23 +1127,20 @@ mono_thread_exit ()
void
ves_icall_System_Threading_Thread_ConstructInternalThread (MonoThread *this)
{
- MonoInternalThread *internal = create_internal_thread_object ();
+ MonoInternalThread *internal = create_internal_thread ();
internal->state = ThreadState_Unstarted;
- internal->apartment_state = ThreadApartmentState_Unknown;
- internal->managed_id = get_next_managed_thread_id ();
InterlockedCompareExchangePointer ((gpointer)&this->internal_thread, internal, NULL);
}
-HANDLE ves_icall_System_Threading_Thread_Thread_internal(MonoThread *this,
- MonoObject *start)
+HANDLE
+ves_icall_System_Threading_Thread_Thread_internal (MonoThread *this,
+ MonoObject *start)
{
- guint32 (*start_func)(void *);
- struct StartInfo *start_info;
- HANDLE thread;
- gsize tid;
+ StartInfo *start_info;
MonoInternalThread *internal;
+ gboolean res;
THREAD_DEBUG (g_message("%s: Trying to start a new thread: this (%p) start (%p)", __func__, this, start));
@@ -1103,87 +1148,48 @@ HANDLE ves_icall_System_Threading_Thread_Thread_internal(MonoThread *this,
ves_icall_System_Threading_Thread_ConstructInternalThread (this);
internal = this->internal_thread;
- ensure_synch_cs_set (internal);
-
- EnterCriticalSection (internal->synch_cs);
+ LOCK_THREAD (internal);
if ((internal->state & ThreadState_Unstarted) == 0) {
- LeaveCriticalSection (internal->synch_cs);
+ UNLOCK_THREAD (internal);
mono_raise_exception (mono_get_exception_thread_state ("Thread has already been started."));
return NULL;
}
if ((internal->state & ThreadState_Aborted) != 0) {
- LeaveCriticalSection (internal->synch_cs);
+ UNLOCK_THREAD (internal);
return this;
}
- start_func = NULL;
- {
- /* This is freed in start_wrapper */
- start_info = g_new0 (struct StartInfo, 1);
- start_info->func = start_func;
- start_info->start_arg = this->start_obj; /* FIXME: GC object stored in unmanaged memory */
- start_info->delegate = start;
- start_info->obj = this;
- g_assert (this->obj.vtable->domain == mono_domain_get ());
-
- internal->start_notify=CreateSemaphore (NULL, 0, 0x7fffffff, NULL);
- if (internal->start_notify==NULL) {
- LeaveCriticalSection (internal->synch_cs);
- g_warning ("%s: CreateSemaphore error 0x%x", __func__, GetLastError ());
- g_free (start_info);
- return(NULL);
- }
-
- mono_threads_lock ();
- register_thread_start_argument (this, start_info);
- if (threads_starting_up == NULL) {
- MONO_GC_REGISTER_ROOT_FIXED (threads_starting_up);
- threads_starting_up = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_KEY_VALUE_GC);
- }
- mono_g_hash_table_insert (threads_starting_up, this, this);
- mono_threads_unlock ();
-
- thread=mono_create_thread(NULL, default_stacksize_for_thread (internal), (LPTHREAD_START_ROUTINE)start_wrapper, start_info,
- CREATE_SUSPENDED, &tid);
- if(thread==NULL) {
- LeaveCriticalSection (internal->synch_cs);
- mono_threads_lock ();
- mono_g_hash_table_remove (threads_starting_up, this);
- mono_threads_unlock ();
- g_warning("%s: CreateThread error 0x%x", __func__, GetLastError());
- return(NULL);
- }
-
- internal->handle=thread;
- internal->tid=tid;
- if (mono_gc_is_moving ()) {
- internal->thread_pinning_ref = internal;
- MONO_GC_REGISTER_ROOT_PINNING (internal->thread_pinning_ref);
- }
-
-
- /* Don't call handle_store() here, delay it to Start.
- * We can't join a thread (trying to will just block
- * forever) until it actually starts running, so don't
- * store the handle till then.
- */
+ /* This is freed in start_wrapper */
+ start_info = g_new0 (StartInfo, 1);
+ start_info->func = NULL;
+ start_info->start_arg = this->start_obj; /* FIXME: GC object stored in unmanaged memory */
+ start_info->delegate = start;
+ start_info->obj = this;
+ g_assert (this->obj.vtable->domain == mono_domain_get ());
+
+ res = create_thread (this, internal, start_info, FALSE, FALSE, 0, FALSE);
+ if (!res) {
+ UNLOCK_THREAD (internal);
+ return NULL;
+ }
- mono_thread_start (this);
-
- internal->state &= ~ThreadState_Unstarted;
+ internal->state &= ~ThreadState_Unstarted;
- THREAD_DEBUG (g_message ("%s: Started thread ID %"G_GSIZE_FORMAT" (handle %p)", __func__, tid, thread));
+ THREAD_DEBUG (g_message ("%s: Started thread ID %"G_GSIZE_FORMAT" (handle %p)", __func__, tid, thread));
- LeaveCriticalSection (internal->synch_cs);
- return(thread);
- }
+ UNLOCK_THREAD (internal);
+ return internal->handle;
}
-void ves_icall_System_Threading_InternalThread_Thread_free_internal (MonoInternalThread *this, HANDLE thread)
+/*
+ * This is called from the finalizer of the internal thread object. Since threads keep a reference to their
+ * thread object while running, by the time this function is called, the thread has already exited/detached,
+ * i.e. thread_cleanup () has ran.
+ */
+void
+ves_icall_System_Threading_InternalThread_Thread_free_internal (MonoInternalThread *this, HANDLE thread)
{
- MONO_ARCH_SAVE_REGS;
-
THREAD_DEBUG (g_message ("%s: Closing thread %p, handle %p", __func__, this, thread));
if (thread)
@@ -1203,38 +1209,6 @@ void ves_icall_System_Threading_InternalThread_Thread_free_internal (MonoInterna
}
}
-static void mono_thread_start (MonoThread *thread)
-{
- MonoInternalThread *internal = thread->internal_thread;
-
- THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") Launching thread %p (%"G_GSIZE_FORMAT")", __func__, GetCurrentThreadId (), internal, (gsize)internal->tid));
-
- /* Only store the handle when the thread is about to be
- * launched, to avoid the main thread deadlocking while trying
- * to clean up a thread that will never be signalled.
- */
- if (!handle_store (thread, FALSE))
- return;
-
- ResumeThread (internal->handle);
-
- if(internal->start_notify!=NULL) {
- /* Wait for the thread to set up its TLS data etc, so
- * theres no potential race condition if someone tries
- * to look up the data believing the thread has
- * started
- */
-
- THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") waiting for thread %p (%"G_GSIZE_FORMAT") to start", __func__, GetCurrentThreadId (), internal, (gsize)internal->tid));
-
- WaitForSingleObjectEx (internal->start_notify, INFINITE, FALSE);
- CloseHandle (internal->start_notify);
- internal->start_notify = NULL;
- }
-
- THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") Done launching thread %p (%"G_GSIZE_FORMAT")", __func__, GetCurrentThreadId (), internal, (gsize)internal->tid));
-}
-
void ves_icall_System_Threading_Thread_Sleep_internal(gint32 ms)
{
guint32 res;
@@ -1273,8 +1247,6 @@ void ves_icall_System_Threading_Thread_SpinWait_nop (void)
gint32
ves_icall_System_Threading_Thread_GetDomainID (void)
{
- MONO_ARCH_SAVE_REGS;
-
return mono_domain_get()->domain_id;
}
@@ -1300,9 +1272,7 @@ mono_thread_get_name (MonoInternalThread *this_obj, guint32 *name_len)
{
gunichar2 *res;
- ensure_synch_cs_set (this_obj);
-
- EnterCriticalSection (this_obj->synch_cs);
+ LOCK_THREAD (this_obj);
if (!this_obj->name) {
*name_len = 0;
@@ -1313,7 +1283,7 @@ mono_thread_get_name (MonoInternalThread *this_obj, guint32 *name_len)
memcpy (res, this_obj->name, sizeof (gunichar2) * this_obj->name_len);
}
- LeaveCriticalSection (this_obj->synch_cs);
+ UNLOCK_THREAD (this_obj);
return res;
}
@@ -1323,16 +1293,14 @@ ves_icall_System_Threading_Thread_GetName_internal (MonoInternalThread *this_obj
{
MonoString* str;
- ensure_synch_cs_set (this_obj);
-
- EnterCriticalSection (this_obj->synch_cs);
+ LOCK_THREAD (this_obj);
if (!this_obj->name)
str = NULL;
else
str = mono_string_new_utf16 (mono_domain_get (), this_obj->name, this_obj->name_len);
- LeaveCriticalSection (this_obj->synch_cs);
+ UNLOCK_THREAD (this_obj);
return str;
}
@@ -1340,12 +1308,10 @@ ves_icall_System_Threading_Thread_GetName_internal (MonoInternalThread *this_obj
void
mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, gboolean managed)
{
- ensure_synch_cs_set (this_obj);
-
- EnterCriticalSection (this_obj->synch_cs);
+ LOCK_THREAD (this_obj);
if (this_obj->flags & MONO_THREAD_FLAG_NAME_SET) {
- LeaveCriticalSection (this_obj->synch_cs);
+ UNLOCK_THREAD (this_obj);
mono_raise_exception (mono_get_exception_invalid_operation ("Thread.Name can only be set once."));
return;
@@ -1361,7 +1327,8 @@ mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, g
if (managed)
this_obj->flags |= MONO_THREAD_FLAG_NAME_SET;
- LeaveCriticalSection (this_obj->synch_cs);
+ UNLOCK_THREAD (this_obj);
+
if (this_obj->name) {
char *tname = mono_string_to_utf8 (name);
mono_profiler_thread_name (this_obj->tid, tname);
@@ -1389,7 +1356,7 @@ byte_array_to_domain (MonoArray *arr, MonoDomain *domain)
return arr;
copy = mono_array_new (domain, mono_defaults.byte_class, arr->max_length);
- mono_gc_memmove (mono_array_addr (copy, guint8, 0), mono_array_addr (arr, guint8, 0), arr->max_length);
+ memmove (mono_array_addr (copy, guint8, 0), mono_array_addr (arr, guint8, 0), arr->max_length);
return copy;
}
@@ -1438,18 +1405,16 @@ gboolean ves_icall_System_Threading_Thread_Join_internal(MonoInternalThread *thi
mono_thread_current_check_pending_interrupt ();
- ensure_synch_cs_set (this);
-
- EnterCriticalSection (this->synch_cs);
+ LOCK_THREAD (this);
if ((this->state & ThreadState_Unstarted) != 0) {
- LeaveCriticalSection (this->synch_cs);
+ UNLOCK_THREAD (this);
mono_raise_exception (mono_get_exception_thread_state ("Thread has not been started."));
return FALSE;
}
- LeaveCriticalSection (this->synch_cs);
+ UNLOCK_THREAD (this);
if(ms== -1) {
ms=INFINITE;
@@ -1640,8 +1605,6 @@ ves_icall_System_Threading_WaitHandle_SignalAndWait_Internal (HANDLE toSignal, H
guint32 ret;
MonoInternalThread *thread = mono_thread_internal_current ();
- MONO_ARCH_SAVE_REGS;
-
if (ms == -1)
ms = INFINITE;
@@ -1660,8 +1623,6 @@ HANDLE ves_icall_System_Threading_Mutex_CreateMutex_internal (MonoBoolean owned,
{
HANDLE mutex;
- MONO_ARCH_SAVE_REGS;
-
*created = TRUE;
if (name == NULL) {
@@ -1678,8 +1639,6 @@ HANDLE ves_icall_System_Threading_Mutex_CreateMutex_internal (MonoBoolean owned,
}
MonoBoolean ves_icall_System_Threading_Mutex_ReleaseMutex_internal (HANDLE handle ) {
- MONO_ARCH_SAVE_REGS;
-
return(ReleaseMutex (handle));
}
@@ -1689,8 +1648,6 @@ HANDLE ves_icall_System_Threading_Mutex_OpenMutex_internal (MonoString *name,
{
HANDLE ret;
- MONO_ARCH_SAVE_REGS;
-
*error = ERROR_SUCCESS;
ret = OpenMutex (rights, FALSE, mono_string_chars (name));
@@ -1706,8 +1663,6 @@ HANDLE ves_icall_System_Threading_Semaphore_CreateSemaphore_internal (gint32 ini
{
HANDLE sem;
- MONO_ARCH_SAVE_REGS;
-
*created = TRUE;
if (name == NULL) {
@@ -1728,8 +1683,6 @@ gint32 ves_icall_System_Threading_Semaphore_ReleaseSemaphore_internal (HANDLE ha
{
gint32 prevcount;
- MONO_ARCH_SAVE_REGS;
-
*fail = !ReleaseSemaphore (handle, releaseCount, &prevcount);
return (prevcount);
@@ -1739,8 +1692,6 @@ HANDLE ves_icall_System_Threading_Semaphore_OpenSemaphore_internal (MonoString *
{
HANDLE ret;
- MONO_ARCH_SAVE_REGS;
-
*error = ERROR_SUCCESS;
ret = OpenSemaphore (rights, FALSE, mono_string_chars (name));
@@ -1755,8 +1706,6 @@ HANDLE ves_icall_System_Threading_Events_CreateEvent_internal (MonoBoolean manua
{
HANDLE event;
- MONO_ARCH_SAVE_REGS;
-
*created = TRUE;
if (name == NULL) {
@@ -1774,21 +1723,15 @@ HANDLE ves_icall_System_Threading_Events_CreateEvent_internal (MonoBoolean manua
}
gboolean ves_icall_System_Threading_Events_SetEvent_internal (HANDLE handle) {
- MONO_ARCH_SAVE_REGS;
-
return (SetEvent(handle));
}
gboolean ves_icall_System_Threading_Events_ResetEvent_internal (HANDLE handle) {
- MONO_ARCH_SAVE_REGS;
-
return (ResetEvent(handle));
}
void
ves_icall_System_Threading_Events_CloseEvent_internal (HANDLE handle) {
- MONO_ARCH_SAVE_REGS;
-
CloseHandle (handle);
}
@@ -1798,8 +1741,6 @@ HANDLE ves_icall_System_Threading_Events_OpenEvent_internal (MonoString *name,
{
HANDLE ret;
- MONO_ARCH_SAVE_REGS;
-
*error = ERROR_SUCCESS;
ret = OpenEvent (rights, FALSE, mono_string_chars (name));
@@ -1812,53 +1753,46 @@ HANDLE ves_icall_System_Threading_Events_OpenEvent_internal (MonoString *name,
gint32 ves_icall_System_Threading_Interlocked_Increment_Int (gint32 *location)
{
- MONO_ARCH_SAVE_REGS;
-
return InterlockedIncrement (location);
}
gint64 ves_icall_System_Threading_Interlocked_Increment_Long (gint64 *location)
{
- gint64 ret;
-
- MONO_ARCH_SAVE_REGS;
-
- mono_interlocked_lock ();
-
- ret = ++ *location;
-
- mono_interlocked_unlock ();
-
-
- return ret;
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)location & 0x7)) {
+ gint64 ret;
+ mono_interlocked_lock ();
+ (*location)++;
+ ret = *location;
+ mono_interlocked_unlock ();
+ return ret;
+ }
+#endif
+ return InterlockedIncrement64 (location);
}
gint32 ves_icall_System_Threading_Interlocked_Decrement_Int (gint32 *location)
{
- MONO_ARCH_SAVE_REGS;
-
return InterlockedDecrement(location);
}
gint64 ves_icall_System_Threading_Interlocked_Decrement_Long (gint64 * location)
{
- gint64 ret;
-
- MONO_ARCH_SAVE_REGS;
-
- mono_interlocked_lock ();
-
- ret = -- *location;
-
- mono_interlocked_unlock ();
-
- return ret;
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)location & 0x7)) {
+ gint64 ret;
+ mono_interlocked_lock ();
+ (*location)--;
+ ret = *location;
+ mono_interlocked_unlock ();
+ return ret;
+ }
+#endif
+ return InterlockedDecrement64 (location);
}
gint32 ves_icall_System_Threading_Interlocked_Exchange_Int (gint32 *location, gint32 value)
{
- MONO_ARCH_SAVE_REGS;
-
return InterlockedExchange(location, value);
}
@@ -1879,8 +1813,6 @@ gfloat ves_icall_System_Threading_Interlocked_Exchange_Single (gfloat *location,
{
IntFloatUnion val, ret;
- MONO_ARCH_SAVE_REGS;
-
val.fval = value;
ret.ival = InterlockedExchange((gint32 *) location, val.ival);
@@ -1890,54 +1822,32 @@ gfloat ves_icall_System_Threading_Interlocked_Exchange_Single (gfloat *location,
gint64
ves_icall_System_Threading_Interlocked_Exchange_Long (gint64 *location, gint64 value)
{
-#if SIZEOF_VOID_P == 8
- return (gint64) InterlockedExchangePointer((gpointer *) location, (gpointer)value);
-#else
- gint64 res;
-
- /*
- * According to MSDN, this function is only atomic with regards to the
- * other Interlocked functions on 32 bit platforms.
- */
- mono_interlocked_lock ();
- res = *location;
- *location = value;
- mono_interlocked_unlock ();
-
- return res;
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)location & 0x7)) {
+ gint64 ret;
+ mono_interlocked_lock ();
+ ret = *location;
+ *location = value;
+ mono_interlocked_unlock ();
+ return ret;
+ }
#endif
+ return InterlockedExchange64 (location, value);
}
gdouble
ves_icall_System_Threading_Interlocked_Exchange_Double (gdouble *location, gdouble value)
{
-#if SIZEOF_VOID_P == 8
LongDoubleUnion val, ret;
val.fval = value;
- ret.ival = (gint64)InterlockedExchangePointer((gpointer *) location, (gpointer)val.ival);
+ ret.ival = (gint64)InterlockedExchange64((gint64 *) location, val.ival);
return ret.fval;
-#else
- gdouble res;
-
- /*
- * According to MSDN, this function is only atomic with regards to the
- * other Interlocked functions on 32 bit platforms.
- */
- mono_interlocked_lock ();
- res = *location;
- *location = value;
- mono_interlocked_unlock ();
-
- return res;
-#endif
}
gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int(gint32 *location, gint32 value, gint32 comparand)
{
- MONO_ARCH_SAVE_REGS;
-
return InterlockedCompareExchange(location, value, comparand);
}
@@ -1958,8 +1868,6 @@ gfloat ves_icall_System_Threading_Interlocked_CompareExchange_Single (gfloat *lo
{
IntFloatUnion val, ret, cmp;
- MONO_ARCH_SAVE_REGS;
-
val.fval = value;
cmp.fval = comparand;
ret.ival = InterlockedCompareExchange((gint32 *) location, val.ival, cmp.ival);
@@ -1995,7 +1903,7 @@ gint64
ves_icall_System_Threading_Interlocked_CompareExchange_Long (gint64 *location, gint64 value, gint64 comparand)
{
#if SIZEOF_VOID_P == 4
- if ((size_t)location & 0x7) {
+ if (G_UNLIKELY ((size_t)location & 0x7)) {
gint64 old;
mono_interlocked_lock ();
old = *location;
@@ -2029,63 +1937,44 @@ ves_icall_System_Threading_Interlocked_Exchange_T (MonoObject **location, MonoOb
gint32
ves_icall_System_Threading_Interlocked_Add_Int (gint32 *location, gint32 value)
{
-#if SIZEOF_VOID_P == 8
- /* Should be implemented as a JIT intrinsic */
- mono_raise_exception (mono_get_exception_not_implemented (NULL));
- return 0;
-#else
- gint32 orig;
-
- mono_interlocked_lock ();
- orig = *location;
- *location = orig + value;
- mono_interlocked_unlock ();
-
- return orig + value;
-#endif
+ return InterlockedAdd (location, value);
}
gint64
ves_icall_System_Threading_Interlocked_Add_Long (gint64 *location, gint64 value)
{
-#if SIZEOF_VOID_P == 8
- /* Should be implemented as a JIT intrinsic */
- mono_raise_exception (mono_get_exception_not_implemented (NULL));
- return 0;
-#else
- gint64 orig;
-
- mono_interlocked_lock ();
- orig = *location;
- *location = orig + value;
- mono_interlocked_unlock ();
-
- return orig + value;
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)location & 0x7)) {
+ gint64 ret;
+ mono_interlocked_lock ();
+ *location += value;
+ ret = *location;
+ mono_interlocked_unlock ();
+ return ret;
+ }
#endif
+ return InterlockedAdd64 (location, value);
}
gint64
ves_icall_System_Threading_Interlocked_Read_Long (gint64 *location)
{
-#if SIZEOF_VOID_P == 8
- /* 64 bit reads are already atomic */
- return *location;
-#else
- gint64 res;
-
- mono_interlocked_lock ();
- res = *location;
- mono_interlocked_unlock ();
-
- return res;
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)location & 0x7)) {
+ gint64 ret;
+ mono_interlocked_lock ();
+ ret = *location;
+ mono_interlocked_unlock ();
+ return ret;
+ }
#endif
+ return InterlockedRead64 (location);
}
void
ves_icall_System_Threading_Thread_MemoryBarrier (void)
{
- mono_threads_lock ();
- mono_threads_unlock ();
+ mono_memory_barrier ();
}
void
@@ -2121,13 +2010,11 @@ ves_icall_System_Threading_Thread_GetState (MonoInternalThread* this)
{
guint32 state;
- ensure_synch_cs_set (this);
-
- EnterCriticalSection (this->synch_cs);
+ LOCK_THREAD (this);
state = this->state;
- LeaveCriticalSection (this->synch_cs);
+ UNLOCK_THREAD (this);
return state;
}
@@ -2137,16 +2024,14 @@ void ves_icall_System_Threading_Thread_Interrupt_internal (MonoInternalThread *t
MonoInternalThread *current;
gboolean throw;
- ensure_synch_cs_set (this);
+ LOCK_THREAD (this);
current = mono_thread_internal_current ();
- EnterCriticalSection (this->synch_cs);
-
this->thread_interrupt_requested = TRUE;
throw = current != this && (this->state & ThreadState_WaitSleepJoin);
- LeaveCriticalSection (this->synch_cs);
+ UNLOCK_THREAD (this);
if (throw) {
abort_thread_internal (this, TRUE, FALSE);
@@ -2158,18 +2043,14 @@ void mono_thread_current_check_pending_interrupt ()
MonoInternalThread *thread = mono_thread_internal_current ();
gboolean throw = FALSE;
- mono_debugger_check_interruption ();
-
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if (thread->thread_interrupt_requested) {
throw = TRUE;
thread->thread_interrupt_requested = FALSE;
}
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
if (throw) {
mono_raise_exception (mono_get_exception_thread_interrupted ());
@@ -2251,21 +2132,19 @@ static void signal_thread_state_change (MonoInternalThread *thread)
void
ves_icall_System_Threading_Thread_Abort (MonoInternalThread *thread, MonoObject *state)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if ((thread->state & ThreadState_AbortRequested) != 0 ||
(thread->state & ThreadState_StopRequested) != 0 ||
(thread->state & ThreadState_Stopped) != 0)
{
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return;
}
if ((thread->state & ThreadState_Unstarted) != 0) {
thread->state |= ThreadState_Aborted;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return;
}
@@ -2288,7 +2167,7 @@ ves_icall_System_Threading_Thread_Abort (MonoInternalThread *thread, MonoObject
* a problem.
*/
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") Abort requested for %p (%"G_GSIZE_FORMAT")", __func__, GetCurrentThreadId (), thread, (gsize)thread->tid));
@@ -2306,12 +2185,10 @@ ves_icall_System_Threading_Thread_ResetAbort (void)
MonoInternalThread *thread = mono_thread_internal_current ();
gboolean was_aborting;
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
was_aborting = thread->state & ThreadState_AbortRequested;
thread->state &= ~ThreadState_AbortRequested;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
if (!was_aborting) {
const char *msg = "Unable to reset abort because no abort was requested";
@@ -2329,9 +2206,7 @@ ves_icall_System_Threading_Thread_ResetAbort (void)
void
mono_thread_internal_reset_abort (MonoInternalThread *thread)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
thread->state &= ~ThreadState_AbortRequested;
@@ -2345,7 +2220,7 @@ mono_thread_internal_reset_abort (MonoInternalThread *thread)
}
}
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
}
MonoObject*
@@ -2380,15 +2255,13 @@ ves_icall_System_Threading_Thread_GetAbortExceptionState (MonoThread *this)
static gboolean
mono_thread_suspend (MonoInternalThread *thread)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if ((thread->state & ThreadState_Unstarted) != 0 ||
(thread->state & ThreadState_Aborted) != 0 ||
(thread->state & ThreadState_Stopped) != 0)
{
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return FALSE;
}
@@ -2396,13 +2269,13 @@ mono_thread_suspend (MonoInternalThread *thread)
(thread->state & ThreadState_SuspendRequested) != 0 ||
(thread->state & ThreadState_StopRequested) != 0)
{
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return TRUE;
}
thread->state |= ThreadState_SuspendRequested;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
suspend_thread_internal (thread, FALSE);
return TRUE;
@@ -2418,13 +2291,11 @@ ves_icall_System_Threading_Thread_Suspend (MonoInternalThread *thread)
static gboolean
mono_thread_resume (MonoInternalThread *thread)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if ((thread->state & ThreadState_SuspendRequested) != 0) {
thread->state &= ~ThreadState_SuspendRequested;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return TRUE;
}
@@ -2433,7 +2304,7 @@ mono_thread_resume (MonoInternalThread *thread)
(thread->state & ThreadState_Aborted) != 0 ||
(thread->state & ThreadState_Stopped) != 0)
{
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return FALSE;
}
@@ -2482,14 +2353,12 @@ is_running_protected_wrapper (void)
void mono_thread_internal_stop (MonoInternalThread *thread)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if ((thread->state & ThreadState_StopRequested) != 0 ||
(thread->state & ThreadState_Stopped) != 0)
{
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return;
}
@@ -2499,7 +2368,7 @@ void mono_thread_internal_stop (MonoInternalThread *thread)
thread->state |= ThreadState_StopRequested;
thread->state &= ~ThreadState_AbortRequested;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
abort_thread_internal (thread, TRUE, TRUE);
}
@@ -2512,108 +2381,262 @@ void mono_thread_stop (MonoThread *thread)
gint8
ves_icall_System_Threading_Thread_VolatileRead1 (void *ptr)
{
- return *((volatile gint8 *) (ptr));
+ gint8 tmp;
+ mono_atomic_load_acquire (tmp, gint8, (volatile gint8 *) ptr);
+ return tmp;
}
gint16
ves_icall_System_Threading_Thread_VolatileRead2 (void *ptr)
{
- return *((volatile gint16 *) (ptr));
+ gint16 tmp;
+ mono_atomic_load_acquire (tmp, gint16, (volatile gint16 *) ptr);
+ return tmp;
}
gint32
ves_icall_System_Threading_Thread_VolatileRead4 (void *ptr)
{
- return *((volatile gint32 *) (ptr));
+ gint32 tmp;
+ mono_atomic_load_acquire (tmp, gint32, (volatile gint32 *) ptr);
+ return tmp;
}
gint64
ves_icall_System_Threading_Thread_VolatileRead8 (void *ptr)
{
-#if SIZEOF_VOID_P == 8
- return *((volatile gint64 *) (ptr));
-#else
- return InterlockedCompareExchange64 (ptr, 0, 0); /*Must ensure atomicity of the operation. */
-#endif
+ gint64 tmp;
+ mono_atomic_load_acquire (tmp, gint64, (volatile gint64 *) ptr);
+ return tmp;
}
void *
ves_icall_System_Threading_Thread_VolatileReadIntPtr (void *ptr)
{
- return (void *) *((volatile void **) ptr);
+ volatile void *tmp;
+ mono_atomic_load_acquire (tmp, volatile void *, (volatile void **) ptr);
+ return (void *) tmp;
+}
+
+void *
+ves_icall_System_Threading_Thread_VolatileReadObject (void *ptr)
+{
+ volatile MonoObject *tmp;
+ mono_atomic_load_acquire (tmp, volatile MonoObject *, (volatile MonoObject **) ptr);
+ return (MonoObject *) tmp;
}
double
ves_icall_System_Threading_Thread_VolatileReadDouble (void *ptr)
{
- return *((volatile double *) (ptr));
+ double tmp;
+ mono_atomic_load_acquire (tmp, double, (volatile double *) ptr);
+ return tmp;
}
float
ves_icall_System_Threading_Thread_VolatileReadFloat (void *ptr)
{
- return *((volatile float *) (ptr));
+ float tmp;
+ mono_atomic_load_acquire (tmp, float, (volatile float *) ptr);
+ return tmp;
+}
+
+gint8
+ves_icall_System_Threading_Volatile_Read1 (void *ptr)
+{
+ return InterlockedRead8 (ptr);
+}
+
+gint16
+ves_icall_System_Threading_Volatile_Read2 (void *ptr)
+{
+ return InterlockedRead16 (ptr);
+}
+
+gint32
+ves_icall_System_Threading_Volatile_Read4 (void *ptr)
+{
+ return InterlockedRead (ptr);
+}
+
+gint64
+ves_icall_System_Threading_Volatile_Read8 (void *ptr)
+{
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)ptr & 0x7)) {
+ gint64 val;
+ mono_interlocked_lock ();
+ val = *(gint64*)ptr;
+ mono_interlocked_unlock ();
+ return val;
+ }
+#endif
+ return InterlockedRead64 (ptr);
+}
+
+void *
+ves_icall_System_Threading_Volatile_ReadIntPtr (void *ptr)
+{
+ return InterlockedReadPointer (ptr);
+}
+
+double
+ves_icall_System_Threading_Volatile_ReadDouble (void *ptr)
+{
+ LongDoubleUnion u;
+
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)ptr & 0x7)) {
+ double val;
+ mono_interlocked_lock ();
+ val = *(double*)ptr;
+ mono_interlocked_unlock ();
+ return val;
+ }
+#endif
+
+ u.ival = InterlockedRead64 (ptr);
+
+ return u.fval;
+}
+
+float
+ves_icall_System_Threading_Volatile_ReadFloat (void *ptr)
+{
+ IntFloatUnion u;
+
+ u.ival = InterlockedRead (ptr);
+
+ return u.fval;
}
MonoObject*
ves_icall_System_Threading_Volatile_Read_T (void *ptr)
{
- return (MonoObject*)*((volatile MonoObject**)ptr);
+ return InterlockedReadPointer (ptr);
}
void
ves_icall_System_Threading_Thread_VolatileWrite1 (void *ptr, gint8 value)
{
- *((volatile gint8 *) ptr) = value;
+ mono_atomic_store_release ((volatile gint8 *) ptr, value);
}
void
ves_icall_System_Threading_Thread_VolatileWrite2 (void *ptr, gint16 value)
{
- *((volatile gint16 *) ptr) = value;
+ mono_atomic_store_release ((volatile gint16 *) ptr, value);
}
void
ves_icall_System_Threading_Thread_VolatileWrite4 (void *ptr, gint32 value)
{
- *((volatile gint32 *) ptr) = value;
+ mono_atomic_store_release ((volatile gint32 *) ptr, value);
}
void
ves_icall_System_Threading_Thread_VolatileWrite8 (void *ptr, gint64 value)
{
- *((volatile gint64 *) ptr) = value;
+ mono_atomic_store_release ((volatile gint64 *) ptr, value);
}
void
ves_icall_System_Threading_Thread_VolatileWriteIntPtr (void *ptr, void *value)
{
- *((volatile void **) ptr) = value;
+ mono_atomic_store_release ((volatile void **) ptr, value);
}
void
-ves_icall_System_Threading_Thread_VolatileWriteObject (void *ptr, void *value)
+ves_icall_System_Threading_Thread_VolatileWriteObject (void *ptr, MonoObject *value)
{
- mono_gc_wbarrier_generic_store (ptr, value);
+ mono_gc_wbarrier_generic_store_atomic (ptr, value);
}
void
ves_icall_System_Threading_Thread_VolatileWriteDouble (void *ptr, double value)
{
- *((volatile double *) ptr) = value;
+ mono_atomic_store_release ((volatile double *) ptr, value);
}
void
ves_icall_System_Threading_Thread_VolatileWriteFloat (void *ptr, float value)
{
- *((volatile float *) ptr) = value;
+ mono_atomic_store_release ((volatile float *) ptr, value);
+}
+
+void
+ves_icall_System_Threading_Volatile_Write1 (void *ptr, gint8 value)
+{
+ InterlockedWrite8 (ptr, value);
+}
+
+void
+ves_icall_System_Threading_Volatile_Write2 (void *ptr, gint16 value)
+{
+ InterlockedWrite16 (ptr, value);
+}
+
+void
+ves_icall_System_Threading_Volatile_Write4 (void *ptr, gint32 value)
+{
+ InterlockedWrite (ptr, value);
+}
+
+void
+ves_icall_System_Threading_Volatile_Write8 (void *ptr, gint64 value)
+{
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)ptr & 0x7)) {
+ mono_interlocked_lock ();
+ *(gint64*)ptr = value;
+ mono_interlocked_unlock ();
+ return;
+ }
+#endif
+
+ InterlockedWrite64 (ptr, value);
+}
+
+void
+ves_icall_System_Threading_Volatile_WriteIntPtr (void *ptr, void *value)
+{
+ InterlockedWritePointer (ptr, value);
+}
+
+void
+ves_icall_System_Threading_Volatile_WriteDouble (void *ptr, double value)
+{
+ LongDoubleUnion u;
+
+#if SIZEOF_VOID_P == 4
+ if (G_UNLIKELY ((size_t)ptr & 0x7)) {
+ mono_interlocked_lock ();
+ *(double*)ptr = value;
+ mono_interlocked_unlock ();
+ return;
+ }
+#endif
+
+ u.fval = value;
+
+ InterlockedWrite64 (ptr, u.ival);
+}
+
+void
+ves_icall_System_Threading_Volatile_WriteFloat (void *ptr, float value)
+{
+ IntFloatUnion u;
+
+ u.fval = value;
+
+ InterlockedWrite (ptr, u.ival);
}
void
ves_icall_System_Threading_Volatile_Write_T (void *ptr, MonoObject *value)
{
- *((volatile MonoObject **) ptr) = value;
- mono_gc_wbarrier_generic_nostore (ptr);
+ mono_gc_wbarrier_generic_store_atomic (ptr, value);
}
void
@@ -2915,16 +2938,16 @@ mono_threads_set_shutting_down (void)
/* Make sure we're properly suspended/stopped */
- EnterCriticalSection (current_thread->synch_cs);
+ LOCK_THREAD (current_thread);
if ((current_thread->state & ThreadState_SuspendRequested) ||
(current_thread->state & ThreadState_AbortRequested) ||
(current_thread->state & ThreadState_StopRequested)) {
- LeaveCriticalSection (current_thread->synch_cs);
+ UNLOCK_THREAD (current_thread);
mono_thread_execute_interruption (current_thread);
} else {
current_thread->state |= ThreadState_Stopped;
- LeaveCriticalSection (current_thread->synch_cs);
+ UNLOCK_THREAD (current_thread);
}
/*since we're killing the thread, unset the current domain.*/
@@ -3135,15 +3158,13 @@ void mono_thread_suspend_all_other_threads (void)
continue;
}
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if (thread->suspended_event == NULL) {
thread->suspended_event = CreateEvent (NULL, TRUE, FALSE, NULL);
if (thread->suspended_event == NULL) {
/* Forget this one and go on to the next */
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
continue;
}
}
@@ -3151,7 +3172,7 @@ void mono_thread_suspend_all_other_threads (void)
if ((thread->state & ThreadState_Suspended) != 0 ||
(thread->state & ThreadState_StopRequested) != 0 ||
(thread->state & ThreadState_Stopped) != 0) {
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
CloseHandle (wait->handles [i]);
wait->threads [i] = NULL; /* ignore this thread in next loop */
continue;
@@ -3168,7 +3189,7 @@ void mono_thread_suspend_all_other_threads (void)
thread->state |= ThreadState_SuspendRequested;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
/* Signal the thread to suspend */
if (mono_thread_info_new_interrupt_enabled ())
@@ -3186,14 +3207,12 @@ void mono_thread_suspend_all_other_threads (void)
if (thread == NULL)
continue;
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if ((thread->state & ThreadState_Suspended) != 0) {
CloseHandle (thread->suspended_event);
thread->suspended_event = NULL;
}
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
}
}
@@ -3247,7 +3266,7 @@ print_stack_frame_to_string (MonoStackFrameInfo *frame, MonoContext *ctx, gpoint
GString *p = (GString*)data;
MonoMethod *method = NULL;
if (frame->ji)
- method = frame->ji->method;
+ method = mono_jit_info_get_method (frame->ji);
if (method) {
gchar *location = mono_debug_print_stack_frame (method, frame->native_offset, frame->domain);
@@ -3953,7 +3972,7 @@ free_thread_static_data_helper (gpointer key, gpointer value, gpointer user)
if (!thread->static_data || !thread->static_data [idx])
return;
ptr = ((char*) thread->static_data [idx]) + (data->offset & 0xffffff);
- mono_gc_bzero (ptr, data->size);
+ mono_gc_bzero_atomic (ptr, data->size);
}
static void
@@ -4165,9 +4184,7 @@ static guint32 dummy_apc (gpointer param)
*/
static MonoException* mono_thread_execute_interruption (MonoInternalThread *thread)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
/* MonoThread::interruption_requested can only be changed with atomics */
if (InterlockedCompareExchange (&thread->interruption_requested, FALSE, TRUE)) {
@@ -4181,7 +4198,7 @@ static MonoException* mono_thread_execute_interruption (MonoInternalThread *thre
}
if ((thread->state & ThreadState_AbortRequested) != 0) {
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
if (thread->abort_exc == NULL) {
/*
* This might be racy, but it has to be called outside the lock
@@ -4198,7 +4215,7 @@ static MonoException* mono_thread_execute_interruption (MonoInternalThread *thre
else if ((thread->state & ThreadState_StopRequested) != 0) {
/* FIXME: do this through the JIT? */
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
mono_thread_exit ();
return NULL;
@@ -4208,17 +4225,17 @@ static MonoException* mono_thread_execute_interruption (MonoInternalThread *thre
exc = thread->pending_exception;
thread->pending_exception = NULL;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return exc;
} else if (thread->thread_interrupt_requested) {
thread->thread_interrupt_requested = FALSE;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return(mono_get_exception_thread_interrupted ());
}
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return NULL;
}
@@ -4285,10 +4302,9 @@ mono_thread_resume_interruption (void)
if (thread == NULL)
return NULL;
- ensure_synch_cs_set (thread);
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
still_aborting = (thread->state & ThreadState_AbortRequested) != 0;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
/*This can happen if the protected block called Thread::ResetAbort*/
if (!still_aborting)
@@ -4323,8 +4339,6 @@ static void mono_thread_interruption_checkpoint_request (gboolean bypass_abort_p
if (thread == NULL)
return;
- mono_debugger_check_interruption ();
-
if (thread->interruption_requested && (bypass_abort_protection || !is_running_protected_wrapper ())) {
MonoException* exc = mono_thread_execute_interruption (thread);
if (exc) mono_raise_exception (exc);
@@ -4445,21 +4459,17 @@ mono_thread_cleanup_apartment_state (void)
void
mono_thread_set_state (MonoInternalThread *thread, MonoThreadState state)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
thread->state |= state;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
}
void
mono_thread_clr_state (MonoInternalThread *thread, MonoThreadState state)
{
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
thread->state &= ~state;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
}
gboolean
@@ -4467,15 +4477,13 @@ mono_thread_test_state (MonoInternalThread *thread, MonoThreadState test)
{
gboolean ret = FALSE;
- ensure_synch_cs_set (thread);
-
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if ((thread->state & test) != 0) {
ret = TRUE;
}
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return ret;
}
@@ -4649,7 +4657,7 @@ abort_thread_internal (MonoInternalThread *thread, gboolean can_raise_exception,
InterlockedIncrement (&thread_interruption_requested);
ji = mono_thread_info_get_last_managed (info);
- protected_wrapper = ji && mono_threads_is_critical_method (ji->method);
+ protected_wrapper = ji && mono_threads_is_critical_method (mono_jit_info_get_method (ji));
running_managed = mono_jit_info_match (ji, MONO_CONTEXT_GET_IP (&info->suspend_state.ctx));
if (!protected_wrapper && running_managed) {
@@ -4690,7 +4698,7 @@ transition_to_suspended (MonoInternalThread *thread)
thread->state |= ThreadState_Suspended;
mono_thread_info_finish_suspend ();
}
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
}
static void
@@ -4701,7 +4709,7 @@ suspend_thread_internal (MonoInternalThread *thread, gboolean interrupt)
return;
}
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
if (thread == mono_thread_internal_current ()) {
transition_to_suspended (thread);
mono_thread_info_self_suspend ();
@@ -4713,12 +4721,12 @@ suspend_thread_internal (MonoInternalThread *thread, gboolean interrupt)
/*A null info usually means the thread is already dead. */
if (!(info = mono_thread_info_safe_suspend_sync ((MonoNativeThreadId)(gsize)thread->tid, interrupt))) {
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return;
}
ji = mono_thread_info_get_last_managed (info);
- protected_wrapper = ji && mono_threads_is_critical_method (ji->method);
+ protected_wrapper = ji && mono_threads_is_critical_method (mono_jit_info_get_method (ji));
running_managed = mono_jit_info_match (ji, MONO_CONTEXT_GET_IP (&info->suspend_state.ctx));
if (running_managed && !protected_wrapper) {
@@ -4737,7 +4745,7 @@ suspend_thread_internal (MonoInternalThread *thread, gboolean interrupt)
if (interrupt)
wapi_finish_interrupt_thread (interrupt_handle);
#endif
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
}
}
}
@@ -4751,13 +4759,13 @@ self_suspend_internal (MonoInternalThread *thread)
thread->state |= ThreadState_Suspended;
thread->suspend_event = CreateEvent (NULL, TRUE, FALSE, NULL);
if (thread->suspend_event == NULL) {
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return;
}
if (thread->suspended_event)
SetEvent (thread->suspended_event);
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
if (shutting_down) {
/* After we left the lock, the runtime might shut down so everything becomes invalid */
@@ -4767,7 +4775,7 @@ self_suspend_internal (MonoInternalThread *thread)
WaitForSingleObject (thread->suspend_event, INFINITE);
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
CloseHandle (thread->suspend_event);
thread->suspend_event = NULL;
@@ -4778,7 +4786,7 @@ self_suspend_internal (MonoInternalThread *thread)
*/
SetEvent (thread->resume_event);
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return;
}
@@ -4793,14 +4801,14 @@ resume_thread_internal (MonoInternalThread *thread)
if (!mono_thread_info_new_interrupt_enabled ()) {
thread->resume_event = CreateEvent (NULL, TRUE, FALSE, NULL);
if (thread->resume_event == NULL) {
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return FALSE;
}
/* Awake the thread */
SetEvent (thread->suspend_event);
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
/* Wait for the thread to awake */
WaitForSingleObject (thread->resume_event, INFINITE);
@@ -4809,13 +4817,13 @@ resume_thread_internal (MonoInternalThread *thread)
return TRUE;
}
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
/* Awake the thread */
if (!mono_thread_info_resume ((MonoNativeThreadId)(gpointer)(gsize)thread->tid))
return FALSE;
- EnterCriticalSection (thread->synch_cs);
+ LOCK_THREAD (thread);
thread->state &= ~ThreadState_Suspended;
- LeaveCriticalSection (thread->synch_cs);
+ UNLOCK_THREAD (thread);
return TRUE;
}
diff --git a/mono/metadata/tpool-epoll.c b/mono/metadata/tpool-epoll.c
index 876a82bc07..41242c6b5e 100644
--- a/mono/metadata/tpool-epoll.c
+++ b/mono/metadata/tpool-epoll.c
@@ -177,7 +177,7 @@ tp_epoll_wait (gpointer p)
}
LeaveCriticalSection (&socket_io_data->io_lock);
threadpool_append_jobs (&async_io_tp, (MonoObject **) async_results, nresults);
- mono_gc_bzero (async_results, sizeof (gpointer) * nresults);
+ mono_gc_bzero_aligned (async_results, sizeof (gpointer) * nresults);
}
}
#undef EPOLL_NEVENTS
diff --git a/mono/metadata/tpool-kqueue.c b/mono/metadata/tpool-kqueue.c
index 75f12f266c..f2ca4f4158 100644
--- a/mono/metadata/tpool-kqueue.c
+++ b/mono/metadata/tpool-kqueue.c
@@ -157,7 +157,7 @@ tp_kqueue_wait (gpointer p)
}
LeaveCriticalSection (&socket_io_data->io_lock);
threadpool_append_jobs (&async_io_tp, (MonoObject **) async_results, nresults);
- mono_gc_bzero (async_results, sizeof (gpointer) * nresults);
+ mono_gc_bzero_aligned (async_results, sizeof (gpointer) * nresults);
}
}
#undef KQUEUE_NEVENTS
diff --git a/mono/mini/Makefile.am b/mono/mini/Makefile.am
index 1aaf8ed95f..8be85bc538 100644
--- a/mono/mini/Makefile.am
+++ b/mono/mini/Makefile.am
@@ -162,7 +162,7 @@ libmono_llvm_la_LIBADD = $(LLVM_LIBS) $(LLVM_LDFLAGS)
if PLATFORM_DARWIN
libmono_llvm_la_LDFLAGS=-Wl,-undefined -Wl,suppress -Wl,-flat_namespace
else
-libmono_llvm_la_LIBADD += $(top_builddir)/mono/mini/libmono-$(API_VER).la $(libs)
+libmono_llvm_la_LIBADD += $(top_builddir)/mono/mini/libmonoboehm-$(API_VER).la $(libs)
endif
endif
@@ -389,7 +389,6 @@ common_sources = \
local-propagation.c \
driver.c \
debug-mini.c \
- debug-mini.h \
linear-scan.c \
aot-compiler.c \
aot-runtime.c \
@@ -417,11 +416,10 @@ common_sources = \
mini-gc.c \
debugger-agent.h \
debugger-agent.c \
- debug-debugger.c \
- debug-debugger.h \
xdebug.c \
mini-llvm.h \
- mini-llvm-cpp.h
+ mini-llvm-cpp.h \
+ alias-analysis.c
test_sources = \
basic-calls.cs \
@@ -450,26 +448,13 @@ regtests += nacl.exe
endif
if X86
-if MONO_DEBUGGER_SUPPORTED
-if PLATFORM_DARWIN
-mdb_x86 = mdb-debug-info32-darwin.s
-else
-mdb_x86 = mdb-debug-info32.s
-endif
-else
-mdb_x86 =
-endif
-arch_sources = $(x86_sources) $(mdb_x86)
+arch_sources = $(x86_sources)
arch_built=cpu-x86.h
arch_define=__i386__
endif
if AMD64
-if MONO_DEBUGGER_SUPPORTED
-arch_sources = $(amd64_sources) mdb-debug-info64.s
-else
arch_sources = $(amd64_sources)
-endif
arch_built=cpu-amd64.h
arch_define=__x86_64__
endif
diff --git a/mono/mini/Makefile.am.in b/mono/mini/Makefile.am.in
index 1aaf8ed95f..8be85bc538 100755
--- a/mono/mini/Makefile.am.in
+++ b/mono/mini/Makefile.am.in
@@ -162,7 +162,7 @@ libmono_llvm_la_LIBADD = $(LLVM_LIBS) $(LLVM_LDFLAGS)
if PLATFORM_DARWIN
libmono_llvm_la_LDFLAGS=-Wl,-undefined -Wl,suppress -Wl,-flat_namespace
else
-libmono_llvm_la_LIBADD += $(top_builddir)/mono/mini/libmono-$(API_VER).la $(libs)
+libmono_llvm_la_LIBADD += $(top_builddir)/mono/mini/libmonoboehm-$(API_VER).la $(libs)
endif
endif
@@ -389,7 +389,6 @@ common_sources = \
local-propagation.c \
driver.c \
debug-mini.c \
- debug-mini.h \
linear-scan.c \
aot-compiler.c \
aot-runtime.c \
@@ -417,11 +416,10 @@ common_sources = \
mini-gc.c \
debugger-agent.h \
debugger-agent.c \
- debug-debugger.c \
- debug-debugger.h \
xdebug.c \
mini-llvm.h \
- mini-llvm-cpp.h
+ mini-llvm-cpp.h \
+ alias-analysis.c
test_sources = \
basic-calls.cs \
@@ -450,26 +448,13 @@ regtests += nacl.exe
endif
if X86
-if MONO_DEBUGGER_SUPPORTED
-if PLATFORM_DARWIN
-mdb_x86 = mdb-debug-info32-darwin.s
-else
-mdb_x86 = mdb-debug-info32.s
-endif
-else
-mdb_x86 =
-endif
-arch_sources = $(x86_sources) $(mdb_x86)
+arch_sources = $(x86_sources)
arch_built=cpu-x86.h
arch_define=__i386__
endif
if AMD64
-if MONO_DEBUGGER_SUPPORTED
-arch_sources = $(amd64_sources) mdb-debug-info64.s
-else
arch_sources = $(amd64_sources)
-endif
arch_built=cpu-amd64.h
arch_define=__x86_64__
endif
diff --git a/mono/mini/Makefile.in b/mono/mini/Makefile.in
index 863947de6f..c389fdb8c3 100644
--- a/mono/mini/Makefile.in
+++ b/mono/mini/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -62,13 +63,12 @@ target_triplet = @target@
@DISABLE_EXECUTABLES_FALSE@@JIT_SUPPORTED_TRUE@ mono$(EXEEXT)
@DISABLE_EXECUTABLES_TRUE@@JIT_SUPPORTED_TRUE@noinst_PROGRAMS = genmdesc$(EXEEXT)
@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@am__append_1 = libmono-llvm.la
-@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@@PLATFORM_DARWIN_FALSE@am__append_2 = $(top_builddir)/mono/mini/libmono-$(API_VER).la $(libs)
+@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@@PLATFORM_DARWIN_FALSE@am__append_2 = $(top_builddir)/mono/mini/libmonoboehm-$(API_VER).la $(libs)
@NACL_CODEGEN_TRUE@am__append_3 = nacl.cs
@NACL_CODEGEN_TRUE@am__append_4 = nacl.exe
subdir = mono/mini
DIST_COMMON = README $(libmonoinclude_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
- $(top_srcdir)/mkinstalldirs ChangeLog TODO
+ $(srcdir)/Makefile.in ChangeLog TODO
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -122,25 +122,23 @@ am__libmini_static_la_SOURCES_DIST = mini.c ir-emit.h method-to-ir.c \
mini-arch.h dominators.c cfold.c regalloc.c regalloc.h \
helpers.c liveness.c ssa.c abcremoval.c abcremoval.h ssapre.c \
ssapre.h local-propagation.c driver.c debug-mini.c \
- debug-mini.h linear-scan.c aot-compiler.c aot-runtime.c \
- graph.c mini-codegen.c mini-exceptions.c mini-trampolines.c \
- declsec.c declsec.h wapihandles.c branch-opts.c \
- mini-generic-sharing.c regalloc2.c simd-methods.h tasklets.c \
- tasklets.h simd-intrinsics.c mini-unwind.h unwind.c \
- image-writer.h image-writer.c dwarfwriter.h dwarfwriter.c \
- mini-gc.h mini-gc.c debugger-agent.h debugger-agent.c \
- debug-debugger.c debug-debugger.h xdebug.c mini-llvm.h \
- mini-llvm-cpp.h mini-llvm.c mini-llvm-cpp.cpp mini-amd64.c \
- mini-amd64.h exceptions-amd64.c tramp-amd64.c \
- mdb-debug-info64.s mini-arm.c mini-arm.h exceptions-arm.c \
- tramp-arm.c mini-ia64.c mini-ia64.h exceptions-ia64.c \
- tramp-ia64.c mini-mips.c mini-mips.h exceptions-mips.c \
- tramp-mips.c mini-ppc.c mini-ppc.h exceptions-ppc.c \
- tramp-ppc.c mini-s390x.c mini-s390x.h exceptions-s390x.c \
- tramp-s390x.c mini-sparc.c mini-sparc.h exceptions-sparc.c \
- tramp-sparc.c mini-x86.c mini-x86.h exceptions-x86.c \
- tramp-x86.c mdb-debug-info32.s mdb-debug-info32-darwin.s \
- mini-windows.c mini-darwin.c mini-posix.c
+ linear-scan.c aot-compiler.c aot-runtime.c graph.c \
+ mini-codegen.c mini-exceptions.c mini-trampolines.c declsec.c \
+ declsec.h wapihandles.c branch-opts.c mini-generic-sharing.c \
+ regalloc2.c simd-methods.h tasklets.c tasklets.h \
+ simd-intrinsics.c mini-unwind.h unwind.c image-writer.h \
+ image-writer.c dwarfwriter.h dwarfwriter.c mini-gc.h mini-gc.c \
+ debugger-agent.h debugger-agent.c xdebug.c mini-llvm.h \
+ mini-llvm-cpp.h alias-analysis.c mini-llvm.c mini-llvm-cpp.cpp \
+ mini-amd64.c mini-amd64.h exceptions-amd64.c tramp-amd64.c \
+ mini-arm.c mini-arm.h exceptions-arm.c tramp-arm.c mini-ia64.c \
+ mini-ia64.h exceptions-ia64.c tramp-ia64.c mini-mips.c \
+ mini-mips.h exceptions-mips.c tramp-mips.c mini-ppc.c \
+ mini-ppc.h exceptions-ppc.c tramp-ppc.c mini-s390x.c \
+ mini-s390x.h exceptions-s390x.c tramp-s390x.c mini-sparc.c \
+ mini-sparc.h exceptions-sparc.c tramp-sparc.c mini-x86.c \
+ mini-x86.h exceptions-x86.c tramp-x86.c mini-windows.c \
+ mini-darwin.c mini-posix.c
am__objects_1 = libmini_static_la-mini.lo \
libmini_static_la-method-to-ir.lo \
libmini_static_la-decompose.lo libmini_static_la-jit-icalls.lo \
@@ -165,8 +163,8 @@ am__objects_1 = libmini_static_la-mini.lo \
libmini_static_la-unwind.lo libmini_static_la-image-writer.lo \
libmini_static_la-dwarfwriter.lo libmini_static_la-mini-gc.lo \
libmini_static_la-debugger-agent.lo \
- libmini_static_la-debug-debugger.lo \
- libmini_static_la-xdebug.lo
+ libmini_static_la-xdebug.lo \
+ libmini_static_la-alias-analysis.lo
@ENABLE_LLVM_TRUE@@LOADED_LLVM_FALSE@am__objects_2 = libmini_static_la-mini-llvm.lo \
@ENABLE_LLVM_TRUE@@LOADED_LLVM_FALSE@ mini-llvm-cpp.lo
am__objects_3 = libmini_static_la-mini-amd64.lo \
@@ -193,34 +191,27 @@ am__objects_9 = libmini_static_la-mini-sparc.lo \
am__objects_10 = libmini_static_la-mini-x86.lo \
libmini_static_la-exceptions-x86.lo \
libmini_static_la-tramp-x86.lo
-@MONO_DEBUGGER_SUPPORTED_TRUE@@PLATFORM_DARWIN_FALSE@@X86_TRUE@am__objects_11 = mdb-debug-info32.lo
-@MONO_DEBUGGER_SUPPORTED_TRUE@@PLATFORM_DARWIN_TRUE@@X86_TRUE@am__objects_11 = mdb-debug-info32-darwin.lo
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_FALSE@@X86_TRUE@am__objects_12 = $(am__objects_10) \
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_FALSE@@X86_TRUE@ $(am__objects_11)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_TRUE@am__objects_12 = $(am__objects_9)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_TRUE@am__objects_12 = $(am__objects_9)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_TRUE@am__objects_12 = $(am__objects_8)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_TRUE@am__objects_12 = $(am__objects_7)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_TRUE@am__objects_12 = $(am__objects_7)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_TRUE@am__objects_12 = $(am__objects_6)
-@AMD64_FALSE@@ARM_FALSE@@IA64_TRUE@am__objects_12 = $(am__objects_5)
-@AMD64_FALSE@@ARM_TRUE@am__objects_12 = $(am__objects_4)
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_FALSE@am__objects_12 = \
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_FALSE@ $(am__objects_3)
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_TRUE@am__objects_12 = \
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_TRUE@ $(am__objects_3) \
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_TRUE@ mdb-debug-info64.lo
-am__objects_13 = libmini_static_la-mini-windows.lo
-am__objects_14 = libmini_static_la-mini-darwin.lo
-am__objects_15 = libmini_static_la-mini-posix.lo
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_FALSE@@PLATFORM_SIGPOSIX_TRUE@am__objects_16 = $(am__objects_15)
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@am__objects_16 = \
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_14) \
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_15)
-@HOST_WIN32_TRUE@am__objects_16 = $(am__objects_13)
-am__objects_17 = $(am__objects_1) $(am__objects_2) $(am__objects_12) \
- $(am__objects_16)
-am_libmini_static_la_OBJECTS = $(am__objects_17)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_FALSE@@X86_TRUE@am__objects_11 = $(am__objects_10)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_TRUE@am__objects_11 = $(am__objects_9)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_TRUE@am__objects_11 = $(am__objects_9)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_TRUE@am__objects_11 = $(am__objects_8)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_TRUE@am__objects_11 = $(am__objects_7)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_TRUE@am__objects_11 = $(am__objects_7)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_TRUE@am__objects_11 = $(am__objects_6)
+@AMD64_FALSE@@ARM_FALSE@@IA64_TRUE@am__objects_11 = $(am__objects_5)
+@AMD64_FALSE@@ARM_TRUE@am__objects_11 = $(am__objects_4)
+@AMD64_TRUE@am__objects_11 = $(am__objects_3)
+am__objects_12 = libmini_static_la-mini-windows.lo
+am__objects_13 = libmini_static_la-mini-darwin.lo
+am__objects_14 = libmini_static_la-mini-posix.lo
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_FALSE@@PLATFORM_SIGPOSIX_TRUE@am__objects_15 = $(am__objects_14)
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@am__objects_15 = \
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_13) \
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_14)
+@HOST_WIN32_TRUE@am__objects_15 = $(am__objects_12)
+am__objects_16 = $(am__objects_1) $(am__objects_2) $(am__objects_11) \
+ $(am__objects_15)
+am_libmini_static_la_OBJECTS = $(am__objects_16)
libmini_static_la_OBJECTS = $(am_libmini_static_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -237,26 +228,24 @@ am__libmini_la_SOURCES_DIST = mini.c ir-emit.h method-to-ir.c \
mini-arch.h dominators.c cfold.c regalloc.c regalloc.h \
helpers.c liveness.c ssa.c abcremoval.c abcremoval.h ssapre.c \
ssapre.h local-propagation.c driver.c debug-mini.c \
- debug-mini.h linear-scan.c aot-compiler.c aot-runtime.c \
- graph.c mini-codegen.c mini-exceptions.c mini-trampolines.c \
- declsec.c declsec.h wapihandles.c branch-opts.c \
- mini-generic-sharing.c regalloc2.c simd-methods.h tasklets.c \
- tasklets.h simd-intrinsics.c mini-unwind.h unwind.c \
- image-writer.h image-writer.c dwarfwriter.h dwarfwriter.c \
- mini-gc.h mini-gc.c debugger-agent.h debugger-agent.c \
- debug-debugger.c debug-debugger.h xdebug.c mini-llvm.h \
- mini-llvm-cpp.h mini-llvm.c mini-llvm-cpp.cpp mini-amd64.c \
- mini-amd64.h exceptions-amd64.c tramp-amd64.c \
- mdb-debug-info64.s mini-arm.c mini-arm.h exceptions-arm.c \
- tramp-arm.c mini-ia64.c mini-ia64.h exceptions-ia64.c \
- tramp-ia64.c mini-mips.c mini-mips.h exceptions-mips.c \
- tramp-mips.c mini-ppc.c mini-ppc.h exceptions-ppc.c \
- tramp-ppc.c mini-s390x.c mini-s390x.h exceptions-s390x.c \
- tramp-s390x.c mini-sparc.c mini-sparc.h exceptions-sparc.c \
- tramp-sparc.c mini-x86.c mini-x86.h exceptions-x86.c \
- tramp-x86.c mdb-debug-info32.s mdb-debug-info32-darwin.s \
- mini-windows.c mini-darwin.c mini-posix.c
-am__objects_18 = libmini_la-mini.lo libmini_la-method-to-ir.lo \
+ linear-scan.c aot-compiler.c aot-runtime.c graph.c \
+ mini-codegen.c mini-exceptions.c mini-trampolines.c declsec.c \
+ declsec.h wapihandles.c branch-opts.c mini-generic-sharing.c \
+ regalloc2.c simd-methods.h tasklets.c tasklets.h \
+ simd-intrinsics.c mini-unwind.h unwind.c image-writer.h \
+ image-writer.c dwarfwriter.h dwarfwriter.c mini-gc.h mini-gc.c \
+ debugger-agent.h debugger-agent.c xdebug.c mini-llvm.h \
+ mini-llvm-cpp.h alias-analysis.c mini-llvm.c mini-llvm-cpp.cpp \
+ mini-amd64.c mini-amd64.h exceptions-amd64.c tramp-amd64.c \
+ mini-arm.c mini-arm.h exceptions-arm.c tramp-arm.c mini-ia64.c \
+ mini-ia64.h exceptions-ia64.c tramp-ia64.c mini-mips.c \
+ mini-mips.h exceptions-mips.c tramp-mips.c mini-ppc.c \
+ mini-ppc.h exceptions-ppc.c tramp-ppc.c mini-s390x.c \
+ mini-s390x.h exceptions-s390x.c tramp-s390x.c mini-sparc.c \
+ mini-sparc.h exceptions-sparc.c tramp-sparc.c mini-x86.c \
+ mini-x86.h exceptions-x86.c tramp-x86.c mini-windows.c \
+ mini-darwin.c mini-posix.c
+am__objects_17 = libmini_la-mini.lo libmini_la-method-to-ir.lo \
libmini_la-decompose.lo libmini_la-jit-icalls.lo \
libmini_la-trace.lo libmini_la-dominators.lo \
libmini_la-cfold.lo libmini_la-regalloc.lo \
@@ -273,51 +262,46 @@ am__objects_18 = libmini_la-mini.lo libmini_la-method-to-ir.lo \
libmini_la-simd-intrinsics.lo libmini_la-unwind.lo \
libmini_la-image-writer.lo libmini_la-dwarfwriter.lo \
libmini_la-mini-gc.lo libmini_la-debugger-agent.lo \
- libmini_la-debug-debugger.lo libmini_la-xdebug.lo
-@ENABLE_LLVM_TRUE@@LOADED_LLVM_FALSE@am__objects_19 = \
+ libmini_la-xdebug.lo libmini_la-alias-analysis.lo
+@ENABLE_LLVM_TRUE@@LOADED_LLVM_FALSE@am__objects_18 = \
@ENABLE_LLVM_TRUE@@LOADED_LLVM_FALSE@ libmini_la-mini-llvm.lo \
@ENABLE_LLVM_TRUE@@LOADED_LLVM_FALSE@ mini-llvm-cpp.lo
-am__objects_20 = libmini_la-mini-amd64.lo \
+am__objects_19 = libmini_la-mini-amd64.lo \
libmini_la-exceptions-amd64.lo libmini_la-tramp-amd64.lo
-am__objects_21 = libmini_la-mini-arm.lo libmini_la-exceptions-arm.lo \
+am__objects_20 = libmini_la-mini-arm.lo libmini_la-exceptions-arm.lo \
libmini_la-tramp-arm.lo
-am__objects_22 = libmini_la-mini-ia64.lo libmini_la-exceptions-ia64.lo \
+am__objects_21 = libmini_la-mini-ia64.lo libmini_la-exceptions-ia64.lo \
libmini_la-tramp-ia64.lo
-am__objects_23 = libmini_la-mini-mips.lo libmini_la-exceptions-mips.lo \
+am__objects_22 = libmini_la-mini-mips.lo libmini_la-exceptions-mips.lo \
libmini_la-tramp-mips.lo
-am__objects_24 = libmini_la-mini-ppc.lo libmini_la-exceptions-ppc.lo \
+am__objects_23 = libmini_la-mini-ppc.lo libmini_la-exceptions-ppc.lo \
libmini_la-tramp-ppc.lo
-am__objects_25 = libmini_la-mini-s390x.lo \
+am__objects_24 = libmini_la-mini-s390x.lo \
libmini_la-exceptions-s390x.lo libmini_la-tramp-s390x.lo
-am__objects_26 = libmini_la-mini-sparc.lo \
+am__objects_25 = libmini_la-mini-sparc.lo \
libmini_la-exceptions-sparc.lo libmini_la-tramp-sparc.lo
-am__objects_27 = libmini_la-mini-x86.lo libmini_la-exceptions-x86.lo \
+am__objects_26 = libmini_la-mini-x86.lo libmini_la-exceptions-x86.lo \
libmini_la-tramp-x86.lo
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_FALSE@@X86_TRUE@am__objects_28 = $(am__objects_27) \
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_FALSE@@X86_TRUE@ $(am__objects_11)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_TRUE@am__objects_28 = $(am__objects_26)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_TRUE@am__objects_28 = $(am__objects_26)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_TRUE@am__objects_28 = $(am__objects_25)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_TRUE@am__objects_28 = $(am__objects_24)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_TRUE@am__objects_28 = $(am__objects_24)
-@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_TRUE@am__objects_28 = $(am__objects_23)
-@AMD64_FALSE@@ARM_FALSE@@IA64_TRUE@am__objects_28 = $(am__objects_22)
-@AMD64_FALSE@@ARM_TRUE@am__objects_28 = $(am__objects_21)
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_FALSE@am__objects_28 = \
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_FALSE@ $(am__objects_20)
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_TRUE@am__objects_28 = \
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_TRUE@ $(am__objects_20) \
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_TRUE@ mdb-debug-info64.lo
-am__objects_29 = libmini_la-mini-windows.lo
-am__objects_30 = libmini_la-mini-darwin.lo
-am__objects_31 = libmini_la-mini-posix.lo
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_FALSE@@PLATFORM_SIGPOSIX_TRUE@am__objects_32 = $(am__objects_31)
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@am__objects_32 = \
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_30) \
-@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_31)
-@HOST_WIN32_TRUE@am__objects_32 = $(am__objects_29)
-am_libmini_la_OBJECTS = $(am__objects_18) $(am__objects_19) \
- $(am__objects_28) $(am__objects_32)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_FALSE@@X86_TRUE@am__objects_27 = $(am__objects_26)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_FALSE@@SPARC_TRUE@am__objects_27 = $(am__objects_25)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_FALSE@@SPARC64_TRUE@am__objects_27 = $(am__objects_25)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_FALSE@@S390X_TRUE@am__objects_27 = $(am__objects_24)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_FALSE@@POWERPC_TRUE@am__objects_27 = $(am__objects_23)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_FALSE@@POWERPC64_TRUE@am__objects_27 = $(am__objects_23)
+@AMD64_FALSE@@ARM_FALSE@@IA64_FALSE@@MIPS_TRUE@am__objects_27 = $(am__objects_22)
+@AMD64_FALSE@@ARM_FALSE@@IA64_TRUE@am__objects_27 = $(am__objects_21)
+@AMD64_FALSE@@ARM_TRUE@am__objects_27 = $(am__objects_20)
+@AMD64_TRUE@am__objects_27 = $(am__objects_19)
+am__objects_28 = libmini_la-mini-windows.lo
+am__objects_29 = libmini_la-mini-darwin.lo
+am__objects_30 = libmini_la-mini-posix.lo
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_FALSE@@PLATFORM_SIGPOSIX_TRUE@am__objects_31 = $(am__objects_30)
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@am__objects_31 = \
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_29) \
+@HOST_WIN32_FALSE@@PLATFORM_DARWIN_TRUE@ $(am__objects_30)
+@HOST_WIN32_TRUE@am__objects_31 = $(am__objects_28)
+am_libmini_la_OBJECTS = $(am__objects_17) $(am__objects_18) \
+ $(am__objects_27) $(am__objects_31)
libmini_la_OBJECTS = $(am_libmini_la_OBJECTS)
@DISABLE_EXECUTABLES_FALSE@@JIT_SUPPORTED_TRUE@@SHARED_MONO_TRUE@am_libmini_la_rpath =
@DISABLE_EXECUTABLES_TRUE@@JIT_SUPPORTED_TRUE@@SHARED_MONO_TRUE@am_libmini_la_rpath =
@@ -329,7 +313,7 @@ am__DEPENDENCIES_4 = $(monodir)/mono/metadata/libmonoruntime.la \
$(monodir)/mono/io-layer/libwapi.la \
$(monodir)/mono/utils/libmonoutils.la $(am__DEPENDENCIES_2) \
$(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3)
-@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@@PLATFORM_DARWIN_FALSE@am__DEPENDENCIES_5 = $(top_builddir)/mono/mini/libmono-$(API_VER).la \
+@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@@PLATFORM_DARWIN_FALSE@am__DEPENDENCIES_5 = $(top_builddir)/mono/mini/libmonoboehm-$(API_VER).la \
@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@@PLATFORM_DARWIN_FALSE@ $(am__DEPENDENCIES_4)
@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@libmono_llvm_la_DEPENDENCIES = \
@JIT_SUPPORTED_TRUE@@LOADED_LLVM_TRUE@ $(am__DEPENDENCIES_2) \
@@ -439,8 +423,8 @@ mono_sgen_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(mono_sgen_CFLAGS) \
$(CFLAGS) $(mono_sgen_LDFLAGS) $(LDFLAGS) -o $@
am__monow_SOURCES_DIST = main.c
-am__objects_33 = main.$(OBJEXT)
-@HOST_WIN32_TRUE@am_monow_OBJECTS = $(am__objects_33)
+am__objects_32 = main.$(OBJEXT)
+@HOST_WIN32_TRUE@am_monow_OBJECTS = $(am__objects_32)
monow_OBJECTS = $(am_monow_OBJECTS)
am__DEPENDENCIES_16 = $(am__DEPENDENCIES_11) $(am__DEPENDENCIES_2) \
$(am__DEPENDENCIES_12) $(am__DEPENDENCIES_2) \
@@ -457,7 +441,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -467,29 +451,22 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
AM_V_CXX = $(am__v_CXX_@AM_V@)
am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
-am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_0 = @echo " CXX " $@;
CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo " CXXLD " $@;
-CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
-LTCCASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
- $(CCASFLAGS)
-AM_V_CCAS = $(am__v_CCAS_@AM_V@)
-am__v_CCAS_ = $(am__v_CCAS_@AM_DEFAULT_V@)
-am__v_CCAS_0 = @echo " CCAS " $@;
+am__v_CXXLD_0 = @echo " CXXLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmini_static_la_SOURCES) $(libmini_la_SOURCES) \
$(libmono_llvm_la_SOURCES) $(libmonoboehm_2_0_la_SOURCES) \
$(libmonosgen_2_0_la_SOURCES) $(genmdesc_SOURCES) \
@@ -951,7 +928,6 @@ common_sources = \
local-propagation.c \
driver.c \
debug-mini.c \
- debug-mini.h \
linear-scan.c \
aot-compiler.c \
aot-runtime.c \
@@ -979,11 +955,10 @@ common_sources = \
mini-gc.c \
debugger-agent.h \
debugger-agent.c \
- debug-debugger.c \
- debug-debugger.h \
xdebug.c \
mini-llvm.h \
- mini-llvm-cpp.h
+ mini-llvm-cpp.h \
+ alias-analysis.c
test_sources = basic-calls.cs basic-long.cs bench.cs objects.cs \
arrays.cs basic-float.cs basic-math.cs basic.cs exceptions.cs \
@@ -994,11 +969,7 @@ regtests = basic.exe basic-float.exe basic-long.exe basic-calls.exe \
objects.exe arrays.exe basic-math.exe exceptions.exe \
iltests.exe devirtualization.exe generics.exe basic-simd.exe \
$(am__append_4)
-@MONO_DEBUGGER_SUPPORTED_FALSE@@X86_TRUE@mdb_x86 =
-@MONO_DEBUGGER_SUPPORTED_TRUE@@PLATFORM_DARWIN_FALSE@@X86_TRUE@mdb_x86 = mdb-debug-info32.s
-@MONO_DEBUGGER_SUPPORTED_TRUE@@PLATFORM_DARWIN_TRUE@@X86_TRUE@mdb_x86 = mdb-debug-info32-darwin.s
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_FALSE@arch_sources = $(amd64_sources)
-@AMD64_TRUE@@MONO_DEBUGGER_SUPPORTED_TRUE@arch_sources = $(amd64_sources) mdb-debug-info64.s
+@AMD64_TRUE@arch_sources = $(amd64_sources)
@ARM_TRUE@arch_sources = $(arm_sources)
@IA64_TRUE@arch_sources = $(ia64_sources)
@MIPS_TRUE@arch_sources = $(mips_sources)
@@ -1007,7 +978,7 @@ regtests = basic.exe basic-float.exe basic-long.exe basic-calls.exe \
@S390X_TRUE@arch_sources = $(s390x_sources)
@SPARC64_TRUE@arch_sources = $(sparc_sources)
@SPARC_TRUE@arch_sources = $(sparc_sources)
-@X86_TRUE@arch_sources = $(x86_sources) $(mdb_x86)
+@X86_TRUE@arch_sources = $(x86_sources)
@AMD64_TRUE@arch_built = cpu-amd64.h
@ARM_TRUE@arch_built = cpu-arm.h
@IA64_TRUE@arch_built = cpu-ia64.h
@@ -1097,7 +1068,7 @@ all: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) all-am
.SUFFIXES:
-.SUFFIXES: .c .cpp .lo .o .obj .s
+.SUFFIXES: .c .cpp .lo .o .obj
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -1154,25 +1125,21 @@ uninstall-libLTLIBRARIES:
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(lib_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
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmini-static.la: $(libmini_static_la_OBJECTS) $(libmini_static_la_DEPENDENCIES) $(EXTRA_libmini_static_la_DEPENDENCIES)
$(AM_V_CXXLD)$(libmini_static_la_LINK) $(am_libmini_static_la_rpath) $(libmini_static_la_OBJECTS) $(libmini_static_la_LIBADD) $(LIBS)
libmini.la: $(libmini_la_OBJECTS) $(libmini_la_DEPENDENCIES) $(EXTRA_libmini_la_DEPENDENCIES)
@@ -1276,11 +1243,11 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genmdesc-genmdesc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genmdesc-helpers.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-abcremoval.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-alias-analysis.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-aot-compiler.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-aot-runtime.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-branch-opts.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-cfold.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-debug-debugger.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-debug-mini.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-debugger-agent.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-declsec.Plo@am__quote@
@@ -1341,11 +1308,11 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-wapihandles.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_la-xdebug.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-abcremoval.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-alias-analysis.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-aot-compiler.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-aot-runtime.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-branch-opts.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-cfold.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-debug-debugger.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-debug-mini.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-debugger-agent.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmini_static_la-declsec.Plo@am__quote@
@@ -1681,13 +1648,6 @@ libmini_static_la-debugger-agent.lo: debugger-agent.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -c -o libmini_static_la-debugger-agent.lo `test -f 'debugger-agent.c' || echo '$(srcdir)/'`debugger-agent.c
-libmini_static_la-debug-debugger.lo: debug-debugger.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -MT libmini_static_la-debug-debugger.lo -MD -MP -MF $(DEPDIR)/libmini_static_la-debug-debugger.Tpo -c -o libmini_static_la-debug-debugger.lo `test -f 'debug-debugger.c' || echo '$(srcdir)/'`debug-debugger.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_static_la-debug-debugger.Tpo $(DEPDIR)/libmini_static_la-debug-debugger.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug-debugger.c' object='libmini_static_la-debug-debugger.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -c -o libmini_static_la-debug-debugger.lo `test -f 'debug-debugger.c' || echo '$(srcdir)/'`debug-debugger.c
-
libmini_static_la-xdebug.lo: xdebug.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -MT libmini_static_la-xdebug.lo -MD -MP -MF $(DEPDIR)/libmini_static_la-xdebug.Tpo -c -o libmini_static_la-xdebug.lo `test -f 'xdebug.c' || echo '$(srcdir)/'`xdebug.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_static_la-xdebug.Tpo $(DEPDIR)/libmini_static_la-xdebug.Plo
@@ -1695,6 +1655,13 @@ libmini_static_la-xdebug.lo: xdebug.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -c -o libmini_static_la-xdebug.lo `test -f 'xdebug.c' || echo '$(srcdir)/'`xdebug.c
+libmini_static_la-alias-analysis.lo: alias-analysis.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -MT libmini_static_la-alias-analysis.lo -MD -MP -MF $(DEPDIR)/libmini_static_la-alias-analysis.Tpo -c -o libmini_static_la-alias-analysis.lo `test -f 'alias-analysis.c' || echo '$(srcdir)/'`alias-analysis.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_static_la-alias-analysis.Tpo $(DEPDIR)/libmini_static_la-alias-analysis.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alias-analysis.c' object='libmini_static_la-alias-analysis.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -c -o libmini_static_la-alias-analysis.lo `test -f 'alias-analysis.c' || echo '$(srcdir)/'`alias-analysis.c
+
libmini_static_la-mini-llvm.lo: mini-llvm.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_static_la_CFLAGS) $(CFLAGS) -MT libmini_static_la-mini-llvm.lo -MD -MP -MF $(DEPDIR)/libmini_static_la-mini-llvm.Tpo -c -o libmini_static_la-mini-llvm.lo `test -f 'mini-llvm.c' || echo '$(srcdir)/'`mini-llvm.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_static_la-mini-llvm.Tpo $(DEPDIR)/libmini_static_la-mini-llvm.Plo
@@ -2136,13 +2103,6 @@ libmini_la-debugger-agent.lo: debugger-agent.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -c -o libmini_la-debugger-agent.lo `test -f 'debugger-agent.c' || echo '$(srcdir)/'`debugger-agent.c
-libmini_la-debug-debugger.lo: debug-debugger.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -MT libmini_la-debug-debugger.lo -MD -MP -MF $(DEPDIR)/libmini_la-debug-debugger.Tpo -c -o libmini_la-debug-debugger.lo `test -f 'debug-debugger.c' || echo '$(srcdir)/'`debug-debugger.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_la-debug-debugger.Tpo $(DEPDIR)/libmini_la-debug-debugger.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug-debugger.c' object='libmini_la-debug-debugger.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -c -o libmini_la-debug-debugger.lo `test -f 'debug-debugger.c' || echo '$(srcdir)/'`debug-debugger.c
-
libmini_la-xdebug.lo: xdebug.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -MT libmini_la-xdebug.lo -MD -MP -MF $(DEPDIR)/libmini_la-xdebug.Tpo -c -o libmini_la-xdebug.lo `test -f 'xdebug.c' || echo '$(srcdir)/'`xdebug.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_la-xdebug.Tpo $(DEPDIR)/libmini_la-xdebug.Plo
@@ -2150,6 +2110,13 @@ libmini_la-xdebug.lo: xdebug.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -c -o libmini_la-xdebug.lo `test -f 'xdebug.c' || echo '$(srcdir)/'`xdebug.c
+libmini_la-alias-analysis.lo: alias-analysis.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -MT libmini_la-alias-analysis.lo -MD -MP -MF $(DEPDIR)/libmini_la-alias-analysis.Tpo -c -o libmini_la-alias-analysis.lo `test -f 'alias-analysis.c' || echo '$(srcdir)/'`alias-analysis.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_la-alias-analysis.Tpo $(DEPDIR)/libmini_la-alias-analysis.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alias-analysis.c' object='libmini_la-alias-analysis.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -c -o libmini_la-alias-analysis.lo `test -f 'alias-analysis.c' || echo '$(srcdir)/'`alias-analysis.c
+
libmini_la-mini-llvm.lo: mini-llvm.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmini_la_CFLAGS) $(CFLAGS) -MT libmini_la-mini-llvm.lo -MD -MP -MF $(DEPDIR)/libmini_la-mini-llvm.Tpo -c -o libmini_la-mini-llvm.lo `test -f 'mini-llvm.c' || echo '$(srcdir)/'`mini-llvm.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libmini_la-mini-llvm.Tpo $(DEPDIR)/libmini_la-mini-llvm.Plo
@@ -2454,15 +2421,6 @@ mono_sgen-main-sgen.obj: main-sgen.c
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
-.s.o:
- $(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ $<
-
-.s.obj:
- $(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.s.lo:
- $(AM_V_CCAS)$(LTCCASCOMPILE) -c -o $@ $<
-
mostlyclean-libtool:
-rm -f *.lo
@@ -2538,20 +2496,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -2713,20 +2657,20 @@ uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \
.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
clean-libtool clean-local clean-noinstLTLIBRARIES \
- clean-noinstPROGRAMS cscopelist ctags distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-binPROGRAMS install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-exec-hook install-html install-html-am \
- install-info install-info-am install-libLTLIBRARIES \
- install-libmonoincludeHEADERS install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- 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-binPROGRAMS \
- uninstall-libLTLIBRARIES uninstall-libmonoincludeHEADERS
+ clean-noinstPROGRAMS ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-exec-hook \
+ install-html install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-libmonoincludeHEADERS \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip 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-binPROGRAMS uninstall-libLTLIBRARIES \
+ uninstall-libmonoincludeHEADERS
@HOST_WIN32_TRUE@export HOST_CC
diff --git a/mono/mini/abcremoval.c b/mono/mini/abcremoval.c
index 8a9349d293..45d5394a66 100644
--- a/mono/mini/abcremoval.c
+++ b/mono/mini/abcremoval.c
@@ -275,6 +275,12 @@ get_relation_from_ins (MonoVariableRelationsEvaluationArea *area, MonoInst *ins,
value->value.variable.variable = ins->sreg1;
value->value.variable.delta = 0;
break;
+ case OP_SEXT_I4:
+ value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
+ value->value.variable.variable = ins->sreg1;
+ value->value.variable.delta = 0;
+ value_kind = MONO_INTEGER_VALUE_SIZE_8;
+ break;
case OP_PHI:
value->type = MONO_PHI_SUMMARIZED_VALUE;
value->value.phi.number_of_alternatives = *(ins->inst_phi_args);
@@ -290,7 +296,7 @@ get_relation_from_ins (MonoVariableRelationsEvaluationArea *area, MonoInst *ins,
case OP_ISUB_IMM:
value->type = MONO_VARIABLE_SUMMARIZED_VALUE;
value->value.variable.variable = ins->sreg1;
- value->value.variable.delta = ins->inst_imm;
+ value->value.variable.delta = -ins->inst_imm;
/* FIXME: */
//check_delta_safety (area, result);
break;
@@ -989,8 +995,8 @@ remove_abc_from_inst (MonoInst *ins, MonoVariableRelationsEvaluationArea *area)
if (REPORT_ABC_REMOVAL) {
printf ("ARRAY-ACCESS: removed bounds check on array %d with index %d\n",
array_variable, index_variable);
- NULLIFY_INS (ins);
}
+ NULLIFY_INS (ins);
} else {
if (TRACE_ABC_REMOVAL) {
if (index_context->ranges.zero.lower >= 0) {
diff --git a/mono/mini/alias-analysis.c b/mono/mini/alias-analysis.c
new file mode 100644
index 0000000000..9289285c95
--- /dev/null
+++ b/mono/mini/alias-analysis.c
@@ -0,0 +1,339 @@
+/*
+ * alias-analysis.c: Implement simple alias analysis for local variables.
+ *
+ * Author:
+ * Rodrigo Kumpera (kumpera@gmail.com)
+ *
+ * (C) 2013 Xamarin
+ */
+
+#include <config.h>
+#include <stdio.h>
+
+#include "mini.h"
+#include "ir-emit.h"
+#include "glib.h"
+
+#ifndef DISABLE_JIT
+
+static gboolean
+is_int_stack_size (int type)
+{
+#if SIZEOF_VOID_P == 4
+ return type == STACK_I4 || type == STACK_MP;
+#else
+ return type == STACK_I4;
+#endif
+}
+
+static gboolean
+is_long_stack_size (int type)
+{
+#if SIZEOF_VOID_P == 8
+ return type == STACK_I8 || type == STACK_MP;
+#else
+ return type == STACK_I8;
+#endif
+}
+
+
+static gboolean
+lower_load (MonoCompile *cfg, MonoInst *load, MonoInst *ldaddr)
+{
+ MonoInst *var = ldaddr->inst_p0;
+ MonoType *type = &var->klass->byval_arg;
+ int replaced_op = mono_type_to_load_membase (cfg, type);
+
+ if (load->opcode == OP_LOADV_MEMBASE && load->klass != var->klass) {
+ if (cfg->verbose_level > 2)
+ printf ("Incompatible load_vtype classes %s x %s\n", load->klass->name, var->klass->name);
+ return FALSE;
+ }
+
+ if (replaced_op != load->opcode) {
+ if (cfg->verbose_level > 2)
+ printf ("Incompatible load type: expected %s but got %s\n",
+ mono_inst_name (replaced_op),
+ mono_inst_name (load->opcode));
+ return FALSE;
+ } else {
+ if (cfg->verbose_level > 2) { printf ("mem2reg replacing: "); mono_print_ins (load); }
+ }
+
+ load->opcode = mono_type_to_regmove (cfg, type);
+ type_to_eval_stack_type (cfg, type, load);
+ load->sreg1 = var->dreg;
+ mono_jit_stats.loads_eliminated++;
+ return TRUE;
+}
+
+static gboolean
+lower_store (MonoCompile *cfg, MonoInst *store, MonoInst *ldaddr)
+{
+ MonoInst *var = ldaddr->inst_p0;
+ MonoType *type = &var->klass->byval_arg;
+ int replaced_op = mono_type_to_store_membase (cfg, type);
+
+ if (store->opcode == OP_STOREV_MEMBASE && store->klass != var->klass) {
+ if (cfg->verbose_level > 2)
+ printf ("Incompatible store_vtype classes %s x %s\n", store->klass->name, store->klass->name);
+ return FALSE;
+ }
+
+
+ if (replaced_op != store->opcode) {
+ if (cfg->verbose_level > 2)
+ printf ("Incompatible store_reg type: expected %s but got %s\n",
+ mono_inst_name (replaced_op),
+ mono_inst_name (store->opcode));
+ return FALSE;
+ } else {
+ if (cfg->verbose_level > 2) { printf ("mem2reg replacing: "); mono_print_ins (store); }
+ }
+
+ store->opcode = mono_type_to_regmove (cfg, type);
+ type_to_eval_stack_type (cfg, type, store);
+ store->dreg = var->dreg;
+ mono_jit_stats.stores_eliminated++;
+ return TRUE;
+}
+
+static gboolean
+lower_store_imm (MonoCompile *cfg, MonoInst *store, MonoInst *ldaddr)
+{
+ MonoInst *var = ldaddr->inst_p0;
+ MonoType *type = &var->klass->byval_arg;
+ int store_op = mono_type_to_store_membase (cfg, type);
+ if (store_op == OP_STOREV_MEMBASE || store_op == OP_STOREX_MEMBASE)
+ return FALSE;
+
+ switch (store->opcode) {
+#if SIZEOF_VOID_P == 4
+ case OP_STORE_MEMBASE_IMM:
+#endif
+ case OP_STOREI4_MEMBASE_IMM:
+ if (!is_int_stack_size (var->type)) {
+ if (cfg->verbose_level > 2) printf ("Incompatible variable of size != 4\n");
+ return FALSE;
+ }
+ if (cfg->verbose_level > 2) { printf ("mem2reg replacing: "); mono_print_ins (store); }
+ store->opcode = OP_ICONST;
+ store->type = STACK_I4;
+ store->dreg = var->dreg;
+ store->inst_c0 = store->inst_imm;
+ break;
+
+#if SIZEOF_VOID_P == 8
+ case OP_STORE_MEMBASE_IMM:
+#endif
+ case OP_STOREI8_MEMBASE_IMM:
+ if (!is_long_stack_size (var->type)) {
+ if (cfg->verbose_level > 2) printf ("Incompatible variable of size != 8\n");
+ return FALSE;
+ }
+ if (cfg->verbose_level > 2) { printf ("mem2reg replacing: "); mono_print_ins (store); }
+ store->opcode = OP_I8CONST;
+ store->type = STACK_I8;
+ store->dreg = var->dreg;
+ store->inst_l = store->inst_imm;
+ break;
+ default:
+ return FALSE;
+ }
+ mono_jit_stats.stores_eliminated++;
+ return TRUE;
+}
+
+static gboolean
+lower_memory_access (MonoCompile *cfg)
+{
+ MonoBasicBlock *bb;
+ MonoInst *ins, *tmp;
+ gboolean needs_dce = FALSE;
+ GHashTable *addr_loads = g_hash_table_new (NULL, NULL);
+ //FIXME optimize
+ for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
+ g_hash_table_remove_all (addr_loads);
+
+ for (ins = bb->code; ins; ins = ins->next) {
+ switch (ins->opcode) {
+ case OP_LDADDR:
+ g_hash_table_insert (addr_loads, GINT_TO_POINTER (ins->dreg), ins);
+ if (cfg->verbose_level > 2) { printf ("New address: "); mono_print_ins (ins); }
+ break;
+ case OP_MOVE:
+ tmp = (MonoInst*)g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->sreg1));
+ /*
+ Forward propagate known aliases
+ ldaddr R10 <- R8
+ mov R11 <- R10
+ */
+ if (tmp) {
+ g_hash_table_insert (addr_loads, GINT_TO_POINTER (ins->dreg), tmp);
+ if (cfg->verbose_level > 2) { printf ("New alias: "); mono_print_ins (ins); }
+ } else {
+ /*
+ Source value is not a know address, kill the variable.
+ */
+ if (g_hash_table_remove (addr_loads, GINT_TO_POINTER (ins->dreg))) {
+ if (cfg->verbose_level > 2) { printf ("Killed alias: "); mono_print_ins (ins); }
+ }
+ }
+ break;
+
+ case OP_LOADV_MEMBASE:
+ case OP_LOAD_MEMBASE:
+ case OP_LOADU1_MEMBASE:
+ case OP_LOADI2_MEMBASE:
+ case OP_LOADU2_MEMBASE:
+ case OP_LOADI4_MEMBASE:
+ case OP_LOADU4_MEMBASE:
+ case OP_LOADI1_MEMBASE:
+ case OP_LOADI8_MEMBASE:
+ case OP_LOADR4_MEMBASE:
+ case OP_LOADR8_MEMBASE:
+ if (ins->inst_offset != 0)
+ continue;
+ tmp = g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->sreg1));
+ if (tmp) {
+ if (cfg->verbose_level > 2) { printf ("Found candidate load:"); mono_print_ins (ins); }
+ needs_dce |= lower_load (cfg, ins, tmp);
+ }
+ break;
+
+ case OP_STORE_MEMBASE_REG:
+ case OP_STOREI1_MEMBASE_REG:
+ case OP_STOREI2_MEMBASE_REG:
+ case OP_STOREI4_MEMBASE_REG:
+ case OP_STOREI8_MEMBASE_REG:
+ case OP_STORER4_MEMBASE_REG:
+ case OP_STORER8_MEMBASE_REG:
+ case OP_STOREV_MEMBASE:
+ if (ins->inst_offset != 0)
+ continue;
+ tmp = g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->dreg));
+ if (tmp) {
+ if (cfg->verbose_level > 2) { printf ("Found candidate store:"); mono_print_ins (ins); }
+ needs_dce |= lower_store (cfg, ins, tmp);
+ }
+ break;
+
+ case OP_STORE_MEMBASE_IMM:
+ case OP_STOREI4_MEMBASE_IMM:
+ case OP_STOREI8_MEMBASE_IMM:
+ if (ins->inst_offset != 0)
+ continue;
+ tmp = g_hash_table_lookup (addr_loads, GINT_TO_POINTER (ins->dreg));
+ if (tmp) {
+ if (cfg->verbose_level > 2) { printf ("Found candidate store-imm:"); mono_print_ins (ins); }
+ needs_dce |= lower_store_imm (cfg, ins, tmp);
+ }
+ break;
+ }
+ }
+ }
+ g_hash_table_destroy (addr_loads);
+ return needs_dce;
+}
+
+static gboolean
+recompute_aliased_variables (MonoCompile *cfg)
+{
+ int i;
+ MonoBasicBlock *bb;
+ MonoInst *ins;
+ int kills = 0;
+ int adds = 0;
+
+ for (i = 0; i < cfg->num_varinfo; i++) {
+ MonoInst *var = cfg->varinfo [i];
+ if (var->flags & MONO_INST_INDIRECT) {
+ if (cfg->verbose_level > 2) {
+ printf ("Killing :"); mono_print_ins (var);
+ }
+ ++kills;
+ }
+ var->flags &= ~MONO_INST_INDIRECT;
+ }
+
+ if (!kills)
+ return FALSE;
+
+ for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
+ for (ins = bb->code; ins; ins = ins->next) {
+ if (ins->opcode == OP_LDADDR) {
+ MonoInst *var;
+
+ if (cfg->verbose_level > 2) { printf ("Found op :"); mono_print_ins (ins); }
+
+ var = (MonoInst*)ins->inst_p0;
+ if (!(var->flags & MONO_INST_INDIRECT)) {
+ if (cfg->verbose_level) { printf ("Restoring :"); mono_print_ins (var); }
+ ++adds;
+ }
+ var->flags |= MONO_INST_INDIRECT;
+ }
+ }
+ }
+
+ mono_jit_stats.alias_found += kills;
+ mono_jit_stats.alias_removed += kills - adds;
+ if (kills > adds) {
+ if (cfg->verbose_level > 2) {
+ printf ("Method: %s\n", mono_method_full_name (cfg->method, 1));
+ printf ("Kills %d Adds %d\n", kills, adds);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*
+FIXME:
+ Don't DCE on the whole CFG, only the BBs that have changed.
+
+TODO:
+ SRVT of small types can fix cases of mismatch for fields of a different type than the component.
+ Handle aliasing of byrefs in call conventions.
+*/
+void
+mono_local_alias_analysis (MonoCompile *cfg)
+{
+ if (!cfg->has_indirection)
+ return;
+
+ if (cfg->verbose_level > 2)
+ mono_print_code (cfg, "BEFORE ALIAS_ANALYSIS");
+
+ /*
+ Remove indirection and memory access of known variables.
+ */
+ if (!lower_memory_access (cfg))
+ goto done;
+
+ /*
+ By replacing indirect access with direct operations, some LDADDR ops become dead. Kill them.
+ */
+ if (cfg->opt & MONO_OPT_DEADCE)
+ mono_local_deadce (cfg);
+
+ /*
+ Some variables no longer need to be flagged as indirect, find them.
+ */
+ if (!recompute_aliased_variables (cfg))
+ goto done;
+
+ /*
+ A lot of simplification just took place, we recompute local variables and do DCE to
+ really profit from the previous gains
+ */
+ mono_handle_global_vregs (cfg);
+ if (cfg->opt & MONO_OPT_DEADCE)
+ mono_local_deadce (cfg);
+
+done:
+ if (cfg->verbose_level > 2)
+ mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
+}
+
+#endif /* !DISABLE_JIT */
diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c
index 3d86dc625f..233dbe44bf 100755
--- a/mono/mini/aot-compiler.c
+++ b/mono/mini/aot-compiler.c
@@ -165,7 +165,7 @@ typedef struct MonoAotCompile {
GHashTable *method_depth;
MonoCompile **cfgs;
int cfgs_size;
- GHashTable *patch_to_plt_entry;
+ GHashTable **patch_to_plt_entry;
GHashTable *plt_offset_to_entry;
GHashTable *patch_to_got_offset;
GHashTable **patch_to_got_offset_by_type;
@@ -188,10 +188,12 @@ typedef struct MonoAotCompile {
guint32 final_got_size;
/* Number of GOT entries reserved for trampolines */
guint32 num_trampoline_got_entries;
+ guint32 tramp_page_size;
guint32 num_trampolines [MONO_AOT_TRAMP_NUM];
guint32 trampoline_got_offset_base [MONO_AOT_TRAMP_NUM];
guint32 trampoline_size [MONO_AOT_TRAMP_NUM];
+ guint32 tramp_page_code_offsets [MONO_AOT_TRAMP_NUM];
MonoAotOptions aot_opts;
guint32 nmethods;
@@ -207,6 +209,7 @@ typedef struct MonoAotCompile {
MonoImageWriter *w;
MonoDwarfWriter *dwarf;
FILE *fp;
+ char *tmpbasename;
char *tmpfname;
GSList *cie_program;
GHashTable *unwind_info_offsets;
@@ -215,6 +218,7 @@ typedef struct MonoAotCompile {
char *got_symbol_base;
char *got_symbol;
char *plt_symbol;
+ char *methods_symbol;
GHashTable *method_label_hash;
const char *temp_prefix;
const char *user_symbol_prefix;
@@ -635,9 +639,8 @@ arch_init (MonoAotCompile *acfg)
acfg->llvm_label_prefix = "";
acfg->user_symbol_prefix = "";
-#if defined(TARGET_AMD64) && defined(TARGET_MACH)
- /* osx contains an old as which doesn't support avx opcodes */
- g_string_append (acfg->llc_args, "-mattr=-avx");
+#if defined(TARGET_AMD64)
+ g_string_append (acfg->llc_args, " -march=x86-64");
#endif
#ifdef TARGET_ARM
@@ -675,6 +678,7 @@ arch_init (MonoAotCompile *acfg)
#endif
}
+#ifdef MONO_ARCH_AOT_SUPPORTED
/*
* arch_emit_direct_call:
*
@@ -682,7 +686,7 @@ arch_init (MonoAotCompile *acfg)
* calling code.
*/
static void
-arch_emit_direct_call (MonoAotCompile *acfg, const char *target, gboolean external, int *call_size)
+arch_emit_direct_call (MonoAotCompile *acfg, const char *target, gboolean external, MonoJumpInfo *ji, int *call_size)
{
#if defined(TARGET_X86) || defined(TARGET_AMD64)
/* Need to make sure this is exactly 5 bytes long */
@@ -721,6 +725,7 @@ arch_emit_direct_call (MonoAotCompile *acfg, const char *target, gboolean extern
g_assert_not_reached ();
#endif
}
+#endif
/*
* PPC32 design:
@@ -837,6 +842,7 @@ arch_emit_got_access (MonoAotCompile *acfg, guint8 *code, int got_slot, int *cod
#endif
+#ifdef MONO_ARCH_AOT_SUPPORTED
/*
* arch_emit_objc_selector_ref:
*
@@ -865,6 +871,7 @@ arch_emit_objc_selector_ref (MonoAotCompile *acfg, guint8 *code, int index, int
g_assert_not_reached ();
#endif
}
+#endif
/*
* arch_emit_plt_entry:
@@ -1030,6 +1037,8 @@ arch_emit_specific_trampoline_pages (MonoAotCompile *acfg)
if (!acfg->aot_opts.use_trampolines_page)
return;
+ acfg->tramp_page_size = mono_pagesize ();
+
sprintf (symbol, "%sspecific_trampolines_page", acfg->user_symbol_prefix);
emit_alignment (acfg, mono_pagesize ());
emit_global (acfg, symbol, TRUE);
@@ -2901,7 +2910,9 @@ get_plt_entry (MonoAotCompile *acfg, MonoJumpInfo *patch_info)
if (!is_plt_patch (patch_info))
return NULL;
- res = g_hash_table_lookup (acfg->patch_to_plt_entry, patch_info);
+ if (!acfg->patch_to_plt_entry [patch_info->type])
+ acfg->patch_to_plt_entry [patch_info->type] = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal);
+ res = g_hash_table_lookup (acfg->patch_to_plt_entry [patch_info->type], patch_info);
// FIXME: This breaks the calculation of final_got_size
if (!acfg->llvm && patch_info->type == MONO_PATCH_INFO_METHOD && (patch_info->data.method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED)) {
@@ -2931,7 +2942,7 @@ get_plt_entry (MonoAotCompile *acfg, MonoJumpInfo *patch_info)
else
res->llvm_symbol = g_strdup_printf ("%s_llvm", res->symbol);
- g_hash_table_insert (acfg->patch_to_plt_entry, new_ji, res);
+ g_hash_table_insert (acfg->patch_to_plt_entry [new_ji->type], new_ji, res);
g_hash_table_insert (acfg->plt_offset_to_entry, GUINT_TO_POINTER (res->plt_offset), res);
@@ -3210,12 +3221,6 @@ add_wrappers (MonoAotCompile *acfg)
* so there is only one wrapper of a given type, or inlining their contents into their
* callers.
*/
-
- /*
- * FIXME: This depends on the fact that different wrappers have different
- * names.
- */
-
for (i = 0; i < acfg->image->tables [MONO_TABLE_METHOD].rows; ++i) {
MonoMethod *method;
guint32 token = MONO_TOKEN_METHOD_DEF | (i + 1);
@@ -3228,9 +3233,6 @@ add_wrappers (MonoAotCompile *acfg)
(method->flags & METHOD_ATTRIBUTE_ABSTRACT))
skip = TRUE;
- if (method->is_generic || method->klass->generic_container)
- skip = TRUE;
-
/* Skip methods which can not be handled by get_runtime_invoke () */
sig = mono_method_signature (method);
if (!sig)
@@ -3238,10 +3240,14 @@ add_wrappers (MonoAotCompile *acfg)
if ((sig->ret->type == MONO_TYPE_PTR) ||
(sig->ret->type == MONO_TYPE_TYPEDBYREF))
skip = TRUE;
+ if (mono_class_is_open_constructed_type (sig->ret))
+ skip = TRUE;
for (j = 0; j < sig->param_count; j++) {
if (sig->params [j]->type == MONO_TYPE_TYPEDBYREF)
skip = TRUE;
+ if (mono_class_is_open_constructed_type (sig->params [j]))
+ skip = TRUE;
}
#ifdef MONO_ARCH_DYN_CALL_SUPPORTED
@@ -3336,10 +3342,6 @@ add_wrappers (MonoAotCompile *acfg)
add_method (acfg, mono_marshal_get_runtime_invoke_dynamic ());
#endif
- /* JIT icall wrappers */
- /* FIXME: locking */
- g_hash_table_foreach (mono_get_jit_icall_info (), add_jit_icall_wrapper, acfg);
-
/* stelemref */
add_method (acfg, mono_marshal_get_stelemref ());
@@ -3403,6 +3405,10 @@ add_wrappers (MonoAotCompile *acfg)
}
}
#endif
+
+ /* JIT icall wrappers */
+ /* FIXME: locking - this is "safe" as full-AOT threads don't mutate the icall hash*/
+ g_hash_table_foreach (mono_get_jit_icall_info (), add_jit_icall_wrapper, acfg);
}
/*
@@ -3813,6 +3819,9 @@ check_type_depth (MonoType *t, int depth)
return FALSE;
}
+static void
+add_types_from_method_header (MonoAotCompile *acfg, MonoMethod *method);
+
/*
* add_generic_class:
*
@@ -3873,9 +3882,11 @@ add_generic_class_with_depth (MonoAotCompile *acfg, MonoClass *klass, int depth,
continue;
}
- if (mono_method_is_generic_sharable_full (method, FALSE, FALSE, use_gsharedvt))
+ if (mono_method_is_generic_sharable_full (method, FALSE, FALSE, use_gsharedvt)) {
/* Already added */
+ add_types_from_method_header (acfg, method);
continue;
+ }
if (method->is_generic)
/* FIXME: */
@@ -4324,6 +4335,7 @@ is_direct_callable (MonoAotCompile *acfg, MonoMethod *method, MonoJumpInfo *patc
return FALSE;
}
+#ifdef MONO_ARCH_AOT_SUPPORTED
static const char *
get_pinvoke_import (MonoAotCompile *acfg, MonoMethod *method)
{
@@ -4353,6 +4365,7 @@ get_pinvoke_import (MonoAotCompile *acfg, MonoMethod *method)
return import;
}
+#endif
static gint
compare_lne (MonoDebugLineNumberEntry *a, MonoDebugLineNumberEntry *b)
@@ -4483,10 +4496,13 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui
MonoJumpInfo *patch_info;
MonoMethodHeader *header;
MonoDebugSourceLocation **locs = NULL;
- gboolean skip, direct_call, external_call;
+ gboolean skip;
+#ifdef MONO_ARCH_AOT_SUPPORTED
+ gboolean direct_call, external_call;
guint32 got_slot;
const char *direct_call_target = 0;
const char *direct_pinvoke;
+#endif
if (method) {
header = mono_method_get_header (method);
@@ -4642,7 +4658,7 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui
if (direct_call) {
int call_size;
- arch_emit_direct_call (acfg, direct_call_target, external_call, &call_size);
+ arch_emit_direct_call (acfg, direct_call_target, external_call, patch_info, &call_size);
i += call_size - 1;
} else {
int code_size;
@@ -4690,16 +4706,51 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui
/*
* sanitize_symbol:
*
- * Modify SYMBOL so it only includes characters permissible in symbols.
+ * Return a modified version of S which only includes characters permissible in symbols.
*/
-static void
-sanitize_symbol (char *symbol)
+static char*
+sanitize_symbol (MonoAotCompile *acfg, char *s)
{
- int i, len = strlen (symbol);
+ gboolean process = FALSE;
+ int i, len;
+ GString *gs;
+ char *res;
+
+ if (!s)
+ return s;
+ len = strlen (s);
for (i = 0; i < len; ++i)
- if (!isalnum (symbol [i]) && (symbol [i] != '_'))
- symbol [i] = '_';
+ if (!(s [i] <= 0x7f && (isalnum (s [i]) || s [i] == '_')))
+ process = TRUE;
+ if (!process)
+ return s;
+
+ gs = g_string_sized_new (len);
+ for (i = 0; i < len; ++i) {
+ guint8 c = s [i];
+ if (c <= 0x7f && (isalnum (c) || c == '_')) {
+ g_string_append_c (gs, c);
+ } else if (c > 0x7f) {
+ /* multi-byte utf8 */
+ g_string_append_printf (gs, "_0x%x", c);
+ i ++;
+ c = s [i];
+ while (c >> 6 == 0x2) {
+ g_string_append_printf (gs, "%x", c);
+ i ++;
+ c = s [i];
+ }
+ g_string_append_printf (gs, "_");
+ i --;
+ } else {
+ g_string_append_c (gs, '_');
+ }
+ }
+
+ res = mono_mempool_strdup (acfg->mempool, gs->str);
+ g_string_free (gs, TRUE);
+ return res;
}
static char*
@@ -4805,7 +4856,7 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg)
acfg->cfgs [method_index]->got_offset = acfg->got_offset;
- emit_and_reloc_code (acfg, method, code, cfg->code_len, cfg->patch_info, FALSE, mono_debug_find_method (cfg->jit_info->method, mono_domain_get ()));
+ emit_and_reloc_code (acfg, method, code, cfg->code_len, cfg->patch_info, FALSE, mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ()));
emit_line (acfg);
@@ -4856,6 +4907,7 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint
case MONO_PATCH_INFO_METHOD_JUMP:
case MONO_PATCH_INFO_ICALL_ADDR:
case MONO_PATCH_INFO_METHOD_RGCTX:
+ case MONO_PATCH_INFO_METHOD_CODE_SLOT:
encode_method_ref (acfg, patch_info->data.method, p, &p);
break;
case MONO_PATCH_INFO_INTERNAL_METHOD:
@@ -5183,12 +5235,10 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
seq_points = cfg->seq_point_info;
- buf_size = header->num_clauses * 256 + debug_info_size + 2048 + (seq_points ? (seq_points->len * 64) : 0) + cfg->gc_map_size;
+ buf_size = header->num_clauses * 256 + debug_info_size + 2048 + (seq_points ? (seq_points->len * 128) : 0) + cfg->gc_map_size;
p = buf = g_malloc (buf_size);
-#ifdef MONO_ARCH_HAVE_XP_UNWIND
use_unwind_ops = cfg->unwind_ops != NULL;
-#endif
flags = (jinfo->has_generic_jit_info ? 1 : 0) | (use_unwind_ops ? 2 : 0) | (header->num_clauses ? 4 : 0) | (seq_points ? 8 : 0) | (cfg->compile_llvm ? 16 : 0) | (jinfo->has_try_block_holes ? 32 : 0) | (cfg->gc_map ? 64 : 0) | (jinfo->has_arch_eh_info ? 128 : 0);
@@ -5265,8 +5315,18 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
encode_value ((gint)((guint8*)ei->data.filter - code), p, &p);
else {
if (ei->data.catch_class) {
- encode_value (1, p, &p);
- encode_klass_ref (acfg, ei->data.catch_class, p, &p);
+ guint8 *buf2, *p2;
+ int len;
+
+ buf2 = g_malloc (4096);
+ p2 = buf2;
+ encode_klass_ref (acfg, ei->data.catch_class, p2, &p2);
+ len = p2 - buf2;
+ g_assert (len < 4096);
+ encode_value (len, p, &p);
+ memcpy (p, buf2, len);
+ p += p2 - buf2;
+ g_free (buf2);
} else {
encode_value (0, p, &p);
}
@@ -5278,10 +5338,29 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
}
}
+ if (jinfo->has_try_block_holes) {
+ MonoTryBlockHoleTableJitInfo *table = mono_jit_info_get_try_block_hole_table_info (jinfo);
+ for (i = 0; i < table->num_holes; ++i) {
+ MonoTryBlockHoleJitInfo *hole = &table->holes [i];
+ encode_value (hole->clause, p, &p);
+ encode_value (hole->length, p, &p);
+ encode_value (hole->offset, p, &p);
+ }
+ }
+
+ if (jinfo->has_arch_eh_info) {
+ MonoArchEHJitInfo *eh_info;
+
+ eh_info = mono_jit_info_get_arch_eh_info (jinfo);
+ encode_value (eh_info->stack_size, p, &p);
+ }
+
if (jinfo->has_generic_jit_info) {
MonoGenericJitInfo *gi = mono_jit_info_get_generic_jit_info (jinfo);
MonoGenericSharingContext* gsctx = gi->generic_sharing_context;
guint8 *p1;
+ guint8 *buf2, *p2;
+ int len;
p1 = p;
encode_value (gi->nlocs, p, &p);
@@ -5311,15 +5390,23 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
* Need to encode jinfo->method too, since it is not equal to 'method'
* when using generic sharing.
*/
- encode_method_ref (acfg, jinfo->method, p, &p);
+ buf2 = g_malloc (4096);
+ p2 = buf2;
+ encode_method_ref (acfg, jinfo->d.method, p2, &p2);
+ len = p2 - buf2;
+ g_assert (len < 4096);
+ encode_value (len, p, &p);
+ memcpy (p, buf2, len);
+ p += p2 - buf2;
+ g_free (buf2);
if (gsctx && (gsctx->var_is_vt || gsctx->mvar_is_vt)) {
MonoMethodInflated *inflated;
MonoGenericContext *context;
MonoGenericInst *inst;
- g_assert (jinfo->method->is_inflated);
- inflated = (MonoMethodInflated*)jinfo->method;
+ g_assert (jinfo->d.method->is_inflated);
+ inflated = (MonoMethodInflated*)jinfo->d.method;
context = &inflated->context;
encode_value (1, p, &p);
@@ -5346,23 +5433,6 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
}
}
- if (jinfo->has_try_block_holes) {
- MonoTryBlockHoleTableJitInfo *table = mono_jit_info_get_try_block_hole_table_info (jinfo);
- for (i = 0; i < table->num_holes; ++i) {
- MonoTryBlockHoleJitInfo *hole = &table->holes [i];
- encode_value (hole->clause, p, &p);
- encode_value (hole->length, p, &p);
- encode_value (hole->offset, p, &p);
- }
- }
-
- if (jinfo->has_arch_eh_info) {
- MonoArchEHJitInfo *eh_info;
-
- eh_info = mono_jit_info_get_arch_eh_info (jinfo);
- encode_value (eh_info->stack_size, p, &p);
- }
-
if (seq_points) {
int il_offset, native_offset, last_il_offset, last_native_offset, j;
@@ -5377,6 +5447,7 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
last_il_offset = il_offset;
last_native_offset = native_offset;
+ encode_value (sp->flags, p, &p);
encode_value (sp->next_len, p, &p);
for (j = 0; j < sp->next_len; ++j)
encode_value (sp->next [j], p, &p);
@@ -5506,6 +5577,7 @@ static char*
get_plt_entry_debug_sym (MonoAotCompile *acfg, MonoJumpInfo *ji, GHashTable *cache)
{
char *debug_sym = NULL;
+ char *s;
switch (ji->type) {
case MONO_PATCH_INFO_METHOD:
@@ -5515,8 +5587,9 @@ get_plt_entry_debug_sym (MonoAotCompile *acfg, MonoJumpInfo *ji, GHashTable *cac
debug_sym = g_strdup_printf ("plt__jit_icall_%s", ji->data.name);
break;
case MONO_PATCH_INFO_CLASS_INIT:
- debug_sym = g_strdup_printf ("plt__class_init_%s", mono_type_get_name (&ji->data.klass->byval_arg));
- sanitize_symbol (debug_sym);
+ s = mono_type_get_name (&ji->data.klass->byval_arg);
+ debug_sym = g_strdup_printf ("plt__class_init_%s", s);
+ g_free (s);
break;
case MONO_PATCH_INFO_RGCTX_FETCH:
debug_sym = g_strdup_printf ("plt__rgctx_fetch_%d", acfg->label_generator ++);
@@ -5538,7 +5611,7 @@ get_plt_entry_debug_sym (MonoAotCompile *acfg, MonoJumpInfo *ji, GHashTable *cac
break;
}
- return debug_sym;
+ return sanitize_symbol (acfg, debug_sym);
}
/*
@@ -5709,6 +5782,8 @@ emit_trampoline_full (MonoAotCompile *acfg, int got_offset, MonoTrampInfo *info,
MonoJumpInfo *ji;
GSList *unwind_ops;
+ g_assert (info);
+
name = info->name;
code = info->code;
code_size = info->code_size;
@@ -6023,6 +6098,7 @@ emit_trampolines (MonoAotCompile *acfg)
}
emit_label (acfg, end_symbol);
+ emit_int32 (acfg, 0);
}
arch_emit_specific_trampoline_pages (acfg);
@@ -6328,7 +6404,8 @@ can_encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info)
{
switch (patch_info->type) {
case MONO_PATCH_INFO_METHOD:
- case MONO_PATCH_INFO_METHODCONST: {
+ case MONO_PATCH_INFO_METHODCONST:
+ case MONO_PATCH_INFO_METHOD_CODE_SLOT: {
MonoMethod *method = patch_info->data.method;
return can_encode_method (acfg, method);
@@ -6418,7 +6495,7 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method)
* the runtime will not see AOT methods during AOT compilation,so it
* does not need to support them by creating a fake GOT etc.
*/
- cfg = mini_method_compile (method, acfg->opts, mono_get_root_domain (), FALSE, TRUE, 0);
+ cfg = mini_method_compile (method, acfg->opts, mono_get_root_domain (), acfg->aot_opts.full_aot ? (JIT_FLAG_AOT|JIT_FLAG_FULL_AOT) : (JIT_FLAG_AOT), 0);
mono_loader_clear_error ();
if (cfg->exception_type == MONO_EXCEPTION_GENERIC_SHARING_FAILED) {
@@ -6884,7 +6961,7 @@ emit_llvm_file (MonoAotCompile *acfg)
}
- tempbc = g_strdup_printf ("%s.bc", acfg->tmpfname);
+ tempbc = g_strdup_printf ("%s.bc", acfg->tmpbasename);
mono_llvm_emit_aot_module (tempbc, acfg->final_got_size);
g_free (tempbc);
@@ -6900,12 +6977,14 @@ emit_llvm_file (MonoAotCompile *acfg)
* - 'prune-eh' and 'functionattrs' depend on 'basiccg'.
* The opt list below was produced by taking the output of:
* llvm-as < /dev/null | opt -O2 -disable-output -debug-pass=Arguments
- * then removing tailcallelim + the global opts, and adding a second gvn.
+ * then removing tailcallelim + the global opts.
+ * strip-dead-prototypes deletes unused intrinsics definitions.
*/
opts = g_strdup ("-instcombine -simplifycfg");
- opts = g_strdup ("-simplifycfg -domtree -domfrontier -scalarrepl -instcombine -simplifycfg -domtree -domfrontier -scalarrepl -simplify-libcalls -instcombine -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loop-simplify -domfrontier -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-deletion -loop-simplify -lcssa -loop-unroll -instcombine -memdep -gvn -memdep -memcpyopt -sccp -instcombine -domtree -memdep -dse -adce -simplifycfg -preverify -domtree -verify");
+ //opts = g_strdup ("-simplifycfg -domtree -domfrontier -scalarrepl -instcombine -simplifycfg -domtree -domfrontier -scalarrepl -simplify-libcalls -instcombine -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loop-simplify -domfrontier -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-deletion -loop-simplify -lcssa -loop-unroll -instcombine -memdep -gvn -memdep -memcpyopt -sccp -instcombine -domtree -memdep -dse -adce -simplifycfg -preverify -domtree -verify");
+ opts = g_strdup ("-targetlibinfo -no-aa -basicaa -notti -instcombine -simplifycfg -sroa -domtree -early-cse -lazy-value-info -correlated-propagation -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -gvn -memdep -memcpyopt -sccp -instcombine -lazy-value-info -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -instcombine -strip-dead-prototypes -preverify -domtree -verify");
#if 1
- command = g_strdup_printf ("%sopt -f %s -o \"%s.opt.bc\" \"%s.bc\"", acfg->aot_opts.llvm_path, opts, acfg->tmpfname, acfg->tmpfname);
+ command = g_strdup_printf ("%sopt -f %s -o \"%s.opt.bc\" \"%s.bc\"", acfg->aot_opts.llvm_path, opts, acfg->tmpbasename, acfg->tmpbasename);
printf ("Executing opt: %s\n", command);
if (system (command) != 0) {
exit (1);
@@ -6933,7 +7012,7 @@ emit_llvm_file (MonoAotCompile *acfg)
#endif
unlink (acfg->tmpfname);
- command = g_strdup_printf ("%sllc %s -disable-gnu-eh-frame -enable-mono-eh-frame -o \"%s\" \"%s.opt.bc\"", acfg->aot_opts.llvm_path, acfg->llc_args->str, acfg->tmpfname, acfg->tmpfname);
+ command = g_strdup_printf ("%sllc %s -disable-gnu-eh-frame -enable-mono-eh-frame -o \"%s\" \"%s.opt.bc\"", acfg->aot_opts.llvm_path, acfg->llc_args->str, acfg->tmpfname, acfg->tmpbasename);
printf ("Executing llc: %s\n", command);
@@ -6948,7 +7027,6 @@ emit_code (MonoAotCompile *acfg)
{
int oindex, i, prev_index;
char symbol [256];
- char end_symbol [256];
#if defined(TARGET_POWERPC64)
sprintf (symbol, ".Lgot_addr");
@@ -6963,21 +7041,20 @@ emit_code (MonoAotCompile *acfg)
* code_offsets array. It is also used to compute the memory ranges occupied by
* AOT code, so it must be equal to the address of the first emitted method.
*/
- sprintf (symbol, "methods");
emit_section_change (acfg, ".text", 0);
emit_alignment (acfg, 8);
if (acfg->llvm) {
for (i = 0; i < acfg->nmethods; ++i) {
if (acfg->cfgs [i] && acfg->cfgs [i]->compile_llvm) {
- fprintf (acfg->fp, "\n.set methods, %s\n", acfg->cfgs [i]->asm_symbol);
+ acfg->methods_symbol = g_strdup (acfg->cfgs [i]->asm_symbol);
break;
}
}
- if (i == acfg->nmethods)
- /* No LLVM compiled methods */
- emit_label (acfg, symbol);
- } else {
+ }
+ if (!acfg->methods_symbol) {
+ sprintf (symbol, "methods");
emit_label (acfg, symbol);
+ acfg->methods_symbol = g_strdup (symbol);
}
/*
@@ -7104,10 +7181,9 @@ emit_code (MonoAotCompile *acfg)
acfg->stats.offsets_size += acfg->nmethods * 4;
- sprintf (end_symbol, "methods");
for (i = 0; i < acfg->nmethods; ++i) {
if (acfg->cfgs [i]) {
- emit_symbol_diff (acfg, acfg->cfgs [i]->asm_symbol, end_symbol, 0);
+ emit_symbol_diff (acfg, acfg->cfgs [i]->asm_symbol, acfg->methods_symbol, 0);
} else {
emit_int32 (acfg, 0xffffffff);
}
@@ -7121,10 +7197,9 @@ emit_code (MonoAotCompile *acfg)
acfg->stats.offsets_size += acfg->nmethods * 4;
- sprintf (end_symbol, "methods");
for (i = 0; i < acfg->nmethods; ++i) {
if (acfg->cfgs [i]) {
- emit_symbol_diff (acfg, acfg->cfgs [i]->asm_symbol, end_symbol, 0);
+ emit_symbol_diff (acfg, acfg->cfgs [i]->asm_symbol, acfg->methods_symbol, 0);
} else {
emit_int32 (acfg, 0xffffffff);
}
@@ -7141,7 +7216,6 @@ emit_code (MonoAotCompile *acfg)
emit_alignment (acfg, 8);
emit_label (acfg, symbol);
- sprintf (end_symbol, "methods");
prev_index = -1;
for (i = 0; i < acfg->nmethods; ++i) {
MonoCompile *cfg;
@@ -7166,7 +7240,7 @@ emit_code (MonoAotCompile *acfg)
else
fprintf (acfg->fp, "\n\tbl %s\n", symbol);
} else {
- emit_symbol_diff (acfg, symbol, end_symbol, 0);
+ emit_symbol_diff (acfg, symbol, acfg->methods_symbol, 0);
}
/* Make sure the table is sorted by index */
g_assert (index > prev_index);
@@ -7175,6 +7249,7 @@ emit_code (MonoAotCompile *acfg)
}
sprintf (symbol, "unbox_trampolines_end");
emit_label (acfg, symbol);
+ emit_int32 (acfg, 0);
}
static void
@@ -8004,7 +8079,7 @@ emit_file_info (MonoAotCompile *acfg)
* various problems (i.e. arm/thumb).
*/
emit_pointer (acfg, acfg->got_symbol);
- emit_pointer (acfg, "methods");
+ emit_pointer (acfg, acfg->methods_symbol);
if (acfg->llvm) {
/*
* Emit a reference to the mono_eh_frame table created by our modified LLVM compiler.
@@ -8097,6 +8172,9 @@ emit_file_info (MonoAotCompile *acfg)
emit_int32 (acfg, __alignof__ (gint64));
#endif
emit_int32 (acfg, MONO_TRAMPOLINE_NUM);
+ emit_int32 (acfg, acfg->tramp_page_size);
+ for (i = 0; i < MONO_AOT_TRAMP_NUM; ++i)
+ emit_int32 (acfg, acfg->tramp_page_code_offsets [i]);
if (acfg->aot_opts.static_link) {
char *p;
@@ -8194,7 +8272,7 @@ emit_dwarf_info (MonoAotCompile *acfg)
sprintf (symbol2, "%sme_%x", acfg->temp_prefix, i);
- mono_dwarf_writer_emit_method (acfg->dwarf, cfg, cfg->method, cfg->asm_symbol, symbol2, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, mono_debug_find_method (cfg->jit_info->method, mono_domain_get ()));
+ mono_dwarf_writer_emit_method (acfg->dwarf, cfg, cfg->method, cfg->asm_symbol, symbol2, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, mono_debug_find_method (cfg->jit_info->d.method, mono_domain_get ()));
}
#endif
}
@@ -8322,7 +8400,7 @@ compile_methods (MonoAotCompile *acfg)
user_data [1] = acfg;
user_data [2] = frag;
- handle = mono_create_thread (NULL, 0, (gpointer)compile_thread_main, user_data, 0, NULL);
+ handle = mono_threads_create_thread ((gpointer)compile_thread_main, user_data, 0, 0, NULL);
g_ptr_array_add (threads, handle);
}
g_free (methods);
@@ -8356,7 +8434,7 @@ compile_asm (MonoAotCompile *acfg)
#elif defined(sparc) && SIZEOF_VOID_P == 8
#define AS_OPTIONS "-xarch=v9"
#elif defined(TARGET_X86) && defined(TARGET_MACH) && !defined(__native_client_codegen__)
-#define AS_OPTIONS "-arch i386 -W"
+#define AS_OPTIONS "-arch i386"
#else
#define AS_OPTIONS ""
#endif
@@ -8367,6 +8445,8 @@ compile_asm (MonoAotCompile *acfg)
#else
#define AS_NAME "nacl-as"
#endif
+#elif defined(TARGET_OSX)
+#define AS_NAME "clang -c -x assembler"
#else
#define AS_NAME "as"
#endif
@@ -8375,7 +8455,17 @@ compile_asm (MonoAotCompile *acfg)
#define LD_OPTIONS ""
#endif
-#define EH_LD_OPTIONS ""
+#if defined(sparc)
+#define LD_NAME "ld -shared -G"
+#elif defined(__ppc__) && defined(TARGET_MACH)
+#define LD_NAME "gcc -dynamiclib"
+#elif defined(TARGET_AMD64) && defined(TARGET_MACH)
+#define LD_NAME "clang --shared"
+#elif defined(HOST_WIN32)
+#define LD_NAME "gcc -shared --dll"
+#elif defined(TARGET_X86) && defined(TARGET_MACH) && !defined(__native_client_codegen__)
+#define LD_NAME "clang -m32 -dynamiclib"
+#endif
if (acfg->aot_opts.asm_only) {
printf ("Output file: '%s'.\n", acfg->tmpfname);
@@ -8416,18 +8506,10 @@ compile_asm (MonoAotCompile *acfg)
tmp_outfile_name = g_strdup_printf ("%s.tmp", outfile_name);
-#if defined(sparc)
- command = g_strdup_printf ("ld -shared -G -o %s %s.o", tmp_outfile_name, acfg->tmpfname);
-#elif defined(__ppc__) && defined(TARGET_MACH)
- command = g_strdup_printf ("gcc -dynamiclib -o %s %s.o", tmp_outfile_name, acfg->tmpfname);
-#elif defined(TARGET_AMD64) && defined(TARGET_MACH)
- command = g_strdup_printf ("gcc --shared -o %s %s.o", tmp_outfile_name, acfg->tmpfname);
-#elif defined(HOST_WIN32)
- command = g_strdup_printf ("gcc -shared --dll -o %s %s.o", tmp_outfile_name, acfg->tmpfname);
-#elif defined(TARGET_X86) && defined(TARGET_MACH) && !defined(__native_client_codegen__)
- command = g_strdup_printf ("gcc -m32 -dynamiclib -o %s %s.o", tmp_outfile_name, acfg->tmpfname);
+#ifdef LD_NAME
+ command = g_strdup_printf ("%s -o %s %s.o", LD_NAME, tmp_outfile_name, acfg->tmpfname);
#else
- command = g_strdup_printf ("%sld %s %s -shared -o %s %s.o", tool_prefix, EH_LD_OPTIONS, LD_OPTIONS, tmp_outfile_name, acfg->tmpfname);
+ command = g_strdup_printf ("%sld %s -shared -o %s %s.o", tool_prefix, LD_OPTIONS, tmp_outfile_name, acfg->tmpfname);
#endif
printf ("Executing the native linker: %s\n", command);
if (system (command) != 0) {
@@ -8465,7 +8547,7 @@ compile_asm (MonoAotCompile *acfg)
#if defined(TARGET_MACH)
command = g_strdup_printf ("dsymutil %s", outfile_name);
- printf ("Generating debug symbols: %s\n", command);
+ printf ("Executing dsymutil: %s\n", command);
if (system (command) != 0) {
return 1;
}
@@ -8498,7 +8580,7 @@ acfg_create (MonoAssembly *ass, guint32 opts)
acfg->method_indexes = g_hash_table_new (NULL, NULL);
acfg->method_depth = g_hash_table_new (NULL, NULL);
acfg->plt_offset_to_entry = g_hash_table_new (NULL, NULL);
- acfg->patch_to_plt_entry = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal);
+ acfg->patch_to_plt_entry = g_new0 (GHashTable*, MONO_PATCH_INFO_NUM);
acfg->patch_to_got_offset = g_hash_table_new (mono_patch_info_hash, mono_patch_info_equal);
acfg->patch_to_got_offset_by_type = g_new0 (GHashTable*, MONO_PATCH_INFO_NUM);
for (i = 0; i < MONO_PATCH_INFO_NUM; ++i)
@@ -8550,7 +8632,11 @@ acfg_free (MonoAotCompile *acfg)
g_hash_table_destroy (acfg->method_indexes);
g_hash_table_destroy (acfg->method_depth);
g_hash_table_destroy (acfg->plt_offset_to_entry);
- g_hash_table_destroy (acfg->patch_to_plt_entry);
+ for (i = 0; i < MONO_PATCH_INFO_NUM; ++i) {
+ if (acfg->patch_to_plt_entry [i])
+ g_hash_table_destroy (acfg->patch_to_plt_entry [i]);
+ }
+ g_free (acfg->patch_to_plt_entry);
g_hash_table_destroy (acfg->patch_to_got_offset);
g_hash_table_destroy (acfg->method_to_cfg);
g_hash_table_destroy (acfg->token_info_hash);
@@ -8599,7 +8685,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options)
acfg->aot_opts.nrgctx_fetch_trampolines = 128;
acfg->aot_opts.ngsharedvt_arg_trampolines = 128;
acfg->aot_opts.llvm_path = g_strdup ("");
-#if MONOTOUCH
+#ifdef MONOTOUCH
acfg->aot_opts.use_trampolines_page = TRUE;
#endif
@@ -8631,7 +8717,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options)
opt->mdb_optimizations = TRUE;
opt->gen_seq_points = TRUE;
- if (mono_debug_format == MONO_DEBUG_FORMAT_NONE) {
+ if (!mono_debug_enabled ()) {
fprintf (stderr, "The soft-debug AOT option requires the --debug option.\n");
return 1;
}
@@ -8747,12 +8833,16 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options)
#ifdef ENABLE_LLVM
if (acfg->llvm) {
if (acfg->aot_opts.asm_only) {
- if (acfg->aot_opts.outfile)
+ if (acfg->aot_opts.outfile) {
acfg->tmpfname = g_strdup_printf ("%s", acfg->aot_opts.outfile);
- else
- acfg->tmpfname = g_strdup_printf ("%s.s", acfg->image->name);
+ acfg->tmpbasename = g_strdup (acfg->tmpfname);
+ } else {
+ acfg->tmpbasename = g_strdup_printf ("%s", acfg->image->name);
+ acfg->tmpfname = g_strdup_printf ("%s.s", acfg->tmpbasename);
+ }
} else {
- acfg->tmpfname = g_strdup ("temp.s");
+ acfg->tmpbasename = g_strdup_printf ("%s", "temp");
+ acfg->tmpfname = g_strdup_printf ("%s.s", acfg->tmpbasename);
}
emit_llvm_file (acfg);
@@ -8795,10 +8885,10 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options)
int i = g_file_open_tmp ("mono_aot_XXXXXX", &acfg->tmpfname, NULL);
acfg->fp = fdopen (i, "w+");
}
- if (acfg->fp == 0) {
- fprintf (stderr, "Unable to open file '%s': %s\n", acfg->tmpfname, strerror (errno));
- return 1;
- }
+ }
+ if (acfg->fp == 0) {
+ fprintf (stderr, "Unable to open file '%s': %s\n", acfg->tmpfname, strerror (errno));
+ return 1;
}
acfg->w = img_writer_create (acfg->fp, FALSE);
@@ -8831,7 +8921,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options)
}
if (!acfg->aot_opts.nodebug || acfg->aot_opts.dwarf_debug) {
- if (acfg->aot_opts.dwarf_debug && mono_debug_format == MONO_DEBUG_FORMAT_NONE) {
+ if (acfg->aot_opts.dwarf_debug && !mono_debug_enabled ()) {
fprintf (stderr, "The dwarf AOT option requires the --debug option.\n");
return 1;
}
@@ -8841,7 +8931,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options)
img_writer_emit_start (acfg->w);
if (acfg->dwarf)
- mono_dwarf_writer_emit_base_info (acfg->dwarf, mono_unwind_get_cie_program ());
+ mono_dwarf_writer_emit_base_info (acfg->dwarf, g_path_get_basename (acfg->image->name), mono_unwind_get_cie_program ());
if (acfg->thumb_mixed) {
char symbol [256];
diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c
index 7bf4aa828e..32bbeb79b4 100644
--- a/mono/mini/aot-runtime.c
+++ b/mono/mini/aot-runtime.c
@@ -70,9 +70,15 @@
#define SHARED_EXT ".so"
#endif
+#define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
#define ALIGN_PTR_TO(ptr,align) (gpointer)((((gssize)(ptr)) + (align - 1)) & (~(align - 1)))
#define ROUND_DOWN(VALUE,SIZE) ((VALUE) & ~((SIZE) - 1))
+typedef struct {
+ int method_index;
+ MonoJitInfo *jinfo;
+} JitInfoMap;
+
typedef struct MonoAotModule {
char *aot_name;
/* Pointer to the Global Offset Table */
@@ -98,9 +104,7 @@ typedef struct MonoAotModule {
guint8 *plt_end;
guint8 *blob;
gint32 *code_offsets;
-#ifdef MONOTOUCH
gpointer *method_addresses;
-#endif
/* This contains <offset, index> pairs sorted by offset */
/* This is needed because LLVM emitted methods can be in any order */
gint32 *sorted_code_offsets;
@@ -132,6 +136,8 @@ typedef struct MonoAotModule {
gpointer *globals;
MonoDl *sofile;
+
+ JitInfoMap *async_jit_info_table;
} MonoAotModule;
typedef struct {
@@ -180,6 +186,9 @@ static guint32 n_pagefaults = 0;
static gsize aot_code_low_addr = (gssize)-1;
static gsize aot_code_high_addr = 0;
+/* Stats */
+static gint32 async_jit_info_size;
+
static GHashTable *aot_jit_icall_hash;
#ifdef MONOTOUCH
@@ -1588,7 +1597,7 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data)
sofile = mono_dl_open (aot_name, MONO_DL_LAZY, &err);
if (!sofile) {
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_AOT, "AOT failed to load AOT module %s: %s\n", aot_name, err);
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_AOT, "AOT module '%s' not found: %s\n", aot_name, err);
g_free (err);
}
}
@@ -1719,9 +1728,7 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data)
}
amodule->code_offsets = info->code_offsets;
-#ifdef MONOTOUCH
amodule->method_addresses = info->method_addresses;
-#endif
amodule->code = info->methods;
#ifdef TARGET_ARM
/* Mask out thumb interop bit */
@@ -1755,7 +1762,7 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data)
amodule->code_offsets = g_malloc0 (amodule->info.nmethods * sizeof (gint32));
for (i = 0; i < amodule->info.nmethods; ++i) {
/* method_addresses () contains a table of branches, since the ios linker can update those correctly */
- void *addr = get_arm_bl_target ((guint32*)(amodule->method_addresses + i));
+ void *addr = get_arm_bl_target ((guint32*)amodule->method_addresses + i);
if (addr == amodule->method_addresses)
amodule->code_offsets [i] = 0xffffffff;
@@ -1909,6 +1916,7 @@ mono_aot_init (void)
#ifndef __native_client__
mono_install_assembly_load_hook (load_aot_module, NULL);
#endif
+ mono_counters_register ("Async JIT info size", MONO_COUNTER_INT|MONO_COUNTER_JIT, &async_jit_info_size);
if (g_getenv ("MONO_LASTAOT"))
mono_last_aot_method = atoi (g_getenv ("MONO_LASTAOT"));
@@ -2257,11 +2265,11 @@ decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain,
* allocate a new JI.
*/
jinfo =
- mono_domain_alloc0 (domain, MONO_SIZEOF_JIT_INFO + (sizeof (MonoJitExceptionInfo) * (ei_len + nested_len)) + extra_size);
+ mono_domain_alloc0_lock_free (domain, MONO_SIZEOF_JIT_INFO + (sizeof (MonoJitExceptionInfo) * (ei_len + nested_len)) + extra_size);
jinfo->code_size = code_len;
jinfo->used_regs = mono_cache_unwind_info (info.unw_info, info.unw_info_len);
- jinfo->method = method;
+ jinfo->d.method = method;
jinfo->code_start = code;
jinfo->domain_neutral = 0;
/* This signals that used_regs points to a normal cached unwind info */
@@ -2321,15 +2329,30 @@ decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain,
return jinfo;
}
+static gpointer
+alloc0_jit_info_data (MonoDomain *domain, int size, gboolean async_context)
+{
+ gpointer res;
+
+ if (async_context) {
+ res = mono_domain_alloc0_lock_free (domain, size);
+ InterlockedExchangeAdd (&async_jit_info_size, size);
+ } else {
+ res = mono_domain_alloc0 (domain, size);
+ }
+ return res;
+}
+
/*
* LOCKING: Acquires the domain lock.
+ * In async context, this is async safe.
*/
static MonoJitInfo*
decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
MonoMethod *method, guint8* ex_info, guint8 *addr,
guint8 *code, guint32 code_len)
{
- int i, buf_len, num_clauses;
+ int i, buf_len, num_clauses, len;
MonoJitInfo *jinfo;
guint used_int_regs, flags;
gboolean has_generic_jit_info, has_dwarf_unwind_info, has_clauses, has_seq_points, has_try_block_holes, has_arch_eh_jit_info;
@@ -2337,8 +2360,10 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
guint8 *p;
int generic_info_size, try_holes_info_size, num_holes, arch_eh_jit_info_size;
int this_reg = 0, this_offset = 0;
+ gboolean async;
/* Load the method info from the AOT file */
+ async = mono_thread_info_is_async_context ();
p = ex_info;
flags = decode_value (p, &p);
@@ -2385,6 +2410,9 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
MonoJitExceptionInfo *clauses;
GSList **nesting;
+ // FIXME: async
+ g_assert (!async);
+
/*
* Part of the info is encoded by the AOT compiler, the rest is in the .eh_frame
* section.
@@ -2417,8 +2445,8 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
g_slist_free (nesting [i]);
g_free (nesting);
} else {
- jinfo =
- mono_domain_alloc0 (domain, MONO_SIZEOF_JIT_INFO + (sizeof (MonoJitExceptionInfo) * num_clauses) + generic_info_size + try_holes_info_size + arch_eh_jit_info_size);
+ len = MONO_SIZEOF_JIT_INFO + (sizeof (MonoJitExceptionInfo) * num_clauses) + generic_info_size + try_holes_info_size + arch_eh_jit_info_size;
+ jinfo = alloc0_jit_info_data (domain, len, async);
jinfo->num_clauses = num_clauses;
for (i = 0; i < jinfo->num_clauses; ++i) {
@@ -2431,8 +2459,14 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
if (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER || ei->flags == MONO_EXCEPTION_CLAUSE_FINALLY)
ei->data.filter = code + decode_value (p, &p);
else {
- if (decode_value (p, &p))
- ei->data.catch_class = decode_klass_ref (amodule, p, &p);
+ int len = decode_value (p, &p);
+
+ if (len > 0) {
+ if (async)
+ p += len;
+ else
+ ei->data.catch_class = decode_klass_ref (amodule, p, &p);
+ }
}
ei->try_start = code + decode_value (p, &p);
@@ -2442,14 +2476,49 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
jinfo->code_size = code_len;
jinfo->used_regs = used_int_regs;
- jinfo->method = method;
+ jinfo->d.method = method;
jinfo->code_start = code;
jinfo->domain_neutral = 0;
jinfo->from_aot = 1;
}
+ if (has_try_block_holes) {
+ MonoTryBlockHoleTableJitInfo *table;
+
+ jinfo->has_try_block_holes = 1;
+
+ table = mono_jit_info_get_try_block_hole_table_info (jinfo);
+ g_assert (table);
+
+ table->num_holes = (guint16)num_holes;
+ for (i = 0; i < num_holes; ++i) {
+ MonoTryBlockHoleJitInfo *hole = &table->holes [i];
+ hole->clause = decode_value (p, &p);
+ hole->length = decode_value (p, &p);
+ hole->offset = decode_value (p, &p);
+ }
+ }
+
+ if (has_arch_eh_jit_info) {
+ MonoArchEHJitInfo *eh_info;
+
+ jinfo->has_arch_eh_info = 1;
+
+ eh_info = mono_jit_info_get_arch_eh_info (jinfo);
+ eh_info->stack_size = decode_value (p, &p);
+ }
+
+ if (async) {
+ /* The rest is not needed in async mode */
+ jinfo->async = TRUE;
+ jinfo->d.aot_info = amodule;
+ // FIXME: Cache
+ return jinfo;
+ }
+
if (has_generic_jit_info) {
MonoGenericJitInfo *gi;
+ int len;
jinfo->has_generic_jit_info = 1;
@@ -2458,7 +2527,7 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
gi->nlocs = decode_value (p, &p);
if (gi->nlocs) {
- gi->locations = mono_domain_alloc0 (domain, gi->nlocs * sizeof (MonoDwarfLocListEntry));
+ gi->locations = alloc0_jit_info_data (domain, gi->nlocs * sizeof (MonoDwarfLocListEntry), async);
for (i = 0; i < gi->nlocs; ++i) {
MonoDwarfLocListEntry *entry = &gi->locations [i];
@@ -2482,7 +2551,11 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
}
}
- jinfo->method = decode_resolve_method_ref (amodule, p, &p);
+ len = decode_value (p, &p);
+ if (async)
+ p += len;
+ else
+ jinfo->d.method = decode_resolve_method_ref (amodule, p, &p);
gi->generic_sharing_context = g_new0 (MonoGenericSharingContext, 1);
if (decode_value (p, &p)) {
@@ -2492,46 +2565,20 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
n = decode_value (p, &p);
if (n) {
- gsctx->var_is_vt = g_new0 (gboolean, n);
+ gsctx->var_is_vt = alloc0_jit_info_data (domain, sizeof (gboolean) * n, async);
for (i = 0; i < n; ++i)
gsctx->var_is_vt [i] = decode_value (p, &p);
}
n = decode_value (p, &p);
if (n) {
- gsctx->mvar_is_vt = g_new0 (gboolean, n);
+ gsctx->mvar_is_vt = alloc0_jit_info_data (domain, sizeof (gboolean) * n, async);
for (i = 0; i < n; ++i)
gsctx->mvar_is_vt [i] = decode_value (p, &p);
}
}
}
- if (has_try_block_holes) {
- MonoTryBlockHoleTableJitInfo *table;
-
- jinfo->has_try_block_holes = 1;
-
- table = mono_jit_info_get_try_block_hole_table_info (jinfo);
- g_assert (table);
-
- table->num_holes = (guint16)num_holes;
- for (i = 0; i < num_holes; ++i) {
- MonoTryBlockHoleJitInfo *hole = &table->holes [i];
- hole->clause = decode_value (p, &p);
- hole->length = decode_value (p, &p);
- hole->offset = decode_value (p, &p);
- }
- }
-
- if (has_arch_eh_jit_info) {
- MonoArchEHJitInfo *eh_info;
-
- jinfo->has_arch_eh_info = 1;
-
- eh_info = mono_jit_info_get_arch_eh_info (jinfo);
- eh_info->stack_size = decode_value (p, &p);
- }
-
- if (has_seq_points) {
+ if (method && has_seq_points) {
MonoSeqPointInfo *seq_points;
int il_offset, native_offset, last_il_offset, last_native_offset, j;
@@ -2548,6 +2595,7 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
sp->il_offset = il_offset;
sp->native_offset = native_offset;
+ sp->flags = decode_value (p, &p);
sp->next_len = decode_value (p, &p);
sp->next = g_new (int, sp->next_len);
for (j = 0; j < sp->next_len; ++j)
@@ -2564,7 +2612,8 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
/* Load debug info */
buf_len = decode_value (p, &p);
- mono_debug_add_aot_method (domain, method, code, p, buf_len);
+ if (!async)
+ mono_debug_add_aot_method (domain, method, code, p, buf_len);
p += buf_len;
if (has_gc_map) {
@@ -2576,7 +2625,7 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
p += map_size;
}
- if (amodule != jinfo->method->klass->image->aot_module) {
+ if (amodule != jinfo->d.method->klass->image->aot_module) {
mono_aot_lock ();
if (!ji_to_amodule)
ji_to_amodule = g_hash_table_new (NULL, NULL);
@@ -2595,10 +2644,14 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
guint8*
mono_aot_get_unwind_info (MonoJitInfo *ji, guint32 *unwind_info_len)
{
- MonoAotModule *amodule = ji->method->klass->image->aot_module;
+ MonoAotModule *amodule;
guint8 *p;
guint8 *code = ji->code_start;
+ if (ji->async)
+ amodule = ji->d.aot_info;
+ else
+ amodule = jinfo_get_method (ji)->klass->image->aot_module;
g_assert (amodule);
g_assert (ji->from_aot);
@@ -2677,6 +2730,13 @@ msort_code_offsets (gint32 *array, int len)
g_free (scratch);
}
+/*
+ * mono_aot_find_jit_info:
+ *
+ * In async context, the resulting MonoJitInfo will not have its method field set, and it will not be added
+ * to the jit info tables.
+ * FIXME: Large sizes in the lock free allocator
+ */
MonoJitInfo *
mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr)
{
@@ -2684,13 +2744,14 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr)
int method_index, table_len;
guint32 token;
MonoAotModule *amodule = image->aot_module;
- MonoMethod *method;
+ MonoMethod *method = NULL;
MonoJitInfo *jinfo;
guint8 *code, *ex_info, *p;
guint32 *table;
int nmethods = amodule->info.nmethods;
gint32 *code_offsets;
int offsets_len, i;
+ gboolean async;
if (!amodule)
return NULL;
@@ -2699,10 +2760,13 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr)
/* FIXME: */
return NULL;
+ async = mono_thread_info_is_async_context ();
+
offset = (guint8*)addr - amodule->code;
/* Compute a sorted table mapping code offsets to method indexes. */
if (!amodule->sorted_code_offsets) {
+ // FIXME: async
code_offsets = g_new0 (gint32, nmethods * 2);
offsets_len = 0;
for (i = 0; i < nmethods; ++i) {
@@ -2757,6 +2821,20 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr)
g_assert (offset < code_offsets [((pos + 1) * 2)]);
method_index = code_offsets [(pos * 2) + 1];
+ /* In async mode, jinfo is not added to the normal jit info table, so have to cache it ourselves */
+ if (async) {
+ JitInfoMap *table = amodule->async_jit_info_table;
+ int len;
+
+ if (table) {
+ len = table [0].method_index;
+ for (i = 1; i < len; ++i) {
+ if (table [i].method_index == method_index)
+ return table [i].jinfo;
+ }
+ }
+ }
+
code = &amodule->code [amodule->code_offsets [method_index]];
ex_info = &amodule->blob [mono_aot_get_offset (amodule->ex_info_offsets, method_index)];
@@ -2768,54 +2846,55 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr)
g_assert ((guint8*)code <= (guint8*)addr && (guint8*)addr < (guint8*)code + code_len);
/* Might be a wrapper/extra method */
- if (amodule->extra_methods) {
- mono_aot_lock ();
- method = g_hash_table_lookup (amodule->extra_methods, GUINT_TO_POINTER (method_index));
- mono_aot_unlock ();
- } else {
- method = NULL;
- }
-
- if (!method) {
- if (method_index >= image->tables [MONO_TABLE_METHOD].rows) {
- /*
- * This is hit for extra methods which are called directly, so they are
- * not in amodule->extra_methods.
- */
- table_len = amodule->extra_method_info_offsets [0];
- table = amodule->extra_method_info_offsets + 1;
- left = 0;
- right = table_len;
- pos = 0;
-
- /* Binary search */
- while (TRUE) {
- pos = ((left + right) / 2);
+ if (!async) {
+ if (amodule->extra_methods) {
+ mono_aot_lock ();
+ method = g_hash_table_lookup (amodule->extra_methods, GUINT_TO_POINTER (method_index));
+ mono_aot_unlock ();
+ } else {
+ method = NULL;
+ }
- g_assert (pos < table_len);
+ if (!method) {
+ if (method_index >= image->tables [MONO_TABLE_METHOD].rows) {
+ /*
+ * This is hit for extra methods which are called directly, so they are
+ * not in amodule->extra_methods.
+ */
+ table_len = amodule->extra_method_info_offsets [0];
+ table = amodule->extra_method_info_offsets + 1;
+ left = 0;
+ right = table_len;
+ pos = 0;
+
+ /* Binary search */
+ while (TRUE) {
+ pos = ((left + right) / 2);
+
+ g_assert (pos < table_len);
+
+ if (table [pos * 2] < method_index)
+ left = pos + 1;
+ else if (table [pos * 2] > method_index)
+ right = pos;
+ else
+ break;
+ }
- if (table [pos * 2] < method_index)
- left = pos + 1;
- else if (table [pos * 2] > method_index)
- right = pos;
- else
- break;
+ p = amodule->blob + table [(pos * 2) + 1];
+ method = decode_resolve_method_ref (amodule, p, &p);
+ if (!method)
+ /* Happens when a random address is passed in which matches a not-yey called wrapper encoded using its name */
+ return NULL;
+ } else {
+ token = mono_metadata_make_token (MONO_TABLE_METHOD, method_index + 1);
+ method = mono_get_method (image, token, NULL);
}
-
- p = amodule->blob + table [(pos * 2) + 1];
- method = decode_resolve_method_ref (amodule, p, &p);
- if (!method)
- /* Happens when a random address is passed in which matches a not-yey called wrapper encoded using its name */
- return NULL;
- } else {
- token = mono_metadata_make_token (MONO_TABLE_METHOD, method_index + 1);
- method = mono_get_method (image, token, NULL);
}
+ /* FIXME: */
+ g_assert (method);
}
- /* FIXME: */
- g_assert (method);
-
//printf ("F: %s\n", mono_method_full_name (method, TRUE));
jinfo = decode_exception_debug_info (amodule, domain, method, ex_info, addr, code, code_len);
@@ -2824,7 +2903,35 @@ mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr)
g_assert ((guint8*)addr < (guint8*)jinfo->code_start + jinfo->code_size);
/* Add it to the normal JitInfo tables */
- mono_jit_info_table_add (domain, jinfo);
+ if (async) {
+ JitInfoMap *old_table, *new_table;
+ int len;
+
+ /*
+ * Use a simple inmutable table with linear search to cache async jit info entries.
+ * This assumes that the number of entries is small.
+ */
+ while (TRUE) {
+ /* Copy the table, adding a new entry at the end */
+ old_table = amodule->async_jit_info_table;
+ if (old_table)
+ len = old_table[0].method_index;
+ else
+ len = 1;
+ new_table = alloc0_jit_info_data (domain, (len + 1) * sizeof (JitInfoMap), async);
+ if (old_table)
+ memcpy (new_table, old_table, len * sizeof (JitInfoMap));
+ new_table [0].method_index = len + 1;
+ new_table [len].method_index = method_index;
+ new_table [len].jinfo = jinfo;
+ /* Publish it */
+ mono_memory_barrier ();
+ if (InterlockedCompareExchangePointer ((gpointer)&amodule->async_jit_info_table, new_table, old_table) == old_table)
+ break;
+ }
+ } else {
+ mono_jit_info_table_add (domain, jinfo);
+ }
return jinfo;
}
@@ -2841,7 +2948,8 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin
case MONO_PATCH_INFO_METHOD:
case MONO_PATCH_INFO_METHOD_JUMP:
case MONO_PATCH_INFO_ICALL_ADDR:
- case MONO_PATCH_INFO_METHOD_RGCTX: {
+ case MONO_PATCH_INFO_METHOD_RGCTX:
+ case MONO_PATCH_INFO_METHOD_CODE_SLOT: {
MethodRef ref;
gboolean res;
@@ -3635,7 +3743,7 @@ mono_aot_get_method (MonoDomain *domain, MonoMethod *method)
char *full_name;
full_name = mono_method_full_name (method, TRUE);
- mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_AOT, "AOT NOT FOUND: %s.\n", full_name);
+ mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_AOT, "AOT NOT FOUND: %s.", full_name);
g_free (full_name);
}
return NULL;
@@ -4168,14 +4276,16 @@ get_new_trampoline_from_page (int tramp_type)
vm_address_t addr, taddr;
kern_return_t ret;
vm_prot_t prot, max_prot;
- int psize;
+ int psize, specific_trampoline_size;
unsigned char *code;
+ specific_trampoline_size = 2 * sizeof (gpointer);
+
mono_aot_page_lock ();
page = trampoline_pages [tramp_type];
if (page && page->trampolines < page->trampolines_end) {
code = page->trampolines;
- page->trampolines += 8;
+ page->trampolines += specific_trampoline_size;
mono_aot_page_unlock ();
return code;
}
@@ -4188,6 +4298,8 @@ get_new_trampoline_from_page (int tramp_type)
amodule = image->aot_module;
g_assert (amodule);
+ g_assert (amodule->info.tramp_page_size == psize);
+
if (tramp_type == MONO_AOT_TRAMP_SPECIFIC)
tpage = load_function (amodule, "specific_trampolines_page");
else if (tramp_type == MONO_AOT_TRAMP_STATIC_RGCTX)
@@ -4231,7 +4343,7 @@ get_new_trampoline_from_page (int tramp_type)
/* some other thread already allocated, so use that to avoid wasting memory */
if (page && page->trampolines < page->trampolines_end) {
code = page->trampolines;
- page->trampolines += 8;
+ page->trampolines += specific_trampoline_size;
mono_aot_page_unlock ();
vm_deallocate (mach_task_self (), addr, psize);
vm_deallocate (mach_task_self (), taddr, psize);
@@ -4343,7 +4455,7 @@ get_numerous_trampoline (MonoAotTrampoline tramp_type, int n_got_slots, MonoAotM
*out_amodule = amodule;
#ifdef MONOTOUCH
-#define MONOTOUCH_TRAMPOLINES_ERROR ". See http://docs.xamarin.com/ios/troubleshooting for instruction on how to fix this condition"
+#define MONOTOUCH_TRAMPOLINES_ERROR ". See http://docs.xamarin.com/ios/troubleshooting for instructions on how to fix this condition."
#else
#define MONOTOUCH_TRAMPOLINES_ERROR ""
#endif
diff --git a/mono/mini/arrays.cs b/mono/mini/arrays.cs
index f38d05319b..55df1662c3 100644
--- a/mono/mini/arrays.cs
+++ b/mono/mini/arrays.cs
@@ -791,6 +791,21 @@ class Tests
return 5;
return 0;
}
+
+ static int llvm_ldlen_licm (int[] arr) {
+ int sum = 0;
+ // The ldlen should be moved out of the loop
+ for (int i = 0; i < arr.Length; ++i)
+ sum += arr [i];
+ return sum;
+ }
+
+ public static int test_10_llvm_ldlen_licm () {
+ int[] arr = new int [10];
+ for (int i = 0; i < 10; ++i)
+ arr [i] = 1;
+ return llvm_ldlen_licm (arr);
+ }
}
diff --git a/mono/mini/basic-float.cs b/mono/mini/basic-float.cs
index 11e3e2725b..e85918292c 100644
--- a/mono/mini/basic-float.cs
+++ b/mono/mini/basic-float.cs
@@ -630,9 +630,6 @@ class Tests
return f == PositiveInfinity ? 0 : 1;
}
- /*
- Disabled until they can be fixed to run on amd64
-
static double VALUE = 0.19975845134874831D;
public static int test_0_float_conversion_reduces_double_precision () {
@@ -664,6 +661,14 @@ class Tests
return 1;
return 0;
}
- */
+
+ public static int test_0_int8_to_float_convertion ()
+ {
+ double d = (double)(float)(long)INT_VAL;
+
+ if (d != 323315616)
+ return 1;
+ return 0;
+ }
}
diff --git a/mono/mini/cpu-amd64.md b/mono/mini/cpu-amd64.md
index 6fdf39699b..329f70a52a 100644
--- a/mono/mini/cpu-amd64.md
+++ b/mono/mini/cpu-amd64.md
@@ -62,7 +62,6 @@
#
break: len:2
-jmp: len:120
tailcall: len:120 clob:c
br: len:6
label: len:0
@@ -87,7 +86,7 @@ long_conv_to_i1: dest:i src1:i len:4
long_conv_to_i2: dest:i src1:i len:4
long_conv_to_i4: dest:i src1:i len:3
long_conv_to_i8: dest:i src1:i len:3
-long_conv_to_r4: dest:f src1:i len:9
+long_conv_to_r4: dest:f src1:i len:15
long_conv_to_r8: dest:f src1:i len:9
long_conv_to_u4: dest:i src1:i len:3
long_conv_to_u8: dest:i src1:i len:3
@@ -247,6 +246,9 @@ float_cgt: dest:i src1:f src2:f len:35
float_cgt_un: dest:i src1:f src2:f len:48
float_clt: dest:i src1:f src2:f len:35
float_clt_un: dest:i src1:f src2:f len:42
+float_cneq: dest:i src1:f src2:f len:42
+float_cge: dest:i src1:f src2:f len:35
+float_cle: dest:i src1:f src2:f len:35
float_ceq_membase: dest:i src1:f src2:b len:35
float_cgt_membase: dest:i src1:f src2:b len:35
float_cgt_un_membase: dest:i src1:f src2:b len:48
@@ -292,7 +294,9 @@ amd64_set_xmmreg_r4: dest:f src1:f len:14 clob:m
amd64_set_xmmreg_r8: dest:f src1:f len:14 clob:m
amd64_save_sp_to_lmf: len:16
tls_get: dest:i len:16
-tls_get_reg: dest:i src1:i len:20
+tls_get_reg: dest:i src1:i len:32
+tls_set: src1:i len:16
+tls_set_reg: src1:i src2:i len:32
atomic_add_i4: src1:b src2:i dest:i len:32
atomic_add_new_i4: src1:b src2:i dest:i len:32
atomic_exchange_i4: src1:b src2:i dest:a len:32
@@ -364,13 +368,20 @@ int_max_un: dest:i src1:i src2:i len:16 clob:1
int_neg: dest:i src1:i clob:1 len:4
int_not: dest:i src1:i clob:1 len:4
-int_conv_to_r4: dest:f src1:i len:9
+int_conv_to_r4: dest:f src1:i len:15
int_conv_to_r8: dest:f src1:i len:9
int_ceq: dest:c len:8
int_cgt: dest:c len:8
int_cgt_un: dest:c len:8
int_clt: dest:c len:8
int_clt_un: dest:c len:8
+
+int_cneq: dest:c len:8
+int_cge: dest:c len:8
+int_cle: dest:c len:8
+int_cge_un: dest:c len:8
+int_cle_un: dest:c len:8
+
int_beq: len:8
int_bne_un: len:8
int_blt: len:8
@@ -493,7 +504,7 @@ amd64_or_membase_reg: src1:b src2:i len:13
amd64_xor_membase_reg: src1:b src2:i len:13
amd64_mul_membase_reg: src1:b src2:i len:15
-float_conv_to_r4: dest:f src1:f
+float_conv_to_r4: dest:f src1:f len:17
vcall2: len:64 clob:c
vcall2_reg: src1:i len:64 clob:c
diff --git a/mono/mini/cpu-arm.md b/mono/mini/cpu-arm.md
index b00f564787..f47a3738a6 100644
--- a/mono/mini/cpu-arm.md
+++ b/mono/mini/cpu-arm.md
@@ -62,11 +62,11 @@ seq_point: len:38 clob:c
throw: src1:i len:24
rethrow: src1:i len:20
start_handler: len:20
-endfinally: len:20
+endfinally: len:32
call_handler: len:16 clob:c
endfilter: src1:i len:16
-ckfinite: dest:f src1:f len:64
+ckfinite: dest:f src1:f len:112
ceq: dest:i len:12
cgt: dest:i len:12
cgt.un: dest:i len:12
@@ -108,7 +108,7 @@ storei4_membase_imm: dest:b len:20
storei4_membase_reg: dest:b src1:i len:20
storei8_membase_imm: dest:b
storei8_membase_reg: dest:b src1:i
-storer4_membase_reg: dest:b src1:f len:12
+storer4_membase_reg: dest:b src1:f len:60
storer8_membase_reg: dest:b src1:f len:24
store_memindex: dest:b src1:i src2:i len:4
storei1_memindex: dest:b src1:i src2:i len:4
@@ -122,7 +122,7 @@ loadu2_membase: dest:i src1:b len:4
loadi4_membase: dest:i src1:b len:4
loadu4_membase: dest:i src1:b len:4
loadi8_membase: dest:i src1:b
-loadr4_membase: dest:f src1:b len:8
+loadr4_membase: dest:f src1:b len:56
loadr8_membase: dest:f src1:b len:24
load_memindex: dest:i src1:b src2:i len:4
loadi1_memindex: dest:i src1:b src2:i len:4
@@ -176,15 +176,15 @@ float_rem: dest:f src1:f src2:f len:16
float_rem_un: dest:f src1:f src2:f len:16
float_neg: dest:f src1:f len:4
float_not: dest:f src1:f len:4
-float_conv_to_i1: dest:i src1:f len:40
-float_conv_to_i2: dest:i src1:f len:40
-float_conv_to_i4: dest:i src1:f len:40
-float_conv_to_i8: dest:l src1:f len:40
+float_conv_to_i1: dest:i src1:f len:88
+float_conv_to_i2: dest:i src1:f len:88
+float_conv_to_i4: dest:i src1:f len:88
+float_conv_to_i8: dest:l src1:f len:88
float_conv_to_r4: dest:f src1:f len:8
-float_conv_to_u4: dest:i src1:f len:40
-float_conv_to_u8: dest:l src1:f len:40
-float_conv_to_u2: dest:i src1:f len:40
-float_conv_to_u1: dest:i src1:f len:40
+float_conv_to_u4: dest:i src1:f len:88
+float_conv_to_u8: dest:l src1:f len:88
+float_conv_to_u2: dest:i src1:f len:88
+float_conv_to_u1: dest:i src1:f len:88
float_conv_to_i: dest:i src1:f len:40
float_ceq: dest:i src1:f src2:f len:16
float_cgt: dest:i src1:f src2:f len:16
@@ -228,8 +228,8 @@ int_not: dest:i src1:i len:4
int_conv_to_i1: dest:i src1:i len:8
int_conv_to_i2: dest:i src1:i len:8
int_conv_to_i4: dest:i src1:i len:4
-int_conv_to_r4: dest:f src1:i len:36
-int_conv_to_r8: dest:f src1:i len:36
+int_conv_to_r4: dest:f src1:i len:84
+int_conv_to_r8: dest:f src1:i len:84
int_conv_to_u4: dest:i src1:i
int_conv_to_r_un: dest:f src1:i len:56
int_conv_to_u2: dest:i src1:i len:8
diff --git a/mono/mini/cpu-mips.md b/mono/mini/cpu-mips.md
index 41c1b5840c..0fd87c8973 100644
--- a/mono/mini/cpu-mips.md
+++ b/mono/mini/cpu-mips.md
@@ -61,7 +61,6 @@ br: len:16
switch: src1:i len:40
seq_point: len:24
-callvirt: dest:v clob:c len:20
int_conv_to_r_un: dest:f src1:i len:32
throw: src1:i len:24
rethrow: src1:i len:24
diff --git a/mono/mini/cpu-x86.md b/mono/mini/cpu-x86.md
index d7d70f7aa5..93d4404195 100644
--- a/mono/mini/cpu-x86.md
+++ b/mono/mini/cpu-x86.md
@@ -63,7 +63,6 @@
# See the code in mini-x86.c for more details on how the specifiers are used.
#
break: len:1
-jmp: len:32 clob:c
call: dest:a clob:c len:17
tailcall: len:120 clob:c
br: len:5
@@ -242,6 +241,9 @@ float_cgt: dest:y src1:f src2:f len:25
float_cgt_un: dest:y src1:f src2:f len:37
float_clt: dest:y src1:f src2:f len:25
float_clt_un: dest:y src1:f src2:f len:32
+float_cneq: dest:y src1:f src2:f len:25
+float_cge: dest:y src1:f src2:f len:37
+float_cle: dest:y src1:f src2:f len:37
float_conv_to_u: dest:i src1:f len:36
call_handler: len:11 clob:c
aot_const: dest:i len:5
@@ -301,6 +303,8 @@ sext_i1: dest:i src1:y len:3
sext_i2: dest:i src1:y len:3
tls_get: dest:i len:20
tls_get_reg: dest:i src1:i len:20
+tls_set: src1:i len:20
+tls_set_reg: src1:i src2:i len:20
atomic_add_i4: src1:b src2:i dest:i len:16
atomic_add_new_i4: src1:b src2:i dest:i len:16
atomic_exchange_i4: src1:b src2:i dest:a len:24
@@ -348,6 +352,12 @@ int_cgt_un: dest:y len:6
int_clt: dest:y len:6
int_clt_un: dest:y len:6
+int_cneq: dest:y len:6
+int_cge: dest:y len:6
+int_cle: dest:y len:6
+int_cge_un: dest:y len:6
+int_cle_un: dest:y len:6
+
cond_exc_ieq: len:6
cond_exc_ine_un: len:6
cond_exc_ilt: len:6
diff --git a/mono/mini/debug-debugger.c b/mono/mini/debug-debugger.c
deleted file mode 100644
index a103595c0b..0000000000
--- a/mono/mini/debug-debugger.c
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * debug-debugger.c: Hard debugger support (mdb)
- *
- * Author:
- *
- * Copyright 2006-2010 Novell, Inc.
- */
-#if MONO_DEBUGGER_SUPPORTED
-
-#include <config.h>
-#include <mono/io-layer/io-layer.h>
-#include <mono/metadata/threads.h>
-#include <mono/metadata/assembly.h>
-#include <mono/metadata/mono-debug.h>
-#include <mono/metadata/mono-config.h>
-#define _IN_THE_MONO_DEBUGGER
-#include "debug-debugger.h"
-#include "debug-mini.h"
-#include <libgc/include/libgc-mono-debugger.h>
-#include "mini.h"
-#include <unistd.h>
-#include <locale.h>
-#include <string.h>
-
-/*
- * This file is only compiled on platforms where the debugger is supported - see the conditional
- * definition of `debugger_sources' in Makefile.am.
- *
- * configure.in checks whether we're using the included libgc and disables the debugger if not.
- */
-
-#if !defined(USE_INCLUDED_LIBGC)
-#error "Inconsistency detected: #defined MONO_DEBUGGER_SUPPORTED without USE_INCLUDED_GC - fix configure.in!"
-#endif
-
-static guint64 debugger_compile_method (guint64 method_arg);
-static guint64 debugger_get_virtual_method (guint64 class_arg, guint64 method_arg);
-static guint64 debugger_get_boxed_object (guint64 klass_arg, guint64 val_arg);
-static guint64 debugger_class_get_static_field_data (guint64 klass);
-
-static guint64 debugger_run_finally (guint64 argument1, guint64 argument2);
-static void debugger_initialize (void);
-static guint64 debugger_init_code_buffer (void);
-
-static void debugger_event_handler (MonoDebuggerEvent event, guint64 data, guint64 arg);
-
-static guint64 debugger_create_string (G_GNUC_UNUSED guint64 dummy, G_GNUC_UNUSED guint64 dummy2,
- G_GNUC_UNUSED guint64 dummy3, const gchar *string_argument);
-static gint64 debugger_lookup_class (guint64 image_argument, G_GNUC_UNUSED guint64 dummy,
- G_GNUC_UNUSED guint64 dummy2, gchar *full_name);
-static guint64 debugger_insert_method_breakpoint (guint64 method_argument, guint64 index);
-static guint64 debugger_insert_source_breakpoint (guint64 image_argument, guint64 token,
- guint64 index, const gchar *class_name);
-static void debugger_remove_breakpoint (guint64 index, G_GNUC_UNUSED guint64 dummy);
-static guint64 debugger_register_class_init_callback (guint64 image_argument, guint64 token,
- guint64 index, const gchar *class_name);
-static void debugger_remove_class_init_callback (guint64 index, G_GNUC_UNUSED guint64 dummy);
-static guint64 debugger_get_method_signature (guint64 argument1, G_GNUC_UNUSED guint64 argument2);
-
-static guint64 debugger_abort_runtime_invoke (G_GNUC_UNUSED guint64 dummy1, G_GNUC_UNUSED guint64 dummy2);
-
-#define EXECUTABLE_CODE_BUFFER_SIZE 4096
-static guint8 *debugger_executable_code_buffer = NULL;
-
-static GCThreadFunctions debugger_thread_vtable;
-
-static guint32 debugger_thread_abort_signal = 0;
-
-static MonoDebuggerMetadataInfo debugger_metadata_info = {
- sizeof (MonoDebuggerMetadataInfo),
- sizeof (MonoDefaults),
- &mono_defaults,
- MONO_SIZEOF_TYPE,
- sizeof (MonoArrayType),
- sizeof (MonoClass),
- sizeof (MonoInternalThread),
- G_STRUCT_OFFSET (MonoInternalThread, tid),
- G_STRUCT_OFFSET (MonoInternalThread, stack_ptr),
- G_STRUCT_OFFSET (MonoInternalThread, end_stack),
- G_STRUCT_OFFSET (MonoClass, image),
- G_STRUCT_OFFSET (MonoClass, instance_size),
- G_STRUCT_OFFSET (MonoClass, parent),
- G_STRUCT_OFFSET (MonoClass, type_token),
- G_STRUCT_OFFSET (MonoClass, fields),
- G_STRUCT_OFFSET (MonoClass, methods),
- G_STRUCT_OFFSET (MonoClass, method.count),
- G_STRUCT_OFFSET (MonoClass, this_arg),
- G_STRUCT_OFFSET (MonoClass, byval_arg),
- G_STRUCT_OFFSET (MonoClass, generic_class),
- G_STRUCT_OFFSET (MonoClass, generic_container),
- G_STRUCT_OFFSET (MonoClass, vtable),
- sizeof (MonoClassField),
- G_STRUCT_OFFSET (MonoClassField, type),
- G_STRUCT_OFFSET (MonoClassField, offset),
- G_STRUCT_OFFSET (MonoDefaults, corlib),
- G_STRUCT_OFFSET (MonoDefaults, object_class),
- G_STRUCT_OFFSET (MonoDefaults, byte_class),
- G_STRUCT_OFFSET (MonoDefaults, void_class),
- G_STRUCT_OFFSET (MonoDefaults, boolean_class),
- G_STRUCT_OFFSET (MonoDefaults, sbyte_class),
- G_STRUCT_OFFSET (MonoDefaults, int16_class),
- G_STRUCT_OFFSET (MonoDefaults, uint16_class),
- G_STRUCT_OFFSET (MonoDefaults, int32_class),
- G_STRUCT_OFFSET (MonoDefaults, uint32_class),
- G_STRUCT_OFFSET (MonoDefaults, int_class),
- G_STRUCT_OFFSET (MonoDefaults, uint_class),
- G_STRUCT_OFFSET (MonoDefaults, int64_class),
- G_STRUCT_OFFSET (MonoDefaults, uint64_class),
- G_STRUCT_OFFSET (MonoDefaults, single_class),
- G_STRUCT_OFFSET (MonoDefaults, double_class),
- G_STRUCT_OFFSET (MonoDefaults, char_class),
- G_STRUCT_OFFSET (MonoDefaults, string_class),
- G_STRUCT_OFFSET (MonoDefaults, enum_class),
- G_STRUCT_OFFSET (MonoDefaults, array_class),
- G_STRUCT_OFFSET (MonoDefaults, delegate_class),
- G_STRUCT_OFFSET (MonoDefaults, exception_class),
- G_STRUCT_OFFSET (MonoMethod, klass),
- G_STRUCT_OFFSET (MonoMethod, token),
- G_STRUCT_OFFSET (MonoMethod, name) + sizeof (void *),
- G_STRUCT_OFFSET (MonoMethodInflated, declaring),
- G_STRUCT_OFFSET (MonoVTable, klass),
- G_STRUCT_OFFSET (MonoVTable, vtable)
-};
-
-extern void MONO_DEBUGGER__notification_function (guint64 command, guint64 data, guint64 data2);
-
-/*
- * This is a global data symbol which is read by the debugger.
- */
-MonoDebuggerInfo MONO_DEBUGGER__debugger_info = {
- MONO_DEBUGGER_MAGIC,
- MONO_DEBUGGER_MAJOR_VERSION,
- MONO_DEBUGGER_MINOR_VERSION,
- 0, /* runtime_flags */
- sizeof (MonoDebuggerInfo),
- sizeof (MonoSymbolTable),
- MONO_TRAMPOLINE_NUM,
- mono_trampoline_code,
- &MONO_DEBUGGER__notification_function,
- &mono_symbol_table,
- &debugger_metadata_info,
- &mono_debug_debugger_version,
-
- &debugger_compile_method,
- &debugger_get_virtual_method,
- &debugger_get_boxed_object,
- &mono_debugger_runtime_invoke,
- &debugger_class_get_static_field_data,
- &debugger_run_finally,
- &debugger_initialize,
-
- &debugger_create_string,
- &debugger_lookup_class,
-
- &debugger_insert_method_breakpoint,
- &debugger_insert_source_breakpoint,
- &debugger_remove_breakpoint,
-
- &debugger_register_class_init_callback,
- &debugger_remove_class_init_callback,
-
- &mono_debugger_thread_table,
-
- &debugger_executable_code_buffer,
- mono_breakpoint_info,
- mono_breakpoint_info_index,
-
- EXECUTABLE_CODE_BUFFER_SIZE,
- MONO_BREAKPOINT_ARRAY_SIZE,
-
- debugger_get_method_signature,
- debugger_init_code_buffer,
-
- &gc_thread_vtable,
- &debugger_thread_vtable,
-
- &mono_debugger_event_handler,
- debugger_event_handler,
-
- &_mono_debug_using_mono_debugger,
- (gint32*)&_mono_debugger_interruption_request,
-
- &debugger_abort_runtime_invoke,
-
- &debugger_thread_abort_signal
-};
-
-static guint64
-debugger_abort_runtime_invoke (G_GNUC_UNUSED guint64 dummy1, G_GNUC_UNUSED guint64 dummy2)
-{
- return mono_debugger_abort_runtime_invoke ();
-}
-
-static guint64
-debugger_compile_method (guint64 method_arg)
-{
- MonoMethod *method = (MonoMethod *) GUINT_TO_POINTER ((gsize) method_arg);
- gpointer addr;
-
- mono_debugger_lock ();
- addr = mono_compile_method (method);
- mono_debugger_unlock ();
-
- return (guint64) (gsize) addr;
-}
-
-static guint64
-debugger_get_virtual_method (guint64 object_arg, guint64 method_arg)
-{
- MonoObject *object = (MonoObject *) GUINT_TO_POINTER ((gsize) object_arg);
- MonoMethod *method = (MonoMethod *) GUINT_TO_POINTER ((gsize) method_arg);
-
- if (mono_class_is_valuetype (mono_method_get_class (method)))
- return method_arg;
-
- return (guint64) (gsize) mono_object_get_virtual_method (object, method);
-}
-
-static guint64
-debugger_get_boxed_object (guint64 klass_arg, guint64 val_arg)
-{
- static MonoObject *last_boxed_object = NULL;
- MonoClass *klass = (MonoClass *) GUINT_TO_POINTER ((gsize) klass_arg);
- gpointer val = (gpointer) GUINT_TO_POINTER ((gsize) val_arg);
- MonoObject *boxed;
-
- if (!mono_class_is_valuetype (klass))
- return val_arg;
-
- boxed = mono_value_box (mono_domain_get (), klass, val);
- last_boxed_object = boxed; // Protect the object from being garbage collected
-
- return (guint64) (gsize) boxed;
-}
-
-static guint64
-debugger_create_string (G_GNUC_UNUSED guint64 dummy, G_GNUC_UNUSED guint64 dummy2,
- G_GNUC_UNUSED guint64 dummy3, const gchar *string_argument)
-{
- return (guint64) (gsize) mono_string_new_wrapper (string_argument);
-}
-
-static gint64
-debugger_lookup_class (guint64 image_argument, G_GNUC_UNUSED guint64 dummy,
- G_GNUC_UNUSED guint64 dummy2, gchar *full_name)
-{
- MonoImage *image = (MonoImage *) GUINT_TO_POINTER ((gsize) image_argument);
- gchar *name_space, *name, *pos;
- MonoClass *klass;
-
- pos = strrchr (full_name, '.');
- if (pos) {
- name_space = full_name;
- *pos = 0;
- name = pos + 1;
- } else {
- name = full_name;
- name_space = NULL;
- }
-
- klass = mono_class_from_name (image, name_space ? name_space : "", name);
- if (!klass)
- return -1;
-
- mono_class_init (klass);
- mono_class_setup_methods (klass);
- return (gint64) (gssize) klass;
-}
-
-static guint64
-debugger_run_finally (guint64 context_argument, G_GNUC_UNUSED guint64 dummy)
-{
- mono_debugger_run_finally (GUINT_TO_POINTER ((gsize)context_argument));
- return 0;
-}
-
-static guint64
-debugger_class_get_static_field_data (guint64 value)
-{
- MonoClass *klass = GUINT_TO_POINTER ((gsize) value);
- MonoVTable *vtable = mono_class_vtable (mono_domain_get (), klass);
- return (guint64) (gsize) mono_vtable_get_static_field_data (vtable);
-}
-
-static guint64
-debugger_insert_method_breakpoint (guint64 method_argument, guint64 index)
-{
- MonoMethod *method = GUINT_TO_POINTER ((gsize) method_argument);
- MonoDebugMethodAddressList *info;
-
- mono_debugger_lock ();
-
- if (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) {
- const char *name = method->name;
- MonoMethod *nm = NULL;
-
- if (method->klass->parent == mono_defaults.multicastdelegate_class) {
- if (*name == 'I' && (strcmp (name, "Invoke") == 0))
- nm = mono_marshal_get_delegate_invoke (method, NULL);
- else if (*name == 'B' && (strcmp (name, "BeginInvoke") == 0))
- nm = mono_marshal_get_delegate_begin_invoke (method);
- else if (*name == 'E' && (strcmp (name, "EndInvoke") == 0))
- nm = mono_marshal_get_delegate_end_invoke (method);
- }
-
- if (!nm) {
- mono_debugger_unlock ();
- return 0;
- }
-
- method = nm;
- }
-
- info = mono_debugger_insert_method_breakpoint (method, index);
-
- mono_debugger_unlock ();
- return (guint64) (gsize) info;
-}
-
-static guint64
-debugger_insert_source_breakpoint (guint64 image_argument, guint64 token, guint64 index,
- const gchar *class_name)
-{
- MonoImage *image = GUINT_TO_POINTER ((gsize) image_argument);
- MonoDebugMethodAddressList *info;
- MonoClass *klass;
- int i;
-
- mono_debugger_lock ();
-
- klass = mono_debugger_register_class_init_callback (image, class_name, token, index);
- if (!klass || !klass->inited || !klass->methods) {
- mono_debugger_unlock ();
- return 0;
- }
-
- for (i = 0; i < klass->method.count; i++) {
- MonoMethod *method = klass->methods [i];
-
- if (method->token != token)
- continue;
-
- if (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) {
- const char *name = method->name;
- MonoMethod *nm = NULL;
-
- if (method->klass->parent == mono_defaults.multicastdelegate_class) {
- if (*name == 'I' && (strcmp (name, "Invoke") == 0))
- nm = mono_marshal_get_delegate_invoke (method, NULL);
- else if (*name == 'B' && (strcmp (name, "BeginInvoke") == 0))
- nm = mono_marshal_get_delegate_begin_invoke (method);
- else if (*name == 'E' && (strcmp (name, "EndInvoke") == 0))
- nm = mono_marshal_get_delegate_end_invoke (method);
- }
-
- if (!nm) {
- mono_debugger_unlock ();
- return 0;
- }
-
- method = nm;
- }
-
- info = mono_debug_lookup_method_addresses (method);
- mono_debugger_unlock ();
- return (guint64) (gsize) info;
- }
-
- mono_debugger_unlock ();
- return 0;
-}
-
-static void
-debugger_remove_breakpoint (guint64 index, G_GNUC_UNUSED guint64 dummy)
-{
- mono_debugger_lock ();
- mono_debugger_remove_method_breakpoint (index);
- mono_debugger_remove_class_init_callback (index);
- mono_debugger_unlock ();
-}
-
-static guint64
-debugger_register_class_init_callback (guint64 image_argument, guint64 token, guint64 index,
- const gchar *class_name)
-{
- MonoImage *image = GUINT_TO_POINTER ((gsize) image_argument);
- MonoClass *klass;
-
- mono_debugger_lock ();
- klass = mono_debugger_register_class_init_callback (image, class_name, token, index);
- mono_debugger_unlock ();
- return (guint64) (gsize) klass;
-}
-
-static void
-debugger_remove_class_init_callback (guint64 index, G_GNUC_UNUSED guint64 dummy)
-{
- mono_debugger_lock ();
- mono_debugger_remove_class_init_callback (index);
- mono_debugger_unlock ();
-}
-
-static guint64
-debugger_get_method_signature (guint64 method_arg, G_GNUC_UNUSED guint64 dummy)
-{
- MonoMethod *method = (MonoMethod *) GUINT_TO_POINTER ((gsize) method_arg);
- MonoMethodSignature *sig;
-
- sig = mono_method_signature (method);
- return (guint64) (gsize) sig;
-}
-
-static void
-debugger_event_handler (MonoDebuggerEvent event, guint64 data, guint64 arg)
-{
- MONO_DEBUGGER__notification_function (event, data, arg);
-}
-
-static void
-debugger_gc_thread_created (pthread_t thread, void *stack_ptr)
-{
- mono_debugger_event (MONO_DEBUGGER_EVENT_GC_THREAD_CREATED,
- (guint64) (gsize) stack_ptr, thread);
-}
-
-static void
-debugger_gc_thread_exited (pthread_t thread, void *stack_ptr)
-{
- mono_debugger_event (MONO_DEBUGGER_EVENT_GC_THREAD_EXITED,
- (guint64) (gsize) stack_ptr, thread);
-}
-
-static void
-debugger_gc_stop_world (void)
-{
- mono_debugger_event (MONO_DEBUGGER_EVENT_ACQUIRE_GLOBAL_THREAD_LOCK, 0, 0);
-}
-
-static void
-debugger_gc_start_world (void)
-{
- mono_debugger_event (MONO_DEBUGGER_EVENT_RELEASE_GLOBAL_THREAD_LOCK, 0, 0);
-}
-
-static GCThreadFunctions debugger_thread_vtable = {
- NULL,
-
- debugger_gc_thread_created,
- debugger_gc_thread_exited,
-
- debugger_gc_stop_world,
- debugger_gc_start_world
-};
-
-static void
-debugger_init_threads (void)
-{
- gc_thread_vtable = &debugger_thread_vtable;
-}
-
-#if 0
-
-static void
-debugger_finalize_threads (void)
-{
- gc_thread_vtable = NULL;
-}
-
-#endif
-
-static guint64
-debugger_init_code_buffer (void)
-{
- if (!debugger_executable_code_buffer)
- debugger_executable_code_buffer = mono_global_codeman_reserve (EXECUTABLE_CODE_BUFFER_SIZE);
- return (guint64) (gsize) debugger_executable_code_buffer;
-}
-
-extern MonoDebuggerInfo *MONO_DEBUGGER__debugger_info_ptr;
-extern long MONO_DEBUGGER__using_debugger;
-
-static void
-debugger_initialize (void)
-{
-}
-
-/**
- * Check whether we're running inside the debugger.
- *
- * There seems to be a bug in some versions of glibc which causes _dl_debug_state() being called with
- * RT_CONSISTENT before relocations are done.
- *
- * If that happens, the debugger cannot read the `MONO_DEBUGGER__debugger_info' structure at the time
- * the `libmono.so' library is loaded.
- *
- * As a workaround, the `mdb_debug_info' now also contains a global variable called
- * `MONO_DEBUGGER__using_debugger' which may we set to 1 by the debugger to tell us that we're running
- * inside the debugger.
- *
- * mini_init() checks this and calls mini_debugger_init() if necessary.
- *
- */
-
-gboolean
-mini_debug_running_inside_mdb (void)
-{
- return MONO_DEBUGGER__using_debugger || mono_debug_using_mono_debugger ();
-}
-
-void
-mini_debugger_init (void)
-{
- if (mono_debugger_event_handler) {
- g_warning (G_STRLOC ": duplicate call to mono_debugger_init()!");
- return;
- }
-
- debugger_executable_code_buffer = mono_global_codeman_reserve (EXECUTABLE_CODE_BUFFER_SIZE);
- mono_debugger_event_handler = debugger_event_handler;
-
- debugger_thread_abort_signal = mono_thread_get_abort_signal ();
-
- /*
- * Use an indirect call so gcc can't optimize it away.
- */
- MONO_DEBUGGER__debugger_info.initialize ();
-
- debugger_init_threads ();
-
- /*
- * Initialize the thread manager.
- *
- * NOTE: We only reference the `MONO_DEBUGGER__debugger_info_ptr' here to prevent the
- * linker from removing the .mdb_debug_info section.
- */
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_INITIALIZE_THREAD_MANAGER,
- (guint64) (gssize) MONO_DEBUGGER__debugger_info_ptr, 0);
-}
-
-void
-mini_debugger_set_attach_ok (void)
-{
- debugger_thread_abort_signal = mono_thread_get_abort_signal ();
- MONO_DEBUGGER__debugger_info.runtime_flags |= DEBUGGER_RUNTIME_FLAGS_ATTACH_OK;
-}
-
-typedef struct
-{
- MonoDomain *domain;
- const char *file;
-} DebuggerThreadArgs;
-
-typedef struct
-{
- MonoDomain *domain;
- MonoMethod *method;
- int argc;
- char **argv;
-} MainThreadArgs;
-
-static guint32
-main_thread_handler (gpointer user_data)
-{
- MainThreadArgs *main_args = (MainThreadArgs *) user_data;
-
- return mono_runtime_run_main (main_args->method, main_args->argc, main_args->argv, NULL);
-}
-
-int
-mini_debugger_main (MonoDomain *domain, MonoAssembly *assembly, int argc, char **argv)
-{
- MainThreadArgs main_args;
- MonoImage *image;
- MonoMethod *main_method;
-
- /*
- * Get and compile the main function.
- */
-
- image = mono_assembly_get_image (assembly);
- main_method = mono_get_method (image, mono_image_get_entry_point (image), NULL);
-
- /*
- * Initialize managed code.
- */
- mono_debugger_event (MONO_DEBUGGER_EVENT_INITIALIZE_MANAGED_CODE,
- (guint64) (gssize) main_method, 0);
-
- /*
- * Start the main thread and wait until it's ready.
- */
-
- main_args.domain = domain;
- main_args.method = main_method;
- main_args.argc = argc;
- main_args.argv = argv;
-
-#if RUN_IN_SUBTHREAD
- mono_thread_create (domain, main_thread_handler, &main_args);
-#else
- main_thread_handler (&main_args);
-#endif
-
- mono_thread_manage ();
-
- /*
- * This will never return.
- */
- mono_debugger_event (MONO_DEBUGGER_EVENT_WRAPPER_MAIN, 0, 0);
-
- return 0;
-}
-#endif /* MONO_DEBUGGER_SUPPORTED */
diff --git a/mono/mini/debug-debugger.h b/mono/mini/debug-debugger.h
deleted file mode 100644
index b7c5b43e6d..0000000000
--- a/mono/mini/debug-debugger.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * This is a private header file for the debugger.
- */
-
-#ifndef __DEBUG_DEBUGGER_H__
-#define __DEBUG_DEBUGGER_H__
-
-#if !defined _IN_THE_MONO_DEBUGGER
-#error "<debug-debugger.h> is a private header file only intended to be used by the debugger."
-#endif
-
-#include <mono/metadata/class-internals.h>
-#include <mono/metadata/mono-debug-debugger.h>
-#include <libgc/include/libgc-mono-debugger.h>
-#include "debug-mini.h"
-
-typedef struct _MonoDebuggerInfo MonoDebuggerInfo;
-typedef struct _MonoDebuggerMetadataInfo MonoDebuggerMetadataInfo;
-
-/*
- * Address of the x86 trampoline code. This is used by the debugger to check
- * whether a method is a trampoline.
- */
-extern guint8 *mono_trampoline_code [];
-
-typedef enum {
- DEBUGGER_RUNTIME_FLAGS_NONE = 0,
- DEBUGGER_RUNTIME_FLAGS_ATTACH_OK = 1
-} MonoDebuggerRuntimeFlags;
-
-/*
- * There's a global data symbol called `MONO_DEBUGGER__debugger_info' which
- * contains pointers to global variables and functions which must be accessed
- * by the debugger.
- */
-struct _MonoDebuggerInfo {
- guint64 magic;
- guint32 major_version;
- guint32 minor_version;
- guint32 runtime_flags;
- guint32 total_size;
- guint32 symbol_table_size;
- guint32 mono_trampoline_num;
- guint8 **mono_trampoline_code;
- gpointer notification_function;
- MonoSymbolTable **symbol_table;
- MonoDebuggerMetadataInfo *metadata_info;
- gint32 *debugger_version;
-
- guint64 (*compile_method) (guint64 method_argument);
- guint64 (*get_virtual_method) (guint64 object_argument, guint64 method_argument);
- guint64 (*get_boxed_object_method) (guint64 klass_argument, guint64 val_argument);
- MonoInvokeFunc runtime_invoke;
- guint64 (*class_get_static_field_data) (guint64 klass);
- guint64 (*run_finally) (guint64 argument1, guint64 argument2);
- void (*initialize) (void);
-
- guint64 (*create_string) (G_GNUC_UNUSED guint64 dummy1, G_GNUC_UNUSED guint64 dummy2,
- G_GNUC_UNUSED guint64 dummy3, const gchar *string_argument);
- gint64 (*lookup_class) (guint64 image_argument, G_GNUC_UNUSED guint64 dummy,
- G_GNUC_UNUSED guint64 dummy2, gchar *full_name);
-
- guint64 (*insert_method_breakpoint) (guint64 method_argument, guint64 index);
- guint64 (*insert_source_breakpoint) (guint64 image_argument, guint64 token,
- guint64 index, const gchar *class_name);
- void (*remove_breakpoint) (guint64 index, G_GNUC_UNUSED guint64 dummy);
-
- guint64 (*rgister_class_init_callback) (guint64 image_argument, guint64 token,
- guint64 index, const gchar *class_name);
- void (*remove_class_init_callback) (guint64 index, G_GNUC_UNUSED guint64 dummy);
-
- MonoDebuggerThreadInfo **thread_table;
-
- guint8 **executable_code_buffer;
- MonoBreakpointInfo *mono_breakpoint_info;
- gssize *mono_breakpoint_info_index;
-
- guint32 executable_code_buffer_size;
- guint32 breakpoint_array_size;
-
- guint64 (*get_method_signature) (guint64 method_argument, G_GNUC_UNUSED guint64 dummy);
- guint64 (*init_code_buffer) (void);
-
- /*
- * These are only needed when attaching.
- */
- GCThreadFunctions **thread_vtable_ptr;
- GCThreadFunctions *debugger_thread_vtable;
- void (**event_handler_ptr) (MonoDebuggerEvent event, guint64 data, guint64 arg);
- void (*debugger_event_handler) (MonoDebuggerEvent event, guint64 data, guint64 arg);
- gint32 *using_mono_debugger;
- gint32 *interruption_request;
-
- guint64 (*abort_runtime_invoke) (G_GNUC_UNUSED guint64 dummy1, G_GNUC_UNUSED guint64 dummy2);
-
- guint32 *thread_abort_signal;
-};
-
-struct _MonoDebuggerMetadataInfo {
- int size;
- int mono_defaults_size;
- MonoDefaults *mono_defaults;
- int type_size;
- int array_type_size;
- int klass_size;
- int thread_size;
- int thread_tid_offset;
- int thread_stack_ptr_offset;
- int thread_end_stack_offset;
- int klass_image_offset;
- int klass_instance_size_offset;
- int klass_parent_offset;
- int klass_token_offset;
- int klass_field_offset;
- int klass_methods_offset;
- int klass_method_count_offset;
- int klass_this_arg_offset;
- int klass_byval_arg_offset;
- int klass_generic_class_offset;
- int klass_generic_container_offset;
- int klass_vtable_offset;
- int field_info_size;
- int field_info_type_offset;
- int field_info_offset_offset;
- int mono_defaults_corlib_offset;
- int mono_defaults_object_offset;
- int mono_defaults_byte_offset;
- int mono_defaults_void_offset;
- int mono_defaults_boolean_offset;
- int mono_defaults_sbyte_offset;
- int mono_defaults_int16_offset;
- int mono_defaults_uint16_offset;
- int mono_defaults_int32_offset;
- int mono_defaults_uint32_offset;
- int mono_defaults_int_offset;
- int mono_defaults_uint_offset;
- int mono_defaults_int64_offset;
- int mono_defaults_uint64_offset;
- int mono_defaults_single_offset;
- int mono_defaults_double_offset;
- int mono_defaults_char_offset;
- int mono_defaults_string_offset;
- int mono_defaults_enum_offset;
- int mono_defaults_array_offset;
- int mono_defaults_delegate_offset;
- int mono_defaults_exception_offset;
- int mono_method_klass_offset;
- int mono_method_token_offset;
- int mono_method_flags_offset;
- int mono_method_inflated_offset;
- int mono_vtable_klass_offset;
- int mono_vtable_vtable_offset;
-};
-
-#endif
diff --git a/mono/mini/debug-mini.c b/mono/mini/debug-mini.c
index f45f63f6b9..61c055a1da 100644
--- a/mono/mini/debug-mini.c
+++ b/mono/mini/debug-mini.c
@@ -18,14 +18,9 @@
#define _IN_THE_MONO_DEBUGGER
#include <mono/metadata/mono-debug-debugger.h>
-#include "debug-mini.h"
#include <mono/utils/valgrind.h>
-#ifdef MONO_DEBUGGER_SUPPORTED
-#include <libgc/include/libgc-mono-debugger.h>
-#endif
-
typedef struct {
guint32 index;
MonoMethodDesc *desc;
@@ -39,64 +34,6 @@ typedef struct
guint32 breakpoint_id;
} MiniDebugMethodInfo;
-typedef struct {
- MonoObject *last_exception;
- guint32 stopped_on_exception : 1;
- guint32 stopped_on_unhandled : 1;
-} MonoDebuggerExceptionState;
-
-typedef enum {
- MONO_DEBUGGER_THREAD_FLAGS_NONE = 0,
- MONO_DEBUGGER_THREAD_FLAGS_INTERNAL = 1,
- MONO_DEBUGGER_THREAD_FLAGS_THREADPOOL = 2
-} MonoDebuggerThreadFlags;
-
-typedef enum {
- MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_NONE = 0,
- MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE = 1,
- MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED = 2
-} MonoDebuggerInternalThreadFlags;
-
-struct _MonoDebuggerThreadInfo {
- guint64 tid;
- guint64 lmf_addr;
- guint64 end_stack;
-
- guint64 extended_notifications;
-
- /* Next pointer. */
- MonoDebuggerThreadInfo *next;
-
- /*
- * The stack bounds are only used when reading a core file.
- */
- guint64 stack_start;
- guint64 signal_stack_start;
- guint32 stack_size;
- guint32 signal_stack_size;
-
- guint32 thread_flags;
-
- /*
- * The debugger doesn't access anything beyond this point.
- */
- MonoDebuggerExceptionState exception_state;
-
- guint32 internal_flags;
-
- MonoJitTlsData *jit_tls;
- MonoInternalThread *thread;
-};
-
-typedef struct {
- gpointer stack_pointer;
- MonoObject *exception_obj;
- guint32 stop;
- guint32 stop_unhandled;
-} MonoDebuggerExceptionInfo;
-
-MonoDebuggerThreadInfo *mono_debugger_thread_table = NULL;
-
static inline void
record_line_number (MiniDebugMethodInfo *info, guint32 address, guint32 offset)
{
@@ -114,7 +51,7 @@ mono_debug_init_method (MonoCompile *cfg, MonoBasicBlock *start_block, guint32 b
{
MiniDebugMethodInfo *info;
- if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
+ if (!mono_debug_enabled ())
return;
info = g_new0 (MiniDebugMethodInfo, 1);
@@ -164,8 +101,12 @@ write_variable (MonoInst *inst, MonoDebugVarInfo *var)
} else if (inst->opcode == OP_GSHAREDVT_LOCAL) {
var->index = inst->inst_imm | MONO_DEBUG_VAR_ADDRESS_MODE_GSHAREDVT_LOCAL;
} else if (inst->opcode == OP_VTARG_ADDR) {
- var->offset = inst->inst_offset;
- var->index = inst->inst_basereg | MONO_DEBUG_VAR_ADDRESS_MODE_VTADDR;
+ MonoInst *vtaddr;
+
+ vtaddr = inst->inst_left;
+ g_assert (vtaddr->opcode == OP_REGOFFSET);
+ var->offset = vtaddr->inst_offset;
+ var->index = vtaddr->inst_basereg | MONO_DEBUG_VAR_ADDRESS_MODE_VTADDR;
} else {
g_assert_not_reached ();
}
@@ -334,8 +275,6 @@ mono_debug_close_method (MonoCompile *cfg)
mono_debug_add_vg_method (method, jit);
- mono_debugger_check_breakpoints (method, debug_info);
-
mono_debug_free_method_jit_info (jit);
mono_debug_free_method (cfg);
}
@@ -651,7 +590,7 @@ mono_debug_add_aot_method (MonoDomain *domain, MonoMethod *method, guint8 *code_
{
MonoDebugMethodJitInfo *jit;
- if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
+ if (!mono_debug_enabled ())
return;
if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
@@ -673,15 +612,6 @@ mono_debug_add_aot_method (MonoDomain *domain, MonoMethod *method, guint8 *code_
mono_debug_free_method_jit_info (jit);
}
-void
-mono_debug_add_icall_wrapper (MonoMethod *method, MonoJitICallInfo* callinfo)
-{
- if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
- return;
-
- // mono_debug_add_wrapper (method, callinfo->wrapper, callinfo->func);
-}
-
static void
print_var_info (MonoDebugVarInfo *info, int idx, const char *name, const char *type)
{
@@ -729,14 +659,14 @@ mono_debug_print_vars (gpointer ip, gboolean only_arguments)
if (!ji)
return;
- jit = mono_debug_find_method (mono_jit_info_get_method (ji), domain);
+ jit = mono_debug_find_method (jinfo_get_method (ji), domain);
if (!jit)
return;
if (only_arguments) {
char **names;
names = g_new (char *, jit->num_params);
- mono_method_get_param_names (mono_jit_info_get_method (ji), (const char **) names);
+ mono_method_get_param_names (jinfo_get_method (ji), (const char **) names);
if (jit->this_var)
print_var_info (jit->this_var, 0, "this", "Arg");
for (i = 0; i < jit->num_params; ++i) {
@@ -761,7 +691,7 @@ mono_debug_print_vars (gpointer ip, gboolean only_arguments)
static GPtrArray *breakpoints = NULL;
-int
+static int
mono_debugger_insert_breakpoint_full (MonoMethodDesc *desc)
{
static int last_breakpoint_id = 0;
@@ -779,29 +709,7 @@ mono_debugger_insert_breakpoint_full (MonoMethodDesc *desc)
return info->index;
}
-int
-mono_debugger_remove_breakpoint (int breakpoint_id)
-{
- int i;
-
- if (!breakpoints)
- return 0;
-
- for (i = 0; i < breakpoints->len; i++) {
- MiniDebugBreakpointInfo *info = g_ptr_array_index (breakpoints, i);
-
- if (info->index != breakpoint_id)
- continue;
-
- mono_method_desc_free (info->desc);
- g_ptr_array_remove (breakpoints, info);
- g_free (info);
- return 1;
- }
-
- return 0;
-}
-
+/*FIXME This is part of the public API by accident, remove it from there when possible. */
int
mono_debugger_insert_breakpoint (const gchar *method_name, gboolean include_namespace)
{
@@ -814,6 +722,7 @@ mono_debugger_insert_breakpoint (const gchar *method_name, gboolean include_name
return mono_debugger_insert_breakpoint_full (desc);
}
+/*FIXME This is part of the public API by accident, remove it from there when possible. */
int
mono_debugger_method_has_breakpoint (MonoMethod *method)
{
@@ -833,441 +742,3 @@ mono_debugger_method_has_breakpoint (MonoMethod *method)
return 0;
}
-
-void
-mono_debugger_breakpoint_callback (MonoMethod *method, guint32 index)
-{
- mono_debugger_event (MONO_DEBUGGER_EVENT_JIT_BREAKPOINT, (guint64) (gsize) method, index);
-}
-
-void
-mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit_tls, gpointer func)
-{
-#ifdef MONO_DEBUGGER_SUPPORTED
- size_t stsize = 0;
- guint8 *staddr = NULL;
- MonoDebuggerThreadInfo *info;
-
- if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
- return;
-
- mono_debugger_lock ();
-
- mono_thread_get_stack_bounds (&staddr, &stsize);
-
- info = g_new0 (MonoDebuggerThreadInfo, 1);
- info->tid = tid;
- info->thread = thread->internal_thread;
- info->stack_start = (guint64) (gsize) staddr;
- info->signal_stack_start = (guint64) (gsize) jit_tls->signal_stack;
- info->stack_size = stsize;
- info->signal_stack_size = jit_tls->signal_stack_size;
- info->end_stack = (guint64) (gsize) GC_mono_debugger_get_stack_ptr ();
- info->lmf_addr = (guint64) (gsize) mono_get_lmf_addr ();
- info->jit_tls = jit_tls;
-
- if (func)
- info->thread_flags = MONO_DEBUGGER_THREAD_FLAGS_INTERNAL;
- if (thread->internal_thread->threadpool_thread)
- info->thread_flags |= MONO_DEBUGGER_THREAD_FLAGS_THREADPOOL;
-
- info->next = mono_debugger_thread_table;
- mono_debugger_thread_table = info;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_THREAD_CREATED,
- tid, (guint64) (gsize) info);
-
- mono_debugger_unlock ();
-#endif /* MONO_DEBUGGER_SUPPORTED */
-}
-
-void
-mono_debugger_thread_cleanup (MonoJitTlsData *jit_tls)
-{
-#ifdef MONO_DEBUGGER_SUPPORTED
- MonoDebuggerThreadInfo **ptr;
-
- if (mono_debug_format == MONO_DEBUG_FORMAT_NONE)
- return;
-
- mono_debugger_lock ();
-
- for (ptr = &mono_debugger_thread_table; *ptr; ptr = &(*ptr)->next) {
- MonoDebuggerThreadInfo *info = *ptr;
-
- if (info->jit_tls != jit_tls)
- continue;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_THREAD_CLEANUP,
- info->tid, (guint64) (gsize) info);
-
- *ptr = info->next;
- g_free (info);
- break;
- }
-
- mono_debugger_unlock ();
-#endif
-}
-
-void
-mono_debugger_extended_notification (MonoDebuggerEvent event, guint64 data, guint64 arg)
-{
-#ifdef MONO_DEBUGGER_SUPPORTED
- MonoDebuggerThreadInfo **ptr;
- MonoInternalThread *thread = mono_thread_internal_current ();
-
- if (!mono_debug_using_mono_debugger ())
- return;
-
- mono_debugger_lock ();
-
- for (ptr = &mono_debugger_thread_table; *ptr; ptr = &(*ptr)->next) {
- MonoDebuggerThreadInfo *info = *ptr;
-
- if (info->thread != thread)
- continue;
-
- if ((info->extended_notifications & (int) event) == 0)
- continue;
-
- mono_debugger_event (event, data, arg);
- }
-
- mono_debugger_unlock ();
-#endif
-}
-
-void
-mono_debugger_trampoline_compiled (const guint8 *trampoline, MonoMethod *method, const guint8 *code)
-{
-#ifdef MONO_DEBUGGER_SUPPORTED
- struct {
- const guint8 * trampoline;
- MonoMethod *method;
- const guint8 *code;
- } info = { trampoline, method, code };
-
- mono_debugger_extended_notification (MONO_DEBUGGER_EVENT_OLD_TRAMPOLINE,
- (guint64) (gsize) method, (guint64) (gsize) code);
- mono_debugger_extended_notification (MONO_DEBUGGER_EVENT_TRAMPOLINE,
- (guint64) (gsize) &info, 0);
-#endif
-}
-
-#if MONO_DEBUGGER_SUPPORTED
-static MonoDebuggerThreadInfo *
-find_debugger_thread_info (MonoInternalThread *thread)
-{
- MonoDebuggerThreadInfo **ptr;
-
- for (ptr = &mono_debugger_thread_table; *ptr; ptr = &(*ptr)->next) {
- MonoDebuggerThreadInfo *info = *ptr;
-
- if (info->thread == thread)
- return info;
- }
-
- return NULL;
-}
-#endif
-
-MonoDebuggerExceptionAction
-_mono_debugger_throw_exception (gpointer addr, gpointer stack, MonoObject *exc)
-{
-#ifdef MONO_DEBUGGER_SUPPORTED
- MonoDebuggerExceptionInfo exc_info;
- MonoDebuggerThreadInfo *thread_info;
-
- if (!mono_debug_using_mono_debugger ())
- return MONO_DEBUGGER_EXCEPTION_ACTION_NONE;
-
- mono_debugger_lock ();
-
- thread_info = find_debugger_thread_info (mono_thread_internal_current ());
- if (!thread_info) {
- mono_debugger_unlock ();
- return MONO_DEBUGGER_EXCEPTION_ACTION_NONE;
- }
-
- if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) {
- mono_debugger_unlock ();
- return MONO_DEBUGGER_EXCEPTION_ACTION_NONE;
- }
-
- if (thread_info->exception_state.stopped_on_exception ||
- thread_info->exception_state.stopped_on_unhandled) {
- thread_info->exception_state.stopped_on_exception = 0;
- mono_debugger_unlock ();
- return MONO_DEBUGGER_EXCEPTION_ACTION_NONE;
- }
-
- /* Protect the exception object from being garbage collected. */
-
- thread_info->exception_state.stopped_on_unhandled = 0;
- thread_info->exception_state.stopped_on_exception = 1;
- thread_info->exception_state.last_exception = exc;
-
- /*
- * Backwards compatibility:
- *
- * Older debugger versions only know `exc_info.stop' and older runtime versions check
- * `exc_info.stop != 0'.
- *
- * The debugger must check for `mono_debug_debugger_version >= 5' before accessing the
- * `stop_unhandled' field.
- */
-
- exc_info.stack_pointer = stack;
- exc_info.exception_obj = exc;
- exc_info.stop = 0;
- exc_info.stop_unhandled = 0;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_THROW_EXCEPTION, (guint64) (gsize) &exc_info,
- (guint64) (gsize) addr);
-
- if (!exc_info.stop) {
- thread_info->exception_state.stopped_on_exception = 0;
- thread_info->exception_state.last_exception = NULL;
- }
-
- mono_debugger_unlock ();
-
- if (exc_info.stop)
- return MONO_DEBUGGER_EXCEPTION_ACTION_STOP;
- else if (exc_info.stop_unhandled)
- return MONO_DEBUGGER_EXCEPTION_ACTION_STOP_UNHANDLED;
-#endif
-
- return MONO_DEBUGGER_EXCEPTION_ACTION_NONE;
-}
-
-gboolean
-_mono_debugger_unhandled_exception (gpointer addr, gpointer stack, MonoObject *exc)
-{
-#ifdef MONO_DEBUGGER_SUPPORTED
- MonoDebuggerThreadInfo *thread_info;
-
- if (!mono_debug_using_mono_debugger ())
- return FALSE;
-
- if (exc) {
- const gchar *name = mono_class_get_name (mono_object_get_class (exc));
- if (!strcmp (name, "ThreadAbortException"))
- return FALSE;
- }
-
- mono_debugger_lock ();
-
- thread_info = find_debugger_thread_info (mono_thread_internal_current ());
- if (!thread_info) {
- mono_debugger_unlock ();
- return FALSE;
- }
-
- if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) {
- mono_debugger_unlock ();
- return FALSE;
- }
-
- if (thread_info->exception_state.stopped_on_unhandled) {
- thread_info->exception_state.stopped_on_unhandled = 0;
- mono_debugger_unlock ();
- return FALSE;
- }
-
- thread_info->exception_state.stopped_on_unhandled = 1;
- thread_info->exception_state.last_exception = exc;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_UNHANDLED_EXCEPTION,
- (guint64) (gsize) exc, (guint64) (gsize) addr);
-
- return TRUE;
-#else
- return FALSE;
-#endif
-}
-
-/*
- * mono_debugger_call_exception_handler:
- *
- * Called from mono_handle_exception_internal() to tell the debugger that we're about
- * to invoke an exception handler.
- *
- * The debugger may choose to set a breakpoint at @addr. This is used if the user is
- * single-stepping from a `try' into a `catch' block, for instance.
- */
-
-void
-mono_debugger_call_exception_handler (gpointer addr, gpointer stack, MonoObject *exc)
-{
-#ifdef MONO_DEBUGGER_SUPPORTED
- MonoDebuggerThreadInfo *thread_info;
- MonoDebuggerExceptionInfo exc_info;
-
- if (!mono_debug_using_mono_debugger ())
- return;
-
- mono_debugger_lock ();
-
- thread_info = find_debugger_thread_info (mono_thread_internal_current ());
- if (!thread_info) {
- mono_debugger_unlock ();
- return;
- }
-
- if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) {
- mono_debugger_unlock ();
- return;
- }
-
- // Prevent the object from being finalized.
- thread_info->exception_state.last_exception = exc;
-
- exc_info.stack_pointer = stack;
- exc_info.exception_obj = exc;
- exc_info.stop = 0;
- exc_info.stop_unhandled = 0;
-
- mono_debugger_event (MONO_DEBUGGER_EVENT_HANDLE_EXCEPTION, (guint64) (gsize) &exc_info,
- (guint64) (gsize) addr);
-
- mono_debugger_unlock ();
-#endif
-}
-
-#ifdef MONO_DEBUGGER_SUPPORTED
-
-static gchar *
-get_exception_message (MonoObject *exc)
-{
- char *message = NULL;
- MonoString *str;
- MonoMethod *method;
- MonoClass *klass;
- gint i;
-
- if (mono_object_isinst (exc, mono_defaults.exception_class)) {
- klass = exc->vtable->klass;
- method = NULL;
- while (klass && method == NULL) {
- for (i = 0; i < klass->method.count; ++i) {
- method = klass->methods [i];
- if (!strcmp ("ToString", method->name) &&
- mono_method_signature (method)->param_count == 0 &&
- method->flags & METHOD_ATTRIBUTE_VIRTUAL &&
- method->flags & METHOD_ATTRIBUTE_PUBLIC) {
- break;
- }
- method = NULL;
- }
-
- if (method == NULL)
- klass = klass->parent;
- }
-
- g_assert (method);
-
- str = (MonoString *) mono_runtime_invoke (method, exc, NULL, NULL);
- if (str)
- message = mono_string_to_utf8 (str);
- }
-
- return message;
-}
-
-MonoObject *
-mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc)
-{
- MonoDebuggerThreadInfo *thread_info;
- MonoDebuggerExceptionState saved_exception_state;
- MonoObject *retval;
- gchar *message;
-
- mono_debugger_lock ();
-
- thread_info = find_debugger_thread_info (mono_thread_internal_current ());
- if (!thread_info) {
- mono_debugger_unlock ();
- return NULL;
- }
-
- saved_exception_state = thread_info->exception_state;
-
- thread_info->exception_state.last_exception = NULL;
- thread_info->exception_state.stopped_on_unhandled = 0;
- thread_info->exception_state.stopped_on_exception = 0;
-
- thread_info->internal_flags |= MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE;
-
- mono_debugger_unlock ();
-
- if (!strcmp (method->name, ".ctor")) {
- retval = obj = mono_object_new (mono_domain_get (), method->klass);
-
- mono_runtime_invoke (method, obj, params, exc);
- } else
- retval = mono_runtime_invoke (method, obj, params, exc);
-
- mono_debugger_lock ();
-
- thread_info->exception_state = saved_exception_state;
- thread_info->internal_flags &= ~MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE;
-
- if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) {
- thread_info->internal_flags &= ~MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED;
- mono_thread_internal_reset_abort (thread_info->thread);
-
- mono_debugger_unlock ();
-
- *exc = NULL;
- return NULL;
- }
-
- mono_debugger_unlock ();
-
- if (!exc || (*exc == NULL))
- return retval;
-
- retval = *exc;
- message = get_exception_message (*exc);
- if (message) {
- *exc = (MonoObject *) mono_string_new_wrapper (message);
- g_free (message);
- }
-
- return retval;
-}
-
-gboolean
-mono_debugger_abort_runtime_invoke ()
-{
- MonoInternalThread *thread = mono_thread_internal_current ();
- MonoDebuggerThreadInfo *thread_info;
-
- mono_debugger_lock ();
-
- thread_info = find_debugger_thread_info (thread);
- if (!thread_info) {
- mono_debugger_unlock ();
- return FALSE;
- }
-
- if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_IN_RUNTIME_INVOKE) == 0) {
- mono_debugger_unlock ();
- return FALSE;
- }
-
- if ((thread_info->internal_flags & MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED) != 0) {
- mono_debugger_unlock ();
- return TRUE;
- }
-
- thread_info->internal_flags |= MONO_DEBUGGER_INTERNAL_THREAD_FLAGS_ABORT_REQUESTED;
- ves_icall_System_Threading_Thread_Abort (thread_info->thread, NULL);
-
- mono_debugger_unlock ();
- return TRUE;
-}
-
-#endif
diff --git a/mono/mini/debug-mini.h b/mono/mini/debug-mini.h
deleted file mode 100644
index 649c30c0fb..0000000000
--- a/mono/mini/debug-mini.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef __DEBUG_MINI_H__
-#define __DEBUG_MINI_H__
-
-#include <mono/metadata/class-internals.h>
-#include <mono/metadata/mono-debug-debugger.h>
-
-#include "mini.h"
-
-typedef struct _MonoDebuggerThreadInfo MonoDebuggerThreadInfo;
-extern MonoDebuggerThreadInfo *mono_debugger_thread_table;
-
-MONO_API void
-mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit_tls, gpointer func);
-
-MONO_API void
-mono_debugger_thread_cleanup (MonoJitTlsData *jit_tls);
-
-MONO_API void
-mono_debugger_extended_notification (MonoDebuggerEvent event, guint64 data, guint64 arg);
-
-MONO_API void
-mono_debugger_trampoline_compiled (const guint8 *trampoline, MonoMethod *method, const guint8 *code);
-
-MONO_API void
-mono_debugger_call_exception_handler (gpointer addr, gpointer stack, MonoObject *exc);
-
-MONO_API gboolean
-mono_debugger_handle_exception (MonoContext *ctx, MonoObject *obj);
-
-MONO_API MonoObject *
-mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc);
-
-MONO_API gboolean
-mono_debugger_abort_runtime_invoke (void);
-
-/*
- * Internal exception API.
- */
-
-typedef enum {
- MONO_DEBUGGER_EXCEPTION_ACTION_NONE = 0,
- MONO_DEBUGGER_EXCEPTION_ACTION_STOP = 1,
- MONO_DEBUGGER_EXCEPTION_ACTION_STOP_UNHANDLED = 2
-} MonoDebuggerExceptionAction;
-
-MonoDebuggerExceptionAction
-_mono_debugger_throw_exception (gpointer addr, gpointer stack, MonoObject *exc);
-
-gboolean
-_mono_debugger_unhandled_exception (gpointer addr, gpointer stack, MonoObject *exc);
-
-/*
- * This is the old breakpoint interface.
- * It isn't used by the debugger anymore, but still when using the `--break' command
- * line argument.
- */
-
-int mono_debugger_insert_breakpoint_full (MonoMethodDesc *desc);
-int mono_debugger_remove_breakpoint (int breakpoint_id);
-void mono_debugger_breakpoint_callback (MonoMethod *method, guint32 idx);
-
-#endif
diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c
index 5db8bdeb12..1e5e267d0c 100755
--- a/mono/mini/debugger-agent.c
+++ b/mono/mini/debugger-agent.c
@@ -69,6 +69,7 @@ int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
#include <mono/metadata/mono-debug-debugger.h>
#include <mono/metadata/debug-mono-symfile.h>
#include <mono/metadata/gc-internal.h>
+#include <mono/metadata/environment.h>
#include <mono/metadata/threads-types.h>
#include <mono/metadata/socket-io.h>
#include <mono/metadata/assembly.h>
@@ -124,6 +125,7 @@ typedef struct {
gboolean embedding;
gboolean defer;
int keepalive;
+ gboolean setpgid;
} AgentConfig;
typedef struct
@@ -283,7 +285,7 @@ typedef struct {
#define HEADER_LENGTH 11
#define MAJOR_VERSION 2
-#define MINOR_VERSION 24
+#define MINOR_VERSION 27
typedef enum {
CMD_SET_VM = 1,
@@ -367,7 +369,8 @@ typedef enum {
typedef enum {
STEP_FILTER_NONE = 0,
STEP_FILTER_STATIC_CTOR = 1,
- STEP_FILTER_DEBUGGER_HIDDEN = 2
+ STEP_FILTER_DEBUGGER_HIDDEN = 2,
+ STEP_FILTER_DEBUGGER_STEP_THROUGH = 4
} StepFilter;
typedef enum {
@@ -528,7 +531,7 @@ typedef struct {
GHashTable *type_names; /* For kind == MONO_KIND_TYPE_NAME_ONLY */
StepFilter filter; /* For kind == MOD_KIND_STEP */
} data;
- gboolean caught, uncaught; /* For kind == MOD_KIND_EXCEPTION_ONLY */
+ gboolean caught, uncaught, subclasses; /* For kind == MOD_KIND_EXCEPTION_ONLY */
} Modifier;
typedef struct{
@@ -557,6 +560,8 @@ typedef struct {
gboolean global;
/* The list of breakpoints used to implement step-over */
GSList *bps;
+ /* The number of frames at the start of a step-over */
+ int nframes;
} SingleStepReq;
/*
@@ -797,6 +802,7 @@ print_usage (void)
fprintf (stderr, " timeout=<n>\t\t\tTimeout for connecting in milliseconds.\n");
fprintf (stderr, " server=y/n\t\t\tWhether to listen for a client connection.\n");
fprintf (stderr, " keepalive=<n>\t\t\tSend keepalive events every n milliseconds.\n");
+ fprintf (stderr, " setpgid=y/n\t\t\tWhether to call setpid(0, 0) after startup.\n");
fprintf (stderr, " help\t\t\t\tPrint this help.\n");
}
@@ -871,6 +877,8 @@ mono_debugger_agent_parse_options (char *options)
agent_config.embedding = atoi (arg + 10) == 1;
} else if (strncmp (arg, "keepalive=", 10) == 0) {
agent_config.keepalive = atoi (arg + 10);
+ } else if (strncmp (arg, "setpgid=", 8) == 0) {
+ agent_config.setpgid = parse_flag ("setpgid", arg + 8);
} else {
print_usage ();
exit (1);
@@ -984,6 +992,11 @@ mono_debugger_agent_init (void)
*/
mini_get_debug_options ()->load_aot_jit_info_eagerly = TRUE;
+#ifdef HAVE_SETPGID
+ if (agent_config.setpgid)
+ setpgid (0, 0);
+#endif
+
if (!agent_config.onuncaught && !agent_config.onthrow)
finish_agent_init (TRUE);
}
@@ -1563,9 +1576,7 @@ stop_debugger_thread (void)
static void
start_debugger_thread (void)
{
- gsize tid;
-
- debugger_thread_handle = mono_create_thread (NULL, 0, debugger_thread, NULL, 0, &tid);
+ debugger_thread_handle = mono_threads_create_thread (debugger_thread, NULL, 0, 0, NULL);
g_assert (debugger_thread_handle);
}
@@ -2457,7 +2468,7 @@ thread_interrupt (DebuggerTlsData *tls, MonoThreadInfo *info, void *sigctx, Mono
if (ji) {
/* Running managed code, will be suspended by the single step code */
- DEBUG (1, fprintf (log_file, "[%p] Received interrupt while at %s(%p), continuing.\n", (gpointer)(gsize)tid, ji->method->name, ip));
+ DEBUG (1, fprintf (log_file, "[%p] Received interrupt while at %s(%p), continuing.\n", (gpointer)(gsize)tid, jinfo_get_method (ji)->name, ip));
return TRUE;
} else {
/*
@@ -2480,8 +2491,6 @@ thread_interrupt (DebuggerTlsData *tls, MonoThreadInfo *info, void *sigctx, Mono
/* Already terminated */
return TRUE;
- tls->context.valid = FALSE;
-
/*
* We are in a difficult position: we want to be able to provide stack
* traces for this thread, but we can't use the current ctx+lmf, since
@@ -2515,9 +2524,9 @@ thread_interrupt (DebuggerTlsData *tls, MonoThreadInfo *info, void *sigctx, Mono
tls->async_state.unwind_data [MONO_UNWIND_DATA_LMF] = data.lmf;
tls->async_state.unwind_data [MONO_UNWIND_DATA_JIT_TLS] = tls->thread->jit_data;
} else {
- /* No managed frames */
tls->async_state.valid = FALSE;
}
+
mono_memory_barrier ();
tls->suspended = TRUE;
@@ -2656,6 +2665,7 @@ process_suspend (DebuggerTlsData *tls, MonoContext *ctx)
{
guint8 *ip = MONO_CONTEXT_GET_IP (ctx);
MonoJitInfo *ji;
+ MonoMethod *method;
if (mono_loader_lock_is_owned_by_self ()) {
/*
@@ -2688,7 +2698,8 @@ process_suspend (DebuggerTlsData *tls, MonoContext *ctx)
ji = mini_jit_info_table_find (mono_domain_get (), (char*)ip, NULL);
/* Can't suspend in these methods */
- if (ji->method->klass == mono_defaults.string_class && (!strcmp (ji->method->name, "memset") || strstr (ji->method->name, "memcpy")))
+ method = jinfo_get_method (ji);
+ if (method->klass == mono_defaults.string_class && (!strcmp (method->name, "memset") || strstr (method->name, "memcpy")))
return;
save_thread_context (ctx);
@@ -3102,7 +3113,7 @@ process_frame (StackFrameInfo *info, MonoContext *ctx, gpointer user_data)
}
if (info->ji)
- method = info->ji->method;
+ method = jinfo_get_method (info->ji);
else
method = info->method;
actual_method = info->actual_method;
@@ -3363,7 +3374,9 @@ create_event_list (EventKind event, GPtrArray *reqs, MonoJitInfo *ji, EventInfo
if (mod->data.thread != mono_thread_internal_current ())
filtered = TRUE;
} else if (mod->kind == MOD_KIND_EXCEPTION_ONLY && ei) {
- if (mod->data.exc_class && !mono_class_is_assignable_from (mod->data.exc_class, ei->exc->vtable->klass))
+ if (mod->data.exc_class && mod->subclasses && !mono_class_is_assignable_from (mod->data.exc_class, ei->exc->vtable->klass))
+ filtered = TRUE;
+ if (mod->data.exc_class && !mod->subclasses && mod->data.exc_class != ei->exc->vtable->klass)
filtered = TRUE;
if (ei->caught && !mod->caught)
filtered = TRUE;
@@ -3376,7 +3389,7 @@ create_event_list (EventKind event, GPtrArray *reqs, MonoJitInfo *ji, EventInfo
if (assemblies) {
for (k = 0; assemblies [k]; ++k)
- if (assemblies [k] == ji->method->klass->image->assembly)
+ if (assemblies [k] == jinfo_get_method (ji)->klass->image->assembly)
found = TRUE;
}
if (!found)
@@ -3429,8 +3442,8 @@ create_event_list (EventKind event, GPtrArray *reqs, MonoJitInfo *ji, EventInfo
g_free (s);
} else if (mod->kind == MOD_KIND_STEP) {
if ((mod->data.filter & STEP_FILTER_STATIC_CTOR) && ji &&
- (ji->method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) &&
- !strcmp (ji->method->name, ".cctor"))
+ (jinfo_get_method (ji)->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) &&
+ !strcmp (jinfo_get_method (ji)->name, ".cctor"))
filtered = TRUE;
if ((mod->data.filter & STEP_FILTER_DEBUGGER_HIDDEN) && ji) {
MonoCustomAttrInfo *ainfo;
@@ -3441,7 +3454,7 @@ create_event_list (EventKind event, GPtrArray *reqs, MonoJitInfo *ji, EventInfo
g_assert (klass);
}
if (!ji->dbg_hidden_inited) {
- ainfo = mono_custom_attrs_from_method (ji->method);
+ ainfo = mono_custom_attrs_from_method (jinfo_get_method (ji));
if (ainfo) {
if (mono_custom_attrs_has_attr (ainfo, klass))
ji->dbg_hidden = TRUE;
@@ -3452,6 +3465,32 @@ create_event_list (EventKind event, GPtrArray *reqs, MonoJitInfo *ji, EventInfo
if (ji->dbg_hidden)
filtered = TRUE;
}
+ if ((mod->data.filter & STEP_FILTER_DEBUGGER_STEP_THROUGH) && ji) {
+ MonoCustomAttrInfo *ainfo;
+ static MonoClass *klass;
+
+ if (!klass) {
+ klass = mono_class_from_name (mono_defaults.corlib, "System.Diagnostics", "DebuggerStepThroughAttribute");
+ g_assert (klass);
+ }
+ if (!ji->dbg_step_through_inited) {
+ ainfo = mono_custom_attrs_from_method (jinfo_get_method (ji));
+ if (ainfo) {
+ if (mono_custom_attrs_has_attr (ainfo, klass))
+ ji->dbg_step_through = TRUE;
+ mono_custom_attrs_free (ainfo);
+ }
+ ainfo = mono_custom_attrs_from_class (jinfo_get_method (ji)->klass);
+ if (ainfo) {
+ if (mono_custom_attrs_has_attr (ainfo, klass))
+ ji->dbg_step_through = TRUE;
+ mono_custom_attrs_free (ainfo);
+ }
+ ji->dbg_step_through_inited = TRUE;
+ }
+ if (ji->dbg_step_through)
+ filtered = TRUE;
+ }
}
}
@@ -3612,6 +3651,8 @@ process_event (EventKind event, gpointer arg, gint32 il_offset, MonoContext *ctx
buffer_add_domainid (&buf, mono_get_root_domain ());
break;
case EVENT_KIND_VM_DEATH:
+ if (CHECK_PROTOCOL_VERSION (2, 27))
+ buffer_add_int (&buf, mono_environment_exitcode_get ());
break;
case EVENT_KIND_EXCEPTION: {
EventInfo *ei = arg;
@@ -4091,7 +4132,7 @@ insert_breakpoint (MonoSeqPointInfo *seq_points, MonoDomain *domain, MonoJitInfo
}
if (i == seq_points->len) {
- char *s = g_strdup_printf ("Unable to insert breakpoint at %s:%d, seq_points=%d\n", mono_method_full_name (ji->method, TRUE), bp->il_offset, seq_points->len);
+ char *s = g_strdup_printf ("Unable to insert breakpoint at %s:%d, seq_points=%d\n", mono_method_full_name (jinfo_get_method (ji), TRUE), bp->il_offset, seq_points->len);
for (i = 0; i < seq_points->len; ++i)
DEBUG (1, fprintf (log_file, "%d\n", seq_points->seq_points [i].il_offset));
@@ -4133,7 +4174,7 @@ insert_breakpoint (MonoSeqPointInfo *seq_points, MonoDomain *domain, MonoJitInfo
#endif
}
- DEBUG(1, fprintf (log_file, "[dbg] Inserted breakpoint at %s:0x%x.\n", mono_method_full_name (ji->method, TRUE), (int)sp->il_offset));
+ DEBUG(1, fprintf (log_file, "[dbg] Inserted breakpoint at %s:0x%x.\n", mono_method_full_name (jinfo_get_method (ji), TRUE), (int)sp->il_offset));
}
static void
@@ -4202,6 +4243,7 @@ add_pending_breakpoints (MonoMethod *method, MonoJitInfo *ji)
int i, j;
MonoSeqPointInfo *seq_points;
MonoDomain *domain;
+ MonoMethod *jmethod;
if (!breakpoints)
return;
@@ -4225,10 +4267,11 @@ add_pending_breakpoints (MonoMethod *method, MonoJitInfo *ji)
}
if (!found) {
+ jmethod = jinfo_get_method (ji);
mono_domain_lock (domain);
- seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, ji->method);
- if (!seq_points && ji->method->is_inflated)
- seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, mono_method_get_declaring_generic_method (ji->method));
+ seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, jmethod);
+ if (!seq_points && jmethod->is_inflated)
+ seq_points = g_hash_table_lookup (domain_jit_info (domain)->seq_points, mono_method_get_declaring_generic_method (jmethod));
mono_domain_unlock (domain);
if (!seq_points)
/* Could be AOT code */
@@ -4424,25 +4467,46 @@ clear_breakpoints_for_domain (MonoDomain *domain)
/*
* ss_update:
*
- * Return FALSE if single stepping needs to continue because we are at the same line.
+ * Return FALSE if single stepping needs to continue.
*/
static gboolean
-ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp)
+ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp, DebuggerTlsData *tls, MonoContext *ctx)
{
MonoDebugMethodInfo *minfo;
MonoDebugSourceLocation *loc = NULL;
gboolean hit = TRUE;
+ MonoMethod *method;
+
+ if (req->depth == STEP_DEPTH_OVER && (sp->flags & MONO_SEQ_POINT_FLAG_NONEMPTY_STACK)) {
+ /*
+ * These seq points are inserted by the JIT after calls, step over needs to skip them.
+ */
+ DEBUG (1, fprintf (log_file, "[%p] Seq point at nonempty stack %x while stepping over, continuing single stepping.\n", (gpointer)GetCurrentThreadId (), sp->il_offset));
+ return FALSE;
+ }
+
+ if (req->depth == STEP_DEPTH_OVER && hit) {
+ if (!tls->context.valid)
+ mono_thread_state_init_from_monoctx (&tls->context, ctx);
+ compute_frame_info (tls->thread, tls);
+ if (req->nframes && tls->frame_count && tls->frame_count > req->nframes) {
+ /* Hit the breakpoint in a recursive call */
+ DEBUG (1, fprintf (log_file, "[%p] Breakpoint at lower frame while stepping over, continuing single stepping.\n", (gpointer)GetCurrentThreadId ()));
+ return FALSE;
+ }
+ }
if (req->size != STEP_SIZE_LINE)
return TRUE;
/* Have to check whenever a different source line was reached */
- minfo = mono_debug_lookup_method (ji->method);
+ method = jinfo_get_method (ji);
+ minfo = mono_debug_lookup_method (method);
if (minfo)
loc = mono_debug_symfile_lookup_location (minfo, sp->il_offset);
- if (!loc || (loc && ji->method == ss_req->last_method && loc->row == ss_req->last_line)) {
+ if (!loc || (loc && method == ss_req->last_method && loc->row == ss_req->last_line)) {
/* Have to continue single stepping */
if (!loc)
DEBUG(1, fprintf (log_file, "[%p] No line number info for il offset %x, continuing single stepping.\n", (gpointer)GetCurrentThreadId (), sp->il_offset));
@@ -4452,7 +4516,7 @@ ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp)
}
if (loc) {
- ss_req->last_method = ji->method;
+ ss_req->last_method = method;
ss_req->last_line = loc->row;
mono_debug_free_source_location (loc);
}
@@ -4479,6 +4543,7 @@ process_breakpoint_inner (DebuggerTlsData *tls)
GSList *bp_events = NULL, *ss_events = NULL, *enter_leave_events = NULL;
EventKind kind = EVENT_KIND_BREAKPOINT;
MonoContext *ctx = &tls->restore_ctx;
+ MonoMethod *method;
MonoSeqPointInfo *info;
SeqPoint *sp;
@@ -4487,7 +4552,7 @@ process_breakpoint_inner (DebuggerTlsData *tls)
ip = MONO_CONTEXT_GET_IP (ctx);
ji = mini_jit_info_table_find (mono_domain_get (), (char*)ip, NULL);
g_assert (ji);
- g_assert (ji->method);
+ method = jinfo_get_method (ji);
/* Compute the native offset of the breakpoint from the ip */
native_offset = ip - (guint8*)ji->code_start;
@@ -4497,7 +4562,7 @@ process_breakpoint_inner (DebuggerTlsData *tls)
*/
mono_arch_skip_breakpoint (ctx, ji);
- if (ji->method->wrapper_type || tls->disable_breakpoints)
+ if (method->wrapper_type || tls->disable_breakpoints)
return;
bp_reqs = g_ptr_array_new ();
@@ -4510,12 +4575,12 @@ process_breakpoint_inner (DebuggerTlsData *tls)
* The ip points to the instruction causing the breakpoint event, which is after
* the offset recorded in the seq point map, so find the prev seq point before ip.
*/
- sp = find_prev_seq_point_for_native_offset (mono_domain_get (), ji->method, native_offset, &info);
+ sp = find_prev_seq_point_for_native_offset (mono_domain_get (), method, native_offset, &info);
if (!sp)
- no_seq_points_found (ji->method);
+ no_seq_points_found (method);
g_assert (sp);
- DEBUG(1, fprintf (log_file, "[%p] Breakpoint hit, method=%s, ip=%p, offset=0x%x, sp il offset=0x%x.\n", (gpointer)GetCurrentThreadId (), ji->method->name, ip, native_offset, sp ? sp->il_offset : -1));
+ DEBUG(1, fprintf (log_file, "[%p] Breakpoint hit, method=%s, ip=%p, offset=0x%x, sp il offset=0x%x.\n", (gpointer)GetCurrentThreadId (), method->name, ip, native_offset, sp ? sp->il_offset : -1));
bp = NULL;
for (i = 0; i < breakpoints->len; ++i) {
@@ -4549,12 +4614,15 @@ process_breakpoint_inner (DebuggerTlsData *tls)
SingleStepReq *ss_req = req->info;
gboolean hit;
- hit = ss_update (ss_req, ji, sp);
+ if (mono_thread_internal_current () != ss_req->thread)
+ continue;
+
+ hit = ss_update (ss_req, ji, sp, tls, ctx);
if (hit)
g_ptr_array_add (ss_reqs, req);
/* Start single stepping again from the current sequence point */
- ss_start (ss_req, ji->method, sp, info, ctx, tls, FALSE);
+ ss_start (ss_req, method, sp, info, ctx, tls, FALSE);
}
if (ss_reqs->len > 0)
@@ -4574,11 +4642,11 @@ process_breakpoint_inner (DebuggerTlsData *tls)
* resume.
*/
if (ss_events)
- process_event (EVENT_KIND_STEP, ji->method, 0, ctx, ss_events, suspend_policy);
+ process_event (EVENT_KIND_STEP, method, 0, ctx, ss_events, suspend_policy);
if (bp_events)
- process_event (kind, ji->method, 0, ctx, bp_events, suspend_policy);
+ process_event (kind, method, 0, ctx, bp_events, suspend_policy);
if (enter_leave_events)
- process_event (kind, ji->method, 0, ctx, enter_leave_events, suspend_policy);
+ process_event (kind, method, 0, ctx, enter_leave_events, suspend_policy);
}
/* Process a breakpoint/single step event after resuming from a signal handler */
@@ -4587,10 +4655,6 @@ process_signal_event (void (*func) (DebuggerTlsData*))
{
DebuggerTlsData *tls;
MonoContext orig_restore_ctx, ctx;
- static void (*restore_context) (void *);
-
- if (!restore_context)
- restore_context = mono_get_restore_context ();
tls = mono_native_tls_get_value (debugger_tls_id);
/* Have to save/restore the restore_ctx as we can be called recursively during invokes etc. */
@@ -4602,7 +4666,7 @@ process_signal_event (void (*func) (DebuggerTlsData*))
/* This is called when resuming from a signal handler, so it shouldn't return */
memcpy (&ctx, &tls->restore_ctx, sizeof (MonoContext));
memcpy (&tls->restore_ctx, &orig_restore_ctx, sizeof (MonoContext));
- restore_context (&ctx);
+ mono_restore_context (&ctx);
g_assert_not_reached ();
}
@@ -4718,6 +4782,7 @@ process_single_step_inner (DebuggerTlsData *tls)
MonoDomain *domain;
GSList *events;
MonoContext *ctx = &tls->restore_ctx;
+ MonoMethod *method;
SeqPoint *sp;
MonoSeqPointInfo *info;
@@ -4741,42 +4806,43 @@ process_single_step_inner (DebuggerTlsData *tls)
if (log_level > 0) {
ji = mini_jit_info_table_find (mono_domain_get (), (char*)ip, &domain);
- DEBUG (1, fprintf (log_file, "[%p] Single step event (depth=%s) at %s (%p), sp %p, last sp %p\n", (gpointer)GetCurrentThreadId (), ss_depth_to_string (ss_req->depth), mono_method_full_name (ji->method, TRUE), MONO_CONTEXT_GET_IP (ctx), MONO_CONTEXT_GET_SP (ctx), ss_req->last_sp));
+ DEBUG (1, fprintf (log_file, "[%p] Single step event (depth=%s) at %s (%p), sp %p, last sp %p\n", (gpointer)GetCurrentThreadId (), ss_depth_to_string (ss_req->depth), mono_method_full_name (jinfo_get_method (ji), TRUE), MONO_CONTEXT_GET_IP (ctx), MONO_CONTEXT_GET_SP (ctx), ss_req->last_sp));
}
ji = mini_jit_info_table_find (mono_domain_get (), (char*)ip, &domain);
g_assert (ji);
- g_assert (ji->method);
+ method = jinfo_get_method (ji);
+ g_assert (method);
- if (ji->method->wrapper_type && ji->method->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD)
+ if (method->wrapper_type && method->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD)
return;
/*
- * FIXME:
+ * FIXME:
* Stopping in memset makes half-initialized vtypes visible.
* Stopping in memcpy makes half-copied vtypes visible.
*/
- if (ji->method->klass == mono_defaults.string_class && (!strcmp (ji->method->name, "memset") || strstr (ji->method->name, "memcpy")))
+ if (method->klass == mono_defaults.string_class && (!strcmp (method->name, "memset") || strstr (method->name, "memcpy")))
return;
/*
* The ip points to the instruction causing the single step event, which is before
* the offset recorded in the seq point map, so find the next seq point after ip.
*/
- sp = find_next_seq_point_for_native_offset (domain, ji->method, (guint8*)ip - (guint8*)ji->code_start, &info);
+ sp = find_next_seq_point_for_native_offset (domain, method, (guint8*)ip - (guint8*)ji->code_start, &info);
if (!sp)
return;
il_offset = sp->il_offset;
- if (!ss_update (ss_req, ji, sp))
+ if (!ss_update (ss_req, ji, sp, tls, ctx))
return;
/* Start single stepping again from the current sequence point */
- ss_start (ss_req, ji->method, sp, info, ctx, tls, FALSE);
+ ss_start (ss_req, method, sp, info, ctx, tls, FALSE);
if ((ss_req->filter & STEP_FILTER_STATIC_CTOR) &&
- (ji->method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) &&
- !strcmp (ji->method->name, ".cctor"))
+ (method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) &&
+ !strcmp (method->name, ".cctor"))
return;
// FIXME: Has to lock earlier
@@ -4793,7 +4859,7 @@ process_single_step_inner (DebuggerTlsData *tls)
mono_loader_unlock ();
- process_event (EVENT_KIND_STEP, ji->method, il_offset, ctx, events, suspend_policy);
+ process_event (EVENT_KIND_STEP, jinfo_get_method (ji), il_offset, ctx, events, suspend_policy);
}
static void
@@ -5015,6 +5081,8 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI
}
if (ss_req->depth == STEP_DEPTH_OVER) {
+ if (ss_req->nframes == 0)
+ ss_req->nframes = tls->frame_count;
/* Need to stop in catch clauses as well */
for (i = 0; i < tls->frame_count; ++i) {
StackFrame *frame = tls->frames [i];
@@ -5343,7 +5411,7 @@ mono_debugger_agent_handle_exception (MonoException *exc, MonoContext *throw_ctx
if (assemblies) {
for (k = 0; assemblies [k]; ++k)
- if (assemblies [k] == catch_ji->method->klass->image->assembly)
+ if (assemblies [k] == jinfo_get_method (catch_ji)->klass->image->assembly)
found = TRUE;
}
if (!found)
@@ -5643,6 +5711,9 @@ decode_vtype (MonoType *t, MonoDomain *domain, guint8 *addr, guint8 *buf, guint8
nfields --;
}
g_assert (nfields == 0);
+
+ *endbuf = buf;
+
return 0;
}
@@ -5868,6 +5939,7 @@ add_var (Buffer *buf, MonoDebugMethodJitInfo *jit, MonoType *t, MonoDebugVarInfo
NOT_IMPLEMENTED;
break;
case MONO_DEBUG_VAR_ADDRESS_MODE_REGOFFSET_INDIR:
+ case MONO_DEBUG_VAR_ADDRESS_MODE_VTADDR:
/* Same as regoffset, but with an indirection */
addr = (gpointer)mono_arch_context_get_int_reg (ctx, reg);
addr += (gint32)var->offset;
@@ -5946,6 +6018,16 @@ set_var (MonoType *t, MonoDebugVarInfo *var, MonoContext *ctx, MonoDomain *domai
mgreg_t v;
gboolean is_signed = FALSE;
+ if (t->byref) {
+ addr = (gpointer)mono_arch_context_get_int_reg (ctx, reg);
+
+ if (addr) {
+ // FIXME: Write barriers
+ mono_gc_memmove_atomic (addr, val, size);
+ }
+ break;
+ }
+
if (!t->byref && (t->type == MONO_TYPE_I1 || t->type == MONO_TYPE_I2 || t->type == MONO_TYPE_I4 || t->type == MONO_TYPE_I8))
is_signed = TRUE;
@@ -5966,9 +6048,6 @@ set_var (MonoType *t, MonoDebugVarInfo *var, MonoContext *ctx, MonoDomain *domai
g_assert_not_reached ();
}
- if (t->byref)
- NOT_IMPLEMENTED;
-
/* Set value on the stack or in the return ctx */
if (reg_locations [reg]) {
/* Saved on the stack */
@@ -6002,7 +6081,7 @@ set_var (MonoType *t, MonoDebugVarInfo *var, MonoContext *ctx, MonoDomain *domai
}
// FIXME: Write barriers
- mono_gc_memmove (addr, val, size);
+ mono_gc_memmove_atomic (addr, val, size);
break;
case MONO_DEBUG_VAR_ADDRESS_MODE_REGOFFSET_INDIR:
/* Same as regoffset, but with an indirection */
@@ -6012,7 +6091,7 @@ set_var (MonoType *t, MonoDebugVarInfo *var, MonoContext *ctx, MonoDomain *domai
gaddr = *(gpointer*)addr;
g_assert (gaddr);
// FIXME: Write barriers
- mono_gc_memmove (gaddr, val, size);
+ mono_gc_memmove_atomic (gaddr, val, size);
break;
case MONO_DEBUG_VAR_ADDRESS_MODE_DEAD:
NOT_IMPLEMENTED;
@@ -6263,39 +6342,7 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8
/* Setup our lmf */
memset (&ext, 0, sizeof (ext));
-#ifdef TARGET_AMD64
- ext.lmf.previous_lmf = *(lmf_addr);
- /* Mark that this is a MonoLMFExt */
- ext.lmf.previous_lmf = (gpointer)(((gssize)ext.lmf.previous_lmf) | 2);
- ext.lmf.rsp = (gssize)&ext;
-#elif defined(TARGET_X86)
- ext.lmf.previous_lmf = (gsize)*(lmf_addr);
- /* Mark that this is a MonoLMFExt */
- ext.lmf.previous_lmf = (gsize)(gpointer)(((gssize)ext.lmf.previous_lmf) | 2);
- ext.lmf.ebp = (gssize)&ext;
-#elif defined(TARGET_ARM)
- ext.lmf.previous_lmf = *(lmf_addr);
- /* Mark that this is a MonoLMFExt */
- ext.lmf.previous_lmf = (gpointer)(((gssize)ext.lmf.previous_lmf) | 2);
- ext.lmf.sp = (gssize)&ext;
-#elif defined(TARGET_POWERPC)
- ext.lmf.previous_lmf = *(lmf_addr);
- /* Mark that this is a MonoLMFExt */
- ext.lmf.previous_lmf = (gpointer)(((gssize)ext.lmf.previous_lmf) | 2);
- ext.lmf.ebp = (gssize)&ext;
-#elif defined(TARGET_S390X)
- ext.lmf.previous_lmf = *(lmf_addr);
- /* Mark that this is a MonoLMFExt */
- ext.lmf.previous_lmf = (gpointer)(((gssize)ext.lmf.previous_lmf) | 2);
- ext.lmf.ebp = (gssize)&ext;
-#elif defined(TARGET_MIPS)
- ext.lmf.previous_lmf = *(lmf_addr);
- /* Mark that this is a MonoLMFExt */
- ext.lmf.previous_lmf = (gpointer)(((gssize)ext.lmf.previous_lmf) | 2);
- ext.lmf.iregs [mips_sp] = (gssize)&ext;
-#else
- g_assert_not_reached ();
-#endif
+ mono_arch_init_lmf_ext (&ext, *lmf_addr);
ext.debugger_invoke = TRUE;
memcpy (&ext.ctx, &invoke->ctx, sizeof (MonoContext));
@@ -6367,13 +6414,9 @@ invoke_method (void)
int id;
int i, err, mindex;
Buffer buf;
- static void (*restore_context) (void *);
MonoContext restore_ctx;
guint8 *p;
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
tls = mono_native_tls_get_value (debugger_tls_id);
g_assert (tls);
@@ -6635,6 +6678,8 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf)
if (!mono_runtime_try_shutdown ())
break;
+ mono_environment_exitcode_set (exit_code);
+
/* Suspend all managed threads since the runtime is going away */
DEBUG(1, fprintf (log_file, "Suspending all threads...\n"));
mono_thread_suspend_all_other_threads ();
@@ -6960,6 +7005,9 @@ event_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
if (CHECK_PROTOCOL_VERSION (2, 16))
filter = decode_int (p, &p, end);
req->modifiers [i].data.filter = filter;
+ if (!CHECK_PROTOCOL_VERSION (2, 26) && (req->modifiers [i].data.filter & STEP_FILTER_DEBUGGER_HIDDEN))
+ /* Treat STEP_THOUGH the same as HIDDEN */
+ req->modifiers [i].data.filter |= STEP_FILTER_DEBUGGER_STEP_THROUGH;
} else if (mod == MOD_KIND_THREAD_ONLY) {
int id = decode_id (p, &p, end);
@@ -6975,7 +7023,11 @@ event_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
return err;
req->modifiers [i].caught = decode_byte (p, &p, end);
req->modifiers [i].uncaught = decode_byte (p, &p, end);
- DEBUG(1, fprintf (log_file, "[dbg] \tEXCEPTION_ONLY filter (%s%s%s).\n", exc_class ? exc_class->name : "all", req->modifiers [i].caught ? ", caught" : "", req->modifiers [i].uncaught ? ", uncaught" : ""));
+ if (CHECK_PROTOCOL_VERSION (2, 25))
+ req->modifiers [i].subclasses = decode_byte (p, &p, end);
+ else
+ req->modifiers [i].subclasses = TRUE;
+ DEBUG(1, fprintf (log_file, "[dbg] \tEXCEPTION_ONLY filter (%s%s%s%s).\n", exc_class ? exc_class->name : "all", req->modifiers [i].caught ? ", caught" : "", req->modifiers [i].uncaught ? ", uncaught" : "", req->modifiers [i].subclasses ? ", include-subclasses" : ""));
if (exc_class) {
req->modifiers [i].data.exc_class = exc_class;
diff --git a/mono/mini/declsec.c b/mono/mini/declsec.c
index fa06e6efdd..1ece56bdc4 100644
--- a/mono/mini/declsec.c
+++ b/mono/mini/declsec.c
@@ -47,19 +47,21 @@ void
mono_declsec_cache_stack_modifiers (MonoJitInfo *jinfo)
{
MonoMethodCasInfo *info = mono_jit_info_get_cas_info (jinfo);
+ MonoMethod *method;
guint32 flags;
if (!info)
return;
+ method = jinfo_get_method (jinfo);
/* first find the stack modifiers applied to the method */
- flags = mono_declsec_flags_from_method (jinfo->method);
+ flags = mono_declsec_flags_from_method (method);
info->cas_method_assert = (flags & MONO_DECLSEC_FLAG_ASSERT) != 0;
info->cas_method_deny = (flags & MONO_DECLSEC_FLAG_DENY) != 0;
info->cas_method_permitonly = (flags & MONO_DECLSEC_FLAG_PERMITONLY) != 0;
/* then find the stack modifiers applied to the class */
- flags = mono_declsec_flags_from_class (jinfo->method->klass);
+ flags = mono_declsec_flags_from_class (method->klass);
info->cas_class_assert = (flags & MONO_DECLSEC_FLAG_ASSERT) != 0;
info->cas_class_deny = (flags & MONO_DECLSEC_FLAG_DENY) != 0;
info->cas_class_permitonly = (flags & MONO_DECLSEC_FLAG_PERMITONLY) != 0;
@@ -71,41 +73,43 @@ mono_declsec_create_frame (MonoDomain *domain, MonoJitInfo *jinfo)
{
MonoSecurityFrame *frame = (MonoSecurityFrame*) mono_object_new (domain, mono_defaults.runtimesecurityframe_class);
MonoMethodCasInfo *info;
+ MonoMethod *method;
+ method = jinfo_get_method (jinfo);
info = mono_jit_info_get_cas_info (jinfo);
if (info && !info->cas_inited) {
- if (mono_method_has_declsec (jinfo->method)) {
+ if (mono_method_has_declsec (method)) {
/* Cache the stack modifiers into the MonoJitInfo structure to speed up future stack walks */
mono_declsec_cache_stack_modifiers (jinfo);
}
info->cas_inited = TRUE;
}
- MONO_OBJECT_SETREF (frame, method, mono_method_get_object (domain, jinfo->method, NULL));
+ MONO_OBJECT_SETREF (frame, method, mono_method_get_object (domain, method, NULL));
MONO_OBJECT_SETREF (frame, domain, domain->domain);
/* stack modifiers on methods have priority on (i.e. replaces) modifiers on class */
if (info && info->cas_method_assert) {
- mono_declsec_get_method_action (jinfo->method, SECURITY_ACTION_ASSERT, &frame->assert);
+ mono_declsec_get_method_action (method, SECURITY_ACTION_ASSERT, &frame->assert);
} else if (info && info->cas_class_assert) {
- mono_declsec_get_class_action (jinfo->method->klass, SECURITY_ACTION_ASSERT, &frame->assert);
+ mono_declsec_get_class_action (method->klass, SECURITY_ACTION_ASSERT, &frame->assert);
}
if (info && info->cas_method_deny) {
- mono_declsec_get_method_action (jinfo->method, SECURITY_ACTION_DENY, &frame->deny);
+ mono_declsec_get_method_action (method, SECURITY_ACTION_DENY, &frame->deny);
} else if (info && info->cas_class_deny) {
- mono_declsec_get_class_action (jinfo->method->klass, SECURITY_ACTION_DENY, &frame->deny);
+ mono_declsec_get_class_action (method->klass, SECURITY_ACTION_DENY, &frame->deny);
}
if (info && info->cas_method_permitonly) {
- mono_declsec_get_method_action (jinfo->method, SECURITY_ACTION_PERMITONLY, &frame->permitonly);
+ mono_declsec_get_method_action (method, SECURITY_ACTION_PERMITONLY, &frame->permitonly);
} else if (info && info->cas_class_permitonly) {
- mono_declsec_get_class_action (jinfo->method->klass, SECURITY_ACTION_PERMITONLY, &frame->permitonly);
+ mono_declsec_get_class_action (method->klass, SECURITY_ACTION_PERMITONLY, &frame->permitonly);
}
/* g_warning ("FRAME %s A(%p,%d) D(%p,%d) PO(%p,%d)",
- jinfo->method->name, frame->assert.blob, frame->assert.size, frame->deny.blob, frame->deny.size, frame->permitonly.blob,frame->permitonly.size); */
+ method->name, frame->assert.blob, frame->assert.size, frame->deny.blob, frame->deny.size, frame->permitonly.blob,frame->permitonly.size); */
return frame;
}
diff --git a/mono/mini/decompose.c b/mono/mini/decompose.c
index 1bbdedb430..88097b2257 100644
--- a/mono/mini/decompose.c
+++ b/mono/mini/decompose.c
@@ -1361,6 +1361,71 @@ mono_decompose_vtype_opts (MonoCompile *cfg)
}
}
+void
+mono_decompose_vtype_opts_llvm (MonoCompile *cfg)
+{
+ MonoBasicBlock *bb, *first_bb;
+
+ /* Decompose only the OP_STOREV_MEMBASE opcodes, which need write barriers */
+
+ cfg->cbb = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoBasicBlock));
+ first_bb = cfg->cbb;
+
+ for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
+ MonoInst *ins;
+ MonoInst *prev = NULL;
+ MonoInst *src_var, *src, *dest;
+ gboolean restart;
+ int dreg;
+
+ if (cfg->verbose_level > 2) mono_print_bb (bb, "BEFORE LOWER-VTYPE-OPTS(LLVM) ");
+
+ cfg->cbb->code = cfg->cbb->last_ins = NULL;
+ restart = TRUE;
+
+ while (restart) {
+ restart = FALSE;
+
+ for (ins = bb->code; ins; ins = ins->next) {
+ switch (ins->opcode) {
+ case OP_STOREV_MEMBASE: {
+ src_var = get_vreg_to_inst (cfg, ins->sreg1);
+
+ if (!src_var) {
+ g_assert (ins->klass);
+ src_var = mono_compile_create_var_for_vreg (cfg, &ins->klass->byval_arg, OP_LOCAL, ins->sreg1);
+ }
+
+ EMIT_NEW_VARLOADA_VREG ((cfg), (src), ins->sreg1, &ins->klass->byval_arg);
+
+ dreg = alloc_preg (cfg);
+ EMIT_NEW_BIALU_IMM (cfg, dest, OP_ADD_IMM, dreg, ins->inst_destbasereg, ins->inst_offset);
+ mini_emit_stobj (cfg, dest, src, src_var->klass, src_var->backend.is_pinvoke);
+ break;
+ }
+ default:
+ break;
+ }
+
+ g_assert (cfg->cbb == first_bb);
+
+ if (cfg->cbb->code || (cfg->cbb != first_bb)) {
+ /* Replace the original instruction with the new code sequence */
+
+ mono_replace_ins (cfg, bb, ins, &prev, first_bb, cfg->cbb);
+ first_bb->code = first_bb->last_ins = NULL;
+ first_bb->in_count = first_bb->out_count = 0;
+ cfg->cbb = first_bb;
+ }
+ else
+ prev = ins;
+ }
+ }
+
+ if (cfg->verbose_level > 2) mono_print_bb (bb, "AFTER LOWER-VTYPE-OPTS(LLVM) ");
+ }
+}
+
inline static MonoInst *
mono_get_domainvar (MonoCompile *cfg)
{
@@ -1413,7 +1478,7 @@ mono_decompose_array_access_opts (MonoCompile *cfg)
switch (ins->opcode) {
case OP_LDLEN:
NEW_LOAD_MEMBASE_FLAGS (cfg, dest, OP_LOADI4_MEMBASE, ins->dreg, ins->sreg1,
- G_STRUCT_OFFSET (MonoArray, max_length), ins->flags | MONO_INST_CONSTANT_LOAD);
+ G_STRUCT_OFFSET (MonoArray, max_length), ins->flags | MONO_INST_INVARIANT_LOAD);
MONO_ADD_INS (cfg->cbb, dest);
break;
case OP_BOUNDS_CHECK:
@@ -1452,7 +1517,7 @@ mono_decompose_array_access_opts (MonoCompile *cfg)
break;
case OP_STRLEN:
MONO_EMIT_NEW_LOAD_MEMBASE_OP_FLAGS (cfg, OP_LOADI4_MEMBASE, ins->dreg,
- ins->sreg1, G_STRUCT_OFFSET (MonoString, length), ins->flags | MONO_INST_CONSTANT_LOAD);
+ ins->sreg1, G_STRUCT_OFFSET (MonoString, length), ins->flags | MONO_INST_INVARIANT_LOAD);
break;
default:
break;
diff --git a/mono/mini/driver.c b/mono/mini/driver.c
index cd93289cd5..3d7f5d8860 100644
--- a/mono/mini/driver.c
+++ b/mono/mini/driver.c
@@ -137,6 +137,7 @@ extern char *nacl_mono_path;
MONO_OPT_CMOV | \
MONO_OPT_GSHARED | \
MONO_OPT_SIMD | \
+ MONO_OPT_ALIAS_ANALYSIS | \
MONO_OPT_AOT)
#define EXCLUDED_FROM_ALL (MONO_OPT_SHARED | MONO_OPT_PRECOMP | MONO_OPT_UNSAFE | MONO_OPT_GSHAREDVT)
@@ -309,16 +310,19 @@ opt_sets [] = {
MONO_OPT_BRANCH,
MONO_OPT_CFOLD,
MONO_OPT_FCMOV,
+ MONO_OPT_ALIAS_ANALYSIS,
#ifdef MONO_ARCH_SIMD_INTRINSICS
MONO_OPT_SIMD,
MONO_OPT_SSE2,
MONO_OPT_SIMD | MONO_OPT_SSE2,
#endif
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_INTRINS,
+ MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_INTRINS | MONO_OPT_ALIAS_ANALYSIS,
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS,
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP,
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_CFOLD,
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE,
+ MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_ALIAS_ANALYSIS,
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS,
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_TAILC,
MONO_OPT_BRANCH | MONO_OPT_PEEPHOLE | MONO_OPT_LINEARS | MONO_OPT_COPYPROP | MONO_OPT_CONSPROP | MONO_OPT_DEADCE | MONO_OPT_LOOP | MONO_OPT_INLINE | MONO_OPT_INTRINS | MONO_OPT_SSA,
@@ -342,18 +346,103 @@ domain_dump_native_code (MonoDomain *domain) {
}
#endif
+static void
+mini_regression_step (MonoImage *image, int verbose, int *total_run, int *total,
+ guint32 opt_flags,
+ GTimer *timer, MonoDomain *domain)
+{
+ int result, expected, failed, cfailed, run, code_size;
+ TestMethod func;
+ double elapsed, comp_time, start_time;
+ char *n;
+ int i;
+
+ mono_set_defaults (verbose, opt_flags);
+ n = opt_descr (opt_flags);
+ g_print ("Test run: image=%s, opts=%s\n", mono_image_get_filename (image), n);
+ g_free (n);
+ cfailed = failed = run = code_size = 0;
+ comp_time = elapsed = 0.0;
+
+ /* fixme: ugly hack - delete all previously compiled methods */
+ if (domain_jit_info (domain)) {
+ g_hash_table_destroy (domain_jit_info (domain)->jit_trampoline_hash);
+ domain_jit_info (domain)->jit_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
+ mono_internal_hash_table_destroy (&(domain->jit_code_hash));
+ mono_jit_code_hash_init (&(domain->jit_code_hash));
+ }
+
+ g_timer_start (timer);
+ if (mini_stats_fd)
+ fprintf (mini_stats_fd, "[");
+ for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) {
+ MonoMethod *method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL);
+ if (!method)
+ continue;
+ if (strncmp (method->name, "test_", 5) == 0) {
+ MonoCompile *cfg;
+
+ expected = atoi (method->name + 5);
+ run++;
+ start_time = g_timer_elapsed (timer, NULL);
+ comp_time -= start_time;
+ cfg = mini_method_compile (method, mono_get_optimizations_for_method (method, opt_flags), mono_get_root_domain (), JIT_FLAG_RUN_CCTORS, 0);
+ comp_time += g_timer_elapsed (timer, NULL);
+ if (cfg->exception_type == MONO_EXCEPTION_NONE) {
+ if (verbose >= 2)
+ g_print ("Running '%s' ...\n", method->name);
+#ifdef MONO_USE_AOT_COMPILER
+ if ((func = mono_aot_get_method (mono_get_root_domain (), method)))
+ ;
+ else
+#endif
+ func = (TestMethod)(gpointer)cfg->native_code;
+ func = (TestMethod)mono_create_ftnptr (mono_get_root_domain (), func);
+ result = func ();
+ if (result != expected) {
+ failed++;
+ g_print ("Test '%s' failed result (got %d, expected %d).\n", method->name, result, expected);
+ }
+ code_size += cfg->code_len;
+ mono_destroy_compile (cfg);
+
+ } else {
+ cfailed++;
+ if (verbose)
+ g_print ("Test '%s' failed compilation.\n", method->name);
+ }
+ if (mini_stats_fd)
+ fprintf (mini_stats_fd, "%f, ",
+ g_timer_elapsed (timer, NULL) - start_time);
+ }
+ }
+ if (mini_stats_fd)
+ fprintf (mini_stats_fd, "],\n");
+ g_timer_stop (timer);
+ elapsed = g_timer_elapsed (timer, NULL);
+ if (failed > 0 || cfailed > 0){
+ g_print ("Results: total tests: %d, failed: %d, cfailed: %d (pass: %.2f%%)\n",
+ run, failed, cfailed, 100.0*(run-failed-cfailed)/run);
+ } else {
+ g_print ("Results: total tests: %d, all pass \n", run);
+ }
+
+ g_print ("Elapsed time: %f secs (%f, %f), Code size: %d\n\n", elapsed,
+ elapsed - comp_time, comp_time, code_size);
+ *total += failed + cfailed;
+ *total_run += run;
+}
+
static int
mini_regression (MonoImage *image, int verbose, int *total_run)
{
- guint32 i, opt, opt_flags;
+ guint32 i, opt;
MonoMethod *method;
- MonoCompile *cfg;
char *n;
- int result, expected, failed, cfailed, run, code_size, total;
- TestMethod func;
GTimer *timer = g_timer_new ();
MonoDomain *domain = mono_domain_get ();
guint32 exclude = 0;
+ int total;
/* Note: mono_hwcap_init () called in mono_init () before we get here. */
mono_arch_cpu_optimizations (&exclude);
@@ -363,7 +452,7 @@ mini_regression (MonoImage *image, int verbose, int *total_run)
fprintf (mini_stats_fd, "$graph->set_legend(qw(");
for (opt = 0; opt < G_N_ELEMENTS (opt_sets); opt++) {
- opt_flags = opt_sets [opt];
+ guint32 opt_flags = opt_sets [opt];
n = opt_descr (opt_flags);
if (!n [0])
n = (char *)"none";
@@ -396,80 +485,37 @@ mini_regression (MonoImage *image, int verbose, int *total_run)
total = 0;
*total_run = 0;
- for (opt = 0; opt < G_N_ELEMENTS (opt_sets); ++opt) {
- double elapsed, comp_time, start_time;
-
- opt_flags = opt_sets [opt] & ~exclude;
- mono_set_defaults (verbose, opt_flags);
- n = opt_descr (opt_flags);
- g_print ("Test run: image=%s, opts=%s\n", mono_image_get_filename (image), n);
- g_free (n);
- cfailed = failed = run = code_size = 0;
- comp_time = elapsed = 0.0;
-
- /* fixme: ugly hack - delete all previously compiled methods */
- g_hash_table_destroy (domain_jit_info (domain)->jit_trampoline_hash);
- domain_jit_info (domain)->jit_trampoline_hash = g_hash_table_new (mono_aligned_addr_hash, NULL);
- mono_internal_hash_table_destroy (&(domain->jit_code_hash));
- mono_jit_code_hash_init (&(domain->jit_code_hash));
-
- g_timer_start (timer);
- if (mini_stats_fd)
- fprintf (mini_stats_fd, "[");
- for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) {
- method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL);
- if (!method)
- continue;
- if (strncmp (method->name, "test_", 5) == 0) {
- expected = atoi (method->name + 5);
- run++;
- start_time = g_timer_elapsed (timer, NULL);
- comp_time -= start_time;
- cfg = mini_method_compile (method, opt_flags, mono_get_root_domain (), TRUE, FALSE, 0);
- comp_time += g_timer_elapsed (timer, NULL);
- if (cfg->exception_type == MONO_EXCEPTION_NONE) {
- if (verbose >= 2)
- g_print ("Running '%s' ...\n", method->name);
-#ifdef MONO_USE_AOT_COMPILER
- if ((func = mono_aot_get_method (mono_get_root_domain (), method)))
- ;
- else
-#endif
- func = (TestMethod)(gpointer)cfg->native_code;
- func = (TestMethod)mono_create_ftnptr (mono_get_root_domain (), func);
- result = func ();
- if (result != expected) {
- failed++;
- g_print ("Test '%s' failed result (got %d, expected %d).\n", method->name, result, expected);
- }
- code_size += cfg->code_len;
- mono_destroy_compile (cfg);
-
- } else {
- cfailed++;
- if (verbose)
- g_print ("Test '%s' failed compilation.\n", method->name);
- }
- if (mini_stats_fd)
- fprintf (mini_stats_fd, "%f, ",
- g_timer_elapsed (timer, NULL) - start_time);
- }
+ if (mono_do_single_method_regression) {
+ GSList *iter;
+
+ mini_regression_step (image, verbose, total_run, &total,
+ 0,
+ timer, domain);
+ if (total)
+ return total;
+ g_print ("Single method regression: %d methods\n", g_slist_length (mono_single_method_list));
+
+ for (iter = mono_single_method_list; iter; iter = g_slist_next (iter)) {
+ char *method_name;
+
+ mono_current_single_method = iter->data;
+
+ method_name = mono_method_full_name (mono_current_single_method, TRUE);
+ g_print ("Current single method: %s\n", method_name);
+ g_free (method_name);
+
+ mini_regression_step (image, verbose, total_run, &total,
+ 0,
+ timer, domain);
+ if (total)
+ return total;
}
- if (mini_stats_fd)
- fprintf (mini_stats_fd, "],\n");
- g_timer_stop (timer);
- elapsed = g_timer_elapsed (timer, NULL);
- if (failed > 0 || cfailed > 0){
- g_print ("Results: total tests: %d, failed: %d, cfailed: %d (pass: %.2f%%)\n",
- run, failed, cfailed, 100.0*(run-failed-cfailed)/run);
- } else {
- g_print ("Results: total tests: %d, all pass \n", run);
+ } else {
+ for (opt = 0; opt < G_N_ELEMENTS (opt_sets); ++opt) {
+ mini_regression_step (image, verbose, total_run, &total,
+ opt_sets [opt] & ~exclude,
+ timer, domain);
}
-
- g_print ("Elapsed time: %f secs (%f, %f), Code size: %d\n\n", elapsed,
- elapsed - comp_time, comp_time, code_size);
- total += failed + cfailed;
- *total_run += run;
}
if (mini_stats_fd) {
@@ -595,7 +641,7 @@ alloc_random_data (Region *region)
g_assert (d->start >= prev_end && d->start + d->length <= next_start);
d->ji = g_new0 (MonoJitInfo, 1);
- d->ji->method = (MonoMethod*) 0xABadBabe;
+ d->ji->d.method = (MonoMethod*) 0xABadBabe;
d->ji->code_start = (gpointer)(gulong) d->start;
d->ji->code_size = d->length;
d->ji->cas_inited = 1; /* marks an allocated jit info */
@@ -829,6 +875,7 @@ jit_info_table_test (MonoDomain *domain)
enum {
DO_BENCH,
DO_REGRESSION,
+ DO_SINGLE_METHOD_REGRESSION,
DO_COMPILE,
DO_EXEC,
DO_DRAW,
@@ -888,7 +935,7 @@ compile_all_methods_thread_main_inner (CompileAllThreadArgs *args)
g_print ("Compiling %d %s\n", count, desc);
g_free (desc);
}
- cfg = mini_method_compile (method, args->opts, mono_get_root_domain (), FALSE, FALSE, 0);
+ cfg = mini_method_compile (method, mono_get_optimizations_for_method (method, args->opts), mono_get_root_domain (), 0, 0);
if (cfg->exception_type != MONO_EXCEPTION_NONE) {
printf ("Compilation of %s failed with exception '%s':\n", mono_method_full_name (cfg->method, TRUE), cfg->exception_message);
fail_count ++;
@@ -1100,6 +1147,7 @@ mini_usage_jitdeveloper (void)
" --ncompile N Number of times to compile METHOD (default: 1)\n"
" --print-vtable Print the vtable of all used classes\n"
" --regression Runs the regression test contained in the assembly\n"
+ " --single-method=OPTS Runs regressions with only one method optimized with OPTS at any time\n"
" --statfile FILE Sets the stat file to FILE\n"
" --stats Print statistics about the JIT operations\n"
" --wapi=hps|semdel|seminfo IO-layer maintenance\n"
@@ -1238,9 +1286,6 @@ static const char info[] =
#ifdef MONO_BIG_ARRAYS
"bigarrays "
#endif
-#ifdef MONO_DEBUGGER_SUPPORTED
- "debugger "
-#endif
#if defined(MONO_ARCH_SOFT_DEBUG_SUPPORTED) && !defined(DISABLE_SOFT_DEBUG)
"softdebug "
#endif
@@ -1351,6 +1396,8 @@ mono_jit_parse_options (int argc, char * argv[])
} else if (strcmp (argv [i], "--llvm") == 0) {
#ifndef MONO_ARCH_LLVM_SUPPORTED
fprintf (stderr, "Mono Warning: --llvm not supported on this platform.\n");
+#elif !defined(ENABLE_LLVM)
+ fprintf (stderr, "Mono Warning: --llvm not enabled in this runtime.\n");
#else
mono_use_llvm = TRUE;
#endif
@@ -1484,13 +1531,18 @@ mono_main (int argc, char* argv[])
break;
if (strcmp (argv [i], "--regression") == 0) {
action = DO_REGRESSION;
+ } else if (strncmp (argv [i], "--single-method=", 16) == 0) {
+ char *full_opts = g_strdup_printf ("-all,%s", argv [i] + 16);
+ action = DO_SINGLE_METHOD_REGRESSION;
+ mono_single_method_regression_opt = parse_optimizations (full_opts);
+ g_free (full_opts);
} else if (strcmp (argv [i], "--verbose") == 0 || strcmp (argv [i], "-v") == 0) {
mini_verbose++;
} else if (strcmp (argv [i], "--version") == 0 || strcmp (argv [i], "-V") == 0) {
char *build = mono_get_runtime_build_info ();
char *gc_descr;
- g_print ("Mono JIT compiler version %s\nCopyright (C) 2002-2012 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com\n", build);
+ g_print ("Mono JIT compiler version %s\nCopyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com\n", build);
g_free (build);
g_print (info);
gc_descr = mono_gc_get_description ();
@@ -1749,6 +1801,8 @@ mono_main (int argc, char* argv[])
} else if (strcmp (argv [i], "--llvm") == 0) {
#ifndef MONO_ARCH_LLVM_SUPPORTED
fprintf (stderr, "Mono Warning: --llvm not supported on this platform.\n");
+#elif !defined(ENABLE_LLVM)
+ fprintf (stderr, "Mono Warning: --llvm not enabled in this runtime.\n");
#else
mono_use_llvm = TRUE;
#endif
@@ -1800,9 +1854,6 @@ mono_main (int argc, char* argv[])
#endif
#endif
- if ((action == DO_EXEC) && mono_debug_using_mono_debugger ())
- action = DO_DEBUGGER;
-
if (mono_compile_aot || action == DO_EXEC || action == DO_DEBUGGER) {
g_set_prgname (argv[i]);
}
@@ -1831,23 +1882,11 @@ mono_main (int argc, char* argv[])
if (action == DO_DEBUGGER) {
enable_debugging = TRUE;
-
-#ifdef MONO_DEBUGGER_SUPPORTED
- mono_debug_init (MONO_DEBUG_FORMAT_DEBUGGER);
-#else
- g_print ("The Mono Debugger is not supported on this platform.\n");
+ g_print ("The Mono Debugger is no longer supported.\n");
return 1;
-#endif
} else if (enable_debugging)
mono_debug_init (MONO_DEBUG_FORMAT_MONO);
-#ifdef MONO_DEBUGGER_SUPPORTED
- if (enable_debugging) {
- if ((opt & MONO_OPT_GSHARED) == 0)
- mini_debugger_set_attach_ok ();
- }
-#endif
-
#ifdef HOST_WIN32
if (mixed_mode)
mono_load_coree (argv [i]);
@@ -1874,6 +1913,8 @@ mono_main (int argc, char* argv[])
}
switch (action) {
+ case DO_SINGLE_METHOD_REGRESSION:
+ mono_do_single_method_regression = TRUE;
case DO_REGRESSION:
if (mini_regression_list (mini_verbose, argc -i, argv + i)) {
g_print ("Regression ERRORS!\n");
@@ -2004,22 +2045,7 @@ mono_main (int argc, char* argv[])
mini_cleanup (domain);
return 0;
} else if (action == DO_DEBUGGER) {
-#ifdef MONO_DEBUGGER_SUPPORTED
- const char *error;
-
- error = mono_check_corlib_version ();
- if (error) {
- fprintf (stderr, "Corlib not in sync with this runtime: %s\n", error);
- fprintf (stderr, "Download a newer corlib or a newer runtime at http://www.go-mono.com/daily.\n");
- exit (1);
- }
-
- mini_debugger_main (domain, assembly, argc - i, argv + i);
- mini_cleanup (domain);
- return 0;
-#else
return 1;
-#endif
}
desc = mono_method_desc_new (mname, 0);
if (!desc) {
@@ -2060,10 +2086,10 @@ mono_main (int argc, char* argv[])
(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)) {
MonoMethod *nm;
nm = mono_marshal_get_native_wrapper (method, TRUE, FALSE);
- cfg = mini_method_compile (nm, opt, mono_get_root_domain (), FALSE, FALSE, part);
+ cfg = mini_method_compile (nm, opt, mono_get_root_domain (), 0, part);
}
else
- cfg = mini_method_compile (method, opt, mono_get_root_domain (), FALSE, FALSE, part);
+ cfg = mini_method_compile (method, opt, mono_get_root_domain (), 0, part);
if ((mono_graph_options & MONO_GRAPH_CFG_SSA) && !(cfg->comp_done & MONO_COMP_SSA)) {
g_warning ("no SSA info available (use -O=deadce)");
return 1;
@@ -2095,7 +2121,7 @@ mono_main (int argc, char* argv[])
opt = opt_sets [i];
g_timer_start (timer);
for (j = 0; j < count; ++j) {
- cfg = mini_method_compile (method, opt, mono_get_root_domain (), FALSE, FALSE, 0);
+ cfg = mini_method_compile (method, opt, mono_get_root_domain (), 0, 0);
mono_destroy_compile (cfg);
}
g_timer_stop (timer);
@@ -2118,12 +2144,12 @@ mono_main (int argc, char* argv[])
(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
method = mono_marshal_get_native_wrapper (method, TRUE, FALSE);
- cfg = mini_method_compile (method, opt, mono_get_root_domain (), FALSE, FALSE, 0);
+ cfg = mini_method_compile (method, opt, mono_get_root_domain (), 0, 0);
mono_destroy_compile (cfg);
}
}
} else {
- cfg = mini_method_compile (method, opt, mono_get_root_domain (), FALSE, FALSE, 0);
+ cfg = mini_method_compile (method, opt, mono_get_root_domain (), 0, 0);
mono_destroy_compile (cfg);
}
#endif
diff --git a/mono/mini/dwarfwriter.c b/mono/mini/dwarfwriter.c
index e912519cdc..2b660a10a5 100644
--- a/mono/mini/dwarfwriter.c
+++ b/mono/mini/dwarfwriter.c
@@ -35,7 +35,6 @@ typedef struct {
char *start_symbol, *end_symbol;
guint8 *code;
guint32 code_size;
- MonoDebugMethodJitInfo *debug_info;
} MethodLineNumberInfo;
struct _MonoDwarfWriter
@@ -466,9 +465,6 @@ static int subprogram_attr [] = {
static int tramp_subprogram_attr [] = {
DW_AT_name , DW_FORM_string,
-#ifndef TARGET_IOS
- DW_AT_description , DW_FORM_string,
-#endif
DW_AT_low_pc , DW_FORM_addr,
DW_AT_high_pc , DW_FORM_addr,
};
@@ -679,69 +675,6 @@ add_line_number_file_name (MonoDwarfWriter *w, const char *name,
return index;
}
-static void
-emit_line_number_info_begin (MonoDwarfWriter *w)
-{
- /* Line number info header */
- /*
- * GAS seems to emit its own data to the end of the first subsection, so we use
- * subsections 1, 2 etc:
- * 1 - contains the header
- * 2 - contains the file names
- * 3 - contains the end of the header + the data
- * 4 - the end symbol
- */
- emit_section_change (w, ".debug_line", 0);
- emit_label (w, ".Ldebug_line_section_start");
- emit_section_change (w, ".debug_line", LINE_SUBSECTION_HEADER);
- emit_label (w, ".Ldebug_line_start");
- emit_symbol_diff (w, ".Ldebug_line_end", ".", -4); /* length */
- emit_int16 (w, 0x2); /* version */
- emit_symbol_diff (w, ".Ldebug_line_header_end", ".", -4); /* header_length */
- emit_byte (w, 1); /* minimum_instruction_length */
- emit_byte (w, 1); /* default_is_stmt */
- emit_byte (w, LINE_BASE); /* line_base */
- emit_byte (w, LINE_RANGE); /* line_range */
- emit_byte (w, OPCODE_BASE); /* opcode_base */
- emit_byte (w, 0); /* standard_opcode_lengths */
- emit_byte (w, 1);
- emit_byte (w, 1);
- emit_byte (w, 1);
- emit_byte (w, 1);
- emit_byte (w, 0);
- emit_byte (w, 0);
- emit_byte (w, 0);
- emit_byte (w, 1);
- emit_byte (w, 0);
- emit_byte (w, 0);
- emit_byte (w, 1);
-
- /* Includes */
- emit_section_change (w, ".debug_line", LINE_SUBSECTION_INCLUDES);
-
- /* End of Includes */
- emit_section_change (w, ".debug_line", LINE_SUBSECTION_FILES);
- emit_byte (w, 0);
-
- /* Files */
- emit_line_number_file_name (w, "xdb.il", 0, 0);
-
- /* End of Files */
- emit_section_change (w, ".debug_line", LINE_SUBSECTION_DATA);
- emit_byte (w, 0);
-
- emit_label (w, ".Ldebug_line_header_end");
-
- /* Emit this into a separate subsection so it gets placed at the end */
- emit_section_change (w, ".debug_line", LINE_SUBSECTION_END);
-
- emit_byte (w, 0);
- emit_byte (w, 1);
- emit_byte (w, DW_LNE_end_sequence);
-
- emit_label (w, ".Ldebug_line_end");
-}
-
char *
mono_dwarf_escape_path (const char *name)
{
@@ -888,8 +821,11 @@ emit_all_line_number_info (MonoDwarfWriter *w)
/* Emit line number table */
for (l = info_list; l; l = l->next) {
MethodLineNumberInfo *info = l->data;
+ MonoDebugMethodJitInfo *dmji;
- emit_line_number_info (w, info->method, info->start_symbol, info->end_symbol, info->code, info->code_size, info->debug_info);
+ dmji = mono_debug_find_method (info->method, mono_domain_get ());;
+ emit_line_number_info (w, info->method, info->start_symbol, info->end_symbol, info->code, info->code_size, dmji);
+ mono_debug_free_method_jit_info (dmji);
}
g_slist_free (info_list);
@@ -917,7 +853,7 @@ emit_debug_info_end (MonoDwarfWriter *w)
}
void
-mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_program)
+mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, const char *cu_name, GSList *base_unwind_program)
{
char *s, *build_info;
int i;
@@ -986,13 +922,16 @@ mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_progra
emit_string (w, s);
g_free (build_info);
g_free (s);
- emit_string (w, "JITted code");
+ emit_string (w, cu_name);
emit_string (w, "");
emit_byte (w, DW_LANG_C);
emit_pointer_value (w, 0);
emit_pointer_value (w, 0);
/* offset into .debug_line section */
- emit_symbol_diff (w, ".Ldebug_line_start", ".Ldebug_line_section_start", 0);
+ if (w->emit_line)
+ emit_symbol_diff (w, ".Ldebug_line_start", ".Ldebug_line_section_start", 0);
+ else
+ emit_pointer_value (w, 0);
/* Base types */
for (i = 0; i < G_N_ELEMENTS (basic_types); ++i) {
@@ -1009,14 +948,6 @@ mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_progra
emit_section_change (w, ".debug_loc", 0);
emit_label (w, ".Ldebug_loc_start");
- /* debug_line section */
- /*
- * We emit some info even if emit_line is FALSE, as the
- * apple linker seems to require a .debug_line section.
- */
- if (!w->collect_line_info)
- emit_line_number_info_begin (w);
-
emit_cie (w);
}
@@ -2083,7 +2014,6 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
info->end_symbol = g_strdup (end_symbol);
info->code = code;
info->code_size = code_size;
- info->debug_info = debug_info;
w->line_info = g_slist_prepend (w->line_info, info);
} else {
emit_line_number_info (w, method, start_symbol, end_symbol, code, code_size, debug_info);
diff --git a/mono/mini/dwarfwriter.h b/mono/mini/dwarfwriter.h
index 490f821fb7..c10bbfe431 100644
--- a/mono/mini/dwarfwriter.h
+++ b/mono/mini/dwarfwriter.h
@@ -24,7 +24,7 @@ MonoDwarfWriter* mono_dwarf_writer_create (MonoImageWriter *writer, FILE *il_fil
void mono_dwarf_writer_destroy (MonoDwarfWriter *w) MONO_INTERNAL;
-void mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_program) MONO_INTERNAL;
+void mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, const char *cu_name, GSList *base_unwind_program) MONO_INTERNAL;
void mono_dwarf_writer_close (MonoDwarfWriter *w) MONO_INTERNAL;
diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c
index a3eff47ea7..342920f1af 100644
--- a/mono/mini/exceptions-amd64.c
+++ b/mono/mini/exceptions-amd64.c
@@ -37,7 +37,6 @@
#include "mini.h"
#include "mini-amd64.h"
#include "tasklets.h"
-#include "debug-mini.h"
#define ALIGN_TO(val,align) (((val) + ((align) - 1)) & ~((align) - 1))
@@ -47,13 +46,13 @@ static MonoW32ExceptionHandler ill_handler;
static MonoW32ExceptionHandler segv_handler;
LPTOP_LEVEL_EXCEPTION_FILTER mono_old_win_toplevel_exception_filter;
-guint64 mono_win_vectored_exception_handle;
+void *mono_win_vectored_exception_handle;
extern gboolean mono_win_chained_exception_needs_run;
#define W32_SEH_HANDLE_EX(_ex) \
if (_ex##_handler) _ex##_handler(0, ep, sctx)
-LONG CALLBACK seh_unhandled_exception_filter(EXCEPTION_POINTERS* ep)
+static LONG CALLBACK seh_unhandled_exception_filter(EXCEPTION_POINTERS* ep)
{
#ifndef MONO_CROSS_COMPILE
if (mono_old_win_toplevel_exception_filter) {
@@ -70,7 +69,7 @@ LONG CALLBACK seh_unhandled_exception_filter(EXCEPTION_POINTERS* ep)
* Unhandled Exception Filter
* Top-level per-process exception handler.
*/
-LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep)
+static LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep)
{
EXCEPTION_RECORD* er;
CONTEXT* ctx;
@@ -118,7 +117,7 @@ LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep)
break;
}
- if (win32_chained_exception_needs_run) {
+ if (mono_win_chained_exception_needs_run) {
/* Don't copy context back if we chained exception
* as the handler may have modfied the EXCEPTION_POINTERS
* directly. We don't pass sigcontext to chained handlers.
@@ -161,11 +160,9 @@ void win32_seh_init()
void win32_seh_cleanup()
{
- if (mono_old_win_toplevel_exception_filter) SetUnhandledExceptionFilter(mono_old_win_toplevel_exception_filter);
-
guint32 ret = 0;
- if (old_win32_toplevel_exception_filter)
- SetUnhandledExceptionFilter(mono_old_win_toplevel_exception_filter);
+
+ if (mono_old_win_toplevel_exception_filter) SetUnhandledExceptionFilter(mono_old_win_toplevel_exception_filter);
ret = RemoveVectoredExceptionHandler (mono_win_vectored_exception_handle);
g_assert (ret);
@@ -227,16 +224,17 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
amd64_mov_reg_membase (code, AMD64_R15, AMD64_R11, G_STRUCT_OFFSET (MonoContext, r15), 8);
#endif
- if (mono_running_on_valgrind ()) {
- /* Prevent 'Address 0x... is just below the stack ptr.' errors */
- amd64_mov_reg_membase (code, AMD64_R8, AMD64_R11, G_STRUCT_OFFSET (MonoContext, rsp), 8);
- amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, G_STRUCT_OFFSET (MonoContext, rip), 8);
- amd64_mov_reg_reg (code, AMD64_RSP, AMD64_R8, 8);
- } else {
- amd64_mov_reg_membase (code, AMD64_RSP, AMD64_R11, G_STRUCT_OFFSET (MonoContext, rsp), 8);
- /* get return address */
- amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, G_STRUCT_OFFSET (MonoContext, rip), 8);
- }
+ /*
+ * The context resides on the stack, in the stack frame of the
+ * caller of this function. The stack pointer that we need to
+ * restore is potentially many stack frames higher up, so the
+ * distance between them can easily be more than the red zone
+ * size. Hence the stack pointer can be restored only after
+ * we have finished loading everything from the context.
+ */
+ amd64_mov_reg_membase (code, AMD64_R8, AMD64_R11, G_STRUCT_OFFSET (MonoContext, rsp), 8);
+ amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, G_STRUCT_OFFSET (MonoContext, rip), 8);
+ amd64_mov_reg_reg (code, AMD64_RSP, AMD64_R8, 8);
/* jump to the saved IP */
amd64_jump_reg (code, AMD64_R11);
@@ -348,12 +346,8 @@ mono_amd64_throw_exception (guint64 dummy1, guint64 dummy2, guint64 dummy3, guin
mgreg_t *regs, mgreg_t rip,
MonoObject *exc, gboolean rethrow)
{
- static void (*restore_context) (MonoContext *);
MonoContext ctx;
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
ctx.rsp = regs [AMD64_RSP];
ctx.rip = rip;
ctx.rbx = regs [AMD64_RBX];
@@ -374,28 +368,11 @@ mono_amd64_throw_exception (guint64 dummy1, guint64 dummy2, guint64 dummy3, guin
mono_ex->stack_trace = NULL;
}
- if (mono_debug_using_mono_debugger ()) {
- guint8 buf [16];
-
- mono_breakpoint_clean_code (NULL, (gpointer)rip, 8, buf, sizeof (buf));
-
- if (buf [3] == 0xe8) {
- MonoContext ctx_cp = ctx;
- ctx_cp.rip = rip - 5;
-
- if (mono_debugger_handle_exception (&ctx_cp, exc)) {
- restore_context (&ctx_cp);
- g_assert_not_reached ();
- }
- }
- }
-
/* adjust eip so that it point into the call instruction */
ctx.rip -= 1;
mono_handle_exception (&ctx, exc);
- restore_context (&ctx);
-
+ mono_restore_context (&ctx);
g_assert_not_reached ();
}
@@ -623,6 +600,11 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
frame->unwind_info = unwind_info;
frame->unwind_info_len = unwind_info_len;
+
+ /*
+ printf ("%s %p %p\n", ji->d.method->name, ji->code_start, ip);
+ mono_print_unwind_info (unwind_info, unwind_info_len);
+ */
regs [AMD64_RAX] = new_ctx->rax;
regs [AMD64_RBX] = new_ctx->rbx;
@@ -665,7 +647,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
if (*lmf && ((*lmf) != jit_tls->first_lmf) && (MONO_CONTEXT_GET_SP (ctx) >= (gpointer)(*lmf)->rsp)) {
/* remove any unused lmf */
- *lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~3);
+ *lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~7);
}
#ifndef MONO_AMD64_NO_PUSHES
@@ -689,7 +671,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
memcpy (new_ctx, &ext->ctx, sizeof (MonoContext));
- *lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~3);
+ *lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~7);
frame->type = FRAME_TYPE_DEBUGGER_INVOKE;
@@ -730,17 +712,36 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
new_ctx->rbp = (*lmf)->rbp;
new_ctx->rsp = (*lmf)->rsp;
- new_ctx->rbx = (*lmf)->rbx;
- new_ctx->r12 = (*lmf)->r12;
- new_ctx->r13 = (*lmf)->r13;
- new_ctx->r14 = (*lmf)->r14;
- new_ctx->r15 = (*lmf)->r15;
+ if (((guint64)(*lmf)->previous_lmf) & 4) {
+ MonoLMFTramp *ext = (MonoLMFTramp*)(*lmf);
+
+ /* Trampoline frame */
+ new_ctx->rbx = ext->regs [AMD64_RBX];
+ new_ctx->r12 = ext->regs [AMD64_R12];
+ new_ctx->r13 = ext->regs [AMD64_R13];
+ new_ctx->r14 = ext->regs [AMD64_R14];
+ new_ctx->r15 = ext->regs [AMD64_R15];
+#ifdef TARGET_WIN32
+ new_ctx->rdi = ext->regs [AMD64_RDI];
+ new_ctx->rsi = ext->regs [AMD64_RSI];
+#endif
+ } else {
+ /*
+ * The registers saved in the LMF will be restored using the normal unwind info,
+ * when the wrapper frame is processed.
+ */
+ new_ctx->rbx = 0;
+ new_ctx->r12 = 0;
+ new_ctx->r13 = 0;
+ new_ctx->r14 = 0;
+ new_ctx->r15 = 0;
#ifdef TARGET_WIN32
- new_ctx->rdi = (*lmf)->rdi;
- new_ctx->rsi = (*lmf)->rsi;
+ new_ctx->rdi = 0;
+ new_ctx->rsi = 0;
#endif
+ }
- *lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~3);
+ *lmf = (gpointer)(((guint64)(*lmf)->previous_lmf) & ~7);
return TRUE;
}
@@ -758,19 +759,12 @@ handle_signal_exception (gpointer obj)
{
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
MonoContext ctx;
- static void (*restore_context) (MonoContext *);
-
- if (!restore_context)
- restore_context = mono_get_restore_context ();
memcpy (&ctx, &jit_tls->ex_ctx, sizeof (MonoContext));
- if (mono_debugger_handle_exception (&ctx, (MonoObject *)obj))
- return;
-
mono_handle_exception (&ctx, obj);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
}
void
@@ -785,6 +779,10 @@ mono_arch_setup_async_callback (MonoContext *ctx, void (*async_cb)(void *fun), g
/* The stack should be unaligned */
if ((sp % 16) == 0)
sp -= 8;
+#ifdef __linux__
+ /* Preserve the call chain to prevent crashes in the libgcc unwinder (#15969) */
+ *(guint64*)sp = ctx->rip;
+#endif
ctx->rsp = sp;
ctx->rip = (guint64)async_cb;
}
@@ -821,9 +819,6 @@ mono_arch_handle_exception (void *sigctx, gpointer obj)
mono_arch_sigctx_to_monoctx (sigctx, &mctx);
- if (mono_debugger_handle_exception (&mctx, (MonoObject *)obj))
- return TRUE;
-
mono_handle_exception (&mctx, obj);
mono_arch_monoctx_to_sigctx (&mctx, sigctx);
@@ -886,22 +881,14 @@ prepare_for_guard_pages (MonoContext *mctx)
static void
altstack_handle_and_restore (void *sigctx, gpointer obj, gboolean stack_ovf)
{
- void (*restore_context) (MonoContext *);
MonoContext mctx;
- restore_context = mono_get_restore_context ();
mono_arch_sigctx_to_monoctx (sigctx, &mctx);
- if (mono_debugger_handle_exception (&mctx, (MonoObject *)obj)) {
- if (stack_ovf)
- prepare_for_guard_pages (&mctx);
- restore_context (&mctx);
- }
-
mono_handle_exception (&mctx, obj);
if (stack_ovf)
prepare_for_guard_pages (&mctx);
- restore_context (&mctx);
+ mono_restore_context (&mctx);
}
void
@@ -1162,8 +1149,7 @@ mono_arch_exceptions_init (void)
MonoTrampInfo *info = l->data;
mono_register_jit_icall (info->code, g_strdup (info->name), NULL, TRUE);
- mono_save_trampoline_xdebug_info (info);
- mono_tramp_info_free (info);
+ mono_tramp_info_register (info);
}
g_slist_free (tramps);
}
@@ -1358,7 +1344,7 @@ mono_arch_unwindinfo_get_size (gpointer monoui)
(sizeof (UNWIND_CODE) * (MONO_MAX_UNWIND_CODES - unwindinfo->unwindInfo.CountOfCodes));
}
-PRUNTIME_FUNCTION
+static PRUNTIME_FUNCTION
MONO_GET_RUNTIME_FUNCTION_CALLBACK ( DWORD64 ControlPc, IN PVOID Context )
{
MonoJitInfo *ji;
diff --git a/mono/mini/exceptions-arm.c b/mono/mini/exceptions-arm.c
index 8931dd8467..8228280a9f 100644
--- a/mono/mini/exceptions-arm.c
+++ b/mono/mini/exceptions-arm.c
@@ -60,10 +60,10 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
ctx_reg = ARMREG_R0;
-#if defined(ARM_FPU_VFP)
- ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, fregs));
- ARM_FLDMD (code, ARM_VFP_D0, 16, ARMREG_IP);
-#endif
+ if (!mono_arch_is_soft_float ()) {
+ ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, fregs));
+ ARM_FLDMD (code, ARM_VFP_D0, 16, ARMREG_IP);
+ }
/* move pc to PC */
ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, pc));
@@ -135,13 +135,9 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot)
void
mono_arm_throw_exception (MonoObject *exc, mgreg_t pc, mgreg_t sp, mgreg_t *int_regs, gdouble *fp_regs)
{
- static void (*restore_context) (MonoContext *);
MonoContext ctx;
gboolean rethrow = pc & 1;
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
pc &= ~1; /* clear the optional rethrow bit */
/* adjust eip so that it point into the call instruction */
pc -= 4;
@@ -159,7 +155,7 @@ mono_arm_throw_exception (MonoObject *exc, mgreg_t pc, mgreg_t sp, mgreg_t *int_
mono_ex->stack_trace = NULL;
}
mono_handle_exception (&ctx, exc);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
g_assert_not_reached ();
}
@@ -220,12 +216,12 @@ get_throw_trampoline (int size, gboolean corlib, gboolean rethrow, gboolean llvm
mono_add_unwind_op_offset (unwind_ops, code, start, ARMREG_LR, - sizeof (mgreg_t));
/* Save fp regs */
- ARM_SUB_REG_IMM8 (code, ARMREG_SP, ARMREG_SP, sizeof (double) * 16);
- cfa_offset += sizeof (double) * 16;
- mono_add_unwind_op_def_cfa_offset (unwind_ops, code, start, cfa_offset);
-#if defined(ARM_FPU_VFP)
- ARM_FSTMD (code, ARM_VFP_D0, 16, ARMREG_SP);
-#endif
+ if (!mono_arch_is_soft_float ()) {
+ ARM_SUB_REG_IMM8 (code, ARMREG_SP, ARMREG_SP, sizeof (double) * 16);
+ cfa_offset += sizeof (double) * 16;
+ mono_add_unwind_op_def_cfa_offset (unwind_ops, code, start, cfa_offset);
+ ARM_FSTMD (code, ARM_VFP_D0, 16, ARMREG_SP);
+ }
/* Param area */
ARM_SUB_REG_IMM8 (code, ARMREG_SP, ARMREG_SP, 8);
@@ -371,8 +367,7 @@ mono_arch_exceptions_init (void)
MonoTrampInfo *info = l->data;
mono_register_jit_icall (info->code, g_strdup (info->name), NULL, TRUE);
- mono_save_trampoline_xdebug_info (info);
- mono_tramp_info_free (info);
+ mono_tramp_info_register (info);
}
g_slist_free (tramps);
}
@@ -399,7 +394,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
if (ji != NULL) {
int i;
- gssize regs [MONO_MAX_IREGS + 1];
+ gssize regs [MONO_MAX_IREGS + 1 + 8];
guint8 *cfa;
guint32 unwind_info_len;
guint8 *unwind_info;
@@ -411,18 +406,32 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
else
unwind_info = mono_get_cached_unwind_info (ji->used_regs, &unwind_info_len);
+ /*
+ printf ("%s %p %p\n", ji->d.method->name, ji->code_start, ip);
+ mono_print_unwind_info (unwind_info, unwind_info_len);
+ */
+
for (i = 0; i < 16; ++i)
regs [i] = new_ctx->regs [i];
+#ifdef TARGET_IOS
+ /* On IOS, d8..d15 are callee saved. They are mapped to 8..15 in unwind.c */
+ for (i = 0; i < 8; ++i)
+ regs [MONO_MAX_IREGS + i] = new_ctx->fregs [8 + i];
+#endif
mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start,
(guint8*)ji->code_start + ji->code_size,
- ip, regs, MONO_MAX_IREGS,
+ ip, regs, MONO_MAX_IREGS + 8,
save_locations, MONO_MAX_IREGS, &cfa);
for (i = 0; i < 16; ++i)
new_ctx->regs [i] = regs [i];
new_ctx->pc = regs [ARMREG_LR];
new_ctx->regs [ARMREG_SP] = (gsize)cfa;
+#ifdef TARGET_IOS
+ for (i = 0; i < 8; ++i)
+ new_ctx->fregs [8 + i] = regs [MONO_MAX_IREGS + i];
+#endif
if (*lmf && (MONO_CONTEXT_GET_SP (ctx) >= (gpointer)(*lmf)->sp)) {
/* remove any unused lmf */
@@ -517,16 +526,12 @@ handle_signal_exception (gpointer obj)
{
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
MonoContext ctx;
- static void (*restore_context) (MonoContext *);
-
- if (!restore_context)
- restore_context = mono_get_restore_context ();
memcpy (&ctx, &jit_tls->ex_ctx, sizeof (MonoContext));
mono_handle_exception (&ctx, obj);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
}
/*
diff --git a/mono/mini/exceptions-ia64.c b/mono/mini/exceptions-ia64.c
index 85c7792be3..b8212c684b 100644
--- a/mono/mini/exceptions-ia64.c
+++ b/mono/mini/exceptions-ia64.c
@@ -266,7 +266,7 @@ throw_exception (MonoObject *exc, guint64 rethrow)
ji = mini_jit_info_table_find (mono_domain_get (), (gpointer)ip, NULL);
- //printf ("UN: %s %lx %lx\n", ji ? ji->method->name : "", ip, sp);
+ //printf ("UN: %s %lx %lx\n", ji ? jinfo_get_method (ji)->name : "", ip, sp);
if (ji)
break;
diff --git a/mono/mini/exceptions-mips.c b/mono/mini/exceptions-mips.c
index ea38a836aa..f0c3e4cb00 100644
--- a/mono/mini/exceptions-mips.c
+++ b/mono/mini/exceptions-mips.c
@@ -174,7 +174,6 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot)
static void
throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gboolean rethrow)
{
- static void (*restore_context) (MonoContext *);
MonoContext ctx;
#ifdef DEBUG_EXCEPTIONS
@@ -182,9 +181,6 @@ throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gboolean
exc, (void *)eip, (void *) esp, rethrow);
#endif
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
/* adjust eip so that it point into the call instruction */
eip -= 8;
@@ -207,7 +203,7 @@ throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gboolean
(void *) ctx.sc_pc, (void *) ctx.sc_regs[mips_sp],
(void *) ctx.sc_regs[mips_fp], &ctx);
#endif
- restore_context (&ctx);
+ mono_restore_context (&ctx);
g_assert_not_reached ();
}
@@ -505,7 +501,7 @@ mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *sigctx)
gpointer
mono_arch_ip_from_context (void *sigctx)
{
- return (gpointer)UCONTEXT_REG_PC (sigctx);
+ return (gpointer)(gsize)UCONTEXT_REG_PC (sigctx);
}
/*
@@ -518,16 +514,12 @@ handle_signal_exception (gpointer obj)
{
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
MonoContext ctx;
- static void (*restore_context) (MonoContext *);
-
- if (!restore_context)
- restore_context = mono_get_restore_context ();
memcpy (&ctx, &jit_tls->ex_ctx, sizeof (MonoContext));
mono_handle_exception (&ctx, obj);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
}
/*
diff --git a/mono/mini/exceptions-ppc.c b/mono/mini/exceptions-ppc.c
index d439b26c94..80bbb3f919 100644
--- a/mono/mini/exceptions-ppc.c
+++ b/mono/mini/exceptions-ppc.c
@@ -316,12 +316,8 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot)
void
mono_ppc_throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, mgreg_t *int_regs, gdouble *fp_regs, gboolean rethrow)
{
- static void (*restore_context) (MonoContext *);
MonoContext ctx;
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
/* adjust eip so that it point into the call instruction */
eip -= 4;
@@ -339,7 +335,7 @@ mono_ppc_throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp,
mono_ex->stack_trace = NULL;
}
mono_handle_exception (&ctx, exc);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
g_assert_not_reached ();
}
@@ -540,7 +536,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
sframe = (MonoPPCStackFrame*)MONO_CONTEXT_GET_SP (ctx);
MONO_CONTEXT_SET_BP (new_ctx, sframe->sp);
- if (ji->method->save_lmf) {
+ if (jinfo_get_method (ji)->save_lmf) {
/* sframe->sp points just past the end of the LMF */
guint8 *lmf_addr = (guint8*)sframe->sp - sizeof (MonoLMF);
memcpy (&new_ctx->fregs, lmf_addr + G_STRUCT_OFFSET (MonoLMF, fregs), sizeof (double) * MONO_SAVED_FREGS);
@@ -669,13 +665,11 @@ mono_ppc_set_func_into_sigctx (void *sigctx, void *func)
static void
altstack_handle_and_restore (void *sigctx, gpointer obj)
{
- void (*restore_context) (MonoContext *);
MonoContext mctx;
- restore_context = mono_get_restore_context ();
mono_arch_sigctx_to_monoctx (sigctx, &mctx);
mono_handle_exception (&mctx, obj);
- restore_context (&mctx);
+ mono_restore_context (&mctx);
}
void
@@ -695,8 +689,8 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean
const char *method;
/* we don't do much now, but we can warn the user with a useful message */
fprintf (stderr, "Stack overflow: IP: %p, SP: %p\n", mono_arch_ip_from_context (sigctx), (gpointer)UCONTEXT_REG_Rn(uc, 1));
- if (ji && ji->method)
- method = mono_method_full_name (ji->method, TRUE);
+ if (ji && jinfo_get_method (ji))
+ method = mono_method_full_name (jinfo_get_method (ji), TRUE);
else
method = "Unmanaged";
fprintf (stderr, "At %s\n", method);
@@ -754,16 +748,12 @@ handle_signal_exception (gpointer obj)
{
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
MonoContext ctx;
- static void (*restore_context) (MonoContext *);
-
- if (!restore_context)
- restore_context = mono_get_restore_context ();
memcpy (&ctx, &jit_tls->ex_ctx, sizeof (MonoContext));
mono_handle_exception (&ctx, obj);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
}
static void
diff --git a/mono/mini/exceptions-s390x.c b/mono/mini/exceptions-s390x.c
index b95c6ed301..17bb8b044d 100644
--- a/mono/mini/exceptions-s390x.c
+++ b/mono/mini/exceptions-s390x.c
@@ -237,11 +237,7 @@ throw_exception (MonoObject *exc, unsigned long ip, unsigned long sp,
{
MonoContext ctx;
int iReg;
- static void (*restore_context) (MonoContext *);
- if (!restore_context)
- restore_context = mono_get_restore_context();
-
memset(&ctx, 0, sizeof(ctx));
setup_context(&ctx);
@@ -267,7 +263,7 @@ throw_exception (MonoObject *exc, unsigned long ip, unsigned long sp,
}
// mono_arch_handle_exception (&ctx, exc, FALSE);
mono_handle_exception (&ctx, exc);
- restore_context(&ctx);
+ mono_restore_context(&ctx);
g_assert_not_reached ();
}
diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c
index 2247b91a2a..531b556e8c 100644
--- a/mono/mini/exceptions-x86.c
+++ b/mono/mini/exceptions-x86.c
@@ -32,7 +32,6 @@
#include "mini.h"
#include "mini-x86.h"
#include "tasklets.h"
-#include "debug-mini.h"
static gpointer signal_exception_trampoline;
@@ -321,27 +320,53 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
/* load ctx */
x86_mov_reg_membase (code, X86_EAX, X86_ESP, 4, 4);
- /* get return address, stored in ECX */
- x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoContext, eip), 4);
/* restore EBX */
x86_mov_reg_membase (code, X86_EBX, X86_EAX, G_STRUCT_OFFSET (MonoContext, ebx), 4);
+
/* restore EDI */
x86_mov_reg_membase (code, X86_EDI, X86_EAX, G_STRUCT_OFFSET (MonoContext, edi), 4);
+
/* restore ESI */
x86_mov_reg_membase (code, X86_ESI, X86_EAX, G_STRUCT_OFFSET (MonoContext, esi), 4);
- /* restore ESP */
- x86_mov_reg_membase (code, X86_ESP, X86_EAX, G_STRUCT_OFFSET (MonoContext, esp), 4);
- /* save the return addr to the restored stack */
- x86_push_reg (code, X86_ECX);
- /* restore EBP */
- x86_mov_reg_membase (code, X86_EBP, X86_EAX, G_STRUCT_OFFSET (MonoContext, ebp), 4);
- /* restore ECX */
- x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoContext, ecx), 4);
+
/* restore EDX */
x86_mov_reg_membase (code, X86_EDX, X86_EAX, G_STRUCT_OFFSET (MonoContext, edx), 4);
- /* restore EAX */
- x86_mov_reg_membase (code, X86_EAX, X86_EAX, G_STRUCT_OFFSET (MonoContext, eax), 4);
+ /*
+ * The context resides on the stack, in the stack frame of the
+ * caller of this function. The stack pointer that we need to
+ * restore is potentially many stack frames higher up, so the
+ * distance between them can easily be more than the red zone
+ * size. Hence the stack pointer can be restored only after
+ * we have finished loading everything from the context.
+ */
+
+ /* load ESP into EBP */
+ x86_mov_reg_membase (code, X86_EBP, X86_EAX, G_STRUCT_OFFSET (MonoContext, esp), 4);
+ /* load return address into ECX */
+ x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoContext, eip), 4);
+ /* save the return addr to the restored stack - 4 */
+ x86_mov_membase_reg (code, X86_EBP, -4, X86_ECX, 4);
+
+ /* load EBP into ECX */
+ x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoContext, ebp), 4);
+ /* save EBP to the restored stack - 8 */
+ x86_mov_membase_reg (code, X86_EBP, -8, X86_ECX, 4);
+
+ /* load EAX into ECX */
+ x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoContext, eax), 4);
+ /* save EAX to the restored stack - 12 */
+ x86_mov_membase_reg (code, X86_EBP, -12, X86_ECX, 4);
+
+ /* restore ECX */
+ x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoContext, ecx), 4);
+
+ /* restore ESP - 12 */
+ x86_lea_membase (code, X86_ESP, X86_EBP, -12);
+ /* restore EAX */
+ x86_pop_reg (code, X86_EAX);
+ /* restore EBP */
+ x86_pop_reg (code, X86_EBP);
/* jump to the saved IP */
x86_ret (code);
@@ -447,12 +472,8 @@ void
mono_x86_throw_exception (mgreg_t *regs, MonoObject *exc,
mgreg_t eip, gboolean rethrow)
{
- static void (*restore_context) (MonoContext *);
MonoContext ctx;
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
ctx.esp = regs [X86_ESP];
ctx.eip = eip;
ctx.ebp = regs [X86_EBP];
@@ -474,29 +495,12 @@ mono_x86_throw_exception (mgreg_t *regs, MonoObject *exc,
mono_ex->stack_trace = NULL;
}
- if (mono_debug_using_mono_debugger ()) {
- guint8 buf [16], *code;
-
- mono_breakpoint_clean_code (NULL, (gpointer)eip, 8, buf, sizeof (buf));
- code = buf + 8;
-
- if (buf [3] == 0xe8) {
- MonoContext ctx_cp = ctx;
- ctx_cp.eip = eip - 5;
-
- if (mono_debugger_handle_exception (&ctx_cp, exc)) {
- restore_context (&ctx_cp);
- g_assert_not_reached ();
- }
- }
- }
-
/* adjust eip so that it point into the call instruction */
ctx.eip -= 1;
mono_handle_exception (&ctx, exc);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
g_assert_not_reached ();
}
@@ -833,9 +837,19 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
/* Adjust IP */
new_ctx->eip --;
- if (*lmf && (MONO_CONTEXT_GET_BP (ctx) >= (gpointer)(*lmf)->ebp)) {
- /* remove any unused lmf */
- *lmf = (gpointer)(((gsize)(*lmf)->previous_lmf) & ~3);
+ if (*lmf && ((*lmf) != jit_tls->first_lmf)) {
+ gboolean is_tramp = ((guint32)((*lmf)->previous_lmf) & 1);
+ gpointer lmf_esp;
+
+ if (is_tramp)
+ /* lmf->esp is only set in trampoline frames */
+ lmf_esp = (gpointer)(*lmf)->esp;
+ else
+ /* In non-trampoline frames, ebp is the frame pointer */
+ lmf_esp = (gpointer)(*lmf)->ebp;
+ if (MONO_CONTEXT_GET_SP (ctx) >= lmf_esp)
+ /* remove any unused lmf */
+ *lmf = (gpointer)(((gsize)(*lmf)->previous_lmf) & ~3);
}
/* Pop arguments off the stack */
@@ -963,19 +977,12 @@ handle_signal_exception (gpointer obj)
{
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
MonoContext ctx;
- static void (*restore_context) (MonoContext *);
-
- if (!restore_context)
- restore_context = mono_get_restore_context ();
memcpy (&ctx, &jit_tls->ex_ctx, sizeof (MonoContext));
- if (mono_debugger_handle_exception (&ctx, (MonoObject *)obj))
- return;
-
mono_handle_exception (&ctx, obj);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
}
/*
@@ -1083,9 +1090,6 @@ mono_arch_handle_exception (void *sigctx, gpointer obj)
mono_arch_sigctx_to_monoctx (sigctx, &mctx);
- if (mono_debugger_handle_exception (&mctx, (MonoObject *)obj))
- return TRUE;
-
mono_handle_exception (&mctx, obj);
mono_arch_monoctx_to_sigctx (&mctx, sigctx);
@@ -1123,22 +1127,14 @@ prepare_for_guard_pages (MonoContext *mctx)
static void
altstack_handle_and_restore (MonoContext *ctx, gpointer obj, gboolean stack_ovf)
{
- void (*restore_context) (MonoContext *);
MonoContext mctx;
- restore_context = mono_get_restore_context ();
mctx = *ctx;
- if (mono_debugger_handle_exception (&mctx, (MonoObject *)obj)) {
- if (stack_ovf)
- prepare_for_guard_pages (&mctx);
- restore_context (&mctx);
- }
-
mono_handle_exception (&mctx, obj);
if (stack_ovf)
prepare_for_guard_pages (&mctx);
- restore_context (&mctx);
+ mono_restore_context (&mctx);
}
void
diff --git a/mono/mini/exceptions.cs b/mono/mini/exceptions.cs
index 49dca8d1ba..8144641273 100644
--- a/mono/mini/exceptions.cs
+++ b/mono/mini/exceptions.cs
@@ -24,11 +24,18 @@ using System.Runtime.CompilerServices;
* the IL code looks.
*/
-class Tests {
-
+#if MOBILE
+class ExceptionTests
+#else
+class Tests
+#endif
+{
+
+#if !MOBILE
public static int Main (string[] args) {
return TestDriver.RunTests (typeof (Tests), args);
}
+#endif
public static int test_0_catch () {
Exception x = new Exception ();
@@ -2408,7 +2415,7 @@ class Tests {
}
public static int test_0_nonvirt_nullref_at_clause_start () {
- Tests t = null;
+ ExceptionTests t = null;
try {
t.amethod ();
} catch (NullReferenceException) {
@@ -2528,7 +2535,11 @@ class Tests {
public static int test_0_lmf_filter () {
try {
// The invoke calls a runtime-invoke wrapper which has a filter clause
+#if MOBILE
+ typeof (ExceptionTests).GetMethod ("lmf_filter").Invoke (null, new object [] { });
+#else
typeof (Tests).GetMethod ("lmf_filter").Invoke (null, new object [] { });
+#endif
} catch (TargetInvocationException) {
}
return 0;
@@ -2732,3 +2743,8 @@ class Tests {
}
}
+#if !MOBILE
+class ExceptionTests : Tests
+{
+}
+#endif \ No newline at end of file
diff --git a/mono/mini/graph.c b/mono/mini/graph.c
index 09917f93e4..d9b0adec2f 100644
--- a/mono/mini/graph.c
+++ b/mono/mini/graph.c
@@ -195,15 +195,15 @@ mono_print_label (FILE *fp, MonoInst *tree) {
mono_print_label (fp, tree->inst_newa_len);
break;
case OP_CALL:
- case OP_CALLVIRT:
+ case OP_CALL_MEMBASE:
case OP_FCALL:
- case OP_FCALLVIRT:
+ case OP_FCALL_MEMBASE:
case OP_LCALL:
- case OP_LCALLVIRT:
+ case OP_LCALL_MEMBASE:
case OP_VCALL:
- case OP_VCALLVIRT:
+ case OP_VCALL_MEMBASE:
case OP_VOIDCALL:
- case OP_VOIDCALLVIRT: {
+ case OP_VOIDCALL_MEMBASE: {
MonoCallInst *call = (MonoCallInst*)tree;
if (call->method) {
if (mono_method_signature (call->method)->hasthis && tree->inst_left) {
diff --git a/mono/mini/gshared.cs b/mono/mini/gshared.cs
index c52dccfe84..8ed2dbe2bf 100644
--- a/mono/mini/gshared.cs
+++ b/mono/mini/gshared.cs
@@ -1291,11 +1291,21 @@ public class Tests
}
}
+ struct ConsStructThrow : IConstrained {
+ public void foo () {
+ throw new Exception ();
+ }
+
+ public void foo_ref_arg (string s) {
+ }
+ }
+
interface IFaceConstrained {
void constrained_void_iface_call<T, T2>(T t, T2 t2) where T2 : IConstrained;
void constrained_void_iface_call_ref_arg<T, T2>(T t, T2 t2) where T2 : IConstrained;
void constrained_void_iface_call_gsharedvt_arg<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T>;
T constrained_iface_call_gsharedvt_ret<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T>;
+ T2 constrained_normal_call<T, T2>(T t, T2 t2) where T2 : VClass;
}
class ClassConstrained : IFaceConstrained {
@@ -1318,6 +1328,18 @@ public class Tests
public T constrained_iface_call_gsharedvt_ret<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T> {
return t2.foo_gsharedvt_ret (t);
}
+
+ [MethodImplAttribute (MethodImplOptions.NoInlining)]
+ public T2 constrained_normal_call<T, T2>(T t, T2 t2) where T2 : VClass {
+ /* This becomes a constrained call even through 't2' is forced to be a reference type by the constraint */
+ return (T2)t2.foo (5);
+ }
+ }
+
+ class VClass {
+ public virtual VClass foo (int i) {
+ return this;
+ }
}
public static int test_0_constrained_void_iface_call () {
@@ -1343,6 +1365,17 @@ public class Tests
return 0;
}
+ public static int test_0_constrained_eh () {
+ var s2 = new ConsStructThrow () { };
+ try {
+ IFaceConstrained c = new ClassConstrained ();
+ c.constrained_void_iface_call<int, ConsStructThrow> (1, s2);
+ return 1;
+ } catch (Exception) {
+ return 0;
+ }
+ }
+
public static int test_0_constrained_void_iface_call_gsharedvt_arg () {
// This tests constrained calls through interfaces with one gsharedvt arg, like IComparable<T>.CompareTo ()
IFaceConstrained c = new ClassConstrained ();
@@ -1378,6 +1411,14 @@ public class Tests
return 0;
}
+ public static int test_0_constrained_normal_call () {
+ IFaceConstrained c = new ClassConstrained ();
+
+ var o = new VClass ();
+ var res = c.constrained_normal_call<int, VClass> (1, o);
+ return res == o ? 0 : 1;
+ }
+
public static async Task<T> FooAsync<T> (int i, int j) {
Task<int> t = new Task<int> (delegate () { return 42; });
var response = await t;
diff --git a/mono/mini/iltests.il.in b/mono/mini/iltests.il.in
index 8ea5c06d27..2ed020c9ce 100644
--- a/mono/mini/iltests.il.in
+++ b/mono/mini/iltests.il.in
@@ -348,7 +348,7 @@ PASS: ldc.i4.0
IL_000a: ret
}
- // Check that localloc can't be inlined
+ // Check that localloc cannot be inlined
.method static public int32 test_0_localloc_inline () cil managed {
.maxstack 16
.locals init (
@@ -967,6 +967,15 @@ COND: ldloc.0
ret
}
+ .method public static int32 test_1234_fconv_u () cil managed {
+ .maxstack 16
+
+ ldc.r8 1234.0
+ conv.u
+ conv.i4
+ ret
+ }
+
.method public static int32 test_0_get_type_from_handle_on_bblock_boundary () cil managed
{
.maxstack 16
diff --git a/mono/mini/image-writer.c b/mono/mini/image-writer.c
index 9554e569c2..a5d7488da8 100644
--- a/mono/mini/image-writer.c
+++ b/mono/mini/image-writer.c
@@ -125,7 +125,11 @@
#define USE_ELF_WRITER 1
#endif
-#if defined(USE_ELF_WRITER)
+#if defined(TARGET_X86) && defined(__APPLE__)
+//#define USE_MACH_WRITER
+#endif
+
+#if defined(USE_ELF_WRITER) || defined(USE_MACH_WRITER)
#define USE_BIN_WRITER 1
#endif
@@ -481,6 +485,206 @@ bin_writer_emit_zero_bytes (MonoImageWriter *acfg, int num)
acfg->cur_section->cur_offset += num;
}
+static void
+bin_writer_fwrite (MonoImageWriter *acfg, void *val, size_t size, size_t nmemb)
+{
+ if (acfg->fp)
+ fwrite (val, size, nmemb, acfg->fp);
+ else {
+ g_assert (acfg->out_buf_pos + (size * nmemb) <= acfg->out_buf_size);
+ memcpy (acfg->out_buf + acfg->out_buf_pos, val, size * nmemb);
+ acfg->out_buf_pos += (size * nmemb);
+ }
+}
+
+static void
+bin_writer_fseek (MonoImageWriter *acfg, int offset)
+{
+ if (acfg->fp)
+ fseek (acfg->fp, offset, SEEK_SET);
+ else
+ acfg->out_buf_pos = offset;
+}
+
+#ifdef USE_MACH_WRITER
+
+/*
+ * This is a minimal implementation designed to support xdebug on 32 bit osx
+ * FIXME: 64 bit support
+ */
+
+#include <mach-o/loader.h>
+
+static gsize
+get_label_addr (MonoImageWriter *acfg, const char *name)
+{
+ int offset;
+ BinLabel *lab;
+ BinSection *section;
+ gsize value;
+
+ lab = g_hash_table_lookup (acfg->labels, name);
+ if (!lab)
+ g_error ("Undefined label: '%s'.\n", name);
+ section = lab->section;
+ offset = lab->offset;
+ if (section->parent) {
+ value = section->parent->virt_offset + section->cur_offset + offset;
+ } else {
+ value = section->virt_offset + offset;
+ }
+ return value;
+}
+
+
+static void
+resolve_reloc (MonoImageWriter *acfg, BinReloc *reloc, guint8 **out_data, gsize *out_vaddr, gsize *out_start_val, gsize *out_end_val)
+{
+ guint8 *data;
+ gssize end_val, start_val;
+ gsize vaddr;
+
+ end_val = get_label_addr (acfg, reloc->val1);
+ if (reloc->val2) {
+ start_val = get_label_addr (acfg, reloc->val2);
+ } else if (reloc->val2_section) {
+ start_val = reloc->val2_offset;
+ if (reloc->val2_section->parent)
+ start_val += reloc->val2_section->parent->virt_offset + reloc->val2_section->cur_offset;
+ else
+ start_val += reloc->val2_section->virt_offset;
+ } else {
+ start_val = 0;
+ }
+ end_val = end_val - start_val + reloc->offset;
+ if (reloc->section->parent) {
+ data = reloc->section->parent->data;
+ data += reloc->section->cur_offset;
+ data += reloc->section_offset;
+ vaddr = reloc->section->parent->virt_offset;
+ vaddr += reloc->section->cur_offset;
+ vaddr += reloc->section_offset;
+ } else {
+ data = reloc->section->data;
+ data += reloc->section_offset;
+ vaddr = reloc->section->virt_offset;
+ vaddr += reloc->section_offset;
+ }
+
+ *out_start_val = start_val;
+ *out_end_val = end_val;
+ *out_data = data;
+ *out_vaddr = vaddr;
+}
+
+static void
+resolve_relocations (MonoImageWriter *acfg)
+{
+ BinReloc *reloc;
+ guint8 *data;
+ gsize end_val, start_val;
+ gsize vaddr;
+
+ /* Only resolve static relocations */
+ for (reloc = acfg->relocations; reloc; reloc = reloc->next) {
+ resolve_reloc (acfg, reloc, &data, &vaddr, &start_val, &end_val);
+ data [0] = end_val;
+ data [1] = end_val >> 8;
+ data [2] = end_val >> 16;
+ data [3] = end_val >> 24;
+ }
+}
+
+static int
+bin_writer_emit_writeout (MonoImageWriter *acfg)
+{
+ BinSection *s;
+ int sindex, file_size, nsections, file_offset, vmaddr;
+ struct mach_header header;
+ struct segment_command segment;
+ struct section *sections;
+
+ /* Assing vm addresses to sections */
+ nsections = 0;
+ vmaddr = 0;
+ for (s = acfg->sections; s; s = s->next) {
+ s->virt_offset = vmaddr;
+ vmaddr += s->cur_offset;
+ nsections ++;
+ }
+
+ resolve_relocations (acfg);
+
+ file_offset = 0;
+
+ memset (&header, 0, sizeof (header));
+ header.magic = MH_MAGIC;
+ header.cputype = CPU_TYPE_X86;
+ header.cpusubtype = CPU_SUBTYPE_X86_ALL;
+ header.filetype = MH_OBJECT;
+ header.ncmds = 0;
+ header.sizeofcmds = 0;
+ header.flags = 0;
+
+ file_offset += sizeof (header);
+
+ memset (&segment, 0, sizeof (segment));
+ segment.cmd = LC_SEGMENT;
+ segment.cmdsize = sizeof (segment);
+ segment.maxprot = VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE;
+ segment.initprot = VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE;
+
+ file_offset += sizeof (segment);
+ file_offset += nsections * sizeof (struct section);
+
+ sections = g_new0 (struct section, nsections);
+ sindex = 0;
+ for (s = acfg->sections; s; s = s->next) {
+ s->file_offset = file_offset;
+
+ /* .debug_line -> __debug_line */
+ sprintf (sections [sindex].sectname, "__%s", s->name + 1);
+ sprintf (sections [sindex].segname, "%s", "__DWARF");
+ sections [sindex].addr = s->virt_offset;
+ sections [sindex].size = s->cur_offset;
+ sections [sindex].offset = s->file_offset;
+
+ file_offset += s->cur_offset;
+
+ segment.nsects ++;
+ segment.cmdsize += sizeof (struct section);
+
+ sindex ++;
+ }
+
+ header.ncmds ++;
+ header.sizeofcmds += segment.cmdsize;
+
+ /* Emit data */
+ file_size = file_offset;
+
+ if (!acfg->fp) {
+ acfg->out_buf_size = file_size;
+ acfg->out_buf = g_malloc (acfg->out_buf_size);
+ }
+
+ bin_writer_fwrite (acfg, &header, sizeof (header), 1);
+ bin_writer_fwrite (acfg, &segment, sizeof (segment), 1);
+ bin_writer_fwrite (acfg, sections, sizeof (struct section), nsections);
+ for (s = acfg->sections; s; s = s->next) {
+ if (!acfg->fp)
+ g_assert (acfg->out_buf_pos == s->file_offset);
+ bin_writer_fwrite (acfg, s->data, s->cur_offset, 1);
+ }
+
+ if (acfg->fp)
+ fclose (acfg->fp);
+
+ return 0;
+}
+
+#endif
+
#ifdef USE_ELF_WRITER
enum {
@@ -1042,27 +1246,6 @@ resolve_relocations (MonoImageWriter *acfg)
#endif /* USE_ELF_RELA */
-static void
-bin_writer_fwrite (MonoImageWriter *acfg, void *val, size_t size, size_t nmemb)
-{
- if (acfg->fp)
- fwrite (val, size, nmemb, acfg->fp);
- else {
- g_assert (acfg->out_buf_pos + (size * nmemb) <= acfg->out_buf_size);
- memcpy (acfg->out_buf + acfg->out_buf_pos, val, size * nmemb);
- acfg->out_buf_pos += (size * nmemb);
- }
-}
-
-static void
-bin_writer_fseek (MonoImageWriter *acfg, int offset)
-{
- if (acfg->fp)
- fseek (acfg->fp, offset, SEEK_SET);
- else
- acfg->out_buf_pos = offset;
-}
-
static int normal_sections [] = { SECT_DATA, SECT_DEBUG_FRAME, SECT_DEBUG_INFO, SECT_DEBUG_ABBREV, SECT_DEBUG_LINE, SECT_DEBUG_LOC };
static int
diff --git a/mono/mini/ir-emit.h b/mono/mini/ir-emit.h
index 27954bf2e1..1af3871966 100644
--- a/mono/mini/ir-emit.h
+++ b/mono/mini/ir-emit.h
@@ -337,6 +337,7 @@ handle_gsharedvt_ldaddr (MonoCompile *cfg)
(dest)->type = STACK_MP; \
(dest)->klass = (var)->klass; \
(dest)->dreg = alloc_dreg ((cfg), STACK_MP); \
+ (cfg)->has_indirection = TRUE; \
if (G_UNLIKELY (cfg->gsharedvt) && mini_is_gsharedvt_variable_type ((cfg), (var)->inst_vtype)) { handle_gsharedvt_ldaddr ((cfg)); } \
if (SIZEOF_REGISTER == 4 && DECOMPOSE_INTO_REGPAIR ((var)->type)) { MonoInst *var1 = get_vreg_to_inst (cfg, (var)->dreg + 1); MonoInst *var2 = get_vreg_to_inst (cfg, (var)->dreg + 2); g_assert (var1); g_assert (var2); var1->flags |= MONO_INST_INDIRECT; var2->flags |= MONO_INST_INDIRECT; } \
} while (0)
@@ -834,8 +835,6 @@ static int ccount = 0;
/* Loads/Stores which can fault are handled correctly by the LLVM mono branch */
#define MONO_EMIT_NEW_IMPLICIT_EXCEPTION_LOAD_STORE(cfg) do { \
- if (COMPILE_LLVM (cfg) && !IS_LLVM_MONO_BRANCH) \
- MONO_EMIT_NEW_IMPLICIT_EXCEPTION ((cfg)); \
} while (0)
/* Emit an explicit null check which doesn't depend on SIGSEGV signal handling */
@@ -863,8 +862,6 @@ static int ccount = 0;
int __ins_flags = ins_flags; \
if (__ins_flags & MONO_INST_FAULT) { \
MONO_EMIT_NULL_CHECK ((cfg), (base)); \
- if (cfg->explicit_null_checks) \
- __ins_flags &= ~MONO_INST_FAULT; \
} \
NEW_LOAD_MEMBASE ((cfg), (dest), (op), (dr), (base), (offset)); \
(dest)->flags = (__ins_flags); \
@@ -875,8 +872,6 @@ static int ccount = 0;
int __ins_flags = ins_flags; \
if (__ins_flags & MONO_INST_FAULT) { \
MONO_EMIT_NULL_CHECK ((cfg), (base)); \
- if (cfg->explicit_null_checks) \
- __ins_flags &= ~MONO_INST_FAULT; \
} \
NEW_LOAD_MEMBASE ((cfg), (inst), (op), (dr), (base), (offset)); \
inst->flags = (__ins_flags); \
@@ -897,6 +892,12 @@ static int ccount = 0;
#define MONO_EMIT_NEW_LOAD_MEMBASE_FAULT(cfg,dr,base,offset) MONO_EMIT_NEW_LOAD_MEMBASE_OP_FAULT ((cfg), (OP_LOAD_MEMBASE), (dr), (base), (offset))
+#define NEW_LOAD_MEMBASE_INVARIANT(cfg,dest,op,dr,base,offset) NEW_LOAD_MEMBASE_FLAGS ((cfg), (dest), (op), (dr), (base), (offset), MONO_INST_INVARIANT_LOAD)
+
+#define MONO_EMIT_NEW_LOAD_MEMBASE_OP_INVARIANT(cfg,op,dr,base,offset) MONO_EMIT_NEW_LOAD_MEMBASE_OP_FLAGS ((cfg), (op), (dr), (base), (offset), MONO_INST_INVARIANT_LOAD)
+
+#define MONO_EMIT_NEW_LOAD_MEMBASE_INVARIANT(cfg,dr,base,offset) MONO_EMIT_NEW_LOAD_MEMBASE_OP_INVARIANT ((cfg), (OP_LOAD_MEMBASE), (dr), (base), (offset))
+
/*Object Model related macros*/
/* Default bounds check implementation for most architectures + llvm */
@@ -905,7 +906,7 @@ static int ccount = 0;
if (fault) \
MONO_EMIT_NEW_LOAD_MEMBASE_OP_FAULT (cfg, OP_LOADI4_MEMBASE, _length_reg, array_reg, offset); \
else \
- MONO_EMIT_NEW_LOAD_MEMBASE_OP_FLAGS (cfg, OP_LOADI4_MEMBASE, _length_reg, array_reg, offset, MONO_INST_CONSTANT_LOAD); \
+ MONO_EMIT_NEW_LOAD_MEMBASE_OP_FLAGS (cfg, OP_LOADI4_MEMBASE, _length_reg, array_reg, offset, MONO_INST_INVARIANT_LOAD); \
MONO_EMIT_NEW_BIALU (cfg, OP_COMPARE, -1, _length_reg, index_reg); \
MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException"); \
} while (0)
diff --git a/mono/mini/jit-icalls.c b/mono/mini/jit-icalls.c
index 10fd50a560..45c7689a58 100644
--- a/mono/mini/jit-icalls.c
+++ b/mono/mini/jit-icalls.c
@@ -82,7 +82,7 @@ mono_helper_stelem_ref_check (MonoArray *array, MonoObject *val)
mono_raise_exception (mono_get_exception_array_type_mismatch ());
}
-#ifndef MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS
+#if !defined(MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS) || defined(MONO_ARCH_EMULATE_LONG_MUL_OVF_OPTS)
gint64
mono_llmult (gint64 a, gint64 b)
@@ -996,8 +996,7 @@ mono_helper_compile_generic_method (MonoObject *obj, MonoMethod *method, gpointe
addr = mono_compile_method (vmethod);
- if (mono_method_needs_static_rgctx_invoke (vmethod, FALSE))
- addr = mono_create_static_rgctx_trampoline (vmethod, addr);
+ addr = mini_add_method_trampoline (NULL, vmethod, addr, mono_method_needs_static_rgctx_invoke (vmethod, FALSE), FALSE);
/* Since this is a virtual call, have to unbox vtypes */
if (obj->vtable->klass->valuetype)
diff --git a/mono/mini/liveness.c b/mono/mini/liveness.c
index 02e3c0857f..a5cbabb53a 100644
--- a/mono/mini/liveness.c
+++ b/mono/mini/liveness.c
@@ -219,7 +219,8 @@ analyze_liveness_bb (MonoCompile *cfg, MonoBasicBlock *bb)
MonoMethodVar *vars = cfg->vars;
guint32 abs_pos = (bb->dfn << 16);
- for (inst_num = 0, ins = bb->code; ins; ins = ins->next, inst_num += 2) {
+ /* Start inst_num from > 0, so last_use.abs_pos is only 0 for dead variables */
+ for (inst_num = 2, ins = bb->code; ins; ins = ins->next, inst_num += 2) {
const char *spec = INS_INFO (ins->opcode);
int num_sregs, i;
int sregs [MONO_MAX_SRC_REGS];
diff --git a/mono/mini/mdb-debug-info32-darwin.s b/mono/mini/mdb-debug-info32-darwin.s
deleted file mode 100644
index 5d80af79fd..0000000000
--- a/mono/mini/mdb-debug-info32-darwin.s
+++ /dev/null
@@ -1,14 +0,0 @@
-.text
-.globl _MONO_DEBUGGER__debugger_info
-.globl _MONO_DEBUGGER__notification_function
-_MONO_DEBUGGER__notification_function:
- int3
- ret
-.section .mdb_debug_info, "aw"
-.globl _MONO_DEBUGGER__debugger_info_ptr
-.globl _MONO_DEBUGGER__using_debugger
-_MONO_DEBUGGER__debugger_info_ptr:
- .long _MONO_DEBUGGER__debugger_info
-_MONO_DEBUGGER__using_debugger:
- .long 0
- .long 0
diff --git a/mono/mini/mdb-debug-info32.s b/mono/mini/mdb-debug-info32.s
deleted file mode 100644
index 230ccef0cf..0000000000
--- a/mono/mini/mdb-debug-info32.s
+++ /dev/null
@@ -1,13 +0,0 @@
- .text
-.global MONO_DEBUGGER__debugger_info
-.global MONO_DEBUGGER__notification_function
-MONO_DEBUGGER__notification_function:
- int3
- ret
-.section .mdb_debug_info, "aw", @progbits
-.global MONO_DEBUGGER__debugger_info_ptr
-.global MONO_DEBUGGER__using_debugger
-MONO_DEBUGGER__debugger_info_ptr:
- .long MONO_DEBUGGER__debugger_info
-MONO_DEBUGGER__using_debugger:
- .quad 0
diff --git a/mono/mini/mdb-debug-info64.s b/mono/mini/mdb-debug-info64.s
deleted file mode 100644
index d32add4772..0000000000
--- a/mono/mini/mdb-debug-info64.s
+++ /dev/null
@@ -1,15 +0,0 @@
-.text
-.global MONO_DEBUGGER__debugger_info
-.global MONO_DEBUGGER__notification_function
-MONO_DEBUGGER__notification_function:
- int3
- ret
-.section .mdb_debug_info, "aw", @progbits
-.global MONO_DEBUGGER__debugger_info_ptr
-.global MONO_DEBUGGER__using_debugger
-MONO_DEBUGGER__debugger_info_ptr:
- .quad MONO_DEBUGGER__debugger_info
-MONO_DEBUGGER__using_debugger:
- .quad 0
-.section .note.GNU-stack, "", @progbits
-.previous
diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c
index 4c83d65e7a..485713d73b 100644
--- a/mono/mini/method-to-ir.c
+++ b/mono/mini/method-to-ir.c
@@ -121,6 +121,12 @@
mono_cfg_set_exception (cfg, MONO_EXCEPTION_OUT_OF_MEMORY); \
goto exception_exit; \
} while (0)
+#define DISABLE_AOT(cfg) do { \
+ if ((cfg)->verbose_level >= 2) \
+ printf ("AOT disabled: %s:%d\n", __FILE__, __LINE__); \
+ (cfg)->disable_aot = TRUE; \
+ } while (0)
+
/* Determine whenever 'ins' represents a load of the 'this' argument */
#define MONO_CHECK_THIS(ins) (mono_method_signature (cfg->method)->hasthis && ((ins)->opcode == OP_MOVE) && ((ins)->sreg1 == cfg->args [0]->dreg))
@@ -264,6 +270,7 @@ mono_type_to_regmove (MonoCompile *cfg, MonoType *type)
if (type->byref)
return OP_MOVE;
+ type = mini_replace_type (type);
handle_enum:
switch (type->type) {
case MONO_TYPE_I1:
@@ -608,7 +615,7 @@ mono_create_spvar_for_region (MonoCompile *cfg, int region)
var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
/* prevent it from being register allocated */
- var->flags |= MONO_INST_INDIRECT;
+ var->flags |= MONO_INST_VOLATILE;
g_hash_table_insert (cfg->spvars, GINT_TO_POINTER (region), var);
}
@@ -630,7 +637,7 @@ mono_create_exvar_for_offset (MonoCompile *cfg, int offset)
var = mono_compile_create_var (cfg, &mono_defaults.object_class->byval_arg, OP_LOCAL);
/* prevent it from being register allocated */
- var->flags |= MONO_INST_INDIRECT;
+ var->flags |= MONO_INST_VOLATILE;
g_hash_table_insert (cfg->exvars, GINT_TO_POINTER (offset), var);
@@ -646,6 +653,7 @@ type_to_eval_stack_type (MonoCompile *cfg, MonoType *type, MonoInst *inst)
{
MonoClass *klass;
+ type = mini_replace_type (type);
inst->klass = klass = mono_class_from_mono_type (type);
if (type->byref) {
inst->type = STACK_MP;
@@ -1155,7 +1163,7 @@ mono_get_vtable_var (MonoCompile *cfg)
if (!cfg->rgctx_var) {
cfg->rgctx_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
/* force the var to be stack allocated */
- cfg->rgctx_var->flags |= MONO_INST_INDIRECT;
+ cfg->rgctx_var->flags |= MONO_INST_VOLATILE;
}
return cfg->rgctx_var;
@@ -1868,17 +1876,134 @@ mini_emit_memcpy (MonoCompile *cfg, int destreg, int doffset, int srcreg, int so
}
}
+static void
+emit_tls_set (MonoCompile *cfg, int sreg1, int tls_key)
+{
+ MonoInst *ins, *c;
+
+ if (cfg->compile_aot) {
+ EMIT_NEW_TLS_OFFSETCONST (cfg, c, tls_key);
+ MONO_INST_NEW (cfg, ins, OP_TLS_SET_REG);
+ ins->sreg1 = sreg1;
+ ins->sreg2 = c->dreg;
+ MONO_ADD_INS (cfg->cbb, ins);
+ } else {
+ MONO_INST_NEW (cfg, ins, OP_TLS_SET);
+ ins->sreg1 = sreg1;
+ ins->inst_offset = mini_get_tls_offset (tls_key);
+ MONO_ADD_INS (cfg->cbb, ins);
+ }
+}
+
+/*
+ * emit_push_lmf:
+ *
+ * Emit IR to push the current LMF onto the LMF stack.
+ */
+static void
+emit_push_lmf (MonoCompile *cfg)
+{
+ /*
+ * Emit IR to push the LMF:
+ * lmf_addr = <lmf_addr from tls>
+ * lmf->lmf_addr = lmf_addr
+ * lmf->prev_lmf = *lmf_addr
+ * *lmf_addr = lmf
+ */
+ int lmf_reg, prev_lmf_reg;
+ MonoInst *ins, *lmf_ins;
+
+ if (!cfg->lmf_ir)
+ return;
+
+ if (cfg->lmf_ir_mono_lmf && mini_tls_get_supported (cfg, TLS_KEY_LMF)) {
+ /* Load current lmf */
+ lmf_ins = mono_get_lmf_intrinsic (cfg);
+ g_assert (lmf_ins);
+ MONO_ADD_INS (cfg->cbb, lmf_ins);
+ EMIT_NEW_VARLOADA (cfg, ins, cfg->lmf_var, NULL);
+ lmf_reg = ins->dreg;
+ /* Save previous_lmf */
+ EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf), lmf_ins->dreg);
+ /* Set new LMF */
+ emit_tls_set (cfg, lmf_reg, TLS_KEY_LMF);
+ } else {
+ /*
+ * Store lmf_addr in a variable, so it can be allocated to a global register.
+ */
+ if (!cfg->lmf_addr_var)
+ cfg->lmf_addr_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
+
+ lmf_ins = mono_get_lmf_addr_intrinsic (cfg);
+ if (lmf_ins)
+ MONO_ADD_INS (cfg->cbb, lmf_ins);
+ else
+ lmf_ins = mono_emit_jit_icall (cfg, mono_get_lmf_addr, NULL);
+ lmf_ins->dreg = cfg->lmf_addr_var->dreg;
+
+ EMIT_NEW_VARLOADA (cfg, ins, cfg->lmf_var, NULL);
+ lmf_reg = ins->dreg;
+
+ prev_lmf_reg = alloc_preg (cfg);
+ /* Save previous_lmf */
+ EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, cfg->lmf_addr_var->dreg, 0);
+ EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf), prev_lmf_reg);
+ /* Set new lmf */
+ EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, cfg->lmf_addr_var->dreg, 0, lmf_reg);
+ }
+}
+
+/*
+ * emit_pop_lmf:
+ *
+ * Emit IR to pop the current LMF from the LMF stack.
+ */
+static void
+emit_pop_lmf (MonoCompile *cfg)
+{
+ int lmf_reg, lmf_addr_reg, prev_lmf_reg;
+ MonoInst *ins;
+
+ if (!cfg->lmf_ir)
+ return;
+
+ EMIT_NEW_VARLOADA (cfg, ins, cfg->lmf_var, NULL);
+ lmf_reg = ins->dreg;
+
+ if (cfg->lmf_ir_mono_lmf && mini_tls_get_supported (cfg, TLS_KEY_LMF)) {
+ /* Load previous_lmf */
+ prev_lmf_reg = alloc_preg (cfg);
+ EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+ /* Set new LMF */
+ emit_tls_set (cfg, prev_lmf_reg, TLS_KEY_LMF);
+ } else {
+ /*
+ * Emit IR to pop the LMF:
+ * *(lmf->lmf_addr) = lmf->prev_lmf
+ */
+ /* This could be called before emit_push_lmf () */
+ if (!cfg->lmf_addr_var)
+ cfg->lmf_addr_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
+ lmf_addr_reg = cfg->lmf_addr_var->dreg;
+
+ prev_lmf_reg = alloc_preg (cfg);
+ EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+ EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_addr_reg, 0, prev_lmf_reg);
+ }
+}
+
static int
ret_type_to_call_opcode (MonoType *type, int calli, int virt, MonoGenericSharingContext *gsctx)
{
if (type->byref)
- return calli? OP_CALL_REG: virt? OP_CALLVIRT: OP_CALL;
+ return calli? OP_CALL_REG: virt? OP_CALL_MEMBASE: OP_CALL;
handle_enum:
type = mini_get_basic_type_from_generic (gsctx, type);
+ type = mini_replace_type (type);
switch (type->type) {
case MONO_TYPE_VOID:
- return calli? OP_VOIDCALL_REG: virt? OP_VOIDCALLVIRT: OP_VOIDCALL;
+ return calli? OP_VOIDCALL_REG: virt? OP_VOIDCALL_MEMBASE: OP_VOIDCALL;
case MONO_TYPE_I1:
case MONO_TYPE_U1:
case MONO_TYPE_BOOLEAN:
@@ -1887,39 +2012,39 @@ handle_enum:
case MONO_TYPE_CHAR:
case MONO_TYPE_I4:
case MONO_TYPE_U4:
- return calli? OP_CALL_REG: virt? OP_CALLVIRT: OP_CALL;
+ return calli? OP_CALL_REG: virt? OP_CALL_MEMBASE: OP_CALL;
case MONO_TYPE_I:
case MONO_TYPE_U:
case MONO_TYPE_PTR:
case MONO_TYPE_FNPTR:
- return calli? OP_CALL_REG: virt? OP_CALLVIRT: OP_CALL;
+ return calli? OP_CALL_REG: virt? OP_CALL_MEMBASE: OP_CALL;
case MONO_TYPE_CLASS:
case MONO_TYPE_STRING:
case MONO_TYPE_OBJECT:
case MONO_TYPE_SZARRAY:
case MONO_TYPE_ARRAY:
- return calli? OP_CALL_REG: virt? OP_CALLVIRT: OP_CALL;
+ return calli? OP_CALL_REG: virt? OP_CALL_MEMBASE: OP_CALL;
case MONO_TYPE_I8:
case MONO_TYPE_U8:
- return calli? OP_LCALL_REG: virt? OP_LCALLVIRT: OP_LCALL;
+ return calli? OP_LCALL_REG: virt? OP_LCALL_MEMBASE: OP_LCALL;
case MONO_TYPE_R4:
case MONO_TYPE_R8:
- return calli? OP_FCALL_REG: virt? OP_FCALLVIRT: OP_FCALL;
+ return calli? OP_FCALL_REG: virt? OP_FCALL_MEMBASE: OP_FCALL;
case MONO_TYPE_VALUETYPE:
if (type->data.klass->enumtype) {
type = mono_class_enum_basetype (type->data.klass);
goto handle_enum;
} else
- return calli? OP_VCALL_REG: virt? OP_VCALLVIRT: OP_VCALL;
+ return calli? OP_VCALL_REG: virt? OP_VCALL_MEMBASE: OP_VCALL;
case MONO_TYPE_TYPEDBYREF:
- return calli? OP_VCALL_REG: virt? OP_VCALLVIRT: OP_VCALL;
+ return calli? OP_VCALL_REG: virt? OP_VCALL_MEMBASE: OP_VCALL;
case MONO_TYPE_GENERICINST:
type = &type->data.generic_class->container_class->byval_arg;
goto handle_enum;
case MONO_TYPE_VAR:
case MONO_TYPE_MVAR:
/* gsharedvt */
- return calli? OP_VCALL_REG: virt? OP_VCALLVIRT: OP_VCALL;
+ return calli? OP_VCALL_REG: virt? OP_VCALL_MEMBASE: OP_VCALL;
default:
g_error ("unknown type 0x%02x in ret_type_to_call_opcode", type->type);
}
@@ -1943,6 +2068,7 @@ target_type_is_incompatible (MonoCompile *cfg, MonoType *target, MonoInst *arg)
MonoType *simple_type;
MonoClass *klass;
+ target = mini_replace_type (target);
if (target->byref) {
/* FIXME: check that the pointed to types match */
if (arg->type == STACK_MP)
@@ -2148,15 +2274,15 @@ static int
callvirt_to_call (int opcode)
{
switch (opcode) {
- case OP_CALLVIRT:
+ case OP_CALL_MEMBASE:
return OP_CALL;
- case OP_VOIDCALLVIRT:
+ case OP_VOIDCALL_MEMBASE:
return OP_VOIDCALL;
- case OP_FCALLVIRT:
+ case OP_FCALL_MEMBASE:
return OP_FCALL;
- case OP_VCALLVIRT:
+ case OP_VCALL_MEMBASE:
return OP_VCALL;
- case OP_LCALLVIRT:
+ case OP_LCALL_MEMBASE:
return OP_LCALL;
default:
g_assert_not_reached ();
@@ -2165,27 +2291,6 @@ callvirt_to_call (int opcode)
return -1;
}
-static int
-callvirt_to_call_membase (int opcode)
-{
- switch (opcode) {
- case OP_CALLVIRT:
- return OP_CALL_MEMBASE;
- case OP_VOIDCALLVIRT:
- return OP_VOIDCALL_MEMBASE;
- case OP_FCALLVIRT:
- return OP_FCALL_MEMBASE;
- case OP_LCALLVIRT:
- return OP_LCALL_MEMBASE;
- case OP_VCALLVIRT:
- return OP_VCALL_MEMBASE;
- default:
- g_assert_not_reached ();
- }
-
- return -1;
-}
-
#ifdef MONO_ARCH_HAVE_IMT
/* Either METHOD or IMT_ARG needs to be set */
static void
@@ -2336,6 +2441,7 @@ inline static MonoCallInst *
mono_emit_call_args (MonoCompile *cfg, MonoMethodSignature *sig,
MonoInst **args, int calli, int virtual, int tail, int rgctx, int unbox_trampoline)
{
+ MonoType *sig_ret;
MonoCallInst *call;
#ifdef MONO_ARCH_SOFT_FLOAT_FALLBACK
int i;
@@ -2349,16 +2455,17 @@ mono_emit_call_args (MonoCompile *cfg, MonoMethodSignature *sig,
call->args = args;
call->signature = sig;
call->rgctx_reg = rgctx;
+ sig_ret = mini_replace_type (sig->ret);
- type_to_eval_stack_type ((cfg), sig->ret, &call->inst);
+ type_to_eval_stack_type ((cfg), sig_ret, &call->inst);
if (tail) {
- if (mini_type_is_vtype (cfg, sig->ret)) {
+ if (mini_type_is_vtype (cfg, sig_ret)) {
call->vret_var = cfg->vret_addr;
//g_assert_not_reached ();
}
- } else if (mini_type_is_vtype (cfg, sig->ret)) {
- MonoInst *temp = mono_compile_create_var (cfg, sig->ret, OP_LOCAL);
+ } else if (mini_type_is_vtype (cfg, sig_ret)) {
+ MonoInst *temp = mono_compile_create_var (cfg, sig_ret, OP_LOCAL);
MonoInst *loada;
temp->backend.is_pinvoke = sig->pinvoke;
@@ -2381,7 +2488,7 @@ mono_emit_call_args (MonoCompile *cfg, MonoMethodSignature *sig,
call->inst.dreg = temp->dreg;
call->vret_var = loada;
- } else if (!MONO_TYPE_IS_VOID (sig->ret))
+ } else if (!MONO_TYPE_IS_VOID (sig_ret))
call->inst.dreg = alloc_dreg (cfg, call->inst.type);
#ifdef MONO_ARCH_SOFT_FLOAT_FALLBACK
@@ -2556,7 +2663,6 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign
MONO_EMIT_NULL_CHECK (cfg, this_reg);
/* Make a call to delegate->invoke_impl */
- call->inst.opcode = callvirt_to_call_membase (call->inst.opcode);
call->inst.inst_basereg = this_reg;
call->inst.inst_offset = G_STRUCT_OFFSET (MonoDelegate, invoke_impl);
MONO_ADD_INS (cfg->cbb, (MonoInst*)call);
@@ -2611,8 +2717,6 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign
call->inst.opcode = callvirt_to_call (call->inst.opcode);
} else {
- call->inst.opcode = callvirt_to_call_membase (call->inst.opcode);
-
vtable_reg = alloc_preg (cfg);
MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, this_reg, G_STRUCT_OFFSET (MonoObject, vtable));
if (method->klass->flags & TYPE_ATTRIBUTE_INTERFACE) {
@@ -2811,7 +2915,7 @@ emit_write_barrier (MonoCompile *cfg, MonoInst *ptr, MonoInst *value)
has_card_table_wb = TRUE;
#endif
- if (has_card_table_wb && !cfg->compile_aot && card_table && nursery_shift_bits > 0) {
+ if (has_card_table_wb && !cfg->compile_aot && card_table && nursery_shift_bits > 0 && !COMPILE_LLVM (cfg)) {
MonoInst *wbarrier;
MONO_INST_NEW (cfg, wbarrier, OP_CARD_TABLE_WBARRIER);
@@ -3328,12 +3432,14 @@ emit_generic_class_init (MonoCompile *cfg, MonoClass *klass)
}
static void
-emit_seq_point (MonoCompile *cfg, MonoMethod *method, guint8* ip, gboolean intr_loc)
+emit_seq_point (MonoCompile *cfg, MonoMethod *method, guint8* ip, gboolean intr_loc, gboolean nonempty_stack)
{
MonoInst *ins;
if (cfg->gen_seq_points && cfg->method == method) {
NEW_SEQ_POINT (cfg, ins, ip - cfg->header->code, intr_loc);
+ if (nonempty_stack)
+ ins->flags |= MONO_INST_NONEMPTY_STACK;
MONO_ADD_INS (cfg->cbb, ins);
}
}
@@ -4315,7 +4421,7 @@ handle_delegate_ctor (MonoCompile *cfg, MonoClass *klass, MonoInst *target, Mono
* in mono_delegate_trampoline (), we allocate a per-domain memory slot to
* store it, and we fill it after the method has been compiled.
*/
- if (!cfg->compile_aot && !method->dynamic && !(cfg->opt & MONO_OPT_SHARED)) {
+ if (!method->dynamic && !(cfg->opt & MONO_OPT_SHARED)) {
MonoInst *code_slot_ins;
if (context_used) {
@@ -4332,7 +4438,10 @@ handle_delegate_ctor (MonoCompile *cfg, MonoClass *klass, MonoInst *target, Mono
}
mono_domain_unlock (domain);
- EMIT_NEW_PCONST (cfg, code_slot_ins, code_slot);
+ if (cfg->compile_aot)
+ EMIT_NEW_AOTCONST (cfg, code_slot_ins, MONO_PATCH_INFO_METHOD_CODE_SLOT, method);
+ else
+ EMIT_NEW_PCONST (cfg, code_slot_ins, code_slot);
}
MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, G_STRUCT_OFFSET (MonoDelegate, method_code), code_slot_ins->dreg);
}
@@ -4459,7 +4568,15 @@ mono_method_check_inlining (MonoCompile *cfg, MonoMethod *method)
* inside the inlined code
*/
if (!(cfg->opt & MONO_OPT_SHARED)) {
- if (method->klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT) {
+ /* The AggressiveInlining hint is a good excuse to force that cctor to run. */
+ if (method->iflags & METHOD_IMPL_ATTRIBUTE_AGGRESSIVE_INLINING) {
+ vtable = mono_class_vtable (cfg->domain, method->klass);
+ if (!vtable)
+ return FALSE;
+ if (cfg->compile_aot && mono_class_needs_cctor_run (method->klass, NULL))
+ return FALSE;
+ mono_runtime_class_init (vtable);
+ } else if (method->klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT) {
if (cfg->run_cctors && method->klass->has_cctor) {
/*FIXME it would easier and lazier to just use mono_class_try_get_vtable */
if (!method->klass->runtime_info)
@@ -4517,18 +4634,23 @@ mono_method_check_inlining (MonoCompile *cfg, MonoMethod *method)
}
static gboolean
-mini_field_access_needs_cctor_run (MonoCompile *cfg, MonoMethod *method, MonoVTable *vtable)
+mini_field_access_needs_cctor_run (MonoCompile *cfg, MonoMethod *method, MonoClass *klass, MonoVTable *vtable)
{
- if (vtable->initialized && !cfg->compile_aot)
- return FALSE;
+ if (!cfg->compile_aot) {
+ g_assert (vtable);
+ if (vtable->initialized)
+ return FALSE;
+ }
- if (vtable->klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT)
- return FALSE;
+ if (klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT) {
+ if (cfg->method == method)
+ return FALSE;
+ }
- if (!mono_class_needs_cctor_run (vtable->klass, method))
+ if (!mono_class_needs_cctor_run (klass, method))
return FALSE;
- if (! (method->flags & METHOD_ATTRIBUTE_STATIC) && (vtable->klass == method->klass))
+ if (! (method->flags & METHOD_ATTRIBUTE_STATIC) && (klass == method->klass))
/* The initialization is already done before the method is called */
return FALSE;
@@ -4543,7 +4665,7 @@ mini_emit_ldelema_1_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, Mono
int mult_reg, add_reg, array_reg, index_reg, index2_reg;
int context_used;
- if (mini_is_gsharedvt_klass (cfg, klass)) {
+ if (mini_is_gsharedvt_variable_klass (cfg, klass)) {
size = -1;
} else {
mono_class_init (klass);
@@ -4753,7 +4875,8 @@ should_insert_brekpoint (MonoMethod *method) {
case MONO_BREAK_POLICY_NEVER:
return FALSE;
case MONO_BREAK_POLICY_ON_DBG:
- return mono_debug_using_mono_debugger ();
+ g_warning ("mdb no longer supported");
+ return FALSE;
default:
g_warning ("Incorrect value returned from break policy callback");
return FALSE;
@@ -4814,7 +4937,7 @@ emit_array_store (MonoCompile *cfg, MonoClass *klass, MonoInst **sp, gboolean sa
} else {
MonoInst *ins;
- if (mini_is_gsharedvt_klass (cfg, klass)) {
+ if (mini_is_gsharedvt_variable_klass (cfg, klass)) {
MonoInst *addr;
// FIXME-VT: OP_ICONST optimization
@@ -5223,8 +5346,10 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
MonoInst *ins_iconst;
guint32 opcode = 0;
- if (fsig->params [0]->type == MONO_TYPE_I4)
+ if (fsig->params [0]->type == MONO_TYPE_I4) {
opcode = OP_ATOMIC_ADD_NEW_I4;
+ cfg->has_atomic_add_new_i4 = TRUE;
+ }
#if SIZEOF_REGISTER == 8
else if (fsig->params [0]->type == MONO_TYPE_I8)
opcode = OP_ATOMIC_ADD_NEW_I8;
@@ -5247,8 +5372,10 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
MonoInst *ins_iconst;
guint32 opcode = 0;
- if (fsig->params [0]->type == MONO_TYPE_I4)
+ if (fsig->params [0]->type == MONO_TYPE_I4) {
opcode = OP_ATOMIC_ADD_NEW_I4;
+ cfg->has_atomic_add_new_i4 = TRUE;
+ }
#if SIZEOF_REGISTER == 8
else if (fsig->params [0]->type == MONO_TYPE_I8)
opcode = OP_ATOMIC_ADD_NEW_I8;
@@ -5270,8 +5397,10 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
} else if (strcmp (cmethod->name, "Add") == 0) {
guint32 opcode = 0;
- if (fsig->params [0]->type == MONO_TYPE_I4)
+ if (fsig->params [0]->type == MONO_TYPE_I4) {
opcode = OP_ATOMIC_ADD_NEW_I4;
+ cfg->has_atomic_add_new_i4 = TRUE;
+ }
#if SIZEOF_REGISTER == 8
else if (fsig->params [0]->type == MONO_TYPE_I8)
opcode = OP_ATOMIC_ADD_NEW_I8;
@@ -5294,15 +5423,19 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
guint32 opcode;
gboolean is_ref = fsig->params [0]->type == MONO_TYPE_OBJECT;
- if (fsig->params [0]->type == MONO_TYPE_I4)
+ if (fsig->params [0]->type == MONO_TYPE_I4) {
opcode = OP_ATOMIC_EXCHANGE_I4;
+ cfg->has_atomic_exchange_i4 = TRUE;
+ }
#if SIZEOF_REGISTER == 8
else if (is_ref || (fsig->params [0]->type == MONO_TYPE_I8) ||
(fsig->params [0]->type == MONO_TYPE_I))
opcode = OP_ATOMIC_EXCHANGE_I8;
#else
- else if (is_ref || (fsig->params [0]->type == MONO_TYPE_I))
+ else if (is_ref || (fsig->params [0]->type == MONO_TYPE_I)) {
opcode = OP_ATOMIC_EXCHANGE_I4;
+ cfg->has_atomic_exchange_i4 = TRUE;
+ }
#endif
else
return NULL;
@@ -5566,35 +5699,48 @@ check_inline_caller_method_name_limit (MonoMethod *caller_method)
#endif
static void
-emit_init_rvar (MonoCompile *cfg, MonoInst *rvar, MonoType *rtype)
+emit_init_rvar (MonoCompile *cfg, int dreg, MonoType *rtype)
{
static double r8_0 = 0.0;
MonoInst *ins;
-
- switch (rvar->type) {
- case STACK_I4:
- MONO_EMIT_NEW_ICONST (cfg, rvar->dreg, 0);
- break;
- case STACK_I8:
- MONO_EMIT_NEW_I8CONST (cfg, rvar->dreg, 0);
- break;
- case STACK_PTR:
- case STACK_MP:
- case STACK_OBJ:
- MONO_EMIT_NEW_PCONST (cfg, rvar->dreg, 0);
- break;
- case STACK_R8:
+ int t;
+
+ rtype = mini_replace_type (rtype);
+ t = rtype->type;
+
+ if (rtype->byref) {
+ MONO_EMIT_NEW_PCONST (cfg, dreg, NULL);
+ } else if (t >= MONO_TYPE_BOOLEAN && t <= MONO_TYPE_U4) {
+ MONO_EMIT_NEW_ICONST (cfg, dreg, 0);
+ } else if (t == MONO_TYPE_I8 || t == MONO_TYPE_U8) {
+ MONO_EMIT_NEW_I8CONST (cfg, dreg, 0);
+ } else if (t == MONO_TYPE_R4 || t == MONO_TYPE_R8) {
MONO_INST_NEW (cfg, ins, OP_R8CONST);
ins->type = STACK_R8;
ins->inst_p0 = (void*)&r8_0;
- ins->dreg = rvar->dreg;
+ ins->dreg = dreg;
MONO_ADD_INS (cfg->cbb, ins);
- break;
- case STACK_VTYPE:
- MONO_EMIT_NEW_VZERO (cfg, rvar->dreg, mono_class_from_mono_type (rtype));
- break;
- default:
- g_assert_not_reached ();
+ } else if ((t == MONO_TYPE_VALUETYPE) || (t == MONO_TYPE_TYPEDBYREF) ||
+ ((t == MONO_TYPE_GENERICINST) && mono_type_generic_inst_is_valuetype (rtype))) {
+ MONO_EMIT_NEW_VZERO (cfg, dreg, mono_class_from_mono_type (rtype));
+ } else if (((t == MONO_TYPE_VAR) || (t == MONO_TYPE_MVAR)) && mini_type_var_is_vt (cfg, rtype)) {
+ MONO_EMIT_NEW_VZERO (cfg, dreg, mono_class_from_mono_type (rtype));
+ } else {
+ MONO_EMIT_NEW_PCONST (cfg, dreg, NULL);
+ }
+}
+
+static void
+emit_init_local (MonoCompile *cfg, int local, MonoType *type)
+{
+ MonoInst *var = cfg->locals [local];
+ if (COMPILE_SOFT_FLOAT (cfg)) {
+ MonoInst *store;
+ int reg = alloc_dreg (cfg, var->type);
+ emit_init_rvar (cfg, reg, type);
+ EMIT_NEW_LOCSTORE (cfg, store, local, cfg->cbb->last_ins);
+ } else {
+ emit_init_rvar (cfg, var->dreg, type);
}
}
@@ -5759,7 +5905,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
if (bb->last_ins && bb->last_ins->opcode == OP_NOT_REACHED) {
cfg->cbb = bb;
- emit_init_rvar (cfg, rvar, fsig->ret);
+ emit_init_rvar (cfg, rvar->dreg, fsig->ret);
}
}
}
@@ -5773,7 +5919,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
* set, so set it to a dummy value.
*/
if (!ret_var_set)
- emit_init_rvar (cfg, rvar, fsig->ret);
+ emit_init_rvar (cfg, rvar->dreg, fsig->ret);
EMIT_NEW_TEMPLOAD (cfg, ins, rvar->inst_c0);
*sp++ = ins;
@@ -6141,9 +6287,6 @@ initialize_array_data (MonoMethod *method, gboolean aot, unsigned char *ip, Mono
case MONO_TYPE_R4:
size = 4; break;
case MONO_TYPE_R8:
-#ifdef ARM_FPU_FPA
- return NULL; /* stupid ARM FP swapped format */
-#endif
case MONO_TYPE_I8:
case MONO_TYPE_U8:
size = 8; break;
@@ -6227,6 +6370,7 @@ emit_optimized_ldloca_ir (MonoCompile *cfg, unsigned char *ip, unsigned char *en
{
int local, token;
MonoClass *klass;
+ MonoType *type;
if (size == 1) {
local = ip [1];
@@ -6237,22 +6381,13 @@ emit_optimized_ldloca_ir (MonoCompile *cfg, unsigned char *ip, unsigned char *en
}
if (ip + 6 < end && (ip [0] == CEE_PREFIX1) && (ip [1] == CEE_INITOBJ) && ip_in_bb (cfg, cfg->cbb, ip + 1)) {
- gboolean skip = FALSE;
-
/* From the INITOBJ case */
token = read32 (ip + 2);
klass = mini_get_class (cfg->current_method, token, cfg->generic_context);
CHECK_TYPELOAD (klass);
- if (mini_type_is_reference (cfg, &klass->byval_arg)) {
- MONO_EMIT_NEW_PCONST (cfg, cfg->locals [local]->dreg, NULL);
- } else if (MONO_TYPE_ISSTRUCT (&klass->byval_arg)) {
- MONO_EMIT_NEW_VZERO (cfg, cfg->locals [local]->dreg, klass);
- } else {
- skip = TRUE;
- }
-
- if (!skip)
- return ip + 6;
+ type = mini_replace_type (&klass->byval_arg);
+ emit_init_local (cfg, local, type);
+ return ip + 6;
}
load_error:
return NULL;
@@ -6333,13 +6468,13 @@ is_jit_optimizer_disabled (MonoMethod *m)
}
static gboolean
-is_supported_tail_call (MonoCompile *cfg, MonoMethod *method, MonoMethod *cmethod, MonoMethodSignature *fsig)
+is_supported_tail_call (MonoCompile *cfg, MonoMethod *method, MonoMethod *cmethod, MonoMethodSignature *fsig, int call_opcode)
{
gboolean supported_tail_call;
int i;
-#ifdef MONO_ARCH_USE_OP_TAIL_CALL
- supported_tail_call = MONO_ARCH_USE_OP_TAIL_CALL (mono_method_signature (method), mono_method_signature (cmethod));
+#ifdef MONO_ARCH_HAVE_OP_TAIL_CALL
+ supported_tail_call = mono_arch_tail_call_supported (cfg, mono_method_signature (method), mono_method_signature (cmethod));
#else
supported_tail_call = mono_metadata_signature_equal (mono_method_signature (method), mono_method_signature (cmethod)) && !MONO_TYPE_ISSTRUCT (mono_method_signature (cmethod)->ret);
#endif
@@ -6358,6 +6493,8 @@ is_supported_tail_call (MonoCompile *cfg, MonoMethod *method, MonoMethod *cmetho
supported_tail_call = FALSE;
if (cmethod->wrapper_type && cmethod->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD)
supported_tail_call = FALSE;
+ if (call_opcode != CEE_CALL)
+ supported_tail_call = FALSE;
/* Debugging support */
#if 0
@@ -6471,7 +6608,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
MonoClass *klass;
MonoClass *constrained_call = NULL;
unsigned char *ip, *end, *target, *err_pos;
- static double r8_0 = 0.0;
MonoMethodSignature *sig;
MonoGenericContext *generic_context = NULL;
MonoGenericContainer *generic_container = NULL;
@@ -6581,9 +6717,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
dont_verify_stloc = TRUE;
}
- if (mono_debug_using_mono_debugger ())
- cfg->keep_cil_nops = TRUE;
-
if (sig->is_inflated)
generic_context = mono_method_get_context (method);
else if (generic_container)
@@ -6664,7 +6797,12 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
tblock->real_offset = clause->handler_offset;
tblock->flags |= BB_EXCEPTION_HANDLER;
- link_bblock (cfg, try_bb, tblock);
+ /*
+ * Linking the try block with the EH block hinders inlining as we won't be able to
+ * merge the bblocks from inlining and produce an artificial hole for no good reason.
+ */
+ if (COMPILE_LLVM (cfg))
+ link_bblock (cfg, try_bb, tblock);
if (*(ip + clause->handler_offset) == CEE_POP)
tblock->flags |= BB_EXCEPTION_DEAD_OBJ;
@@ -6765,7 +6903,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
if (cfg->method == method) {
breakpoint_id = mono_debugger_method_has_breakpoint (method);
- if (breakpoint_id && (mono_debug_format != MONO_DEBUG_FORMAT_DEBUGGER)) {
+ if (breakpoint_id) {
MONO_INST_NEW (cfg, ins, OP_BREAK);
MONO_ADD_INS (bblock, ins);
}
@@ -6840,7 +6978,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
/* prevent it from being register allocated */
- //var->flags |= MONO_INST_INDIRECT;
+ //var->flags |= MONO_INST_VOLATILE;
cfg->gsharedvt_info_var = var;
ins = emit_get_rgctx_gsharedvt_method (cfg, mini_method_check_context_used (cfg, method), method, info);
@@ -6849,7 +6987,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
/* Allocate locals */
locals_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
/* prevent it from being register allocated */
- //locals_var->flags |= MONO_INST_INDIRECT;
+ //locals_var->flags |= MONO_INST_VOLATILE;
cfg->gsharedvt_locals_var = locals_var;
dreg = alloc_ireg (cfg);
@@ -6954,7 +7092,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
/* FIXME: Is there a better way to do this?
We need the variable live for the duration
of the whole method. */
- cfg->args [0]->flags |= MONO_INST_INDIRECT;
+ cfg->args [0]->flags |= MONO_INST_VOLATILE;
}
}
@@ -7076,6 +7214,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
// FIXME: Enable this
//if (!(cfg->cbb->last_ins && cfg->cbb->last_ins->opcode == OP_SEQ_POINT)) {
NEW_SEQ_POINT (cfg, ins, ip - header->code, intr_loc);
+ if (sp != stack_start)
+ ins->flags |= MONO_INST_NONEMPTY_STACK;
MONO_ADD_INS (cfg->cbb, ins);
if (sym_seq_points)
@@ -7414,14 +7554,15 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
if (mono_security_cas_enabled ())
CHECK_CFG_EXCEPTION;
-#ifdef MONO_ARCH_USE_OP_TAIL_CALL
- {
+ if (ARCH_HAVE_OP_TAIL_CALL) {
MonoMethodSignature *fsig = mono_method_signature (cmethod);
int i, n;
/* Handle tail calls similarly to calls */
n = fsig->param_count + fsig->hasthis;
+ DISABLE_AOT (cfg);
+
MONO_INST_NEW_CALL (cfg, call, OP_TAILCALL);
call->method = cmethod;
call->tail_call = TRUE;
@@ -7433,17 +7574,16 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
mono_arch_emit_call (cfg, call);
MONO_ADD_INS (bblock, (MonoInst*)call);
- }
-#else
- for (i = 0; i < num_args; ++i)
- /* Prevent arguments from being optimized away */
- arg_array [i]->flags |= MONO_INST_VOLATILE;
+ } else {
+ for (i = 0; i < num_args; ++i)
+ /* Prevent arguments from being optimized away */
+ arg_array [i]->flags |= MONO_INST_VOLATILE;
- MONO_INST_NEW_CALL (cfg, call, OP_JMP);
- ins = (MonoInst*)call;
- ins->inst_p0 = cmethod;
- MONO_ADD_INS (bblock, ins);
-#endif
+ MONO_INST_NEW_CALL (cfg, call, OP_JMP);
+ ins = (MonoInst*)call;
+ ins->inst_p0 = cmethod;
+ MONO_ADD_INS (bblock, ins);
+ }
ip += 5;
start_new_bblock = 1;
@@ -7583,7 +7723,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
if (fsig->pinvoke) {
MonoMethod *wrapper = mono_marshal_get_native_wrapper (cmethod,
- check_for_pending_exc, FALSE);
+ check_for_pending_exc, cfg->compile_aot);
fsig = mono_method_signature (wrapper);
} else if (constrained_call) {
fsig = mono_method_signature (cmethod);
@@ -7594,7 +7734,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
mono_save_token_info (cfg, image, token, cil_method);
- if (!MONO_TYPE_IS_VOID (fsig->ret) && !sym_seq_points) {
+ if (!MONO_TYPE_IS_VOID (fsig->ret)) {
/*
* Need to emit an implicit seq point after every non-void call so single stepping through nested calls like
* foo (bar (), baz ())
@@ -7605,7 +7745,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
* int i = foo ();
*/
/* Special case a few common successor opcodes */
- if (!(ip + 5 < end && ip [5] == CEE_POP))
+ if (!(ip + 5 < end && (ip [5] == CEE_POP || ip [5] == CEE_NOP)) && !(seq_point_locs && mono_bitset_test_fast (seq_point_locs, ip + 5 - header->code)))
need_seq_point = TRUE;
}
@@ -7648,6 +7788,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
*/
if ((cmethod->klass != mono_defaults.object_class) && constrained_call->valuetype && cmethod->klass->valuetype) {
/* The 'Own method' case below */
+ } else if (cmethod->klass->image != mono_defaults.corlib && !(cmethod->klass->flags & TYPE_ATTRIBUTE_INTERFACE) && !cmethod->klass->valuetype) {
+ /* 'The type parameter is instantiated as a reference type' case below. */
} else if (((cmethod->klass == mono_defaults.object_class) || (cmethod->klass->flags & TYPE_ATTRIBUTE_INTERFACE) || (!cmethod->klass->valuetype && cmethod->klass->image != mono_defaults.corlib)) &&
(MONO_TYPE_IS_VOID (fsig->ret) || MONO_TYPE_IS_PRIMITIVE (fsig->ret) || MONO_TYPE_IS_REFERENCE (fsig->ret) || mini_is_gsharedvt_type (cfg, fsig->ret)) &&
(fsig->param_count == 0 || (!fsig->hasthis && fsig->param_count == 1) || (fsig->param_count == 1 && (MONO_TYPE_IS_REFERENCE (fsig->params [0]) || mini_is_gsharedvt_type (cfg, fsig->params [0]))))) {
@@ -8206,12 +8348,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
/* FIXME: runtime generic context pointer for jumps? */
/* FIXME: handle this for generic sharing eventually */
if (cmethod && (ins_flag & MONO_INST_TAILCALL) &&
- !vtable_arg && !cfg->generic_sharing_context && is_supported_tail_call (cfg, method, cmethod, fsig))
+ !vtable_arg && !cfg->generic_sharing_context && is_supported_tail_call (cfg, method, cmethod, fsig, call_opcode))
supported_tail_call = TRUE;
- if (supported_tail_call) {
- if (call_opcode != CEE_CALL)
- supported_tail_call = FALSE;
- }
if (supported_tail_call) {
MonoCallInst *call;
@@ -8221,7 +8359,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
//printf ("HIT: %s -> %s\n", mono_method_full_name (cfg->method, TRUE), mono_method_full_name (cmethod, TRUE));
- if (ARCH_USE_OP_TAIL_CALL) {
+ if (ARCH_HAVE_OP_TAIL_CALL) {
/* Handle tail calls similarly to normal calls */
tail_call = TRUE;
} else {
@@ -8325,7 +8463,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
ins_flag = 0;
constrained_call = NULL;
if (need_seq_point)
- emit_seq_point (cfg, method, ip, FALSE);
+ emit_seq_point (cfg, method, ip, FALSE, TRUE);
break;
}
case CEE_RET:
@@ -8352,8 +8490,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
cfg->ret_var_set = TRUE;
}
} else {
+ if (cfg->lmf_var && cfg->cbb->in_count)
+ emit_pop_lmf (cfg);
+
if (cfg->ret) {
- MonoType *ret_type = mono_method_signature (method)->ret;
+ MonoType *ret_type = mini_replace_type (mono_method_signature (method)->ret);
if (seq_points && !sym_seq_points) {
/*
@@ -9226,7 +9367,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
if (cmethod->klass->valuetype) {
iargs [0] = mono_compile_create_var (cfg, &cmethod->klass->byval_arg, OP_LOCAL);
- MONO_EMIT_NEW_VZERO (cfg, iargs [0]->dreg, cmethod->klass);
+ emit_init_rvar (cfg, iargs [0]->dreg, &cmethod->klass->byval_arg);
EMIT_NEW_TEMPLOADA (cfg, *sp, iargs [0]->inst_c0);
alloc = NULL;
@@ -9240,8 +9381,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
alloc = handle_alloc (cfg, cmethod->klass, FALSE, context_used);
*sp = alloc;
} else {
- MonoVTable *vtable = mono_class_vtable (cfg->domain, cmethod->klass);
+ MonoVTable *vtable = NULL;
+ if (!cfg->compile_aot)
+ vtable = mono_class_vtable (cfg->domain, cmethod->klass);
CHECK_TYPELOAD (cmethod->klass);
/*
@@ -9249,11 +9392,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
* call in mono_jit_runtime_invoke () can abort the finalizer thread.
* As a workaround, we call class cctors before allocating objects.
*/
- if (mini_field_access_needs_cctor_run (cfg, method, vtable) && !(g_slist_find (class_inits, vtable))) {
- mono_emit_abs_call (cfg, MONO_PATCH_INFO_CLASS_INIT, vtable->klass, helper_sig_class_init_trampoline, NULL);
+ if (mini_field_access_needs_cctor_run (cfg, method, cmethod->klass, vtable) && !(g_slist_find (class_inits, cmethod->klass))) {
+ mono_emit_abs_call (cfg, MONO_PATCH_INFO_CLASS_INIT, cmethod->klass, helper_sig_class_init_trampoline, NULL);
if (cfg->verbose_level > 2)
printf ("class %s.%s needs init call for ctor\n", cmethod->klass->name_space, cmethod->klass->name);
- class_inits = g_slist_prepend (class_inits, vtable);
+ class_inits = g_slist_prepend (class_inits, cmethod->klass);
}
alloc = handle_alloc (cfg, cmethod->klass, FALSE, 0);
@@ -9700,6 +9843,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
gboolean is_special_static;
MonoType *ftype;
MonoInst *store_val = NULL;
+ MonoInst *thread_ins;
op = *ip;
is_instance = (op == CEE_LDFLD || op == CEE_LDFLDA || op == CEE_STFLD);
@@ -9979,8 +10123,13 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
is_special_static = mono_class_field_is_special_static (field);
+ if (is_special_static && ((gsize)addr & 0x80000000) == 0)
+ thread_ins = mono_get_thread_intrinsic (cfg);
+ else
+ thread_ins = NULL;
+
/* Generate IR to compute the field address */
- if (is_special_static && ((gsize)addr & 0x80000000) == 0 && mono_get_thread_intrinsic (cfg) && !(cfg->opt & MONO_OPT_SHARED) && !context_used) {
+ if (is_special_static && ((gsize)addr & 0x80000000) == 0 && thread_ins && !(cfg->opt & MONO_OPT_SHARED) && !context_used) {
/*
* Fast access to TLS data
* Inline version of get_thread_static_data () in
@@ -9988,15 +10137,12 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
*/
guint32 offset;
int idx, static_data_reg, array_reg, dreg;
- MonoInst *thread_ins;
GSHAREDVT_FAILURE (op);
// offset &= 0x7fffffff;
// idx = (offset >> 24) - 1;
// return ((char*) thread->static_data [idx]) + (offset & 0xffffff);
-
- thread_ins = mono_get_thread_intrinsic (cfg);
MONO_ADD_INS (cfg->cbb, thread_ins);
static_data_reg = alloc_ireg (cfg);
MONO_EMIT_NEW_LOAD_MEMBASE (cfg, static_data_reg, thread_ins->dreg, G_STRUCT_OFFSET (MonoInternalThread, static_data));
@@ -10082,16 +10228,19 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
EMIT_NEW_FIELDCONST (cfg, iargs [1], field);
ins = mono_emit_jit_icall (cfg, mono_class_static_field_address, iargs);
} else {
- MonoVTable *vtable = mono_class_vtable (cfg->domain, klass);
+ MonoVTable *vtable = NULL;
+ if (!cfg->compile_aot)
+ vtable = mono_class_vtable (cfg->domain, klass);
CHECK_TYPELOAD (klass);
+
if (!addr) {
- if (mini_field_access_needs_cctor_run (cfg, method, vtable)) {
- if (!(g_slist_find (class_inits, vtable))) {
- mono_emit_abs_call (cfg, MONO_PATCH_INFO_CLASS_INIT, vtable->klass, helper_sig_class_init_trampoline, NULL);
+ if (mini_field_access_needs_cctor_run (cfg, method, klass, vtable)) {
+ if (!(g_slist_find (class_inits, klass))) {
+ mono_emit_abs_call (cfg, MONO_PATCH_INFO_CLASS_INIT, klass, helper_sig_class_init_trampoline, NULL);
if (cfg->verbose_level > 2)
printf ("class %s.%s needs init call for %s\n", klass->name_space, klass->name, mono_field_get_name (field));
- class_inits = g_slist_prepend (class_inits, vtable);
+ class_inits = g_slist_prepend (class_inits, klass);
}
} else {
if (cfg->run_cctors) {
@@ -10099,6 +10248,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
/* This makes so that inline cannot trigger */
/* .cctors: too many apps depend on them */
/* running with a specific order... */
+ g_assert (vtable);
if (! vtable->initialized)
INLINE_FAILURE ("class init");
ex = mono_runtime_class_init_full (vtable, FALSE);
@@ -10108,12 +10258,14 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
}
}
}
- addr = (char*)mono_vtable_get_static_field_data (vtable) + field->offset;
-
if (cfg->compile_aot)
EMIT_NEW_SFLDACONST (cfg, ins, field);
- else
+ else {
+ g_assert (vtable);
+ addr = (char*)mono_vtable_get_static_field_data (vtable) + field->offset;
+ g_assert (addr);
EMIT_NEW_PCONST (cfg, ins, addr);
+ }
} else {
MonoInst *iargs [1];
EMIT_NEW_ICONST (cfg, iargs [0], GPOINTER_TO_UINT (addr));
@@ -10433,7 +10585,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
cfg->flags |= MONO_CFG_HAS_LDELEMA;
- if (mini_is_gsharedvt_klass (cfg, klass)) {
+ if (mini_is_gsharedvt_variable_klass (cfg, klass)) {
// FIXME-VT: OP_ICONST optimization
addr = mini_emit_ldelema_1_ins (cfg, klass, sp [0], sp [1], TRUE);
EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, &klass->byval_arg, addr->dreg, 0);
@@ -10687,7 +10839,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
EMIT_NEW_TYPE_FROM_HANDLE_CONST (cfg, ins, tclass->image, tclass->type_token, generic_context);
} else {
/* FIXME: n is not a normal token */
- cfg->disable_aot = TRUE;
+ DISABLE_AOT (cfg);
EMIT_NEW_PCONST (cfg, ins, NULL);
}
} else {
@@ -10751,7 +10903,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
case CEE_ENDFINALLY:
/* mono_save_seq_point_info () depends on this */
if (sp != stack_start)
- emit_seq_point (cfg, method, ip, FALSE);
+ emit_seq_point (cfg, method, ip, FALSE, FALSE);
MONO_INST_NEW (cfg, ins, OP_ENDFINALLY);
MONO_ADD_INS (bblock, ins);
ip++;
@@ -10922,7 +11074,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
ip += 6;
inline_costs += 10 * num_calls++;
/* Can't embed random pointers into AOT code */
- cfg->disable_aot = 1;
+ DISABLE_AOT (cfg);
break;
}
case CEE_MONO_JIT_ICALL_ADDR: {
@@ -11107,17 +11259,31 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
bblock->out_of_line = TRUE;
ip += 2;
break;
- case CEE_MONO_TLS:
+ case CEE_MONO_TLS: {
+ int key;
+
CHECK_STACK_OVF (1);
CHECK_OPSIZE (6);
- MONO_INST_NEW (cfg, ins, OP_TLS_GET);
- ins->dreg = alloc_preg (cfg);
- ins->inst_offset = (gint32)read32 (ip + 2);
+ key = (gint32)read32 (ip + 2);
+ g_assert (key < TLS_KEY_NUM);
+
+ ins = mono_create_tls_get (cfg, key);
+ if (!ins) {
+ if (cfg->compile_aot) {
+ DISABLE_AOT (cfg);
+ MONO_INST_NEW (cfg, ins, OP_TLS_GET);
+ ins->dreg = alloc_preg (cfg);
+ ins->type = STACK_PTR;
+ } else {
+ g_assert_not_reached ();
+ }
+ }
ins->type = STACK_PTR;
MONO_ADD_INS (bblock, ins);
*sp++ = ins;
ip += 6;
break;
+ }
case CEE_MONO_DYN_CALL: {
MonoCallInst *call;
@@ -11129,7 +11295,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
if (!cfg->dyn_call_var) {
cfg->dyn_call_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
/* prevent it from being register allocated */
- cfg->dyn_call_var->flags |= MONO_INST_INDIRECT;
+ cfg->dyn_call_var->flags |= MONO_INST_VOLATILE;
}
/* Has to use a call inst since it local regalloc expects it */
@@ -11140,9 +11306,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
ins->sreg2 = sp [1]->dreg;
MONO_ADD_INS (bblock, ins);
-#ifdef MONO_ARCH_DYN_CALL_PARAM_AREA
cfg->param_area = MAX (cfg->param_area, MONO_ARCH_DYN_CALL_PARAM_AREA);
-#endif
ip += 2;
inline_costs += 10 * num_calls++;
@@ -11724,13 +11888,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
cfg->cbb = init_localsbb;
- if (! (get_domain = mono_arch_get_domain_intrinsic (cfg))) {
+ if ((get_domain = mono_get_domain_intrinsic (cfg))) {
+ MONO_ADD_INS (cfg->cbb, get_domain);
+ } else {
get_domain = mono_emit_jit_icall (cfg, mono_domain_get, NULL);
}
- else {
- get_domain->dreg = alloc_preg (cfg);
- MONO_ADD_INS (cfg->cbb, get_domain);
- }
NEW_TEMPSTORE (cfg, store, cfg->domainvar->inst_c0, get_domain);
MONO_ADD_INS (cfg->cbb, store);
}
@@ -11745,38 +11907,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
mono_emit_load_got_addr (cfg);
if (init_locals) {
- MonoInst *store;
-
cfg->cbb = init_localsbb;
cfg->ip = NULL;
for (i = 0; i < header->num_locals; ++i) {
- MonoType *ptype = header->locals [i];
- int t = ptype->type;
- dreg = cfg->locals [i]->dreg;
-
- if (t == MONO_TYPE_VALUETYPE && ptype->data.klass->enumtype)
- t = mono_class_enum_basetype (ptype->data.klass)->type;
- if (ptype->byref) {
- MONO_EMIT_NEW_PCONST (cfg, dreg, NULL);
- } else if (t >= MONO_TYPE_BOOLEAN && t <= MONO_TYPE_U4) {
- MONO_EMIT_NEW_ICONST (cfg, cfg->locals [i]->dreg, 0);
- } else if (t == MONO_TYPE_I8 || t == MONO_TYPE_U8) {
- MONO_EMIT_NEW_I8CONST (cfg, cfg->locals [i]->dreg, 0);
- } else if (t == MONO_TYPE_R4 || t == MONO_TYPE_R8) {
- MONO_INST_NEW (cfg, ins, OP_R8CONST);
- ins->type = STACK_R8;
- ins->inst_p0 = (void*)&r8_0;
- ins->dreg = alloc_dreg (cfg, STACK_R8);
- MONO_ADD_INS (init_localsbb, ins);
- EMIT_NEW_LOCSTORE (cfg, store, i, ins);
- } else if ((t == MONO_TYPE_VALUETYPE) || (t == MONO_TYPE_TYPEDBYREF) ||
- ((t == MONO_TYPE_GENERICINST) && mono_type_generic_inst_is_valuetype (ptype))) {
- MONO_EMIT_NEW_VZERO (cfg, dreg, mono_class_from_mono_type (ptype));
- } else if (((t == MONO_TYPE_VAR) || (t == MONO_TYPE_MVAR)) && mini_type_var_is_vt (cfg, ptype)) {
- MONO_EMIT_NEW_VZERO (cfg, dreg, mono_class_from_mono_type (ptype));
- } else {
- MONO_EMIT_NEW_PCONST (cfg, dreg, NULL);
- }
+ emit_init_local (cfg, i, header->locals [i]);
}
}
@@ -11791,6 +11925,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
}
}
+ if (cfg->lmf_var && cfg->method == method) {
+ cfg->cbb = init_localsbb;
+ emit_push_lmf (cfg);
+ }
+
if (seq_points) {
MonoBasicBlock *bb;
@@ -12514,7 +12653,7 @@ mono_handle_global_vregs (MonoCompile *cfg)
/* Arguments are implicitly global */
/* Putting R4 vars into registers doesn't work currently */
/* The gsharedvt vars are implicitly referenced by ldaddr opcodes, but those opcodes are only generated later */
- if ((var->opcode != OP_ARG) && (var != cfg->ret) && !(var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) && (vreg_to_bb [var->dreg] != -1) && (var->klass->byval_arg.type != MONO_TYPE_R4) && !cfg->disable_vreg_to_lvreg && var != cfg->gsharedvt_info_var && var != cfg->gsharedvt_locals_var) {
+ if ((var->opcode != OP_ARG) && (var != cfg->ret) && !(var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) && (vreg_to_bb [var->dreg] != -1) && (var->klass->byval_arg.type != MONO_TYPE_R4) && !cfg->disable_vreg_to_lvreg && var != cfg->gsharedvt_info_var && var != cfg->gsharedvt_locals_var && var != cfg->lmf_addr_var) {
/*
* Make that the variable's liveness interval doesn't contain a call, since
* that would cause the lvreg to be spilled, making the whole optimization
diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c
index 081186e22c..434f74f3f6 100644
--- a/mono/mini/mini-amd64.c
+++ b/mono/mini/mini-amd64.c
@@ -39,9 +39,9 @@
#include "debugger-agent.h"
#include "mini-gc.h"
-static gint lmf_tls_offset = -1;
-static gint lmf_addr_tls_offset = -1;
-static gint appdomain_tls_offset = -1;
+#ifdef HOST_WIN32
+static gint jit_tls_offset = -1;
+#endif
#ifdef MONO_XEN_OPT
static gboolean optimize_for_xen = TRUE;
@@ -603,12 +603,12 @@ typedef enum ArgumentClass {
} ArgumentClass;
static ArgumentClass
-merge_argument_class_from_type (MonoType *type, ArgumentClass class1)
+merge_argument_class_from_type (MonoGenericSharingContext *gsctx, MonoType *type, ArgumentClass class1)
{
ArgumentClass class2 = ARG_CLASS_NO_CLASS;
MonoType *ptype;
- ptype = mini_type_get_underlying_type (NULL, type);
+ ptype = mini_type_get_underlying_type (gsctx, type);
switch (ptype->type) {
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_CHAR:
@@ -655,7 +655,7 @@ merge_argument_class_from_type (MonoType *type, ArgumentClass class1)
for (i = 0; i < info->num_fields; ++i) {
class2 = class1;
- class2 = merge_argument_class_from_type (info->fields [i].field->type, class2);
+ class2 = merge_argument_class_from_type (gsctx, info->fields [i].field->type, class2);
}
break;
}
@@ -861,7 +861,7 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn
/* (8 is size of quad) */
quadsize [quad] = info->fields [i].offset + size - (quad * 8);
- class1 = merge_argument_class_from_type (info->fields [i].field->type, class1);
+ class1 = merge_argument_class_from_type (gsctx, info->fields [i].field->type, class1);
}
g_assert (class1 != ARG_CLASS_NO_CLASS);
args [quad] = class1;
@@ -1004,7 +1004,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
case MONO_TYPE_VALUETYPE: {
guint32 tmp_gr = 0, tmp_fr = 0, tmp_stacksize = 0;
- add_valuetype (gsctx, sig, &cinfo->ret, sig->ret, TRUE, &tmp_gr, &tmp_fr, &tmp_stacksize);
+ add_valuetype (gsctx, sig, &cinfo->ret, ret_type, TRUE, &tmp_gr, &tmp_fr, &tmp_stacksize);
if (cinfo->ret.storage == ArgOnStack) {
cinfo->vtype_retaddr = TRUE;
/* The caller passes the address where the value is stored */
@@ -1020,7 +1020,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
case MONO_TYPE_VOID:
break;
default:
- g_error ("Can't handle as return value 0x%x", sig->ret->type);
+ g_error ("Can't handle as return value 0x%x", ret_type->type);
}
}
@@ -1204,15 +1204,17 @@ mono_arch_get_argument_info (MonoGenericSharingContext *gsctx, MonoMethodSignatu
}
gboolean
-mono_amd64_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig)
+mono_arch_tail_call_supported (MonoCompile *cfg, MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig)
{
CallInfo *c1, *c2;
gboolean res;
+ MonoType *callee_ret;
c1 = get_call_info (NULL, NULL, caller_sig);
c2 = get_call_info (NULL, NULL, callee_sig);
res = c1->stack_usage >= c2->stack_usage;
- if (callee_sig->ret && MONO_TYPE_ISSTRUCT (callee_sig->ret) && c2->ret.storage != ArgValuetypeInReg)
+ callee_ret = mini_replace_type (callee_sig->ret);
+ if (callee_ret && MONO_TYPE_ISSTRUCT (callee_ret) && c2->ret.storage != ArgValuetypeInReg)
/* An address on the callee's stack is passed as the first argument */
res = FALSE;
@@ -1608,6 +1610,7 @@ mono_arch_regalloc_cost (MonoCompile *cfg, MonoMethodVar *vmv)
void
mono_arch_fill_argument_info (MonoCompile *cfg)
{
+ MonoType *sig_ret;
MonoMethodSignature *sig;
MonoMethodHeader *header;
MonoInst *ins;
@@ -1619,6 +1622,7 @@ mono_arch_fill_argument_info (MonoCompile *cfg)
sig = mono_method_signature (cfg->method);
cinfo = cfg->arch.cinfo;
+ sig_ret = mini_replace_type (sig->ret);
/*
* Contrary to mono_arch_allocate_vars (), the information should describe
@@ -1626,12 +1630,12 @@ mono_arch_fill_argument_info (MonoCompile *cfg)
* accessed during the execution of the method. The later makes no sense for the
* global register allocator, since a variable can be in more than one location.
*/
- if (sig->ret->type != MONO_TYPE_VOID) {
+ if (sig_ret->type != MONO_TYPE_VOID) {
switch (cinfo->ret.storage) {
case ArgInIReg:
case ArgInFloatSSEReg:
case ArgInDoubleSSEReg:
- if ((MONO_TYPE_ISSTRUCT (sig->ret) && !mono_class_from_mono_type (sig->ret)->enumtype) || ((sig->ret->type == MONO_TYPE_TYPEDBYREF) && cinfo->vtype_retaddr)) {
+ if ((MONO_TYPE_ISSTRUCT (sig_ret) && !mono_class_from_mono_type (sig_ret)->enumtype) || ((sig_ret->type == MONO_TYPE_TYPEDBYREF) && cinfo->vtype_retaddr)) {
cfg->vret_addr->opcode = OP_REGVAR;
cfg->vret_addr->inst_c0 = cinfo->ret.reg;
}
@@ -1686,6 +1690,7 @@ mono_arch_fill_argument_info (MonoCompile *cfg)
void
mono_arch_allocate_vars (MonoCompile *cfg)
{
+ MonoType *sig_ret;
MonoMethodSignature *sig;
MonoMethodHeader *header;
MonoInst *ins;
@@ -1699,6 +1704,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
sig = mono_method_signature (cfg->method);
cinfo = cfg->arch.cinfo;
+ sig_ret = mini_replace_type (sig->ret);
mono_arch_compute_omit_fp (cfg);
@@ -1738,14 +1744,16 @@ mono_arch_allocate_vars (MonoCompile *cfg)
if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
offset += sizeof(mgreg_t);
}
+ if (!cfg->arch.omit_fp)
+ cfg->arch.reg_save_area_offset = -offset;
}
- if (sig->ret->type != MONO_TYPE_VOID) {
+ if (sig_ret->type != MONO_TYPE_VOID) {
switch (cinfo->ret.storage) {
case ArgInIReg:
case ArgInFloatSSEReg:
case ArgInDoubleSSEReg:
- if ((MONO_TYPE_ISSTRUCT (sig->ret) && !mono_class_from_mono_type (sig->ret)->enumtype) || ((sig->ret->type == MONO_TYPE_TYPEDBYREF) && cinfo->vtype_retaddr)) {
+ if ((MONO_TYPE_ISSTRUCT (sig_ret) && !mono_class_from_mono_type (sig_ret)->enumtype) || ((sig_ret->type == MONO_TYPE_TYPEDBYREF) && cinfo->vtype_retaddr)) {
if (cfg->globalra) {
cfg->vret_addr->opcode = OP_REGVAR;
cfg->vret_addr->inst_c0 = cinfo->ret.reg;
@@ -1965,6 +1973,7 @@ mono_arch_create_vars (MonoCompile *cfg)
{
MonoMethodSignature *sig;
CallInfo *cinfo;
+ MonoType *sig_ret;
sig = mono_method_signature (cfg->method);
@@ -1975,7 +1984,8 @@ mono_arch_create_vars (MonoCompile *cfg)
if (cinfo->ret.storage == ArgValuetypeInReg)
cfg->ret_var_is_local = TRUE;
- if ((cinfo->ret.storage != ArgValuetypeInReg) && MONO_TYPE_ISSTRUCT (sig->ret)) {
+ sig_ret = mini_replace_type (sig->ret);
+ if ((cinfo->ret.storage != ArgValuetypeInReg) && MONO_TYPE_ISSTRUCT (sig_ret)) {
cfg->vret_addr = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_ARG);
if (G_UNLIKELY (cfg->verbose_level > 1)) {
printf ("vret_addr = ");
@@ -2010,12 +2020,16 @@ mono_arch_create_vars (MonoCompile *cfg)
cfg->arch.no_pushes = TRUE;
#endif
+ if (cfg->method->save_lmf)
+ cfg->create_lmf_var = TRUE;
+
+#if !defined(HOST_WIN32)
if (cfg->method->save_lmf) {
- MonoInst *lmf_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
- lmf_var->flags |= MONO_INST_VOLATILE;
- lmf_var->flags |= MONO_INST_LMF;
- cfg->arch.lmf_var = lmf_var;
+ cfg->lmf_ir = TRUE;
+ if (mono_get_lmf_tls_offset () != -1 && !optimize_for_xen)
+ cfg->lmf_ir_mono_lmf = TRUE;
}
+#endif
#ifndef MONO_AMD64_NO_PUSHES
cfg->arch_eh_jit_info = 1;
@@ -2136,9 +2150,10 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig)
ArgInfo *ainfo;
int j;
LLVMCallInfo *linfo;
- MonoType *t;
+ MonoType *t, *sig_ret;
n = sig->param_count + sig->hasthis;
+ sig_ret = mini_replace_type (sig->ret);
cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
@@ -2162,7 +2177,7 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig)
linfo->ret.pair_storage [j] = arg_storage_to_llvm_arg_storage (cfg, cinfo->ret.pair_storage [j]);
}
- if (MONO_TYPE_ISSTRUCT (sig->ret) && cinfo->ret.storage == ArgInIReg) {
+ if (MONO_TYPE_ISSTRUCT (sig_ret) && cinfo->ret.storage == ArgInIReg) {
/* Vtype returned using a hidden argument */
linfo->ret.storage = LLVMArgVtypeRetAddr;
linfo->vret_arg_index = cinfo->vret_arg_index;
@@ -2226,6 +2241,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
{
MonoInst *arg, *in;
MonoMethodSignature *sig;
+ MonoType *sig_ret;
int i, n, stack_size;
CallInfo *cinfo;
ArgInfo *ainfo;
@@ -2237,6 +2253,8 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
+ sig_ret = sig->ret;
+
if (COMPILE_LLVM (cfg)) {
/* We shouldn't be called in the llvm case */
cfg->disable_llvm = TRUE;
@@ -2394,7 +2412,8 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG) && (n == sig->sentinelpos))
emit_sig_cookie (cfg, call, cinfo);
- if (sig->ret && MONO_TYPE_ISSTRUCT (sig->ret)) {
+ sig_ret = mini_replace_type (sig->ret);
+ if (sig_ret && MONO_TYPE_ISSTRUCT (sig_ret)) {
MonoInst *vtarg;
if (cinfo->ret.storage == ArgValuetypeInReg) {
@@ -2439,7 +2458,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
}
#ifdef HOST_WIN32
- if (call->inst.opcode != OP_JMP && OP_TAILCALL != call->inst.opcode) {
+ if (call->inst.opcode != OP_TAILCALL) {
MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, 0x20);
}
#endif
@@ -2494,6 +2513,7 @@ mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src)
g_assert (!cfg->arch.no_pushes);
MONO_INST_NEW (cfg, load, OP_LDADDR);
+ cfg->has_indirection = TRUE;
load->inst_p0 = vtaddr;
vtaddr->flags |= MONO_INST_INDIRECT;
load->type = STACK_MP;
@@ -2558,7 +2578,7 @@ mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src)
void
mono_arch_emit_setret (MonoCompile *cfg, MonoMethod *method, MonoInst *val)
{
- MonoType *ret = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret);
+ MonoType *ret = mini_replace_type (mono_method_signature (method)->ret);
if (ret->type == MONO_TYPE_R4) {
if (COMPILE_LLVM (cfg))
@@ -2833,8 +2853,9 @@ mono_arch_finish_dyn_call (MonoDynCallInfo *info, guint8 *buf)
MonoMethodSignature *sig = dinfo->sig;
guint8 *ret = ((DynCallArgs*)buf)->ret;
mgreg_t res = ((DynCallArgs*)buf)->res;
+ MonoType *sig_ret = mono_type_get_underlying_type (sig->ret);
- switch (mono_type_get_underlying_type (sig->ret)->type) {
+ switch (sig_ret->type) {
case MONO_TYPE_VOID:
*(gpointer*)ret = NULL;
break;
@@ -2875,7 +2896,7 @@ mono_arch_finish_dyn_call (MonoDynCallInfo *info, guint8 *buf)
*(guint64*)ret = res;
break;
case MONO_TYPE_GENERICINST:
- if (MONO_TYPE_IS_REFERENCE (sig->ret)) {
+ if (MONO_TYPE_IS_REFERENCE (sig_ret)) {
*(gpointer*)ret = GREG_TO_PTR(res);
break;
} else {
@@ -3602,6 +3623,17 @@ mono_amd64_have_tls_get (void)
#endif
}
+int
+mono_amd64_get_tls_gs_offset (void)
+{
+#ifdef TARGET_OSX
+ return tls_gs_offset;
+#else
+ g_assert_not_reached ();
+ return -1;
+#endif
+}
+
/*
* mono_amd64_emit_tls_get:
* @code: buffer to store code to
@@ -3637,6 +3669,83 @@ mono_amd64_emit_tls_get (guint8* code, int dreg, int tls_offset)
return code;
}
+static guint8*
+emit_tls_get_reg (guint8* code, int dreg, int offset_reg)
+{
+ /* offset_reg contains a value translated by mono_arch_translate_tls_offset () */
+#ifdef TARGET_OSX
+ if (dreg != offset_reg)
+ amd64_mov_reg_reg (code, dreg, offset_reg, sizeof (mgreg_t));
+ amd64_prefix (code, X86_GS_PREFIX);
+ amd64_mov_reg_membase (code, dreg, dreg, 0, sizeof (mgreg_t));
+#elif defined(__linux__)
+ int tmpreg = -1;
+
+ if (dreg == offset_reg) {
+ /* Use a temporary reg by saving it to the redzone */
+ tmpreg = dreg == AMD64_RAX ? AMD64_RCX : AMD64_RAX;
+ amd64_mov_membase_reg (code, AMD64_RSP, -8, tmpreg, 8);
+ amd64_mov_reg_reg (code, tmpreg, offset_reg, sizeof (gpointer));
+ offset_reg = tmpreg;
+ }
+ x86_prefix (code, X86_FS_PREFIX);
+ amd64_mov_reg_mem (code, dreg, 0, 8);
+ amd64_mov_reg_memindex (code, dreg, dreg, 0, offset_reg, 0, 8);
+ if (tmpreg != -1)
+ amd64_mov_reg_membase (code, tmpreg, AMD64_RSP, -8, 8);
+#else
+ g_assert_not_reached ();
+#endif
+ return code;
+}
+
+static guint8*
+amd64_emit_tls_set (guint8 *code, int sreg, int tls_offset)
+{
+#ifdef HOST_WIN32
+ g_assert_not_reached ();
+#elif defined(__APPLE__)
+ x86_prefix (code, X86_GS_PREFIX);
+ amd64_mov_mem_reg (code, tls_gs_offset + (tls_offset * 8), sreg, 8);
+#else
+ g_assert (!optimize_for_xen);
+ x86_prefix (code, X86_FS_PREFIX);
+ amd64_mov_mem_reg (code, tls_offset, sreg, 8);
+#endif
+ return code;
+}
+
+static guint8*
+amd64_emit_tls_set_reg (guint8 *code, int sreg, int offset_reg)
+{
+ /* offset_reg contains a value translated by mono_arch_translate_tls_offset () */
+#ifdef HOST_WIN32
+ g_assert_not_reached ();
+#elif defined(__APPLE__)
+ x86_prefix (code, X86_GS_PREFIX);
+ amd64_mov_membase_reg (code, offset_reg, 0, sreg, 8);
+#else
+ x86_prefix (code, X86_FS_PREFIX);
+ amd64_mov_membase_reg (code, offset_reg, 0, sreg, 8);
+#endif
+ return code;
+}
+
+ /*
+ * mono_arch_translate_tls_offset:
+ *
+ * Translate the TLS offset OFFSET computed by MONO_THREAD_VAR_OFFSET () into a format usable by OP_TLS_GET_REG/OP_TLS_SET_REG.
+ */
+int
+mono_arch_translate_tls_offset (int offset)
+{
+#ifdef __APPLE__
+ return tls_gs_offset + (offset * 8);
+#else
+ return offset;
+#endif
+}
+
/*
* emit_setup_lmf:
*
@@ -3687,8 +3796,9 @@ emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offse
/* These can't contain refs */
mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), SLOT_NOREF);
+#ifdef HOST_WIN32
mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), SLOT_NOREF);
- mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, method), SLOT_NOREF);
+#endif
mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rip), SLOT_NOREF);
mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsp), SLOT_NOREF);
@@ -3707,94 +3817,59 @@ emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offse
return code;
}
+#ifdef HOST_WIN32
/*
- * emit_save_lmf:
+ * emit_push_lmf:
*
* Emit code to push an LMF structure on the LMF stack.
*/
static guint8*
-emit_save_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, gboolean *args_clobbered)
+emit_push_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, gboolean *args_clobbered)
{
- if ((lmf_tls_offset != -1) && !optimize_for_xen) {
- /*
- * Optimized version which uses the mono_lmf TLS variable instead of
- * indirection through the mono_lmf_addr TLS variable.
- */
- /* %rax = previous_lmf */
- x86_prefix (code, X86_FS_PREFIX);
- amd64_mov_reg_mem (code, AMD64_RAX, lmf_tls_offset, 8);
-
- /* Save previous_lmf */
- amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_RAX, 8);
- /* Set new lmf */
- if (lmf_offset == 0) {
- x86_prefix (code, X86_FS_PREFIX);
- amd64_mov_mem_reg (code, lmf_tls_offset, cfg->frame_reg, 8);
- } else {
- amd64_lea_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset);
- x86_prefix (code, X86_FS_PREFIX);
- amd64_mov_mem_reg (code, lmf_tls_offset, AMD64_R11, 8);
- }
+ if (jit_tls_offset != -1) {
+ code = mono_amd64_emit_tls_get (code, AMD64_RAX, jit_tls_offset);
+ amd64_alu_reg_imm (code, X86_ADD, AMD64_RAX, G_STRUCT_OFFSET (MonoJitTlsData, lmf));
} else {
- if (lmf_addr_tls_offset != -1) {
- /* Load lmf quicky using the FS register */
- code = mono_amd64_emit_tls_get (code, AMD64_RAX, lmf_addr_tls_offset);
-#ifdef HOST_WIN32
- /* The TLS key actually contains a pointer to the MonoJitTlsData structure */
- /* FIXME: Add a separate key for LMF to avoid this */
- amd64_alu_reg_imm (code, X86_ADD, AMD64_RAX, G_STRUCT_OFFSET (MonoJitTlsData, lmf));
-#endif
- }
- else {
- /*
- * The call might clobber argument registers, but they are already
- * saved to the stack/global regs.
- */
- if (args_clobbered)
- *args_clobbered = TRUE;
- code = emit_call (cfg, code, MONO_PATCH_INFO_INTERNAL_METHOD,
- (gpointer)"mono_get_lmf_addr", TRUE);
- }
-
- /* Save lmf_addr */
- amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), AMD64_RAX, sizeof(gpointer));
- /* Save previous_lmf */
- amd64_mov_reg_membase (code, AMD64_R11, AMD64_RAX, 0, sizeof(gpointer));
- amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_R11, sizeof(gpointer));
- /* Set new lmf */
- amd64_lea_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset);
- amd64_mov_membase_reg (code, AMD64_RAX, 0, AMD64_R11, sizeof(gpointer));
+ /*
+ * The call might clobber argument registers, but they are already
+ * saved to the stack/global regs.
+ */
+ if (args_clobbered)
+ *args_clobbered = TRUE;
+ code = emit_call (cfg, code, MONO_PATCH_INFO_INTERNAL_METHOD,
+ (gpointer)"mono_get_lmf_addr", TRUE);
}
+ /* Save lmf_addr */
+ amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), AMD64_RAX, sizeof(gpointer));
+ /* Save previous_lmf */
+ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RAX, 0, sizeof(gpointer));
+ amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_R11, sizeof(gpointer));
+ /* Set new lmf */
+ amd64_lea_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset);
+ amd64_mov_membase_reg (code, AMD64_RAX, 0, AMD64_R11, sizeof(gpointer));
+
return code;
}
+#endif
+#ifdef HOST_WIN32
/*
- * emit_save_lmf:
+ * emit_pop_lmf:
*
* Emit code to pop an LMF structure from the LMF stack.
*/
static guint8*
-emit_restore_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
+emit_pop_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
{
- if ((lmf_tls_offset != -1) && !optimize_for_xen) {
- /*
- * Optimized version which uses the mono_lmf TLS variable instead of indirection
- * through the mono_lmf_addr TLS variable.
- */
- /* reg = previous_lmf */
- amd64_mov_reg_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
- x86_prefix (code, X86_FS_PREFIX);
- amd64_mov_mem_reg (code, lmf_tls_offset, AMD64_R11, 8);
- } else {
- /* Restore previous lmf */
- amd64_mov_reg_membase (code, AMD64_RCX, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
- amd64_mov_reg_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), sizeof(gpointer));
- amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_RCX, sizeof(gpointer));
- }
+ /* Restore previous lmf */
+ amd64_mov_reg_membase (code, AMD64_RCX, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
+ amd64_mov_reg_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), sizeof(gpointer));
+ amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_RCX, sizeof(gpointer));
return code;
}
+#endif
#define REAL_PRINT_REG(text,reg) \
mono_assert (reg >= 0); \
@@ -4741,7 +4816,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
}
case OP_TAILCALL: {
MonoCallInst *call = (MonoCallInst*)ins;
- int pos = 0, i;
+ int i, save_area_offset;
/* FIXME: no tracing support... */
if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
@@ -4749,41 +4824,26 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
g_assert (!cfg->method->save_lmf);
- if (cfg->arch.omit_fp) {
- guint32 save_offset = 0;
- /* Pop callee-saved registers */
- for (i = 0; i < AMD64_NREG; ++i)
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
- amd64_mov_reg_membase (code, i, AMD64_RSP, save_offset, 8);
- save_offset += 8;
- }
- amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, cfg->arch.stack_alloc_size);
+ /* Restore callee saved registers */
+ save_area_offset = cfg->arch.reg_save_area_offset;
+ for (i = 0; i < AMD64_NREG; ++i)
+ if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
+ amd64_mov_reg_membase (code, i, cfg->frame_reg, save_area_offset, 8);
+ save_area_offset += 8;
+ }
+ if (cfg->arch.omit_fp) {
+ if (cfg->arch.stack_alloc_size)
+ amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, cfg->arch.stack_alloc_size);
// FIXME:
if (call->stack_usage)
NOT_IMPLEMENTED;
- }
- else {
- for (i = 0; i < AMD64_NREG; ++i)
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i)))
- pos -= sizeof(mgreg_t);
-
- /* Restore callee-saved registers */
- for (i = AMD64_NREG - 1; i > 0; --i) {
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
- amd64_mov_reg_membase (code, i, AMD64_RBP, pos, sizeof(mgreg_t));
- pos += sizeof(mgreg_t);
- }
- }
-
+ } else {
/* Copy arguments on the stack to our argument area */
for (i = 0; i < call->stack_usage; i += sizeof(mgreg_t)) {
amd64_mov_reg_membase (code, AMD64_RAX, AMD64_RSP, i, sizeof(mgreg_t));
amd64_mov_membase_reg (code, AMD64_RBP, 16 + i, AMD64_RAX, sizeof(mgreg_t));
}
-
- if (pos)
- amd64_lea_membase (code, AMD64_RSP, AMD64_RBP, pos);
amd64_leave (code);
}
@@ -4942,8 +5002,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
break;
}
case OP_AMD64_SAVE_SP_TO_LMF: {
- MonoInst *lmf_var = cfg->arch.lmf_var;
- amd64_mov_membase_reg (code, cfg->frame_reg, lmf_var->inst_offset + G_STRUCT_OFFSET (MonoLMF, rsp), AMD64_RSP, 8);
+ MonoInst *lmf_var = cfg->lmf_var;
+ amd64_mov_membase_reg (code, lmf_var->inst_basereg, lmf_var->inst_offset + G_STRUCT_OFFSET (MonoLMF, rsp), AMD64_RSP, 8);
break;
}
case OP_X86_PUSH:
@@ -5103,6 +5163,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_BR_REG:
amd64_jump_reg (code, ins->sreg1);
break;
+ case OP_ICNEQ:
+ case OP_ICGE:
+ case OP_ICLE:
+ case OP_ICGE_UN:
+ case OP_ICLE_UN:
+
case OP_CEQ:
case OP_LCEQ:
case OP_ICEQ:
@@ -5199,16 +5265,23 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
amd64_sse_movss_reg_membase (code, ins->dreg, ins->inst_basereg, ins->inst_offset);
amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg);
break;
- case OP_ICONV_TO_R4: /* FIXME: change precision */
+ case OP_ICONV_TO_R4:
+ amd64_sse_cvtsi2ss_reg_reg_size (code, ins->dreg, ins->sreg1, 4);
+ amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg);
+ break;
case OP_ICONV_TO_R8:
amd64_sse_cvtsi2sd_reg_reg_size (code, ins->dreg, ins->sreg1, 4);
break;
- case OP_LCONV_TO_R4: /* FIXME: change precision */
+ case OP_LCONV_TO_R4:
+ amd64_sse_cvtsi2ss_reg_reg (code, ins->dreg, ins->sreg1);
+ amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg);
+ break;
case OP_LCONV_TO_R8:
amd64_sse_cvtsi2sd_reg_reg (code, ins->dreg, ins->sreg1);
break;
case OP_FCONV_TO_R4:
- /* FIXME: nothing to do ?? */
+ amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg1);
+ amd64_sse_cvtss2sd_reg_reg (code, ins->dreg, ins->dreg);
break;
case OP_FCONV_TO_I1:
code = emit_float_to_int (cfg, code, ins->dreg, ins->sreg1, 1, TRUE);
@@ -5371,6 +5444,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
*/
amd64_sse_comisd_reg_reg (code, ins->sreg2, ins->sreg1);
break;
+ case OP_FCNEQ:
case OP_FCEQ: {
/* zeroing the register at the start results in
* shorter and faster code (we can also remove the widening op)
@@ -5380,8 +5454,19 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
amd64_sse_comisd_reg_reg (code, ins->sreg1, ins->sreg2);
unordered_check = code;
x86_branch8 (code, X86_CC_P, 0, FALSE);
- amd64_set_reg (code, X86_CC_EQ, ins->dreg, FALSE);
- amd64_patch (unordered_check, code);
+
+ if (ins->opcode == OP_FCEQ) {
+ amd64_set_reg (code, X86_CC_EQ, ins->dreg, FALSE);
+ amd64_patch (unordered_check, code);
+ } else {
+ guchar *jump_to_end;
+ amd64_set_reg (code, X86_CC_NE, ins->dreg, FALSE);
+ jump_to_end = code;
+ x86_jump8 (code, 0);
+ amd64_patch (unordered_check, code);
+ amd64_inc_reg (code, ins->dreg);
+ amd64_patch (jump_to_end, code);
+ }
break;
}
case OP_FCLT:
@@ -5405,6 +5490,16 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
amd64_set_reg (code, X86_CC_GT, ins->dreg, FALSE);
}
break;
+ case OP_FCLE: {
+ guchar *unordered_check;
+ amd64_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg);
+ amd64_sse_comisd_reg_reg (code, ins->sreg2, ins->sreg1);
+ unordered_check = code;
+ x86_branch8 (code, X86_CC_P, 0, FALSE);
+ amd64_set_reg (code, X86_CC_NB, ins->dreg, FALSE);
+ amd64_patch (unordered_check, code);
+ break;
+ }
case OP_FCGT:
case OP_FCGT_UN: {
/* zeroing the register at the start results in
@@ -5423,6 +5518,17 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
}
break;
}
+ case OP_FCGE: {
+ guchar *unordered_check;
+ amd64_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg);
+ amd64_sse_comisd_reg_reg (code, ins->sreg2, ins->sreg1);
+ unordered_check = code;
+ x86_branch8 (code, X86_CC_P, 0, FALSE);
+ amd64_set_reg (code, X86_CC_NA, ins->dreg, FALSE);
+ amd64_patch (unordered_check, code);
+ break;
+ }
+
case OP_FCLT_MEMBASE:
case OP_FCGT_MEMBASE:
case OP_FCLT_UN_MEMBASE:
@@ -5564,19 +5670,16 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
break;
}
case OP_TLS_GET_REG:
-#ifdef TARGET_OSX
- // FIXME: tls_gs_offset can change too, do these when calculating the tls offset
- if (ins->dreg != ins->sreg1)
- amd64_mov_reg_reg (code, ins->dreg, ins->sreg1, sizeof (gpointer));
- amd64_shift_reg_imm (code, X86_SHL, ins->dreg, 3);
- if (tls_gs_offset)
- amd64_alu_reg_imm (code, X86_ADD, ins->dreg, tls_gs_offset);
- x86_prefix (code, X86_GS_PREFIX);
- amd64_mov_reg_membase (code, ins->dreg, ins->dreg, 0, sizeof (gpointer));
-#else
- g_assert_not_reached ();
-#endif
+ code = emit_tls_get_reg (code, ins->dreg, ins->sreg1);
+ break;
+ case OP_TLS_SET: {
+ code = amd64_emit_tls_set (code, ins->sreg1, ins->inst_offset);
+ break;
+ }
+ case OP_TLS_SET_REG: {
+ code = amd64_emit_tls_set_reg (code, ins->sreg1, ins->sreg2);
break;
+ }
case OP_MEMORY_BARRIER: {
switch (ins->backend.memory_barrier_kind) {
case StoreLoadBarrier:
@@ -6464,8 +6567,6 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono
unsigned char *ip = patch_info->ip.i + code;
unsigned char *target;
- target = mono_resolve_patch_target (method, domain, code, patch_info, run_cctors);
-
if (compile_aot) {
switch (patch_info->type) {
case MONO_PATCH_INFO_BB:
@@ -6477,6 +6578,8 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono
}
}
+ target = mono_resolve_patch_target (method, domain, code, patch_info, run_cctors);
+
switch (patch_info->type) {
case MONO_PATCH_INFO_NONE:
continue;
@@ -6562,7 +6665,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
int alloc_size, pos, i, cfa_offset, quad, max_epilog_size;
guint8 *code;
CallInfo *cinfo;
- MonoInst *lmf_var = cfg->arch.lmf_var;
+ MonoInst *lmf_var = cfg->lmf_var;
gboolean args_clobbered = FALSE;
gboolean trace = FALSE;
#ifdef __native_client_codegen__
@@ -6639,23 +6742,6 @@ mono_arch_emit_prolog (MonoCompile *cfg)
#endif
}
- /* Save callee saved registers */
- if (!cfg->arch.omit_fp && !method->save_lmf) {
- int offset = cfa_offset;
-
- for (i = 0; i < AMD64_NREG; ++i)
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
- amd64_push_reg (code, i);
- pos += 8; /* AMD64 push inst is always 8 bytes, no way to change it */
- offset += 8;
- mono_emit_unwind_op_offset (cfg, code, i, - offset);
- async_exc_point (code);
-
- /* These are handled automatically by the stack marking code */
- mini_gc_set_slot_type_from_cfa (cfg, - offset, SLOT_NOREF);
- }
- }
-
/* The param area is always at offset 0 from sp */
/* This needs to be allocated here, since it has to come after the spill area */
if (cfg->arch.no_pushes && cfg->param_area) {
@@ -6792,19 +6878,31 @@ mono_arch_emit_prolog (MonoCompile *cfg)
}
/* Save callee saved registers */
- if (cfg->arch.omit_fp && !method->save_lmf) {
- gint32 save_area_offset = cfg->arch.reg_save_area_offset;
+ if (!method->save_lmf) {
+ gint32 save_area_offset;
+
+ if (cfg->arch.omit_fp) {
+ save_area_offset = cfg->arch.reg_save_area_offset;
+ /* Save caller saved registers after sp is adjusted */
+ /* The registers are saved at the bottom of the frame */
+ /* FIXME: Optimize this so the regs are saved at the end of the frame in increasing order */
+ } else {
+ /* The registers are saved just below the saved rbp */
+ save_area_offset = cfg->arch.reg_save_area_offset;
+ }
- /* Save caller saved registers after sp is adjusted */
- /* The registers are saved at the bottom of the frame */
- /* FIXME: Optimize this so the regs are saved at the end of the frame in increasing order */
for (i = 0; i < AMD64_NREG; ++i)
if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
- amd64_mov_membase_reg (code, AMD64_RSP, save_area_offset, i, 8);
- mono_emit_unwind_op_offset (cfg, code, i, - (cfa_offset - save_area_offset));
+ amd64_mov_membase_reg (code, cfg->frame_reg, save_area_offset, i, 8);
- /* These are handled automatically by the stack marking code */
- mini_gc_set_slot_type_from_cfa (cfg, - (cfa_offset - save_area_offset), SLOT_NOREF);
+ if (cfg->arch.omit_fp) {
+ mono_emit_unwind_op_offset (cfg, code, i, - (cfa_offset - save_area_offset));
+ /* These are handled automatically by the stack marking code */
+ mini_gc_set_slot_type_from_cfa (cfg, - (cfa_offset - save_area_offset), SLOT_NOREF);
+ } else {
+ mono_emit_unwind_op_offset (cfg, code, i, - (-save_area_offset + (2 * 8)));
+ // FIXME: GC
+ }
save_area_offset += 8;
async_exc_point (code);
@@ -7005,9 +7103,13 @@ mono_arch_emit_prolog (MonoCompile *cfg)
}
}
+#ifdef HOST_WIN32
if (method->save_lmf) {
- code = emit_save_lmf (cfg, code, lmf_var->inst_offset, &args_clobbered);
+ code = emit_push_lmf (cfg, code, lmf_var->inst_offset, &args_clobbered);
}
+#else
+ args_clobbered = TRUE;
+#endif
if (trace) {
args_clobbered = TRUE;
@@ -7126,7 +7228,7 @@ mono_arch_emit_epilog (MonoCompile *cfg)
guint8 *code;
int max_epilog_size;
CallInfo *cinfo;
- gint32 lmf_offset = cfg->arch.lmf_var ? ((MonoInst*)cfg->arch.lmf_var)->inst_offset : -1;
+ gint32 lmf_offset = cfg->lmf_var ? ((MonoInst*)cfg->lmf_var)->inst_offset : -1;
max_epilog_size = get_max_epilog_size (cfg);
@@ -7141,10 +7243,14 @@ mono_arch_emit_epilog (MonoCompile *cfg)
if (mono_jit_trace_calls != NULL && mono_trace_eval (method))
code = mono_arch_instrument_epilog (cfg, mono_trace_leave_method, code, TRUE);
- /* the code restoring the registers must be kept in sync with OP_JMP */
+ /* the code restoring the registers must be kept in sync with OP_TAILCALL */
pos = 0;
if (method->save_lmf) {
+#ifdef HOST_WIN32
+ code = emit_pop_lmf (cfg, code, lmf_offset);
+#endif
+
/* check if we need to restore protection of the stack after a stack overflow */
if (mono_get_jit_tls_offset () != -1) {
guint8 *patch;
@@ -7163,8 +7269,6 @@ mono_arch_emit_epilog (MonoCompile *cfg)
/* FIXME: maybe save the jit tls in the prolog */
}
- code = emit_restore_lmf (cfg, code, lmf_offset);
-
/* Restore caller saved regs */
if (cfg->used_int_regs & (1 << AMD64_RBP)) {
amd64_mov_reg_membase (code, AMD64_RBP, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rbp), 8);
@@ -7197,40 +7301,13 @@ mono_arch_emit_epilog (MonoCompile *cfg)
}
#endif
} else {
+ gint32 save_area_offset = cfg->arch.reg_save_area_offset;
- if (cfg->arch.omit_fp) {
- gint32 save_area_offset = cfg->arch.reg_save_area_offset;
-
- for (i = 0; i < AMD64_NREG; ++i)
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
- amd64_mov_reg_membase (code, i, AMD64_RSP, save_area_offset, 8);
- save_area_offset += 8;
- }
- }
- else {
- for (i = 0; i < AMD64_NREG; ++i)
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i)))
- pos -= sizeof(mgreg_t);
-
- if (pos) {
- if (pos == - sizeof(mgreg_t)) {
- /* Only one register, so avoid lea */
- for (i = AMD64_NREG - 1; i > 0; --i)
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
- amd64_mov_reg_membase (code, i, AMD64_RBP, pos, 8);
- }
- }
- else {
- amd64_lea_membase (code, AMD64_RSP, AMD64_RBP, pos);
-
- /* Pop registers in reverse order */
- for (i = AMD64_NREG - 1; i > 0; --i)
- if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
- amd64_pop_reg (code, i);
- }
- }
+ for (i = 0; i < AMD64_NREG; ++i)
+ if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->used_int_regs & (1 << i))) {
+ amd64_mov_reg_membase (code, i, cfg->frame_reg, save_area_offset, 8);
+ save_area_offset += 8;
}
- }
}
/* Load returned vtypes into registers if needed */
@@ -7552,7 +7629,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
guchar *code = p;
int save_mode = SAVE_NONE;
MonoMethod *method = cfg->method;
- MonoType *ret_type = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret);
+ MonoType *ret_type = mini_replace_type (mono_method_signature (method)->ret);
int i;
switch (ret_type->type) {
@@ -7953,7 +8030,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
return NULL;
/* FIXME: Support more cases */
- if (MONO_TYPE_ISSTRUCT (sig->ret))
+ if (MONO_TYPE_ISSTRUCT (mini_replace_type (sig->ret)))
return NULL;
if (has_target) {
@@ -8005,24 +8082,15 @@ mono_arch_finish_init (void)
* We need to init this multiple times, since when we are first called, the key might not
* be initialized yet.
*/
- appdomain_tls_offset = mono_domain_get_tls_key ();
- lmf_tls_offset = mono_get_jit_tls_key ();
- lmf_addr_tls_offset = mono_get_jit_tls_key ();
+ jit_tls_offset = mono_get_jit_tls_key ();
/* Only 64 tls entries can be accessed using inline code */
- if (appdomain_tls_offset >= 64)
- appdomain_tls_offset = -1;
- if (lmf_tls_offset >= 64)
- lmf_tls_offset = -1;
- if (lmf_addr_tls_offset >= 64)
- lmf_addr_tls_offset = -1;
+ if (jit_tls_offset >= 64)
+ jit_tls_offset = -1;
#else
#ifdef MONO_XEN_OPT
optimize_for_xen = access ("/proc/xen", F_OK) == 0;
#endif
- appdomain_tls_offset = mono_domain_get_tls_offset ();
- lmf_tls_offset = mono_get_lmf_tls_offset ();
- lmf_addr_tls_offset = mono_get_lmf_addr_tls_offset ();
#endif
}
@@ -8335,18 +8403,6 @@ mono_arch_print_tree (MonoInst *tree, int arity)
return 0;
}
-MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- MonoInst* ins;
-
- if (appdomain_tls_offset == -1)
- return NULL;
-
- MONO_INST_NEW (cfg, ins, OP_TLS_GET);
- ins->inst_offset = appdomain_tls_offset;
- return ins;
-}
-
#define _CTX_REG(ctx,fld,i) ((&ctx->fld)[i])
mgreg_t
@@ -8359,12 +8415,7 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
case AMD64_RBP: return ctx->rbp;
case AMD64_RSP: return ctx->rsp;
default:
- if (reg < 8)
- return _CTX_REG (ctx, rax, reg);
- else if (reg >= 12)
- return _CTX_REG (ctx, r12, reg - 12);
- else
- g_assert_not_reached ();
+ return _CTX_REG (ctx, rax, reg);
}
}
@@ -8388,12 +8439,7 @@ mono_arch_context_set_int_reg (MonoContext *ctx, int reg, mgreg_t val)
ctx->rsp = val;
break;
default:
- if (reg < 8)
- _CTX_REG (ctx, rax, reg) = val;
- else if (reg >= 12)
- _CTX_REG (ctx, r12, reg - 12) = val;
- else
- g_assert_not_reached ();
+ _CTX_REG (ctx, rax, reg) = val;
}
}
@@ -8671,4 +8717,13 @@ mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code)
return info;
}
+void
+mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
+{
+ ext->lmf.previous_lmf = prev_lmf;
+ /* Mark that this is a MonoLMFExt */
+ ext->lmf.previous_lmf = (gpointer)(((gssize)ext->lmf.previous_lmf) | 2);
+ ext->lmf.rsp = (gssize)ext;
+}
+
#endif
diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h
index fd84eab379..b523d9981c 100644
--- a/mono/mini/mini-amd64.h
+++ b/mono/mini/mini-amd64.h
@@ -47,7 +47,7 @@ struct sigcontext {
guint64 eip;
};
-typedef void (* MonoW32ExceptionHandler) (int _dummy, EXCEPTION_RECORD *info, void *context);
+typedef void (* MonoW32ExceptionHandler) (int _dummy, EXCEPTION_POINTERS *info, void *context);
void win32_seh_init(void);
void win32_seh_cleanup(void);
void win32_seh_set_handler(int type, MonoW32ExceptionHandler handler);
@@ -159,16 +159,17 @@ struct sigcontext {
struct MonoLMF {
/*
- * If the lowest bit is set to 1, then this LMF has the rip field set. Otherwise,
+ * If the lowest bit is set, then this LMF has the rip field set. Otherwise,
* the rip field is not set, and the rsp field points to the stack location where
* the caller ip is saved.
- * If the second lowest bit is set to 1, then this is a MonoLMFExt structure, and
+ * If the second lowest bit is set, then this is a MonoLMFExt structure, and
* the other fields are not valid.
+ * If the third lowest bit is set, then this is a MonoLMFTramp structure.
*/
gpointer previous_lmf;
+#ifdef HOST_WIN32
gpointer lmf_addr;
- /* This is only set in trampoline LMF frames */
- MonoMethod *method;
+#endif
#if defined(__default_codegen__) || defined(HOST_WIN32)
guint64 rip;
#elif defined(__native_client_codegen__)
@@ -189,6 +190,13 @@ struct MonoLMF {
#endif
};
+/* LMF structure used by the JIT trampolines */
+typedef struct {
+ struct MonoLMF lmf;
+ guint64 *regs;
+ gpointer lmf_addr;
+} MonoLMFTramp;
+
typedef struct MonoCompileArch {
gint32 localloc_offset;
gint32 reg_save_area_offset;
@@ -334,9 +342,7 @@ typedef struct MonoCompileArch {
#define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
#define MONO_ARCH_ENABLE_REGALLOC_IN_EH_BLOCKS 1
-#if !defined(__APPLE__)
#define MONO_ARCH_ENABLE_MONO_LMF_VAR 1
-#endif
#define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
#define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
#define MONO_ARCH_HAVE_ATOMIC_ADD 1
@@ -396,16 +402,13 @@ typedef struct MonoCompileArch {
#define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG 1
#define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK 1
#define MONO_ARCH_HAVE_CREATE_LLVM_NATIVE_THUNK 1
+#define MONO_ARCH_HAVE_OP_TAIL_CALL 1
+#define MONO_ARCH_HAVE_TRANSLATE_TLS_OFFSET 1
-#ifdef TARGET_OSX
+#if defined(TARGET_OSX) || defined(__linux__)
#define MONO_ARCH_HAVE_TLS_GET_REG 1
#endif
-gboolean
-mono_amd64_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig) MONO_INTERNAL;
-
-#define MONO_ARCH_USE_OP_TAIL_CALL(caller_sig, callee_sig) mono_amd64_tail_call_supported (caller_sig, callee_sig)
-
/* Used for optimization, not complete */
#define MONO_ARCH_IS_OP_MEMBASE(opcode) ((opcode) == OP_X86_PUSH_MEMBASE)
@@ -446,6 +449,9 @@ mono_amd64_have_tls_get (void) MONO_INTERNAL;
GSList*
mono_amd64_get_exception_trampolines (gboolean aot) MONO_INTERNAL;
+int
+mono_amd64_get_tls_gs_offset (void) MONO_INTERNAL;
+
typedef struct {
guint8 *address;
guint8 saved_byte;
diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c
index 544607bd90..3c9b2d73ee 100644
--- a/mono/mini/mini-arm.c
+++ b/mono/mini/mini-arm.c
@@ -30,11 +30,26 @@
#error "ARM_FPU_NONE is defined while one of ARM_FPU_VFP/ARM_FPU_VFP_HARD is defined"
#endif
-#if defined(MONO_ARCH_SOFT_FLOAT_FALLBACK)
+/*
+ * IS_SOFT_FLOAT: Is full software floating point used?
+ * IS_HARD_FLOAT: Is full hardware floating point used?
+ * IS_VFP: Is hardware floating point with software ABI used?
+ *
+ * These are not necessarily constants, e.g. IS_SOFT_FLOAT and
+ * IS_VFP may delegate to mono_arch_is_soft_float ().
+ */
+
+#if defined(ARM_FPU_VFP_HARD)
+#define IS_SOFT_FLOAT (FALSE)
+#define IS_HARD_FLOAT (TRUE)
+#define IS_VFP (TRUE)
+#elif defined(ARM_FPU_NONE)
#define IS_SOFT_FLOAT (mono_arch_is_soft_float ())
+#define IS_HARD_FLOAT (FALSE)
#define IS_VFP (!mono_arch_is_soft_float ())
#else
#define IS_SOFT_FLOAT (FALSE)
+#define IS_HARD_FLOAT (FALSE)
#define IS_VFP (TRUE)
#endif
@@ -105,6 +120,25 @@ static gboolean iphone_abi = FALSE;
*/
static MonoArmFPU arm_fpu;
+#if defined(ARM_FPU_VFP_HARD)
+/*
+ * On armhf, d0-d7 are used for argument passing and d8-d15
+ * must be preserved across calls, which leaves us no room
+ * for scratch registers. So we use d14-d15 but back up their
+ * previous contents to a stack slot before using them - see
+ * mono_arm_emit_vfp_scratch_save/_restore ().
+ */
+static int vfp_scratch1 = ARM_VFP_D14;
+static int vfp_scratch2 = ARM_VFP_D15;
+#else
+/*
+ * On armel, d0-d7 do not need to be preserved, so we can
+ * freely make use of them as scratch registers.
+ */
+static int vfp_scratch1 = ARM_VFP_D0;
+static int vfp_scratch2 = ARM_VFP_D1;
+#endif
+
static int i8_align;
static volatile int ss_trigger_var = 0;
@@ -154,7 +188,7 @@ int mono_exc_esp_offset = 0;
#define ADD_LR_PC_4 ((ARMCOND_AL << ARMCOND_SHIFT) | (1 << 25) | (1 << 23) | (ARMREG_PC << 16) | (ARMREG_LR << 12) | 4)
#define MOV_LR_PC ((ARMCOND_AL << ARMCOND_SHIFT) | (1 << 24) | (0xa << 20) | (ARMREG_LR << 12) | ARMREG_PC)
-#define DEBUG_IMT 0
+//#define DEBUG_IMT 0
/* A variant of ARM_LDR_IMM which can handle large offsets */
#define ARM_LDR_IMM_GENERAL(code, dreg, basereg, offset, scratch_reg) do { \
@@ -354,7 +388,6 @@ mono_arm_load_jumptable_entry (guint8 *code, gpointer* jte, ARMReg reg)
}
#endif
-
static guint8*
emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code)
{
@@ -364,10 +397,18 @@ emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code)
case OP_FCALL_MEMBASE:
if (IS_VFP) {
if (((MonoCallInst*)ins)->signature->ret->type == MONO_TYPE_R4) {
- ARM_FMSR (code, ins->dreg, ARMREG_R0);
- ARM_CVTS (code, ins->dreg, ins->dreg);
+ if (IS_HARD_FLOAT) {
+ ARM_CVTS (code, ins->dreg, ARM_VFP_F0);
+ } else {
+ ARM_FMSR (code, ins->dreg, ARMREG_R0);
+ ARM_CVTS (code, ins->dreg, ins->dreg);
+ }
} else {
- ARM_FMDRR (code, ARMREG_R0, ARMREG_R1, ins->dreg);
+ if (IS_HARD_FLOAT) {
+ ARM_CPYD (code, ins->dreg, ARM_VFP_D0);
+ } else {
+ ARM_FMDRR (code, ARMREG_R0, ARMREG_R1, ins->dreg);
+ }
}
}
break;
@@ -465,6 +506,86 @@ emit_save_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
return code;
}
+typedef struct {
+ gint32 vreg;
+ gint32 hreg;
+} FloatArgData;
+
+static guint8 *
+emit_float_args (MonoCompile *cfg, MonoCallInst *inst, guint8 *code, int *max_len, guint *offset)
+{
+ GSList *list;
+
+ for (list = inst->float_args; list; list = list->next) {
+ FloatArgData *fad = list->data;
+ MonoInst *var = get_vreg_to_inst (cfg, fad->vreg);
+ gboolean imm = arm_is_fpimm8 (var->inst_offset);
+
+ /* 4+1 insns for emit_big_add () and 1 for FLDS. */
+ if (imm)
+ *max_len += 20 + 4;
+
+ *max_len += 4;
+
+ if (*offset + *max_len > cfg->code_size) {
+ cfg->code_size += *max_len;
+ cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
+
+ code = cfg->native_code + *offset;
+ }
+
+ if (!imm) {
+ code = emit_big_add (code, ARMREG_LR, var->inst_basereg, var->inst_offset);
+ ARM_FLDS (code, fad->hreg, ARMREG_LR, 0);
+ } else
+ ARM_FLDS (code, fad->hreg, var->inst_basereg, var->inst_offset);
+
+ *offset = code - cfg->native_code;
+ }
+
+ return code;
+}
+
+static guint8 *
+mono_arm_emit_vfp_scratch_save (MonoCompile *cfg, guint8 *code, int reg)
+{
+ MonoInst *inst;
+
+ g_assert (reg == vfp_scratch1 || reg == vfp_scratch2);
+
+ inst = (MonoInst *) cfg->arch.vfp_scratch_slots [reg == vfp_scratch1 ? 0 : 1];
+
+ if (IS_HARD_FLOAT) {
+ if (!arm_is_fpimm8 (inst->inst_offset)) {
+ code = emit_big_add (code, ARMREG_LR, inst->inst_basereg, inst->inst_offset);
+ ARM_FSTD (code, reg, ARMREG_LR, 0);
+ } else
+ ARM_FSTD (code, reg, inst->inst_basereg, inst->inst_offset);
+ }
+
+ return code;
+}
+
+static guint8 *
+mono_arm_emit_vfp_scratch_restore (MonoCompile *cfg, guint8 *code, int reg)
+{
+ MonoInst *inst;
+
+ g_assert (reg == vfp_scratch1 || reg == vfp_scratch2);
+
+ inst = (MonoInst *) cfg->arch.vfp_scratch_slots [reg == vfp_scratch1 ? 0 : 1];
+
+ if (IS_HARD_FLOAT) {
+ if (!arm_is_fpimm8 (inst->inst_offset)) {
+ code = emit_big_add (code, ARMREG_LR, inst->inst_basereg, inst->inst_offset);
+ ARM_FLDD (code, reg, ARMREG_LR, 0);
+ } else
+ ARM_FLDD (code, reg, inst->inst_basereg, inst->inst_offset);
+ }
+
+ return code;
+}
+
/*
* emit_save_lmf:
*
@@ -904,6 +1025,12 @@ mono_arch_is_soft_float (void)
}
#endif
+gboolean
+mono_arm_is_hard_float (void)
+{
+ return arm_fpu == MONO_ARM_FPU_VFP_HARD;
+}
+
static gboolean
is_regsize_var (MonoGenericSharingContext *gsctx, MonoType *t) {
if (t->byref)
@@ -1152,10 +1279,97 @@ add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple)
(*gr) ++;
}
+static void inline
+add_float (guint *fpr, guint *stack_size, ArgInfo *ainfo, gboolean is_double, gint *float_spare)
+{
+ /*
+ * If we're calling a function like this:
+ *
+ * void foo(float a, double b, float c)
+ *
+ * We pass a in s0 and b in d1. That leaves us
+ * with s1 being unused. The armhf ABI recognizes
+ * this and requires register assignment to then
+ * use that for the next single-precision arg,
+ * i.e. c in this example. So float_spare either
+ * tells us which reg to use for the next single-
+ * precision arg, or it's -1, meaning use *fpr.
+ *
+ * Note that even though most of the JIT speaks
+ * double-precision, fpr represents single-
+ * precision registers.
+ *
+ * See parts 5.5 and 6.1.2 of the AAPCS for how
+ * this all works.
+ */
+
+ if (*fpr < ARM_VFP_F16 || (!is_double && *float_spare >= 0)) {
+ ainfo->storage = RegTypeFP;
+
+ if (is_double) {
+ /*
+ * If we're passing a double-precision value
+ * and *fpr is odd (e.g. it's s1, s3, ...)
+ * we need to use the next even register. So
+ * we mark the current *fpr as a spare that
+ * can be used for the next single-precision
+ * value.
+ */
+ if (*fpr % 2) {
+ *float_spare = *fpr;
+ (*fpr)++;
+ }
+
+ /*
+ * At this point, we have an even register
+ * so we assign that and move along.
+ */
+ ainfo->reg = *fpr;
+ *fpr += 2;
+ } else if (*float_spare >= 0) {
+ /*
+ * We're passing a single-precision value
+ * and it looks like a spare single-
+ * precision register is available. Let's
+ * use it.
+ */
+
+ ainfo->reg = *float_spare;
+ *float_spare = -1;
+ } else {
+ /*
+ * If we hit this branch, we're passing a
+ * single-precision value and we can simply
+ * use the next available register.
+ */
+
+ ainfo->reg = *fpr;
+ (*fpr)++;
+ }
+ } else {
+ /*
+ * We've exhausted available floating point
+ * regs, so pass the rest on the stack.
+ */
+
+ if (is_double) {
+ *stack_size += 7;
+ *stack_size &= ~7;
+ }
+
+ ainfo->offset = *stack_size;
+ ainfo->reg = ARMREG_SP;
+ ainfo->storage = RegTypeBase;
+
+ *stack_size += 8;
+ }
+}
+
static CallInfo*
get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSignature *sig)
{
- guint i, gr, pstart;
+ guint i, gr, fpr, pstart;
+ gint float_spare;
int n = sig->hasthis + sig->param_count;
MonoType *simpletype;
guint32 stack_size = 0;
@@ -1170,6 +1384,8 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
cinfo->nargs = n;
gr = ARMREG_R0;
+ fpr = ARM_VFP_F0;
+ float_spare = -1;
t = mini_type_get_underlying_type (gsctx, sig->ret);
if (MONO_TYPE_ISSTRUCT (t)) {
@@ -1222,6 +1438,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
/* Prevent implicit arguments and sig_cookie from
being passed in registers */
gr = ARMREG_R3 + 1;
+ fpr = ARM_VFP_F16;
/* Emit the signature cookie just before the implicit arguments */
add_general (&gr, &stack_size, &cinfo->sig_cookie, TRUE);
}
@@ -1263,7 +1480,6 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
case MONO_TYPE_STRING:
case MONO_TYPE_SZARRAY:
case MONO_TYPE_ARRAY:
- case MONO_TYPE_R4:
cinfo->args [n].size = sizeof (gpointer);
add_general (&gr, &stack_size, ainfo, TRUE);
n++;
@@ -1344,11 +1560,30 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
}
case MONO_TYPE_U8:
case MONO_TYPE_I8:
- case MONO_TYPE_R8:
ainfo->size = 8;
add_general (&gr, &stack_size, ainfo, FALSE);
n++;
break;
+ case MONO_TYPE_R4:
+ ainfo->size = 4;
+
+ if (IS_HARD_FLOAT)
+ add_float (&fpr, &stack_size, ainfo, FALSE, &float_spare);
+ else
+ add_general (&gr, &stack_size, ainfo, TRUE);
+
+ n++;
+ break;
+ case MONO_TYPE_R8:
+ ainfo->size = 8;
+
+ if (IS_HARD_FLOAT)
+ add_float (&fpr, &stack_size, ainfo, TRUE, &float_spare);
+ else
+ add_general (&gr, &stack_size, ainfo, FALSE);
+
+ n++;
+ break;
case MONO_TYPE_VAR:
case MONO_TYPE_MVAR:
/* gsharedvt arguments are passed by ref */
@@ -1376,6 +1611,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
/* Prevent implicit arguments and sig_cookie from
being passed in registers */
gr = ARMREG_R3 + 1;
+ fpr = ARM_VFP_F16;
/* Emit the signature cookie just before the implicit arguments */
add_general (&gr, &stack_size, &cinfo->sig_cookie, TRUE);
}
@@ -1411,9 +1647,13 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
case MONO_TYPE_R4:
case MONO_TYPE_R8:
cinfo->ret.storage = RegTypeFP;
- cinfo->ret.reg = ARMREG_R0;
- /* FIXME: cinfo->ret.reg = ???;
- cinfo->ret.storage = RegTypeFP;*/
+
+ if (IS_HARD_FLOAT) {
+ cinfo->ret.reg = ARM_VFP_F0;
+ } else {
+ cinfo->ret.reg = ARMREG_R0;
+ }
+
break;
case MONO_TYPE_GENERICINST:
if (!mono_type_generic_inst_is_valuetype (simpletype)) {
@@ -1801,6 +2041,7 @@ mono_arch_create_vars (MonoCompile *cfg)
{
MonoMethodSignature *sig;
CallInfo *cinfo;
+ int i;
sig = mono_method_signature (cfg->method);
@@ -1808,6 +2049,15 @@ mono_arch_create_vars (MonoCompile *cfg)
cfg->arch.cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
cinfo = cfg->arch.cinfo;
+ if (IS_HARD_FLOAT) {
+ for (i = 0; i < 2; i++) {
+ MonoInst *inst = mono_compile_create_var (cfg, &mono_defaults.double_class->byval_arg, OP_LOCAL);
+ inst->flags |= MONO_INST_VOLATILE;
+
+ cfg->arch.vfp_scratch_slots [i] = (gpointer) inst;
+ }
+ }
+
if (cinfo->ret.storage == RegTypeStructByVal)
cfg->ret_var_is_local = TRUE;
@@ -2104,19 +2354,50 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
}
break;
case RegTypeFP: {
- /* FIXME: */
- NOT_IMPLEMENTED;
-#if 0
- arg->backend.reg3 = ainfo->reg;
- /* FP args are passed in int regs */
- call->used_iregs |= 1 << ainfo->reg;
+ int fdreg = mono_alloc_freg (cfg);
+
if (ainfo->size == 8) {
- arg->opcode = OP_OUTARG_R8;
- call->used_iregs |= 1 << (ainfo->reg + 1);
+ MONO_INST_NEW (cfg, ins, OP_FMOVE);
+ ins->sreg1 = in->dreg;
+ ins->dreg = fdreg;
+ MONO_ADD_INS (cfg->cbb, ins);
+
+ mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, ainfo->reg, TRUE);
} else {
- arg->opcode = OP_OUTARG_R4;
+ FloatArgData *fad;
+
+ /*
+ * Mono's register allocator doesn't speak single-precision registers that
+ * overlap double-precision registers (i.e. armhf). So we have to work around
+ * the register allocator and load the value from memory manually.
+ *
+ * So we create a variable for the float argument and an instruction to store
+ * the argument into the variable. We then store the list of these arguments
+ * in cfg->float_args. This list is then used by emit_float_args later to
+ * pass the arguments in the various call opcodes.
+ *
+ * This is not very nice, and we should really try to fix the allocator.
+ */
+
+ MonoInst *float_arg = mono_compile_create_var (cfg, &mono_defaults.single_class->byval_arg, OP_LOCAL);
+
+ /* Make sure the instruction isn't seen as pointless and removed.
+ */
+ float_arg->flags |= MONO_INST_VOLATILE;
+
+ MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, float_arg->dreg, in->dreg);
+
+ /* We use the dreg to look up the instruction later. The hreg is used to
+ * emit the instruction that loads the value into the FP reg.
+ */
+ fad = mono_mempool_alloc0 (cfg->mempool, sizeof (FloatArgData));
+ fad->vreg = float_arg->dreg;
+ fad->hreg = ainfo->reg;
+
+ call->float_args = g_slist_append_mempool (cfg->mempool, call->float_args, fad);
}
-#endif
+
+ call->used_iregs |= 1 << ainfo->reg;
cfg->flags |= MONO_CFG_HAS_FPOUT;
break;
}
@@ -2238,6 +2519,7 @@ mono_arch_emit_setret (MonoCompile *cfg, MonoMethod *method, MonoInst *val)
}
break;
case MONO_ARM_FPU_VFP:
+ case MONO_ARM_FPU_VFP_HARD:
if (ret->type == MONO_TYPE_R8 || ret->type == MONO_TYPE_R4) {
MonoInst *ins;
@@ -2301,17 +2583,24 @@ dyn_call_supported (CallInfo *cinfo, MonoMethodSignature *sig)
}
for (i = 0; i < cinfo->nargs; ++i) {
- switch (cinfo->args [i].storage) {
+ ArgInfo *ainfo = &cinfo->args [i];
+ int last_slot;
+
+ switch (ainfo->storage) {
case RegTypeGeneral:
break;
case RegTypeIRegPair:
break;
case RegTypeBase:
- if (cinfo->args [i].offset >= (DYN_CALL_STACK_ARGS * sizeof (gpointer)))
+ if (ainfo->offset >= (DYN_CALL_STACK_ARGS * sizeof (gpointer)))
return FALSE;
break;
case RegTypeStructByVal:
- if (cinfo->args [i].reg + cinfo->args [i].vtsize >= PARAM_REGS + DYN_CALL_STACK_ARGS)
+ if (ainfo->size == 0)
+ last_slot = PARAM_REGS + (ainfo->offset / 4) + ainfo->vtsize;
+ else
+ last_slot = ainfo->reg + ainfo->size + ainfo->vtsize;
+ if (last_slot >= PARAM_REGS + DYN_CALL_STACK_ARGS)
return FALSE;
break;
default:
@@ -3208,11 +3497,13 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size,
{
/* sreg is a float, dreg is an integer reg */
if (IS_VFP) {
+ code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1);
if (is_signed)
- ARM_TOSIZD (code, ARM_VFP_F0, sreg);
+ ARM_TOSIZD (code, vfp_scratch1, sreg);
else
- ARM_TOUIZD (code, ARM_VFP_F0, sreg);
- ARM_FMRS (code, dreg, ARM_VFP_F0);
+ ARM_TOUIZD (code, vfp_scratch1, sreg);
+ ARM_FMRS (code, dreg, vfp_scratch1);
+ code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1);
}
if (!is_signed) {
if (size == 1)
@@ -4364,6 +4655,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_VOIDCALL:
case OP_CALL:
call = (MonoCallInst*)ins;
+
+ if (IS_HARD_FLOAT)
+ code = emit_float_args (cfg, call, code, &max_len, &offset);
+
if (ins->flags & MONO_INST_HAS_METHOD)
mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_METHOD, call->method);
else
@@ -4379,6 +4674,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_VCALL2_REG:
case OP_VOIDCALL_REG:
case OP_CALL_REG:
+ if (IS_HARD_FLOAT)
+ code = emit_float_args (cfg, (MonoCallInst *)ins, code, &max_len, &offset);
+
code = emit_call_reg (code, ins->sreg1);
ins->flags |= MONO_INST_GC_CALLSITE;
ins->backend.pc_offset = code - cfg->native_code;
@@ -4394,6 +4692,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
g_assert (ins->sreg1 != ARMREG_LR);
call = (MonoCallInst*)ins;
+
+ if (IS_HARD_FLOAT)
+ code = emit_float_args (cfg, call, code, &max_len, &offset);
+
if (call->dynamic_imt_arg || call->method->klass->flags & TYPE_ATTRIBUTE_INTERFACE)
imt_arg = TRUE;
if (!arm_is_imm12 (ins->inst_offset))
@@ -4770,34 +5072,49 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
break;
case OP_STORER4_MEMBASE_REG:
g_assert (arm_is_fpimm8 (ins->inst_offset));
- ARM_CVTD (code, ARM_VFP_F0, ins->sreg1);
- ARM_FSTS (code, ARM_VFP_F0, ins->inst_destbasereg, ins->inst_offset);
+ code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1);
+ ARM_CVTD (code, vfp_scratch1, ins->sreg1);
+ ARM_FSTS (code, vfp_scratch1, ins->inst_destbasereg, ins->inst_offset);
+ code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1);
break;
case OP_LOADR4_MEMBASE:
g_assert (arm_is_fpimm8 (ins->inst_offset));
- ARM_FLDS (code, ARM_VFP_F0, ins->inst_basereg, ins->inst_offset);
- ARM_CVTS (code, ins->dreg, ARM_VFP_F0);
+ code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1);
+ ARM_FLDS (code, vfp_scratch1, ins->inst_basereg, ins->inst_offset);
+ ARM_CVTS (code, ins->dreg, vfp_scratch1);
+ code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1);
break;
case OP_ICONV_TO_R_UN: {
g_assert_not_reached ();
break;
}
case OP_ICONV_TO_R4:
- ARM_FMSR (code, ARM_VFP_F0, ins->sreg1);
- ARM_FSITOS (code, ARM_VFP_F0, ARM_VFP_F0);
- ARM_CVTS (code, ins->dreg, ARM_VFP_F0);
+ code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1);
+ ARM_FMSR (code, vfp_scratch1, ins->sreg1);
+ ARM_FSITOS (code, vfp_scratch1, vfp_scratch1);
+ ARM_CVTS (code, ins->dreg, vfp_scratch1);
+ code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1);
break;
case OP_ICONV_TO_R8:
- ARM_FMSR (code, ARM_VFP_F0, ins->sreg1);
- ARM_FSITOD (code, ins->dreg, ARM_VFP_F0);
+ code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1);
+ ARM_FMSR (code, vfp_scratch1, ins->sreg1);
+ ARM_FSITOD (code, ins->dreg, vfp_scratch1);
+ code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1);
break;
case OP_SETFRET:
if (mono_method_signature (cfg->method)->ret->type == MONO_TYPE_R4) {
ARM_CVTD (code, ARM_VFP_F0, ins->sreg1);
- ARM_FMRS (code, ARMREG_R0, ARM_VFP_F0);
+
+ if (!IS_HARD_FLOAT) {
+ ARM_FMRS (code, ARMREG_R0, ARM_VFP_F0);
+ }
} else {
- ARM_FMRRD (code, ARMREG_R0, ARMREG_R1, ins->sreg1);
+ if (IS_HARD_FLOAT) {
+ ARM_CPYD (code, ARM_VFP_D0, ins->sreg1);
+ } else {
+ ARM_FMRRD (code, ARMREG_R0, ARMREG_R1, ins->sreg1);
+ }
}
break;
case OP_FCONV_TO_I1:
@@ -4969,30 +5286,36 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_CKFINITE: {
if (IS_VFP) {
+ code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch1);
+ code = mono_arm_emit_vfp_scratch_save (cfg, code, vfp_scratch2);
+
#ifdef USE_JUMP_TABLES
{
gpointer *jte = mono_jumptable_add_entries (2);
jte [0] = GUINT_TO_POINTER (0xffffffff);
jte [1] = GUINT_TO_POINTER (0x7fefffff);
code = mono_arm_load_jumptable_entry_addr (code, jte, ARMREG_IP);
- ARM_FLDD (code, ARM_VFP_D0, ARMREG_IP, 0);
+ ARM_FLDD (code, vfp_scratch1, ARMREG_IP, 0);
}
#else
- ARM_ABSD (code, ARM_VFP_D1, ins->sreg1);
- ARM_FLDD (code, ARM_VFP_D0, ARMREG_PC, 0);
+ ARM_ABSD (code, vfp_scratch2, ins->sreg1);
+ ARM_FLDD (code, vfp_scratch1, ARMREG_PC, 0);
ARM_B (code, 1);
*(guint32*)code = 0xffffffff;
code += 4;
*(guint32*)code = 0x7fefffff;
code += 4;
#endif
- ARM_CMPD (code, ARM_VFP_D1, ARM_VFP_D0);
+ ARM_CMPD (code, vfp_scratch2, vfp_scratch1);
ARM_FMSTAT (code);
EMIT_COND_SYSTEM_EXCEPTION_FLAGS (ARMCOND_GT, "ArithmeticException");
ARM_CMPD (code, ins->sreg1, ins->sreg1);
ARM_FMSTAT (code);
EMIT_COND_SYSTEM_EXCEPTION_FLAGS (ARMCOND_VS, "ArithmeticException");
ARM_CPYD (code, ins->dreg, ins->sreg1);
+
+ code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch1);
+ code = mono_arm_emit_vfp_scratch_restore (cfg, code, vfp_scratch2);
}
break;
}
@@ -5078,7 +5401,6 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono
jt [i] = code + (int)patch_info->data.table->table [i];
continue;
}
- target = mono_resolve_patch_target (method, domain, code, patch_info, run_cctors);
if (compile_aot) {
switch (patch_info->type) {
@@ -5091,6 +5413,8 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono
}
}
+ target = mono_resolve_patch_target (method, domain, code, patch_info, run_cctors);
+
switch (patch_info->type) {
case MONO_PATCH_INFO_IP:
g_assert_not_reached ();
@@ -5344,7 +5668,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
if (arm_is_imm12 (prev_sp_offset + ainfo->offset)) {
ARM_LDR_IMM (code, inst->dreg, ARMREG_SP, (prev_sp_offset + ainfo->offset));
} else {
- code = mono_arm_emit_load_imm (code, ARMREG_IP, inst->inst_offset);
+ code = mono_arm_emit_load_imm (code, ARMREG_IP, prev_sp_offset + ainfo->offset);
ARM_LDR_REG_REG (code, inst->dreg, ARMREG_SP, ARMREG_IP);
}
} else
@@ -5456,7 +5780,18 @@ mono_arch_emit_prolog (MonoCompile *cfg)
break;
}
} else if (ainfo->storage == RegTypeFP) {
- g_assert_not_reached ();
+ int imm8, rot_amount;
+
+ if ((imm8 = mono_arm_is_rotated_imm8 (inst->inst_offset, &rot_amount)) == -1) {
+ code = mono_arm_emit_load_imm (code, ARMREG_IP, inst->inst_offset);
+ ARM_ADD_REG_REG (code, ARMREG_IP, ARMREG_IP, inst->inst_basereg);
+ } else
+ ARM_ADD_REG_IMM (code, ARMREG_IP, inst->inst_basereg, imm8, rot_amount);
+
+ if (ainfo->size == 8)
+ ARM_FSTD (code, ainfo->reg, ARMREG_IP, 0);
+ else
+ ARM_FSTS (code, ainfo->reg, ARMREG_IP, 0);
} else if (ainfo->storage == RegTypeStructByVal) {
int doffset = inst->inst_offset;
int soffset = 0;
@@ -5690,30 +6025,6 @@ mono_arch_emit_epilog (MonoCompile *cfg)
}
-/* remove once throw_exception_by_name is eliminated */
-static int
-exception_id_by_name (const char *name)
-{
- if (strcmp (name, "IndexOutOfRangeException") == 0)
- return MONO_EXC_INDEX_OUT_OF_RANGE;
- if (strcmp (name, "OverflowException") == 0)
- return MONO_EXC_OVERFLOW;
- if (strcmp (name, "ArithmeticException") == 0)
- return MONO_EXC_ARITHMETIC;
- if (strcmp (name, "DivideByZeroException") == 0)
- return MONO_EXC_DIVIDE_BY_ZERO;
- if (strcmp (name, "InvalidCastException") == 0)
- return MONO_EXC_INVALID_CAST;
- if (strcmp (name, "NullReferenceException") == 0)
- return MONO_EXC_NULL_REF;
- if (strcmp (name, "ArrayTypeMismatchException") == 0)
- return MONO_EXC_ARRAY_TYPE_MISMATCH;
- if (strcmp (name, "ArgumentException") == 0)
- return MONO_EXC_ARGUMENT;
- g_error ("Unknown intrinsic exception %s\n", name);
- return -1;
-}
-
void
mono_arch_emit_exceptions (MonoCompile *cfg)
{
@@ -5736,7 +6047,7 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
*/
for (patch_info = cfg->patch_info; patch_info; patch_info = patch_info->next) {
if (patch_info->type == MONO_PATCH_INFO_EXC) {
- i = exception_id_by_name (patch_info->data.target);
+ i = mini_exception_id_by_name (patch_info->data.target);
if (!exc_throw_found [i]) {
max_epilog_size += 32;
exc_throw_found [i] = TRUE;
@@ -5759,7 +6070,7 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
MonoClass *exc_class;
unsigned char *ip = patch_info->ip.i + cfg->native_code;
- i = exception_id_by_name (patch_info->data.target);
+ i = mini_exception_id_by_name (patch_info->data.target);
if (exc_throw_pos [i]) {
arm_patch (ip, exc_throw_pos [i]);
patch_info->type = MONO_PATCH_INFO_NONE;
@@ -5835,11 +6146,9 @@ mono_arch_print_tree (MonoInst *tree, int arity)
return 0;
}
-MonoInst*
-mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- return mono_get_domain_intrinsic (cfg);
-}
+#ifndef DISABLE_JIT
+
+#endif
guint32
mono_arch_get_patch_offset (guint8 *code)
@@ -5942,13 +6251,13 @@ mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG];
}
-#define ENABLE_WRONG_METHOD_CHECK 0
+/* #define ENABLE_WRONG_METHOD_CHECK 1 */
#define BASE_SIZE (6 * 4)
#define BSEARCH_ENTRY_SIZE (4 * 4)
#define CMP_SIZE (3 * 4)
#define BRANCH_SIZE (1 * 4)
#define CALL_SIZE (2 * 4)
-#define WMC_SIZE (5 * 4)
+#define WMC_SIZE (8 * 4)
#define DISTANCE(A, B) (((gint32)(B)) - ((gint32)(A)))
#ifdef USE_JUMP_TABLES
@@ -5984,6 +6293,15 @@ arm_emit_value_and_patch_ldr (arminstr_t *code, arminstr_t *target, guint32 valu
}
#endif
+#ifdef ENABLE_WRONG_METHOD_CHECK
+static void
+mini_dump_bad_imt (int input_imt, int compared_imt, int pc)
+{
+ g_print ("BAD IMT comparing %x with expected %x at ip %x", input_imt, compared_imt, pc);
+ g_assert (0);
+}
+#endif
+
gpointer
mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckItem **imt_entries, int count,
gpointer fail_tramp)
@@ -5998,6 +6316,9 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
arminstr_t *vtable_target = NULL;
int extra_space = 0;
#endif
+#ifdef ENABLE_WRONG_METHOD_CHECK
+ char * cond;
+#endif
size = BASE_SIZE;
#ifdef USE_JUMP_TABLES
@@ -6026,7 +6347,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
item->chunk_size += CMP_SIZE;
item->chunk_size += BRANCH_SIZE;
} else {
-#if ENABLE_WRONG_METHOD_CHECK
+#ifdef ENABLE_WRONG_METHOD_CHECK
item->chunk_size += WMC_SIZE;
#endif
}
@@ -6052,11 +6373,11 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
code = mono_domain_code_reserve (domain, size);
start = code;
-#if DEBUG_IMT
- printf ("building IMT thunk for class %s %s entries %d code size %d code at %p end %p vtable %p\n", vtable->klass->name_space, vtable->klass->name, count, size, start, ((guint8*)start) + size, vtable);
+#ifdef DEBUG_IMT
+ g_print ("Building IMT thunk for class %s %s entries %d code size %d code at %p end %p vtable %p fail_tramp %p\n", vtable->klass->name_space, vtable->klass->name, count, size, start, ((guint8*)start) + size, vtable, fail_tramp);
for (i = 0; i < count; ++i) {
MonoIMTCheckItem *item = imt_entries [i];
- printf ("method %d (%p) %s vtable slot %p is_equals %d chunk size %d\n", i, item->key, item->key->name, &vtable->vtable [item->value.vtable_slot], item->is_equals, item->chunk_size);
+ g_print ("method %d (%p) %s vtable slot %p is_equals %d chunk size %d\n", i, item->key, ((MonoMethod*)item->key)->name, &vtable->vtable [item->value.vtable_slot], item->is_equals, item->chunk_size);
}
#endif
@@ -6131,7 +6452,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
#endif
} else {
/*Enable the commented code to assert on wrong method*/
-#if ENABLE_WRONG_METHOD_CHECK
+#ifdef ENABLE_WRONG_METHOD_CHECK
#ifdef USE_JUMP_TABLES
imt_method_jti = IMT_METHOD_JTI (i);
code = load_element_with_regbase_cond (code, ARMREG_R1, ARMREG_R2, imt_method_jti, ARMCOND_AL);
@@ -6140,10 +6461,19 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
ARM_LDR_IMM (code, ARMREG_R1, ARMREG_PC, 0);
#endif
ARM_CMP_REG_REG (code, ARMREG_R0, ARMREG_R1);
- ARM_B_COND (code, ARMCOND_NE, 1);
-
+ cond = code;
+ ARM_B_COND (code, ARMCOND_EQ, 0);
+
+/* Define this if your system is so bad that gdb is failing. */
+#ifdef BROKEN_DEV_ENV
+ ARM_MOV_REG_REG (code, ARMREG_R2, ARMREG_PC);
+ ARM_BL (code, 0);
+ arm_patch (code - 1, mini_dump_bad_imt);
+#else
ARM_DBRK (code);
#endif
+ arm_patch (cond, code);
+#endif
}
if (item->has_target_code) {
@@ -6262,15 +6592,15 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
#ifdef USE_JUMP_TABLES
code = load_element_with_regbase_cond (code, ARMREG_R1, ARMREG_R2, IMT_METHOD_JTI (i), ARMCOND_AL);
ARM_CMP_REG_REG (code, ARMREG_R0, ARMREG_R1);
- code = load_element_with_regbase_cond (code, ARMREG_R1, ARMREG_R2, JUMP_CODE_JTI (i), ARMCOND_GE);
- ARM_BX_COND (code, ARMCOND_GE, ARMREG_R1);
+ code = load_element_with_regbase_cond (code, ARMREG_R1, ARMREG_R2, JUMP_CODE_JTI (i), ARMCOND_HS);
+ ARM_BX_COND (code, ARMCOND_HS, ARMREG_R1);
item->jmp_code = GUINT_TO_POINTER (JUMP_CODE_JTI (i));
#else
ARM_LDR_IMM (code, ARMREG_R1, ARMREG_PC, 0);
ARM_CMP_REG_REG (code, ARMREG_R0, ARMREG_R1);
item->jmp_code = (guint8*)code;
- ARM_B_COND (code, ARMCOND_GE, 0);
+ ARM_B_COND (code, ARMCOND_HS, 0);
++extra_space;
#endif
}
@@ -6300,7 +6630,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
}
}
-#if DEBUG_IMT
+#ifdef DEBUG_IMT
{
char *buff = g_strdup_printf ("thunk_for_class_%s_%s_entries_%d", vtable->klass->name_space, vtable->klass->name, count);
mono_disassemble_code (NULL, (guint8*)start, size, buff);
@@ -6571,6 +6901,15 @@ mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code)
return info;
}
+void
+mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
+{
+ ext->lmf.previous_lmf = prev_lmf;
+ /* Mark that this is a MonoLMFExt */
+ ext->lmf.previous_lmf = (gpointer)(((gssize)ext->lmf.previous_lmf) | 2);
+ ext->lmf.sp = (gssize)ext;
+}
+
/*
* mono_arch_set_target:
*
diff --git a/mono/mini/mini-arm.h b/mono/mini/mini-arm.h
index 93a256b563..9fcd6545d2 100644
--- a/mono/mini/mini-arm.h
+++ b/mono/mini/mini-arm.h
@@ -19,10 +19,6 @@
#define MONO_ARCH_SOFT_FLOAT_FALLBACK 1
#endif
-#ifdef ARM_FPU_VFP_HARD
-#error "hardfp-abi not yet supported."
-#endif
-
#if defined(__ARM_EABI__)
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
#define ARM_ARCHITECTURE "armel"
@@ -56,10 +52,8 @@
#endif
#define MONO_MAX_IREGS 16
-#define MONO_MAX_FREGS 16
#define MONO_SAVED_GREGS 10 /* r4-r11, ip, lr */
-#define MONO_SAVED_FREGS 8
/* r4-r11, ip, lr: registers saved in the LMF */
#define MONO_ARM_REGSAVE_MASK 0x5ff0
@@ -71,9 +65,36 @@
#define MONO_ARCH_CALLEE_REGS ((1<<ARMREG_R0) | (1<<ARMREG_R1) | (1<<ARMREG_R2) | (1<<ARMREG_R3) | (1<<ARMREG_IP))
#define MONO_ARCH_CALLEE_SAVED_REGS ((1<<ARMREG_V1) | (1<<ARMREG_V2) | (1<<ARMREG_V3) | (1<<ARMREG_V4) | (1<<ARMREG_V5) | (1<<ARMREG_V6) | (1<<ARMREG_V7))
-/* Every double precision vfp register, d0/d1 is reserved for a scratch reg */
+/*
+ * TODO: Make use of VFP v3 registers d16-d31.
+ */
+
+/*
+ * TODO: We can't use registers d8-d15 in hard float mode because the
+ * register allocator doesn't allocate floating point registers globally.
+ */
+
+#if defined(ARM_FPU_VFP_HARD)
+#define MONO_SAVED_FREGS 16
+#define MONO_MAX_FREGS 32
+
+/*
+ * d8-d15 must be preserved across function calls. We use d14-d15 as
+ * scratch registers in the JIT. The rest have no meaning tied to them.
+ */
+#define MONO_ARCH_CALLEE_FREGS 0x00005555
+#define MONO_ARCH_CALLEE_SAVED_FREGS 0x55550000
+#else
+#define MONO_SAVED_FREGS 8
+#define MONO_MAX_FREGS 16
+
+/*
+ * No registers need to be preserved across function calls. We use d0-d1
+ * as scratch registers in the JIT. The rest have no meaning tied to them.
+ */
#define MONO_ARCH_CALLEE_FREGS 0x55555550
-#define MONO_ARCH_CALLEE_SAVED_FREGS 0
+#define MONO_ARCH_CALLEE_SAVED_FREGS 0x00000000
+#endif
#define MONO_ARCH_USE_FPSTACK FALSE
#define MONO_ARCH_FPSTACK_SIZE 0
@@ -164,6 +185,10 @@ struct MonoLMF {
mgreg_t sp;
mgreg_t ip;
mgreg_t fp;
+ /* Currently only used in trampolines on armhf to hold d0-d15. We don't really
+ * need to put d0-d7 in the LMF, but it simplifies the trampoline code.
+ */
+ double fregs [16];
/* all but sp and pc: matches the PUSH instruction layout in the trampolines
* 0-4 should be considered undefined (execpt in the magic tramp)
* sp is saved at IP.
@@ -177,6 +202,7 @@ typedef struct MonoCompileArch {
gpointer seq_point_bp_method_var;
gboolean omit_fp, omit_fp_computed;
gpointer cinfo;
+ gpointer *vfp_scratch_slots [2];
} MonoCompileArch;
#define MONO_ARCH_EMULATE_FCONV_TO_I8 1
@@ -291,4 +317,7 @@ guint8*
mono_arm_load_jumptable_entry (guint8 *code, gpointer *jte, ARMReg reg) MONO_INTERNAL;
#endif
+gboolean
+mono_arm_is_hard_float (void) MONO_INTERNAL;
+
#endif /* __MONO_MINI_ARM_H__ */
diff --git a/mono/mini/mini-codegen.c b/mono/mini/mini-codegen.c
index e54c217941..8214be4db7 100644
--- a/mono/mini/mini-codegen.c
+++ b/mono/mini/mini-codegen.c
@@ -453,9 +453,22 @@ mono_print_ins_index (int i, MonoInst *ins)
else
printf (" %s", mono_inst_name (ins->opcode));
if (spec == MONO_ARCH_CPU_SPEC) {
+ gboolean dest_base = FALSE;
+ switch (ins->opcode) {
+ case OP_STOREV_MEMBASE:
+ dest_base = TRUE;
+ break;
+ default:
+ break;
+ }
+
/* This is a lowered opcode */
- if (ins->dreg != -1)
- printf (" R%d <-", ins->dreg);
+ if (ins->dreg != -1) {
+ if (dest_base)
+ printf (" [R%d + 0x%lx] <-", ins->dreg, (long)ins->inst_offset);
+ else
+ printf (" R%d <-", ins->dreg);
+ }
if (ins->sreg1 != -1)
printf (" R%d", ins->sreg1);
if (ins->sreg2 != -1)
@@ -584,11 +597,8 @@ mono_print_ins_index (int i, MonoInst *ins)
case OP_CALL_MEMBASE:
case OP_CALL_REG:
case OP_FCALL:
- case OP_FCALLVIRT:
case OP_LCALL:
- case OP_LCALLVIRT:
case OP_VCALL:
- case OP_VCALLVIRT:
case OP_VCALL_REG:
case OP_VCALL_MEMBASE:
case OP_VCALL2:
@@ -596,7 +606,6 @@ mono_print_ins_index (int i, MonoInst *ins)
case OP_VCALL2_MEMBASE:
case OP_VOIDCALL:
case OP_VOIDCALL_MEMBASE:
- case OP_VOIDCALLVIRT:
case OP_TAILCALL: {
MonoCallInst *call = (MonoCallInst*)ins;
GSList *list;
@@ -1790,7 +1799,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
continue;
s = regmask (j);
- if ((clob_mask & s) && !(rs->free_mask [cur_bank] & s) && (j != ins->sreg1)) {
+ if ((clob_mask & s) && !(rs->free_mask [cur_bank] & s)) {
if (j != dreg)
free_up_hreg (cfg, bb, tmp, ins, j, cur_bank);
else if (rs->symbolic [cur_bank] [j])
@@ -2341,6 +2350,8 @@ mono_opcode_to_cond (int opcode)
case OP_CMOV_IEQ:
case OP_CMOV_LEQ:
return CMP_EQ;
+ case OP_FCNEQ:
+ case OP_ICNEQ:
case OP_IBNE_UN:
case OP_LBNE_UN:
case OP_FBNE_UN:
@@ -2349,12 +2360,16 @@ mono_opcode_to_cond (int opcode)
case OP_CMOV_INE_UN:
case OP_CMOV_LNE_UN:
return CMP_NE;
+ case OP_FCLE:
+ case OP_ICLE:
case OP_IBLE:
case OP_LBLE:
case OP_FBLE:
case OP_CMOV_ILE:
case OP_CMOV_LLE:
return CMP_LE;
+ case OP_FCGE:
+ case OP_ICGE:
case OP_IBGE:
case OP_LBGE:
case OP_FBGE:
@@ -2386,6 +2401,7 @@ mono_opcode_to_cond (int opcode)
case OP_CMOV_LGT:
return CMP_GT;
+ case OP_ICLE_UN:
case OP_IBLE_UN:
case OP_LBLE_UN:
case OP_FBLE_UN:
@@ -2394,6 +2410,8 @@ mono_opcode_to_cond (int opcode)
case OP_CMOV_ILE_UN:
case OP_CMOV_LLE_UN:
return CMP_LE_UN;
+
+ case OP_ICGE_UN:
case OP_IBGE_UN:
case OP_LBGE_UN:
case OP_FBGE_UN:
@@ -2697,4 +2715,27 @@ mono_peephole_ins (MonoBasicBlock *bb, MonoInst *ins)
}
}
+int
+mini_exception_id_by_name (const char *name)
+{
+ if (strcmp (name, "IndexOutOfRangeException") == 0)
+ return MONO_EXC_INDEX_OUT_OF_RANGE;
+ if (strcmp (name, "OverflowException") == 0)
+ return MONO_EXC_OVERFLOW;
+ if (strcmp (name, "ArithmeticException") == 0)
+ return MONO_EXC_ARITHMETIC;
+ if (strcmp (name, "DivideByZeroException") == 0)
+ return MONO_EXC_DIVIDE_BY_ZERO;
+ if (strcmp (name, "InvalidCastException") == 0)
+ return MONO_EXC_INVALID_CAST;
+ if (strcmp (name, "NullReferenceException") == 0)
+ return MONO_EXC_NULL_REF;
+ if (strcmp (name, "ArrayTypeMismatchException") == 0)
+ return MONO_EXC_ARRAY_TYPE_MISMATCH;
+ if (strcmp (name, "ArgumentException") == 0)
+ return MONO_EXC_ARGUMENT;
+ g_error ("Unknown intrinsic exception %s\n", name);
+ return -1;
+}
+
#endif /* DISABLE_JIT */
diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c
index 21b48d0420..fcdb540599 100644
--- a/mono/mini/mini-exceptions.c
+++ b/mono/mini/mini-exceptions.c
@@ -50,7 +50,6 @@
#include <mono/utils/mono-logger-internal.h>
#include "mini.h"
-#include "debug-mini.h"
#include "trace.h"
#include "debugger-agent.h"
@@ -87,25 +86,13 @@ mono_exceptions_init (void)
MonoTrampInfo *info;
restore_context_func = mono_arch_get_restore_context (&info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
call_filter_func = mono_arch_get_call_filter (&info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
throw_exception_func = mono_arch_get_throw_exception (&info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
rethrow_exception_func = mono_arch_get_rethrow_exception (&info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
}
#ifdef MONO_ARCH_HAVE_RESTORE_STACK_SUPPORT
try_more_restore_tramp = mono_create_specific_trampoline (try_more_restore, MONO_TRAMPOLINE_RESTORE_STACK_PROT, mono_domain_get (), NULL);
@@ -166,10 +153,7 @@ mono_get_throw_corlib_exception (void)
code = mono_aot_get_trampoline ("throw_corlib_exception");
else {
code = mono_arch_get_throw_corlib_exception (&info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
}
mono_memory_barrier ();
@@ -244,7 +228,7 @@ find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *res, Mo
return frame.ji;
else {
memset (res, 0, sizeof (MonoJitInfo));
- res->method = frame.method;
+ res->d.method = frame.method;
return res;
}
case FRAME_TYPE_DEBUGGER_INVOKE: {
@@ -281,6 +265,7 @@ mono_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *re
gboolean managed2;
gpointer ip = MONO_CONTEXT_GET_IP (ctx);
MonoJitInfo *ji;
+ MonoMethod *method = NULL;
if (trace)
*trace = NULL;
@@ -296,7 +281,10 @@ mono_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *re
if (ji == (gpointer)-1)
return ji;
- if (managed2 || (ji && ji->method->wrapper_type)) {
+ if (ji)
+ method = jinfo_get_method (ji);
+
+ if (managed2 || (ji && method->wrapper_type)) {
const char *real_ip, *start;
gint32 offset;
@@ -316,14 +304,14 @@ mono_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *re
*native_offset = offset;
if (managed)
- if (!ji->method->wrapper_type || ji->method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD)
+ if (!method->wrapper_type || method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD)
*managed = TRUE;
if (trace)
- *trace = mono_debug_print_stack_frame (ji->method, offset, domain);
+ *trace = mono_debug_print_stack_frame (method, offset, domain);
} else {
if (trace) {
- char *fname = mono_method_full_name (res->method, TRUE);
+ char *fname = mono_method_full_name (jinfo_get_method (res), TRUE);
*trace = g_strdup_printf ("in (unmanaged) %s", fname);
g_free (fname);
}
@@ -345,6 +333,8 @@ mono_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *re
* On return, it will be filled with the locations where callee saved registers are saved
* by the current frame. This is returned outside of StackFrameInfo because it can be
* quite large on some platforms.
+ * If ASYNC true, this function will be async safe, but some fields of frame and frame->ji will
+ * not be set.
*/
gboolean
mono_find_jit_info_ext (MonoDomain *domain, MonoJitTlsData *jit_tls,
@@ -357,6 +347,8 @@ mono_find_jit_info_ext (MonoDomain *domain, MonoJitTlsData *jit_tls,
gpointer ip = MONO_CONTEXT_GET_IP (ctx);
MonoJitInfo *ji;
MonoDomain *target_domain = domain;
+ MonoMethod *method = NULL;
+ gboolean async = mono_thread_info_is_async_context ();
if (trace)
*trace = NULL;
@@ -377,8 +369,11 @@ mono_find_jit_info_ext (MonoDomain *domain, MonoJitTlsData *jit_tls,
if (!err)
return FALSE;
- if (frame->type == FRAME_TYPE_MANAGED) {
- if (!frame->ji->method->wrapper_type || frame->ji->method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD)
+ if (frame->ji && !frame->ji->async)
+ method = jinfo_get_method (frame->ji);
+
+ if (frame->type == FRAME_TYPE_MANAGED && method) {
+ if (!method->wrapper_type || method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD)
frame->managed = TRUE;
}
@@ -393,13 +388,14 @@ mono_find_jit_info_ext (MonoDomain *domain, MonoJitTlsData *jit_tls,
frame->native_offset = -1;
frame->domain = target_domain;
+ frame->async_context = async;
ji = frame->ji;
if (frame->type == FRAME_TYPE_MANAGED)
- frame->method = ji->method;
+ frame->method = method;
- if (ji && (frame->managed || ji->method->wrapper_type)) {
+ if (ji && (frame->managed || (method && method->wrapper_type))) {
const char *real_ip, *start;
start = (const char *)ji->code_start;
@@ -415,7 +411,7 @@ mono_find_jit_info_ext (MonoDomain *domain, MonoJitTlsData *jit_tls,
frame->native_offset = -1;
if (trace)
- *trace = mono_debug_print_stack_frame (ji->method, frame->native_offset, domain);
+ *trace = mono_debug_print_stack_frame (method, frame->native_offset, domain);
} else {
if (trace && frame->method) {
char *fname = mono_method_full_name (frame->method, TRUE);
@@ -431,6 +427,7 @@ static gpointer
get_generic_info_from_stack_frame (MonoJitInfo *ji, MonoContext *ctx)
{
MonoGenericJitInfo *gi;
+ MonoMethod *method;
gpointer info;
if (!ji->has_generic_jit_info)
@@ -469,9 +466,10 @@ get_generic_info_from_stack_frame (MonoJitInfo *ji, MonoContext *ctx)
gi->this_offset);
}
- if (mono_method_get_context (ji->method)->method_inst) {
+ method = jinfo_get_method (ji);
+ if (mono_method_get_context (method)->method_inst) {
return info;
- } else if ((ji->method->flags & METHOD_ATTRIBUTE_STATIC) || ji->method->klass->valuetype) {
+ } else if ((method->flags & METHOD_ATTRIBUTE_STATIC) || method->klass->valuetype) {
return info;
} else {
/* Avoid returning a managed object */
@@ -486,17 +484,19 @@ get_generic_context_from_stack_frame (MonoJitInfo *ji, gpointer generic_info)
{
MonoGenericContext context = { NULL, NULL };
MonoClass *class, *method_container_class;
+ MonoMethod *method;
g_assert (generic_info);
- g_assert (ji->method->is_inflated);
- if (mono_method_get_context (ji->method)->method_inst) {
+ method = jinfo_get_method (ji);
+ g_assert (method->is_inflated);
+ if (mono_method_get_context (method)->method_inst) {
MonoMethodRuntimeGenericContext *mrgctx = generic_info;
class = mrgctx->class_vtable->klass;
context.method_inst = mrgctx->method_inst;
g_assert (context.method_inst);
- } else if ((ji->method->flags & METHOD_ATTRIBUTE_STATIC) || ji->method->klass->valuetype) {
+ } else if ((method->flags & METHOD_ATTRIBUTE_STATIC) || method->klass->valuetype) {
MonoVTable *vtable = generic_info;
class = vtable->klass;
@@ -504,14 +504,14 @@ get_generic_context_from_stack_frame (MonoJitInfo *ji, gpointer generic_info)
class = generic_info;
}
- //g_assert (!ji->method->klass->generic_container);
- if (ji->method->klass->generic_class)
- method_container_class = ji->method->klass->generic_class->container_class;
+ //g_assert (!method->klass->generic_container);
+ if (method->klass->generic_class)
+ method_container_class = method->klass->generic_class->container_class;
else
- method_container_class = ji->method->klass;
+ method_container_class = method->klass;
- /* class might refer to a subclass of ji->method's class */
- while (!(class == ji->method->klass || (class->generic_class && class->generic_class->container_class == method_container_class))) {
+ /* class might refer to a subclass of method's class */
+ while (!(class == method->klass || (class->generic_class && class->generic_class->container_class == method_container_class))) {
class = class->parent;
g_assert (class);
}
@@ -534,10 +534,11 @@ get_method_from_stack_frame (MonoJitInfo *ji, gpointer generic_info)
MonoMethod *method;
if (!ji->has_generic_jit_info || !mono_jit_info_get_generic_jit_info (ji)->has_this)
- return ji->method;
+ return jinfo_get_method (ji);
context = get_generic_context_from_stack_frame (ji, generic_info);
- method = mono_method_get_declaring_generic_method (ji->method);
+ method = jinfo_get_method (ji);
+ method = mono_method_get_declaring_generic_method (method);
method = mono_class_inflate_generic_method (method, &context);
return method;
@@ -663,7 +664,7 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
g_assert (ji != NULL);
method = get_method_from_stack_frame (ji, generic_info);
- if (ji->method->wrapper_type) {
+ if (jinfo_get_method (ji)->wrapper_type) {
char *s;
sf->method = NULL;
@@ -680,7 +681,7 @@ ves_icall_get_trace (MonoException *exc, gint32 skip, MonoBoolean need_file_info
* and the IL offset. Note that computing the IL offset is already an expensive
* operation, so we shouldn't call this method twice.
*/
- location = mono_debug_lookup_source_location (ji->method, sf->native_offset, domain);
+ location = mono_debug_lookup_source_location (jinfo_get_method (ji), sf->native_offset, domain);
if (location)
sf->il_offset = location->il_offset;
else
@@ -761,6 +762,7 @@ mono_walk_stack_with_state (MonoJitStackWalk func, MonoThreadUnwindState *state,
{
MonoThreadUnwindState extra_state;
if (!state) {
+ g_assert (!mono_thread_info_is_async_context ());
if (!mono_thread_state_init_from_current (&extra_state))
return;
state = &extra_state;
@@ -810,6 +812,7 @@ mono_walk_stack_full (MonoJitStackWalk func, MonoContext *start_ctx, MonoDomain
mgreg_t *reg_locations [MONO_MAX_IREGS];
mgreg_t *new_reg_locations [MONO_MAX_IREGS];
gboolean get_reg_locations = unwind_options & MONO_UNWIND_REG_LOCATIONS;
+ gboolean async = mono_thread_info_is_async_context ();
g_assert (start_ctx);
g_assert (domain);
@@ -817,6 +820,9 @@ mono_walk_stack_full (MonoJitStackWalk func, MonoContext *start_ctx, MonoDomain
/*The LMF will be null if the target have no managed frames.*/
/* g_assert (lmf); */
+ if (async)
+ g_assert (unwind_options == MONO_UNWIND_NONE);
+
memcpy (&ctx, start_ctx, sizeof (MonoContext));
memset (reg_locations, 0, sizeof (reg_locations));
@@ -829,7 +835,7 @@ mono_walk_stack_full (MonoJitStackWalk func, MonoContext *start_ctx, MonoDomain
if ((unwind_options & MONO_UNWIND_LOOKUP_IL_OFFSET) && frame.ji) {
MonoDebugSourceLocation *source;
- source = mono_debug_lookup_source_location (frame.ji->method, frame.native_offset, domain);
+ source = mono_debug_lookup_source_location (jinfo_get_method (frame.ji), frame.native_offset, domain);
il_offset = source ? source->il_offset : -1;
mono_debug_free_source_location (source);
} else
@@ -871,7 +877,7 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
MonoJitInfo *ji = NULL;
MonoContext ctx, new_ctx;
MonoDebugSourceLocation *location;
- MonoMethod *actual_method;
+ MonoMethod *jmethod = NULL, *actual_method;
StackFrameInfo frame;
gboolean res;
@@ -899,7 +905,8 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
*native_offset = frame.native_offset;
/* The skip count passed by the caller depends on us not filtering out MANAGED_TO_NATIVE */
- if (ji->method->wrapper_type != MONO_WRAPPER_NONE && ji->method->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD && ji->method->wrapper_type != MONO_WRAPPER_MANAGED_TO_NATIVE)
+ jmethod = jinfo_get_method (ji);
+ if (jmethod->wrapper_type != MONO_WRAPPER_NONE && jmethod->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD && jmethod->wrapper_type != MONO_WRAPPER_MANAGED_TO_NATIVE)
continue;
skip--;
} while (skip >= 0);
@@ -908,7 +915,7 @@ ves_icall_get_frame_info (gint32 skip, MonoBoolean need_file_info,
mono_gc_wbarrier_generic_store (method, (MonoObject*) mono_method_get_object (domain, actual_method, NULL));
- location = mono_debug_lookup_source_location (ji->method, *native_offset, domain);
+ location = mono_debug_lookup_source_location (jmethod, *native_offset, domain);
if (location)
*iloffset = location->il_offset;
else
@@ -940,16 +947,18 @@ callback_get_first_frame_security_info (StackFrameInfo *frame, MonoContext *ctx,
{
MonoFrameSecurityInfo *si = (MonoFrameSecurityInfo*) data;
MonoJitInfo *ji = frame->ji;
+ MonoMethod *method;
if (!ji)
return FALSE;
/* FIXME: skip all wrappers ?? probably not - case by case testing is required */
- if (ji->method->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE ||
- ji->method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE ||
- ji->method->wrapper_type == MONO_WRAPPER_XDOMAIN_DISPATCH ||
- ji->method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK ||
- ji->method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE) {
+ method = jinfo_get_method (ji);
+ if (method->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE ||
+ method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE ||
+ method->wrapper_type == MONO_WRAPPER_XDOMAIN_DISPATCH ||
+ method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK ||
+ method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE) {
return FALSE;
}
@@ -1014,16 +1023,18 @@ callback_get_stack_frames_security_info (StackFrameInfo *frame, MonoContext *ctx
{
MonoSecurityStack *ss = (MonoSecurityStack*) data;
MonoJitInfo *ji = frame->ji;
+ MonoMethod *method;
if (!ji)
return FALSE;
/* FIXME: skip all wrappers ?? probably not - case by case testing is required */
- if (ji->method->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE ||
- ji->method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE ||
- ji->method->wrapper_type == MONO_WRAPPER_XDOMAIN_DISPATCH ||
- ji->method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK ||
- ji->method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE) {
+ method = jinfo_get_method (ji);
+ if (method->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE ||
+ method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE ||
+ method->wrapper_type == MONO_WRAPPER_XDOMAIN_DISPATCH ||
+ method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK ||
+ method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE) {
return FALSE;
}
@@ -1149,6 +1160,9 @@ mini_jit_info_table_find (MonoDomain *domain, char *addr, MonoDomain **out_domai
}
}
+ if (!t)
+ return NULL;
+
refs = (t->appdomain_refs) ? *(gpointer *) t->appdomain_refs : NULL;
for (; refs && *refs; refs++) {
if (*refs != domain && *refs != mono_get_root_domain ()) {
@@ -1292,6 +1306,7 @@ mono_handle_exception_internal_first_pass (MonoContext *ctx, gpointer obj, gint3
MonoException *mono_ex;
gboolean stack_overflow = FALSE;
MonoContext initial_ctx;
+ MonoMethod *method;
int frame_count = 0;
gboolean has_dynamic_methods = FALSE;
gint32 filter_idx;
@@ -1355,15 +1370,16 @@ mono_handle_exception_internal_first_pass (MonoContext *ctx, gpointer obj, gint3
}
frame_count ++;
- //printf ("M: %s %d.\n", mono_method_full_name (ji->method, TRUE), frame_count);
+ method = jinfo_get_method (ji);
+ //printf ("M: %s %d.\n", mono_method_full_name (method, TRUE), frame_count);
- if (mini_get_debug_options ()->reverse_pinvoke_exceptions && ji->method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {
+ if (mini_get_debug_options ()->reverse_pinvoke_exceptions && method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {
g_error ("A native frame was found while unwinding the stack after an exception.\n"
"The native frame called the managed method:\n%s\n",
- mono_method_full_name (ji->method, TRUE));
+ mono_method_full_name (method, TRUE));
}
- if (ji->method->wrapper_type != MONO_WRAPPER_RUNTIME_INVOKE && mono_ex) {
+ if (method->wrapper_type != MONO_WRAPPER_RUNTIME_INVOKE && mono_ex) {
/*
* Avoid overwriting the stack trace if the exception is
* rethrown. Also avoid giant stack traces during a stack
@@ -1376,7 +1392,7 @@ mono_handle_exception_internal_first_pass (MonoContext *ctx, gpointer obj, gint3
}
}
- if (ji->method->dynamic)
+ if (method->dynamic)
has_dynamic_methods = TRUE;
if (stack_overflow) {
@@ -1407,18 +1423,16 @@ mono_handle_exception_internal_first_pass (MonoContext *ctx, gpointer obj, gint3
* Have to unwrap RuntimeWrappedExceptions if the
* method's assembly doesn't have a RuntimeCompatibilityAttribute.
*/
- if (non_exception && !wrap_non_exception_throws (ji->method))
+ if (non_exception && !wrap_non_exception_throws (method))
ex_obj = non_exception;
else
ex_obj = obj;
if (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER) {
- gboolean is_user_frame = ji->method->wrapper_type == MONO_WRAPPER_NONE || ji->method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD;
+ gboolean is_user_frame = method->wrapper_type == MONO_WRAPPER_NONE || method->wrapper_type == MONO_WRAPPER_DYNAMIC_METHOD;
#ifndef DISABLE_PERFCOUNTERS
mono_perfcounters->exceptions_filters++;
#endif
- mono_debugger_call_exception_handler (ei->data.filter, MONO_CONTEXT_GET_SP (ctx), ex_obj);
-
/*
Here's the thing, if this is a filter clause done by a wrapper like runtime invoke, we don't want to
trim the stackframe since if it returns FALSE we lose information.
@@ -1488,14 +1502,14 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
MonoDomain *domain = mono_domain_get ();
MonoJitInfo *ji, *prev_ji;
static int (*call_filter) (MonoContext *, gpointer) = NULL;
- static void (*restore_context) (void *);
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
MonoLMF *lmf = mono_get_lmf ();
MonoException *mono_ex;
gboolean stack_overflow = FALSE;
MonoContext initial_ctx;
+ MonoMethod *method;
int frame_count = 0;
- gint32 filter_idx, first_filter_idx;
+ gint32 filter_idx, first_filter_idx = 0;
int i;
MonoObject *ex_obj;
MonoObject *non_exception = NULL;
@@ -1558,9 +1572,6 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
if (!call_filter)
call_filter = mono_get_call_filter ();
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
g_assert (jit_tls->end_of_stack);
g_assert (jit_tls->abort_func);
@@ -1627,10 +1638,10 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
* FIXME: The check below is hackish, but its hard to distinguish these runtime invoke calls from others
* in the runtime.
*/
- if (ji && ji->method->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE) {
+ if (ji && jinfo_get_method (ji)->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE) {
if (prev_ji) {
MonoInternalThread *thread = mono_thread_internal_current ();
- if (prev_ji->method == thread->async_invoke_method)
+ if (jinfo_get_method (prev_ji) == thread->async_invoke_method)
unhandled = TRUE;
}
}
@@ -1681,8 +1692,9 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
g_assert_not_reached ();
}
+ method = jinfo_get_method (ji);
frame_count ++;
- //printf ("M: %s %d.\n", mono_method_full_name (ji->method, TRUE), frame_count);
+ //printf ("M: %s %d.\n", mono_method_full_name (method, TRUE), frame_count);
if (stack_overflow) {
if (DOES_STACK_GROWS_UP)
@@ -1712,7 +1724,7 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
* Have to unwrap RuntimeWrappedExceptions if the
* method's assembly doesn't have a RuntimeCompatibilityAttribute.
*/
- if (non_exception && !wrap_non_exception_throws (ji->method))
+ if (non_exception && !wrap_non_exception_throws (method))
ex_obj = non_exception;
else
ex_obj = obj;
@@ -1776,12 +1788,11 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
}
}
- if (mono_trace_is_enabled () && mono_trace_eval (ji->method))
- g_print ("EXCEPTION: catch found at clause %d of %s\n", i, mono_method_full_name (ji->method, TRUE));
+ if (mono_trace_is_enabled () && mono_trace_eval (method))
+ g_print ("EXCEPTION: catch found at clause %d of %s\n", i, mono_method_full_name (method, TRUE));
jit_tls->orig_ex_ctx_set = TRUE;
- mono_profiler_exception_clause_handler (ji->method, ei->flags, i);
+ mono_profiler_exception_clause_handler (method, ei->flags, i);
jit_tls->orig_ex_ctx_set = FALSE;
- mono_debugger_call_exception_handler (ei->handler_start, MONO_CONTEXT_GET_SP (ctx), ex_obj);
MONO_CONTEXT_SET_IP (ctx, ei->handler_start);
*(mono_get_lmf_addr ()) = lmf;
#ifndef DISABLE_PERFCOUNTERS
@@ -1794,22 +1805,20 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
}
if (is_address_protected (ji, ei, MONO_CONTEXT_GET_IP (ctx)) &&
(ei->flags == MONO_EXCEPTION_CLAUSE_FAULT)) {
- if (mono_trace_is_enabled () && mono_trace_eval (ji->method))
- g_print ("EXCEPTION: fault clause %d of %s\n", i, mono_method_full_name (ji->method, TRUE));
+ if (mono_trace_is_enabled () && mono_trace_eval (method))
+ g_print ("EXCEPTION: fault clause %d of %s\n", i, mono_method_full_name (method, TRUE));
jit_tls->orig_ex_ctx_set = TRUE;
- mono_profiler_exception_clause_handler (ji->method, ei->flags, i);
+ mono_profiler_exception_clause_handler (method, ei->flags, i);
jit_tls->orig_ex_ctx_set = FALSE;
- mono_debugger_call_exception_handler (ei->handler_start, MONO_CONTEXT_GET_SP (ctx), ex_obj);
call_filter (ctx, ei->handler_start);
}
if (is_address_protected (ji, ei, MONO_CONTEXT_GET_IP (ctx)) &&
(ei->flags == MONO_EXCEPTION_CLAUSE_FINALLY)) {
- if (mono_trace_is_enabled () && mono_trace_eval (ji->method))
- g_print ("EXCEPTION: finally clause %d of %s\n", i, mono_method_full_name (ji->method, TRUE));
+ if (mono_trace_is_enabled () && mono_trace_eval (method))
+ g_print ("EXCEPTION: finally clause %d of %s\n", i, mono_method_full_name (method, TRUE));
jit_tls->orig_ex_ctx_set = TRUE;
- mono_profiler_exception_clause_handler (ji->method, ei->flags, i);
+ mono_profiler_exception_clause_handler (method, ei->flags, i);
jit_tls->orig_ex_ctx_set = FALSE;
- mono_debugger_call_exception_handler (ei->handler_start, MONO_CONTEXT_GET_SP (ctx), ex_obj);
#ifndef DISABLE_PERFCOUNTERS
mono_perfcounters->exceptions_finallys++;
#endif
@@ -1841,7 +1850,7 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
}
jit_tls->orig_ex_ctx_set = TRUE;
- mono_profiler_exception_method_leave (ji->method);
+ mono_profiler_exception_method_leave (method);
jit_tls->orig_ex_ctx_set = FALSE;
*ctx = new_ctx;
@@ -1850,72 +1859,6 @@ mono_handle_exception_internal (MonoContext *ctx, gpointer obj, gboolean resume,
g_assert_not_reached ();
}
-/*
- * mono_debugger_handle_exception:
- *
- * Notify the debugger about exceptions. Returns TRUE if the debugger wants us to stop
- * at the exception and FALSE to resume with the normal exception handling.
- *
- * The arch code is responsible to setup @ctx in a way that MONO_CONTEXT_GET_IP () and
- * MONO_CONTEXT_GET_SP () point to the throw instruction; ie. before executing the
- * `callq throw' instruction.
- */
-gboolean
-mono_debugger_handle_exception (MonoContext *ctx, MonoObject *obj)
-{
- MonoDebuggerExceptionAction action;
-
- if (!mono_debug_using_mono_debugger ())
- return FALSE;
-
- if (!obj) {
- MonoException *ex = mono_get_exception_null_reference ();
- MONO_OBJECT_SETREF (ex, message, mono_string_new (mono_domain_get (), "Object reference not set to an instance of an object"));
- obj = (MonoObject *)ex;
- }
-
- action = _mono_debugger_throw_exception (MONO_CONTEXT_GET_IP (ctx), MONO_CONTEXT_GET_SP (ctx), obj);
-
- if (action == MONO_DEBUGGER_EXCEPTION_ACTION_STOP) {
- /*
- * The debugger wants us to stop on the `throw' instruction.
- * By the time we get here, it already inserted a breakpoint there.
- */
- return TRUE;
- } else if (action == MONO_DEBUGGER_EXCEPTION_ACTION_STOP_UNHANDLED) {
- MonoContext ctx_cp = *ctx;
- MonoJitInfo *ji = NULL;
- gboolean ret;
-
- /*
- * The debugger wants us to stop only if this exception is user-unhandled.
- */
-
- ret = mono_handle_exception_internal_first_pass (&ctx_cp, obj, NULL, &ji, NULL, NULL);
- if (ret && (ji != NULL) && (ji->method->wrapper_type == MONO_WRAPPER_RUNTIME_INVOKE)) {
- /*
- * The exception is handled in a runtime-invoke wrapper, that means that it's unhandled
- * inside the method being invoked, so we handle it like a user-unhandled exception.
- */
- ret = FALSE;
- }
-
- if (!ret) {
- /*
- * The exception is user-unhandled - tell the debugger to stop.
- */
- return _mono_debugger_unhandled_exception (MONO_CONTEXT_GET_IP (ctx), MONO_CONTEXT_GET_SP (ctx), obj);
- }
-
- /*
- * The exception is catched somewhere - resume with the normal exception handling and don't
- * stop in the debugger.
- */
- }
-
- return FALSE;
-}
-
/**
* mono_debugger_run_finally:
* @start_ctx: saved processor state
@@ -2165,6 +2108,7 @@ typedef struct {
int count;
} PrintOverflowUserData;
+#ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
static gboolean
print_overflow_stack_frame (StackFrameInfo *frame, MonoContext *ctx, gpointer data)
{
@@ -2173,7 +2117,7 @@ print_overflow_stack_frame (StackFrameInfo *frame, MonoContext *ctx, gpointer da
gchar *location;
if (frame->ji)
- method = frame->ji->method;
+ method = jinfo_get_method (frame->ji);
if (method) {
if (user_data->count == 0) {
@@ -2203,12 +2147,15 @@ print_overflow_stack_frame (StackFrameInfo *frame, MonoContext *ctx, gpointer da
return FALSE;
}
+#endif
void
mono_handle_hard_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx, guint8* fault_addr)
{
+#ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
PrintOverflowUserData ud;
MonoContext mctx;
+#endif
/* we don't do much now, but we can warn the user with a useful message */
mono_runtime_printf_err ("Stack overflow: IP: %p, fault addr: %p", mono_arch_ip_from_context (ctx), fault_addr);
@@ -2222,8 +2169,8 @@ mono_handle_hard_stack_ovf (MonoJitTlsData *jit_tls, MonoJitInfo *ji, void *ctx,
mono_walk_stack_with_ctx (print_overflow_stack_frame, &mctx, MONO_UNWIND_LOOKUP_ACTUAL_METHOD, &ud);
#else
- if (ji && ji->method)
- mono_runtime_printf_err ("At %s", mono_method_full_name (ji->method, TRUE));
+ if (ji && jinfo_get_method (ji))
+ mono_runtime_printf_err ("At %s", mono_method_full_name (jinfo_get_method (ji), TRUE));
else
mono_runtime_printf_err ("At <unmanaged>.");
#endif
@@ -2235,8 +2182,9 @@ static gboolean
print_stack_frame_to_stderr (StackFrameInfo *frame, MonoContext *ctx, gpointer data)
{
MonoMethod *method = NULL;
+
if (frame->ji)
- method = frame->ji->method;
+ method = jinfo_get_method (frame->ji);
if (method) {
gchar *location = mono_debug_print_stack_frame (method, frame->native_offset, mono_domain_get ());
@@ -2253,8 +2201,9 @@ print_stack_frame_to_string (StackFrameInfo *frame, MonoContext *ctx, gpointer d
{
GString *p = (GString*)data;
MonoMethod *method = NULL;
+
if (frame->ji)
- method = frame->ji->method;
+ method = jinfo_get_method (frame->ji);
if (method) {
gchar *location = mono_debug_print_stack_frame (method, frame->native_offset, mono_domain_get ());
@@ -2288,8 +2237,14 @@ mono_handle_native_sigsegv (int signal, void *ctx)
if (mini_get_debug_options ()->suspend_on_sigsegv) {
mono_runtime_printf_err ("Received SIGSEGV, suspending...");
+#ifdef HOST_WIN32
while (1)
;
+#else
+ while (1) {
+ sleep (0);
+ }
+#endif
}
/* To prevent infinite loops when the stack walk causes a crash */
@@ -2320,7 +2275,7 @@ mono_handle_native_sigsegv (int signal, void *ctx)
/* Try to get more meaningful information using gdb */
#if !defined(HOST_WIN32) && defined(HAVE_SYS_SYSCALL_H) && defined(SYS_fork)
- if (!mini_get_debug_options ()->no_gdb_backtrace && !mono_debug_using_mono_debugger ()) {
+ if (!mini_get_debug_options ()->no_gdb_backtrace) {
/* From g_spawn_command_line_sync () in eglib */
pid_t pid;
int status;
@@ -2460,7 +2415,6 @@ void
mono_resume_unwind (MonoContext *ctx)
{
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
- static void (*restore_context) (MonoContext *);
MonoContext new_ctx;
MONO_CONTEXT_SET_IP (ctx, MONO_CONTEXT_GET_IP (&jit_tls->resume_state.ctx));
@@ -2469,10 +2423,7 @@ mono_resume_unwind (MonoContext *ctx)
mono_handle_exception_internal (&new_ctx, jit_tls->resume_state.ex_obj, TRUE, NULL);
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
- restore_context (&new_ctx);
+ mono_restore_context (&new_ctx);
}
#ifdef MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD
@@ -2494,9 +2445,6 @@ find_last_handler_block (StackFrameInfo *frame, MonoContext *ctx, gpointer data)
if (!ji)
return FALSE;
- if (ji->method->wrapper_type)
- return FALSE;
-
ip = MONO_CONTEXT_GET_IP (ctx);
for (i = 0; i < ji->num_clauses; ++i) {
@@ -2565,7 +2513,10 @@ mono_install_handler_block_guard (MonoThreadUnwindState *ctx)
if (!jit_tls || jit_tls->handler_block_return_address)
return FALSE;
- mono_walk_stack_with_state (find_last_handler_block, ctx, MONO_UNWIND_SIGNAL_SAFE, &data);
+ /* Do an async safe stack walk */
+ mono_thread_info_set_is_async_context (TRUE);
+ mono_walk_stack_with_state (find_last_handler_block, ctx, MONO_UNWIND_NONE, &data);
+ mono_thread_info_set_is_async_context (FALSE);
if (!data.ji)
return FALSE;
@@ -2681,11 +2632,8 @@ mono_thread_state_init_from_current (MonoThreadUnwindState *ctx)
static void
mono_raise_exception_with_ctx (MonoException *exc, MonoContext *ctx)
{
- void (*restore_context) (MonoContext *);
- restore_context = mono_get_restore_context ();
-
mono_handle_exception (ctx, exc);
- restore_context (ctx);
+ mono_restore_context (ctx);
}
/*FIXME Move all monoctx -> sigctx conversion to signal handlers once all archs support utils/mono-context */
@@ -2744,3 +2692,20 @@ mono_invoke_unhandled_exception_hook (MonoObject *exc)
g_assert_not_reached ();
}
+
+/*
+ * mono_restore_context:
+ *
+ * Call the architecture specific restore context function.
+ */
+void
+mono_restore_context (MonoContext *ctx)
+{
+ static void (*restore_context) (MonoContext *);
+
+ if (!restore_context)
+ restore_context = mono_get_restore_context ();
+ restore_context (ctx);
+ g_assert_not_reached ();
+}
+
diff --git a/mono/mini/mini-gc.c b/mono/mini/mini-gc.c
index 83c4e3dc1f..bc6a1aabb6 100755
--- a/mono/mini/mini-gc.c
+++ b/mono/mini/mini-gc.c
@@ -702,6 +702,7 @@ static void
conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
{
MonoJitInfo *ji;
+ MonoMethod *method;
MonoContext ctx, new_ctx;
MonoLMF *lmf;
guint8 *stack_limit;
@@ -811,10 +812,15 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
continue;
}
+ if (ji)
+ method = jinfo_get_method (ji);
+ else
+ method = NULL;
+
/* The last frame can be in any state so mark conservatively */
if (last) {
if (ji) {
- DEBUG (char *fname = mono_method_full_name (ji->method, TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx)); g_free (fname));
+ DEBUG (char *fname = mono_method_full_name (method, TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx)); g_free (fname));
}
DEBUG (fprintf (logfile, "\t <Last frame>\n"));
last = FALSE;
@@ -841,8 +847,8 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
pc_offset = (guint8*)MONO_CONTEXT_GET_IP (&ctx) - (guint8*)ji->code_start;
/* These frames are very problematic */
- if (ji->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
- DEBUG (char *fname = mono_method_full_name (ji->method, TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx)); g_free (fname));
+ if (method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
+ DEBUG (char *fname = mono_method_full_name (method, TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx)); g_free (fname));
DEBUG (fprintf (logfile, "\tSkip.\n"));
continue;
}
@@ -873,7 +879,7 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
emap = ji->gc_info;
if (!emap) {
- DEBUG (char *fname = mono_method_full_name (ji->method, TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx)); g_free (fname));
+ DEBUG (char *fname = mono_method_full_name (jinfo_get_method (ji), TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx)); g_free (fname));
DEBUG (fprintf (logfile, "\tNo GC Map.\n"));
continue;
}
@@ -892,7 +898,7 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
if (precise_frame_limit != -1) {
if (precise_frame_count [FALSE] == precise_frame_limit)
- printf ("LAST PRECISE FRAME: %s\n", mono_method_full_name (ji->method, TRUE));
+ printf ("LAST PRECISE FRAME: %s\n", mono_method_full_name (method, TRUE));
if (precise_frame_count [FALSE] > precise_frame_limit)
continue;
}
@@ -913,7 +919,7 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
frame_start = fp + map->start_offset + map->map_offset;
frame_end = fp + map->end_offset;
- DEBUG (char *fname = mono_method_full_name (ji->method, TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p) limit=%p fp=%p frame=%p-%p (%d)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx), stack_limit, fp, frame_start, frame_end, (int)(frame_end - frame_start)); g_free (fname));
+ DEBUG (char *fname = mono_method_full_name (jinfo_get_method (ji), TRUE); fprintf (logfile, "Mark(0): %s+0x%x (%p) limit=%p fp=%p frame=%p-%p (%d)\n", fname, pc_offset, (gpointer)MONO_CONTEXT_GET_IP (&ctx), stack_limit, fp, frame_start, frame_end, (int)(frame_end - frame_start)); g_free (fname));
/* Find the callsite index */
if (map->callsite_entry_size == 1) {
@@ -935,7 +941,7 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
break;
}
if (i == map->ncallsites) {
- printf ("Unable to find ip offset 0x%x in callsite list of %s.\n", pc_offset + 1, mono_method_full_name (ji->method, TRUE));
+ printf ("Unable to find ip offset 0x%x in callsite list of %s.\n", pc_offset + 1, mono_method_full_name (method, TRUE));
g_assert_not_reached ();
}
cindex = i;
@@ -1114,7 +1120,7 @@ precise_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
fi = &tls->frames [findex];
frame_start = stack_start + fi->frame_start_offset;
- DEBUG (char *fname = mono_method_full_name (fi->ji->method, TRUE); fprintf (logfile, "Mark(1): %s\n", fname); g_free (fname));
+ DEBUG (char *fname = mono_method_full_name (jinfo_get_method (fi->ji), TRUE); fprintf (logfile, "Mark(1): %s\n", fname); g_free (fname));
/*
* FIXME: Add a function to mark using a bitmap, to avoid doing a
diff --git a/mono/mini/mini-generic-sharing.c b/mono/mini/mini-generic-sharing.c
index 6965524c90..ac7d9ea2c7 100644
--- a/mono/mini/mini-generic-sharing.c
+++ b/mono/mini/mini-generic-sharing.c
@@ -1424,7 +1424,7 @@ instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
if (call_sig == mono_method_signature (method)) {
} else {
sig = mono_method_signature (method);
- gsig = mono_method_signature (callee_ji->method);
+ gsig = mono_method_signature (jinfo_get_method (callee_ji));
addr = mini_get_gsharedvt_wrapper (TRUE, callee_ji->code_start, sig, gsig, callee_gji->generic_sharing_context, -1, FALSE);
@@ -2699,6 +2699,13 @@ mini_class_is_generic_sharable (MonoClass *klass)
return (klass->generic_class && mono_generic_context_is_sharable (&klass->generic_class->context, FALSE));
}
+
+gboolean
+mini_is_gsharedvt_variable_klass (MonoCompile *cfg, MonoClass *klass)
+{
+ return mini_is_gsharedvt_variable_type (cfg, &klass->byval_arg);
+}
+
#if defined(MONOTOUCH) || defined(MONO_EXTENSIONS)
#include "../../../mono-extensions/mono/mini/mini-generic-sharing-gsharedvt.c"
diff --git a/mono/mini/mini-ia64.c b/mono/mini/mini-ia64.c
index 113d4a1fcd..17cc1f9f2f 100644
--- a/mono/mini/mini-ia64.c
+++ b/mono/mini/mini-ia64.c
@@ -4748,12 +4748,6 @@ mono_arch_print_tree (MonoInst *tree, int arity)
return 0;
}
-MonoInst*
-mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- return mono_get_domain_intrinsic (cfg);
-}
-
mgreg_t
mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
{
diff --git a/mono/mini/mini-llvm-cpp.cpp b/mono/mini/mini-llvm-cpp.cpp
index aa89217904..0d2ada8207 100644
--- a/mono/mini/mini-llvm-cpp.cpp
+++ b/mono/mini/mini-llvm-cpp.cpp
@@ -123,14 +123,15 @@ public:
virtual void deallocateExceptionTable(void*) {
}
- virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
- unsigned SectionID) {
+ virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID,
+ StringRef SectionName) {
// FIXME:
assert(0);
return NULL;
}
- virtual uint8_t* allocateDataSection(uintptr_t, unsigned int, unsigned int, bool) {
+ virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID,
+ StringRef SectionName, bool IsReadOnly) {
// FIXME:
assert(0);
return NULL;
@@ -142,6 +143,12 @@ public:
return false;
}
+ virtual bool finalizeMemory(std::string *ErrMsg = 0) {
+ // FIXME:
+ assert(0);
+ return false;
+ }
+
virtual void* getPointerToNamedFunction(const std::string &Name, bool AbortOnFailure) {
void *res;
char *err;
@@ -262,17 +269,8 @@ public:
* install a profiler hook and reset the code model here.
* This should be inside an ifdef, but we can't include our config.h either,
* since its definitions conflict with LLVM's config.h.
- *
+ * The LLVM mono branch contains a workaround.
*/
- //#if defined(TARGET_X86) || defined(TARGET_AMD64)
-#ifndef LLVM_MONO_BRANCH
- /* The LLVM mono branch contains a workaround, so this is not needed */
- if (Details.MF->getTarget ().getCodeModel () == CodeModel::Large) {
- Details.MF->getTarget ().setCodeModel (CodeModel::Default);
- }
-#endif
- //#endif
-
emitted_cb (wrap (&F), Code, (char*)Code + Size);
}
};
@@ -287,7 +285,10 @@ static FunctionPassManager *fpm;
void
mono_llvm_optimize_method (LLVMValueRef method)
{
- verifyFunction (*(unwrap<Function> (method)));
+ /*
+ * The verifier does some checks on the whole module, leading to quadratic behavior.
+ */
+ //verifyFunction (*(unwrap<Function> (method)));
fpm->run (*unwrap<Function> (method));
}
@@ -417,7 +418,7 @@ force_pass_linking (void)
(void) llvm::createBasicAliasAnalysisPass();
(void) llvm::createLibCallAliasAnalysisPass(0);
(void) llvm::createScalarEvolutionAliasAnalysisPass();
- (void) llvm::createBlockPlacementPass();
+ //(void) llvm::createBlockPlacementPass();
(void) llvm::createBreakCriticalEdgesPass();
(void) llvm::createCFGSimplificationPass();
/*
@@ -487,7 +488,7 @@ force_pass_linking (void)
(void) llvm::createReassociatePass();
(void) llvm::createSCCPPass();
(void) llvm::createScalarReplAggregatesPass();
- (void) llvm::createSimplifyLibCallsPass();
+ //(void) llvm::createSimplifyLibCallsPass();
/*
(void) llvm::createSingleLoopExtractorPass();
(void) llvm::createStripSymbolsPass();
@@ -547,10 +548,6 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func
mono_mm->alloc_cb = alloc_cb;
mono_mm->dlsym_cb = dlsym_cb;
- //JITExceptionHandling = true;
- // PrettyStackTrace installs signal handlers which trip up libgc
- DisablePrettyStackTrace = true;
-
/*
* The Default code model doesn't seem to work on amd64,
* test_0_fields_with_big_offsets (among others) crashes, because LLVM tries to call
@@ -568,14 +565,6 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func
#endif
g_assert (EE);
-#if 0
- ExecutionEngine *EE = ExecutionEngine::createJIT (unwrap (MP), &Error, mono_mm, CodeGenOpt::Default, true, Reloc::Default, CodeModel::Large);
- if (!EE) {
- errs () << "Unable to create LLVM ExecutionEngine: " << Error << "\n";
- g_assert_not_reached ();
- }
-#endif
-
EE->InstallExceptionTableRegister (exception_cb);
mono_event_listener = new MonoJITEventListener (emitted_cb);
EE->RegisterJITEventListener (mono_event_listener);
@@ -587,12 +576,10 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func
PassRegistry &Registry = *PassRegistry::getPassRegistry();
initializeCore(Registry);
initializeScalarOpts(Registry);
- //initializeIPO(Registry);
initializeAnalysis(Registry);
initializeIPA(Registry);
initializeTransformUtils(Registry);
initializeInstCombine(Registry);
- //initializeInstrumentation(Registry);
initializeTarget(Registry);
llvm::cl::ParseEnvironmentOptions("mono", "MONO_LLVM", "");
@@ -610,7 +597,7 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func
}
} else {
/* Use the same passes used by 'opt' by default, without the ipo passes */
- const char *opts = "-simplifycfg -domtree -domfrontier -scalarrepl -instcombine -simplifycfg -domtree -domfrontier -scalarrepl -simplify-libcalls -instcombine -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loop-simplify -domfrontier -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-deletion -loop-simplify -lcssa -loop-unroll -instcombine -memdep -gvn -memdep -memcpyopt -sccp -instcombine -domtree -memdep -dse -adce -gvn -simplifycfg -preverify -domtree -verify";
+ const char *opts = "-simplifycfg -domtree -domfrontier -scalarrepl -instcombine -simplifycfg -domtree -domfrontier -scalarrepl -instcombine -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loop-simplify -domfrontier -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-deletion -loop-simplify -lcssa -loop-unroll -instcombine -memdep -gvn -memdep -memcpyopt -sccp -instcombine -domtree -memdep -dse -adce -gvn -simplifycfg";
char **args;
int i;
diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c
index ce2e50d536..1cc990039f 100644
--- a/mono/mini/mini-llvm.c
+++ b/mono/mini/mini-llvm.c
@@ -35,6 +35,9 @@ typedef struct {
LLVMValueRef got_var;
const char *got_symbol;
GHashTable *plt_entries;
+ char **bb_names;
+ GPtrArray *used;
+ LLVMTypeRef ptr_type;
} MonoLLVMModule;
/*
@@ -145,6 +148,12 @@ llvm_ins_info[] = {
#define IS_TARGET_X86 0
#endif
+#ifdef TARGET_AMD64
+#define IS_TARGET_AMD64 1
+#else
+#define IS_TARGET_AMD64 0
+#endif
+
#define LLVM_FAILURE(ctx, reason) do { \
TRACE_FAILURE (reason); \
(ctx)->cfg->exception_message = g_strdup (reason); \
@@ -205,6 +214,18 @@ IntPtrType (void)
return sizeof (gpointer) == 8 ? LLVMInt64Type () : LLVMInt32Type ();
}
+static LLVMTypeRef
+ObjRefType (void)
+{
+ return sizeof (gpointer) == 8 ? LLVMPointerType (LLVMInt64Type (), 0) : LLVMPointerType (LLVMInt32Type (), 0);
+}
+
+static LLVMTypeRef
+ThisType (void)
+{
+ return sizeof (gpointer) == 8 ? LLVMPointerType (LLVMInt64Type (), 0) : LLVMPointerType (LLVMInt32Type (), 0);
+}
+
/*
* get_vtype_size:
*
@@ -326,14 +347,14 @@ type_to_llvm_type (EmitContext *ctx, MonoType *t)
case MONO_TYPE_SZARRAY:
case MONO_TYPE_STRING:
case MONO_TYPE_PTR:
- return IntPtrType ();
+ return ObjRefType ();
case MONO_TYPE_VAR:
case MONO_TYPE_MVAR:
/* Because of generic sharing */
- return IntPtrType ();
+ return ObjRefType ();
case MONO_TYPE_GENERICINST:
if (!mono_type_generic_inst_is_valuetype (t))
- return IntPtrType ();
+ return ObjRefType ();
/* Fall through */
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_TYPEDBYREF: {
@@ -833,14 +854,28 @@ simd_op_to_llvm_type (int opcode)
static LLVMBasicBlockRef
get_bb (EmitContext *ctx, MonoBasicBlock *bb)
{
- char bb_name [128];
+ char bb_name_buf [128];
+ char *bb_name;
if (ctx->bblocks [bb->block_num].bblock == NULL) {
if (bb->flags & BB_EXCEPTION_HANDLER) {
int clause_index = (mono_get_block_region_notry (ctx->cfg, bb->region) >> 8) - 1;
- sprintf (bb_name, "EH_CLAUSE%d_BB%d", clause_index, bb->block_num);
+ sprintf (bb_name_buf, "EH_CLAUSE%d_BB%d", clause_index, bb->block_num);
+ bb_name = bb_name_buf;
+ } else if (bb->block_num < 256) {
+ if (!ctx->lmodule->bb_names)
+ ctx->lmodule->bb_names = g_new0 (char*, 256);
+ if (!ctx->lmodule->bb_names [bb->block_num]) {
+ char *n;
+
+ n = g_strdup_printf ("BB%d", bb->block_num);
+ mono_memory_barrier ();
+ ctx->lmodule->bb_names [bb->block_num] = n;
+ }
+ bb_name = ctx->lmodule->bb_names [bb->block_num];
} else {
- sprintf (bb_name, "BB%d", bb->block_num);
+ sprintf (bb_name_buf, "BB%d", bb->block_num);
+ bb_name = bb_name_buf;
}
ctx->bblocks [bb->block_num].bblock = LLVMAppendBasicBlock (ctx->lmethod, bb_name);
@@ -1056,13 +1091,13 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *
if (cinfo && cinfo->rgctx_arg) {
if (sinfo)
sinfo->rgctx_arg_pindex = pindex;
- param_types [pindex] = IntPtrType ();
+ param_types [pindex] = ctx->lmodule->ptr_type;
pindex ++;
}
if (cinfo && cinfo->imt_arg) {
if (sinfo)
sinfo->imt_arg_pindex = pindex;
- param_types [pindex] = IntPtrType ();
+ param_types [pindex] = ctx->lmodule->ptr_type;
pindex ++;
}
if (vretaddr) {
@@ -1092,7 +1127,7 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *
if (sig->hasthis) {
if (sinfo)
sinfo->this_arg_pindex = pindex;
- param_types [pindex ++] = IntPtrType ();
+ param_types [pindex ++] = ThisType ();
}
if (vretaddr && vret_arg_pindex == pindex)
param_types [pindex ++] = IntPtrType ();
@@ -1274,12 +1309,26 @@ set_metadata_flag (LLVMValueRef v, const char *flag_name)
{
LLVMValueRef md_arg;
int md_kind;
-
+
md_kind = LLVMGetMDKindID (flag_name, strlen (flag_name));
md_arg = LLVMMDString ("mono", 4);
LLVMSetMetadata (v, md_kind, LLVMMDNode (&md_arg, 1));
}
+static void
+set_invariant_load_flag (LLVMValueRef v)
+{
+ LLVMValueRef md_arg;
+ int md_kind;
+ const char *flag_name;
+
+ // FIXME: Cache this
+ flag_name = "invariant.load";
+ md_kind = LLVMGetMDKindID (flag_name, strlen (flag_name));
+ md_arg = LLVMMDString ("<index>", strlen ("<index>"));
+ LLVMSetMetadata (v, md_kind, LLVMMDNode (&md_arg, 1));
+}
+
/*
* emit_call:
*
@@ -1475,7 +1524,8 @@ emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *ex
throw_sig->ret = &mono_get_void_class ()->byval_arg;
throw_sig->params [0] = &mono_get_int32_class ()->byval_arg;
icall_name = "llvm_throw_corlib_exception_abs_trampoline";
- throw_sig->params [1] = &mono_get_intptr_class ()->byval_arg;
+ /* This will become i8* */
+ throw_sig->params [1] = &mono_get_byte_class ()->this_arg;
sig = sig_to_llvm_sig (ctx, throw_sig);
if (ctx->cfg->compile_aot) {
@@ -1486,8 +1536,7 @@ emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *ex
/*
* Differences between the LLVM/non-LLVM throw corlib exception trampoline:
* - On x86, LLVM generated code doesn't push the arguments
- * - When using the LLVM mono branch, the trampoline takes the throw address as an
- * arguments, not a pc offset.
+ * - The trampoline takes the throw address as an arguments, not a pc offset.
*/
LLVMAddGlobalMapping (ee, callee, resolve_patch (ctx->cfg, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name));
}
@@ -1496,7 +1545,7 @@ emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *ex
ctx->lmodule->throw_corlib_exception = callee;
}
- if (IS_TARGET_X86)
+ if (IS_TARGET_X86 || IS_TARGET_AMD64)
args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token - MONO_TOKEN_TYPE_DEF, FALSE);
else
args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token, FALSE);
@@ -1505,7 +1554,7 @@ emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *ex
* The LLVM mono branch contains changes so a block address can be passed as an
* argument to a call.
*/
- args [1] = LLVMBuildPtrToInt (builder, LLVMBlockAddress (ctx->lmethod, ex_bb), IntPtrType (), "");
+ args [1] = LLVMBlockAddress (ctx->lmethod, ex_bb);
emit_call (ctx, bb, &builder, ctx->lmodule->throw_corlib_exception, args, 2);
LLVMBuildUnreachable (builder);
@@ -1643,15 +1692,30 @@ build_alloca (EmitContext *ctx, MonoType *t)
* Put the global into the 'llvm.used' array to prevent it from being optimized away.
*/
static void
-mark_as_used (LLVMModuleRef module, LLVMValueRef global)
+mark_as_used (MonoLLVMModule *lmodule, LLVMValueRef global)
{
+ if (!lmodule->used)
+ lmodule->used = g_ptr_array_sized_new (16);
+ g_ptr_array_add (lmodule->used, global);
+}
+
+static void
+emit_llvm_used (MonoLLVMModule *lmodule)
+{
+ LLVMModuleRef module = lmodule->module;
LLVMTypeRef used_type;
- LLVMValueRef used, used_elem;
+ LLVMValueRef used, *used_elem;
+ int i;
- used_type = LLVMArrayType (LLVMPointerType (LLVMInt8Type (), 0), 1);
+ if (!lmodule->used)
+ return;
+
+ used_type = LLVMArrayType (LLVMPointerType (LLVMInt8Type (), 0), lmodule->used->len);
used = LLVMAddGlobal (module, used_type, "llvm.used");
- used_elem = LLVMConstBitCast (global, LLVMPointerType (LLVMInt8Type (), 0));
- LLVMSetInitializer (used, LLVMConstArray (LLVMPointerType (LLVMInt8Type (), 0), &used_elem, 1));
+ used_elem = g_new0 (LLVMValueRef, lmodule->used->len);
+ for (i = 0; i < lmodule->used->len; ++i)
+ used_elem [i] = LLVMConstBitCast (g_ptr_array_index (lmodule->used, i), LLVMPointerType (LLVMInt8Type (), 0));
+ LLVMSetInitializer (used, LLVMConstArray (LLVMPointerType (LLVMInt8Type (), 0), used_elem, lmodule->used->len));
LLVMSetLinkage (used, LLVMAppendingLinkage);
LLVMSetSection (used, "llvm.metadata");
}
@@ -1745,7 +1809,7 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
* with the "mono.this" custom metadata to tell llvm that it needs to save its
* location into the LSDA.
*/
- this_alloc = mono_llvm_build_alloca (builder, IntPtrType (), LLVMConstInt (LLVMInt32Type (), 1, FALSE), 0, "");
+ this_alloc = mono_llvm_build_alloca (builder, ThisType (), LLVMConstInt (LLVMInt32Type (), 1, FALSE), 0, "");
/* This volatile store will keep the alloca alive */
mono_llvm_build_store (builder, ctx->values [cfg->args [0]->dreg], this_alloc, TRUE);
@@ -1761,7 +1825,7 @@ emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
g_assert (ctx->addresses [cfg->rgctx_var->dreg]);
rgctx_alloc = ctx->addresses [cfg->rgctx_var->dreg];
/* This volatile store will keep the alloca alive */
- store = mono_llvm_build_store (builder, ctx->rgctx_arg, rgctx_alloc, TRUE);
+ store = mono_llvm_build_store (builder, convert (ctx, ctx->rgctx_arg, IntPtrType ()), rgctx_alloc, TRUE);
set_metadata_flag (rgctx_alloc, "mono.this");
}
@@ -1956,12 +2020,12 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
if (call->rgctx_arg_reg) {
g_assert (values [call->rgctx_arg_reg]);
g_assert (sinfo.rgctx_arg_pindex < nargs);
- args [sinfo.rgctx_arg_pindex] = values [call->rgctx_arg_reg];
+ args [sinfo.rgctx_arg_pindex] = convert (ctx, values [call->rgctx_arg_reg], ctx->lmodule->ptr_type);
}
if (call->imt_arg_reg) {
g_assert (values [call->imt_arg_reg]);
g_assert (sinfo.imt_arg_pindex < nargs);
- args [sinfo.imt_arg_pindex] = values [call->imt_arg_reg];
+ args [sinfo.imt_arg_pindex] = convert (ctx, values [call->imt_arg_reg], ctx->lmodule->ptr_type);
}
if (vretaddr) {
@@ -2009,7 +2073,7 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
} else {
g_assert (args [pindex]);
if (i == 0 && sig->hasthis)
- args [pindex] = convert (ctx, args [pindex], IntPtrType ());
+ args [pindex] = convert (ctx, args [pindex], ThisType ());
else
args [pindex] = convert (ctx, args [pindex], type_to_llvm_arg_type (ctx, sig->params [i - sig->hasthis]));
}
@@ -2025,7 +2089,6 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
lcall = emit_call (ctx, bb, &builder, callee, args, LLVMCountParamTypes (llvm_sig));
-#ifdef LLVM_MONO_BRANCH
/*
* Modify cconv and parameter attributes to pass rgctx/imt correctly.
*/
@@ -2041,7 +2104,6 @@ process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref,
LLVMAddInstrAttribute (lcall, 1 + sinfo.rgctx_arg_pindex, LLVMInRegAttribute);
if (call->imt_arg_reg)
LLVMAddInstrAttribute (lcall, 1 + sinfo.imt_arg_pindex, LLVMInRegAttribute);
-#endif
/* Add byval attributes if needed */
for (i = 0; i < sig->param_count; ++i) {
@@ -2417,9 +2479,12 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
/* We use COMPARE+SETcc/Bcc, llvm uses SETcc+br cond */
if (ins->opcode == OP_FCOMPARE)
cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), "");
- else if (ins->opcode == OP_COMPARE_IMM)
- cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), "");
- else if (ins->opcode == OP_LCOMPARE_IMM) {
+ else if (ins->opcode == OP_COMPARE_IMM) {
+ if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind && ins->inst_imm == 0)
+ cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, LLVMConstNull (LLVMTypeOf (lhs)), "");
+ else
+ cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), "");
+ } else if (ins->opcode == OP_LCOMPARE_IMM) {
if (SIZEOF_REGISTER == 4 && COMPILE_LLVM (cfg)) {
/* The immediate is encoded in two fields */
guint64 l = ((guint64)(guint32)ins->inst_offset << 32) | ((guint32)ins->inst_imm);
@@ -2428,9 +2493,12 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, LLVMInt64Type ()), LLVMConstInt (LLVMInt64Type (), ins->inst_imm, FALSE), "");
}
}
- else if (ins->opcode == OP_COMPARE)
- cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), convert (ctx, rhs, IntPtrType ()), "");
- else
+ else if (ins->opcode == OP_COMPARE) {
+ if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind && LLVMTypeOf (lhs) == LLVMTypeOf (rhs))
+ cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, rhs, "");
+ else
+ cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), convert (ctx, rhs, IntPtrType ()), "");
+ } else
cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, rhs, "");
if (MONO_IS_COND_BRANCH_OP (ins->next)) {
@@ -2685,7 +2753,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
case OP_AND_IMM:
case OP_MUL_IMM:
case OP_SHL_IMM:
- case OP_SHR_IMM: {
+ case OP_SHR_IMM:
+ case OP_SHR_UN_IMM: {
LLVMValueRef imm;
if (spec [MONO_INST_SRC1] == 'l') {
@@ -2761,6 +2830,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
break;
case OP_LSHR_UN_IMM:
+ case OP_SHR_UN_IMM:
values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
break;
default:
@@ -2972,12 +3042,12 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
values [ins->dreg] = emit_load (ctx, bb, &builder, size, addr, dname, is_volatile);
- if (!is_volatile && (ins->flags & MONO_INST_CONSTANT_LOAD)) {
+ if (!is_volatile && (ins->flags & MONO_INST_INVARIANT_LOAD)) {
/*
* These will signal LLVM that these loads do not alias any stores, and
* they can't fail, allowing them to be hoisted out of loops.
*/
- set_metadata_flag (values [ins->dreg], "mono.noalias");
+ set_invariant_load_flag (values [ins->dreg]);
set_metadata_flag (values [ins->dreg], "mono.nofail.load");
}
@@ -3095,23 +3165,8 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
indexes [1] = LLVMConstInt (LLVMInt32Type (), (gssize)got_offset, FALSE);
got_entry_addr = LLVMBuildGEP (builder, ctx->lmodule->got_var, indexes, 2, "");
- // FIXME: This doesn't work right now, because it must be
- // paired with an invariant.end, and even then, its only in effect
- // inside its basic block
-#if 0
- {
- LLVMValueRef args [3];
- LLVMValueRef ptr, val;
-
- ptr = LLVMBuildBitCast (builder, got_entry_addr, LLVMPointerType (LLVMInt8Type (), 0), "ptr");
-
- args [0] = LLVMConstInt (LLVMInt64Type (), sizeof (gpointer), FALSE);
- args [1] = ptr;
- val = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.invariant.start"), args, 2, "");
- }
-#endif
-
values [ins->dreg] = LLVMBuildLoad (builder, got_entry_addr, dname);
+ set_invariant_load_flag (values [ins->dreg]);
break;
}
case OP_NOT_REACHED:
@@ -3210,44 +3265,38 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
values [ins->dreg] = LLVMBuildSelect (builder, v, lhs, rhs, dname);
break;
}
- case OP_ATOMIC_EXCHANGE_I4: {
- LLVMValueRef args [2];
-
- g_assert (ins->inst_offset == 0);
-
- args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt32Type (), 0));
- args [1] = rhs;
-
- values [ins->dreg] = mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_XCHG, args [0], args [1]);
- break;
- }
+ case OP_ATOMIC_EXCHANGE_I4:
case OP_ATOMIC_EXCHANGE_I8: {
LLVMValueRef args [2];
+ LLVMTypeRef t;
+
+ if (ins->opcode == OP_ATOMIC_EXCHANGE_I4)
+ t = LLVMInt32Type ();
+ else
+ t = LLVMInt64Type ();
g_assert (ins->inst_offset == 0);
- args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt64Type (), 0));
- args [1] = convert (ctx, rhs, LLVMInt64Type ());
- values [ins->dreg] = mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_XCHG, args [0], args [1]);
- break;
- }
- case OP_ATOMIC_ADD_NEW_I4: {
- LLVMValueRef args [2];
-
- g_assert (ins->inst_offset == 0);
+ args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
+ args [1] = convert (ctx, rhs, t);
- args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt32Type (), 0));
- args [1] = rhs;
- values [ins->dreg] = LLVMBuildAdd (builder, mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_ADD, args [0], args [1]), args [1], dname);
+ values [ins->dreg] = mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_XCHG, args [0], args [1]);
break;
}
+ case OP_ATOMIC_ADD_NEW_I4:
case OP_ATOMIC_ADD_NEW_I8: {
LLVMValueRef args [2];
+ LLVMTypeRef t;
+
+ if (ins->opcode == OP_ATOMIC_ADD_NEW_I4)
+ t = LLVMInt32Type ();
+ else
+ t = LLVMInt64Type ();
g_assert (ins->inst_offset == 0);
- args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt64Type (), 0));
- args [1] = convert (ctx, rhs, LLVMInt64Type ());
+ args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
+ args [1] = convert (ctx, rhs, t);
values [ins->dreg] = LLVMBuildAdd (builder, mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_ADD, args [0], args [1]), args [1], dname);
break;
}
@@ -3256,11 +3305,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
LLVMValueRef args [3];
LLVMTypeRef t;
- if (ins->opcode == OP_ATOMIC_CAS_I4) {
+ if (ins->opcode == OP_ATOMIC_CAS_I4)
t = LLVMInt32Type ();
- } else {
+ else
t = LLVMInt64Type ();
- }
args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
/* comparand */
@@ -3291,15 +3339,32 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
// 256 == GS segment register
LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 256);
#endif
-
// FIXME: XEN
values [ins->dreg] = LLVMBuildLoad (builder, LLVMBuildIntToPtr (builder, LLVMConstInt (IntPtrType (), ins->inst_offset, TRUE), ptrtype, ""), "");
+#elif defined(TARGET_AMD64) && defined(TARGET_OSX)
+ /* See mono_amd64_emit_tls_get () */
+ int offset = mono_amd64_get_tls_gs_offset () + (ins->inst_offset * 8);
+
+ // 256 == GS segment register
+ LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 256);
+ values [ins->dreg] = LLVMBuildLoad (builder, LLVMBuildIntToPtr (builder, LLVMConstInt (IntPtrType (), offset, TRUE), ptrtype, ""), "");
#else
LLVM_FAILURE (ctx, "opcode tls-get");
#endif
break;
}
+ case OP_TLS_GET_REG: {
+#if defined(TARGET_AMD64) && defined(TARGET_OSX)
+ /* See emit_tls_get_reg () */
+ // 256 == GS segment register
+ LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 256);
+ values [ins->dreg] = LLVMBuildLoad (builder, LLVMBuildIntToPtr (builder, convert (ctx, lhs, LLVMInt32Type ()), ptrtype, ""), "");
+#else
+ LLVM_FAILURE (ctx, "opcode tls-get");
+#endif
+ break;
+ }
/*
* Overflow opcodes.
@@ -3384,9 +3449,10 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
switch (ins->opcode) {
case OP_STOREV_MEMBASE:
- if (cfg->gen_write_barriers && klass->has_references && ins->inst_destbasereg != cfg->frame_reg) {
- /* FIXME: Emit write barriers like in mini_emit_stobj () */
- LLVM_FAILURE (ctx, "storev_membase + write barriers");
+ if (cfg->gen_write_barriers && klass->has_references && ins->inst_destbasereg != cfg->frame_reg &&
+ LLVMGetInstructionOpcode (values [ins->inst_destbasereg]) != LLVMAlloca) {
+ /* Decomposed earlier */
+ g_assert_not_reached ();
break;
}
if (!addresses [ins->sreg1]) {
@@ -4140,7 +4206,7 @@ mono_llvm_check_method_supported (MonoCompile *cfg)
#if 1
for (i = 0; i < header->num_clauses; ++i) {
clause = &header->clauses [i];
-
+
if (i > 0 && clause->try_offset <= header->clauses [i - 1].handler_offset + header->clauses [i - 1].handler_len) {
/*
* FIXME: Some tests still fail with nested clauses.
@@ -4207,7 +4273,7 @@ mono_llvm_emit_method (MonoCompile *cfg)
ctx->addresses = g_new0 (LLVMValueRef, cfg->next_vreg);
ctx->vreg_types = g_new0 (LLVMTypeRef, cfg->next_vreg);
ctx->vreg_cli_types = g_new0 (MonoType*, cfg->next_vreg);
- phi_values = g_ptr_array_new ();
+ phi_values = g_ptr_array_sized_new (256);
/*
* This signals whenever the vreg was defined by a phi node with no input vars
* (i.e. all its input bblocks end with NOT_REACHABLE).
@@ -4216,7 +4282,7 @@ mono_llvm_emit_method (MonoCompile *cfg)
/* Whenever the bblock is unreachable */
ctx->unreachable = g_new0 (gboolean, cfg->max_block_num);
- bblock_list = g_ptr_array_new ();
+ bblock_list = g_ptr_array_sized_new (256);
ctx->values = values;
ctx->region_to_handler = g_hash_table_new (NULL, NULL);
@@ -4274,9 +4340,7 @@ mono_llvm_emit_method (MonoCompile *cfg)
method = LLVMAddFunction (module, method_name, method_type);
ctx->lmethod = method;
-#ifdef LLVM_MONO_BRANCH
LLVMSetFunctionCallConv (method, LLVMMono1CallConv);
-#endif
LLVMSetLinkage (method, LLVMPrivateLinkage);
LLVMAddFunctionAttr (method, LLVMUWTable);
@@ -4509,7 +4573,8 @@ mono_llvm_emit_method (MonoCompile *cfg)
if (cfg->verbose_level > 1)
mono_llvm_dump_value (method);
- mark_as_used (module, method);
+ if (cfg->compile_aot)
+ mark_as_used (ctx->lmodule, method);
if (cfg->compile_aot) {
LLVMValueRef md_args [16];
@@ -4707,6 +4772,8 @@ exception_cb (void *data)
* with it.
*/
cfg->encoded_unwind_ops = mono_unwind_decode_fde ((guint8*)data, &cfg->encoded_unwind_ops_len, NULL, &ei, &ei_len, &type_info, &this_reg, &this_offset);
+ if (cfg->verbose_level > 1)
+ mono_print_unwind_info (cfg->encoded_unwind_ops, cfg->encoded_unwind_ops_len);
/* Count nested clauses */
nested_len = 0;
@@ -4869,16 +4936,6 @@ add_intrinsics (LLVMModuleRef module)
LLVMAddFunction (module, "llvm.umul.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
}
- {
- LLVMTypeRef struct_ptr = LLVMPointerType (LLVMStructType (NULL, 0, FALSE), 0);
- LLVMTypeRef invariant_start_params [] = { LLVMInt64Type (), LLVMPointerType (LLVMInt8Type (), 0) };
- LLVMTypeRef invariant_end_params [] = { struct_ptr, LLVMInt64Type (), LLVMPointerType (LLVMInt8Type (), 0) };
-
- LLVMAddFunction (module, "llvm.invariant.start", LLVMFunctionType (struct_ptr, invariant_start_params, 2, FALSE));
-
- LLVMAddFunction (module, "llvm.invariant.end", LLVMFunctionType (LLVMVoidType (), invariant_end_params, 3, FALSE));
- }
-
/* EH intrinsics */
{
LLVMTypeRef arg_types [2];
@@ -4894,6 +4951,7 @@ add_intrinsics (LLVMModuleRef module)
}
/* SSE intrinsics */
+#if defined(TARGET_X86) || defined(TARGET_AMD64)
{
LLVMTypeRef ret_type, arg_types [16];
@@ -5038,6 +5096,7 @@ add_intrinsics (LLVMModuleRef module)
}
AddFunc (module, "llvm.x86.sse2.pause", LLVMVoidType (), NULL, 0);
+#endif
/* Load/Store intrinsics */
{
@@ -5062,6 +5121,12 @@ add_intrinsics (LLVMModuleRef module)
}
}
+static void
+add_types (MonoLLVMModule *lmodule)
+{
+ lmodule->ptr_type = LLVMPointerType (sizeof (gpointer) == 8 ? LLVMInt64Type () : LLVMInt32Type (), 0);
+}
+
void
mono_llvm_init (void)
{
@@ -5088,6 +5153,7 @@ init_jit_module (void)
ee = mono_llvm_create_ee (LLVMCreateModuleProviderForExistingModule (jit_module.module), alloc_cb, emitted_cb, exception_cb, dlsym_cb);
add_intrinsics (jit_module.module);
+ add_types (&jit_module);
jit_module.llvm_types = g_hash_table_new (NULL, NULL);
@@ -5130,6 +5196,7 @@ mono_llvm_create_aot_module (const char *got_symbol)
aot_module.got_symbol = got_symbol;
add_intrinsics (aot_module.module);
+ add_types (&aot_module);
/* Add GOT */
/*
@@ -5139,7 +5206,7 @@ mono_llvm_create_aot_module (const char *got_symbol)
* its size is known in mono_llvm_emit_aot_module ().
*/
{
- LLVMTypeRef got_type = LLVMArrayType (IntPtrType (), 0);
+ LLVMTypeRef got_type = LLVMArrayType (aot_module.ptr_type, 0);
aot_module.got_var = LLVMAddGlobal (aot_module.module, got_type, "mono_dummy_got");
LLVMSetInitializer (aot_module.got_var, LLVMConstNull (got_type));
@@ -5176,18 +5243,20 @@ mono_llvm_emit_aot_module (const char *filename, int got_size)
* Create the real got variable and replace all uses of the dummy variable with
* the real one.
*/
- got_type = LLVMArrayType (IntPtrType (), got_size);
+ got_type = LLVMArrayType (aot_module.ptr_type, got_size);
real_got = LLVMAddGlobal (aot_module.module, got_type, aot_module.got_symbol);
LLVMSetInitializer (real_got, LLVMConstNull (got_type));
LLVMSetLinkage (real_got, LLVMInternalLinkage);
mono_llvm_replace_uses_of (aot_module.got_var, real_got);
- mark_as_used (aot_module.module, real_got);
+ mark_as_used (&aot_module, real_got);
/* Delete the dummy got so it doesn't become a global */
LLVMDeleteGlobal (aot_module.got_var);
+ emit_llvm_used (&aot_module);
+
#if 0
{
char *verifier_err;
diff --git a/mono/mini/mini-llvm.h b/mono/mini/mini-llvm.h
index 53c524e754..06494f9e14 100644
--- a/mono/mini/mini-llvm.h
+++ b/mono/mini/mini-llvm.h
@@ -121,6 +121,15 @@ mono_llvm_load (const char* bpath)
llvm_lib = try_llvm_load (name, &err);
g_free (name);
}
+#ifdef __MACH__
+ if (!llvm_lib) {
+ char *newbase = g_path_get_dirname (base);
+ name = g_strdup_printf ("%s/Libraries", newbase);
+ err = NULL;
+ llvm_lib = try_llvm_load (name, &err);
+ g_free (name);
+ }
+#endif
g_free (base);
g_free (resolvedname);
}
diff --git a/mono/mini/mini-mips.c b/mono/mini/mini-mips.c
index c219458d67..235fd33a44 100644
--- a/mono/mini/mini-mips.c
+++ b/mono/mini/mini-mips.c
@@ -64,7 +64,6 @@ int mono_exc_esp_offset = 0;
static int tls_mode = TLS_MODE_DETECT;
static int lmf_pthread_key = -1;
static int monothread_key = -1;
-static int monodomain_key = -1;
/* Whenever the host is little-endian */
static int little_endian;
@@ -5756,11 +5755,6 @@ setup_tls_access (void)
}
#endif
}
- if (monodomain_key == -1) {
- ptk = mono_domain_get_tls_key ();
- if (ptk < 1024)
- monodomain_key = ptk;
- }
if (lmf_pthread_key == -1) {
ptk = mono_jit_tls_id;
if (ptk < 1024) {
@@ -5844,19 +5838,6 @@ mono_arch_print_tree (MonoInst *tree, int arity)
return 0;
}
-MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- MonoInst* ins;
-
- setup_tls_access ();
- if (monodomain_key == -1)
- return NULL;
-
- MONO_INST_NEW (cfg, ins, OP_TLS_GET);
- ins->inst_offset = monodomain_key;
- return ins;
-}
-
mgreg_t
mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
{
@@ -6151,4 +6132,13 @@ mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code)
return NULL;
}
+void
+mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
+{
+ ext->lmf.previous_lmf = prev_lmf;
+ /* Mark that this is a MonoLMFExt */
+ ext->lmf.previous_lmf = (gpointer)(((gssize)ext->lmf.previous_lmf) | 2);
+ ext->lmf.iregs [mips_sp] = (gssize)ext;
+}
+
#endif /* MONO_ARCH_SOFT_DEBUG_SUPPORTED */
diff --git a/mono/mini/mini-ops.h b/mono/mini/mini-ops.h
index f6c8c64d53..e7a7844a0f 100644
--- a/mono/mini/mini-ops.h
+++ b/mono/mini/mini-ops.h
@@ -40,23 +40,18 @@ MINI_OP(OP_SEQ_POINT, "seq_point", NONE, NONE, NONE)
MINI_OP(OP_IMPLICIT_EXCEPTION, "implicit_exception", NONE, NONE, NONE)
MINI_OP(OP_VOIDCALL, "voidcall", NONE, NONE, NONE)
-MINI_OP(OP_VOIDCALLVIRT, "voidcallvirt", NONE, NONE, NONE)
MINI_OP(OP_VOIDCALL_REG, "voidcall_reg", NONE, IREG, NONE)
MINI_OP(OP_VOIDCALL_MEMBASE, "voidcall_membase", NONE, IREG, NONE)
MINI_OP(OP_CALL, "call", IREG, NONE, NONE)
MINI_OP(OP_CALL_REG, "call_reg", IREG, IREG, NONE)
MINI_OP(OP_CALL_MEMBASE, "call_membase", IREG, IREG, NONE)
-MINI_OP(OP_CALLVIRT, "callvirt", IREG, NONE, NONE)
MINI_OP(OP_FCALL, "fcall", FREG, NONE, NONE)
-MINI_OP(OP_FCALLVIRT, "fcallvirt", FREG, NONE, NONE)
MINI_OP(OP_FCALL_REG, "fcall_reg", FREG, IREG, NONE)
MINI_OP(OP_FCALL_MEMBASE, "fcall_membase", FREG, IREG, NONE)
MINI_OP(OP_LCALL, "lcall", LREG, NONE, NONE)
-MINI_OP(OP_LCALLVIRT, "lcallvirt", LREG, NONE, NONE)
MINI_OP(OP_LCALL_REG, "lcall_reg", LREG, IREG, NONE)
MINI_OP(OP_LCALL_MEMBASE, "lcall_membase", LREG, IREG, NONE)
MINI_OP(OP_VCALL, "vcall", VREG, NONE, NONE)
-MINI_OP(OP_VCALLVIRT, "vcallvirt", VREG, NONE, NONE)
MINI_OP(OP_VCALL_REG, "vcall_reg", VREG, IREG, NONE)
MINI_OP(OP_VCALL_MEMBASE, "vcall_membase", VREG, IREG, NONE)
/* Represents the decomposed vcall which doesn't return a vtype no more */
@@ -426,6 +421,12 @@ MINI_OP(OP_ICGT_UN,"int_cgt_un", IREG, NONE, NONE)
MINI_OP(OP_ICLT, "int_clt", IREG, NONE, NONE)
MINI_OP(OP_ICLT_UN,"int_clt_un", IREG, NONE, NONE)
+MINI_OP(OP_ICNEQ, "int_cneq", IREG, NONE, NONE)
+MINI_OP(OP_ICGE, "int_cge", IREG, NONE, NONE)
+MINI_OP(OP_ICLE, "int_cle", IREG, NONE, NONE)
+MINI_OP(OP_ICGE_UN,"int_cge_un", IREG, NONE, NONE)
+MINI_OP(OP_ICLE_UN,"int_cle_un", IREG, NONE, NONE)
+
MINI_OP(OP_IBEQ, "int_beq", NONE, NONE, NONE)
MINI_OP(OP_IBGE, "int_bge", NONE, NONE, NONE)
MINI_OP(OP_IBGT, "int_bgt", NONE, NONE, NONE)
@@ -509,6 +510,10 @@ MINI_OP(OP_FCGT_UN,"float_cgt_un", IREG, FREG, FREG)
MINI_OP(OP_FCLT, "float_clt", IREG, FREG, FREG)
MINI_OP(OP_FCLT_UN,"float_clt_un", IREG, FREG, FREG)
+MINI_OP(OP_FCNEQ, "float_cneq", IREG, FREG, FREG)
+MINI_OP(OP_FCGE, "float_cge", IREG, FREG, FREG)
+MINI_OP(OP_FCLE, "float_cle", IREG, FREG, FREG)
+
MINI_OP(OP_FCEQ_MEMBASE, "float_ceq_membase", IREG, FREG, IREG)
MINI_OP(OP_FCGT_MEMBASE, "float_cgt_membase", IREG, FREG, IREG)
MINI_OP(OP_FCGT_UN_MEMBASE,"float_cgt_un_membase", IREG, FREG, IREG)
@@ -608,7 +613,10 @@ MINI_OP(OP_CARD_TABLE_WBARRIER, "card_table_wbarrier", NONE, IREG, IREG)
/* arch-dep tls access */
MINI_OP(OP_TLS_GET, "tls_get", IREG, NONE, NONE)
-MINI_OP(OP_TLS_GET_REG, "tls_get_reg", IREG, IREG, NONE)
+MINI_OP(OP_TLS_GET_REG, "tls_get_reg", IREG, IREG, NONE)
+/* inst_offset contains the TLS offset */
+MINI_OP(OP_TLS_SET, "tls_set", NONE, IREG, NONE)
+MINI_OP(OP_TLS_SET_REG, "tls_set_reg", NONE, IREG, IREG)
MINI_OP(OP_LOAD_GOTADDR, "load_gotaddr", IREG, NONE, NONE)
MINI_OP(OP_DUMMY_USE, "dummy_use", NONE, IREG, NONE)
diff --git a/mono/mini/mini-posix.c b/mono/mini/mini-posix.c
index d3e5c90729..67595770e9 100644
--- a/mono/mini/mini-posix.c
+++ b/mono/mini/mini-posix.c
@@ -54,6 +54,7 @@
#include <mono/utils/mono-logger-internal.h>
#include <mono/utils/mono-mmap.h>
#include <mono/utils/dtrace.h>
+#include <mono/utils/mono-signal-handler.h>
#include "mini.h"
#include <string.h>
@@ -192,8 +193,7 @@ SIG_HANDLER_SIGNATURE (mono_chain_signal)
return FALSE;
}
-static void
-SIG_HANDLER_SIGNATURE (sigabrt_signal_handler)
+SIG_HANDLER_FUNC (static, sigabrt_signal_handler)
{
MonoJitInfo *ji = NULL;
GET_CONTEXT;
@@ -207,8 +207,7 @@ SIG_HANDLER_SIGNATURE (sigabrt_signal_handler)
}
}
-static void
-SIG_HANDLER_SIGNATURE (sigusr1_signal_handler)
+SIG_HANDLER_FUNC (static, sigusr1_signal_handler)
{
gboolean running_managed;
MonoException *exc;
@@ -281,6 +280,7 @@ SIG_HANDLER_SIGNATURE (sigusr1_signal_handler)
mono_arch_handle_exception (ctx, exc);
}
+
#if defined(__i386__) || defined(__x86_64__)
#define FULL_STAT_PROFILER_BACKTRACE 1
#define CURRENT_FRAME_GET_BASE_POINTER(f) (* (gpointer*)(f))
@@ -298,8 +298,7 @@ SIG_HANDLER_SIGNATURE (sigusr1_signal_handler)
#if defined(__ia64__) || defined(__sparc__) || defined(sparc) || defined(__s390__) || defined(s390)
-static void
-SIG_HANDLER_SIGNATURE (sigprof_signal_handler)
+SIG_HANDLER_FUNC (static, sigprof_signal_handler)
{
if (mono_chain_signal (SIG_HANDLER_PARAMS))
return;
@@ -309,8 +308,7 @@ SIG_HANDLER_SIGNATURE (sigprof_signal_handler)
#else
-static void
-SIG_HANDLER_SIGNATURE (sigprof_signal_handler)
+SIG_HANDLER_FUNC (static, sigprof_signal_handler)
{
int call_chain_depth = mono_profiler_stat_get_call_chain_depth ();
MonoProfilerCallChainStrategy call_chain_strategy = mono_profiler_stat_get_call_chain_strategy ();
@@ -388,8 +386,7 @@ SIG_HANDLER_SIGNATURE (sigprof_signal_handler)
#endif
-static void
-SIG_HANDLER_SIGNATURE (sigquit_signal_handler)
+SIG_HANDLER_FUNC (static, sigquit_signal_handler)
{
gboolean res;
@@ -419,8 +416,7 @@ SIG_HANDLER_SIGNATURE (sigquit_signal_handler)
mono_chain_signal (SIG_HANDLER_PARAMS);
}
-static void
-SIG_HANDLER_SIGNATURE (sigusr2_signal_handler)
+SIG_HANDLER_FUNC (static, sigusr2_signal_handler)
{
gboolean enabled = mono_trace_is_enabled ();
@@ -672,24 +668,54 @@ void
mono_gdb_render_native_backtraces (pid_t crashed_pid)
{
const char *argv [9];
+ char template [] = "/tmp/mono-lldb-commands.XXXXXX";
char buf1 [128];
+ FILE *commands;
+ gboolean using_lldb = FALSE;
argv [0] = g_find_program_in_path ("gdb");
if (argv [0] == NULL) {
- return;
+ argv [0] = g_find_program_in_path ("lldb");
+ using_lldb = TRUE;
}
- argv [1] = "-ex";
- sprintf (buf1, "attach %ld", (long) crashed_pid);
- argv [2] = buf1;
- argv [3] = "--ex";
- argv [4] = "info threads";
- argv [5] = "--ex";
- argv [6] = "thread apply all bt";
- argv [7] = "--batch";
- argv [8] = 0;
+ if (argv [0] == NULL)
+ return;
+
+ if (using_lldb) {
+ if (mkstemp (template) == -1)
+ return;
+
+ commands = fopen (template, "w");
+
+ fprintf (commands, "process attach --pid %ld\n", (long) crashed_pid);
+ fprintf (commands, "script lldb.debugger.HandleCommand (\"thread list\")\n");
+ fprintf (commands, "script lldb.debugger.HandleCommand (\"thread backtrace all\")\n");
+ fprintf (commands, "detach\n");
+ fprintf (commands, "quit\n");
+
+ fflush (commands);
+ fclose (commands);
+
+ argv [1] = "--source";
+ argv [2] = template;
+ argv [3] = 0;
+ } else {
+ argv [1] = "-ex";
+ sprintf (buf1, "attach %ld", (long) crashed_pid);
+ argv [2] = buf1;
+ argv [3] = "--ex";
+ argv [4] = "info threads";
+ argv [5] = "--ex";
+ argv [6] = "thread apply all bt";
+ argv [7] = "--batch";
+ argv [8] = 0;
+ }
execv (argv [0], (char**)argv);
+
+ if (using_lldb)
+ unlink (template);
}
#endif
#endif /* __native_client__ */
diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c
index d8c3367214..69a1d3d78a 100644
--- a/mono/mini/mini-ppc.c
+++ b/mono/mini/mini-ppc.c
@@ -68,7 +68,6 @@ static CRITICAL_SECTION mini_arch_mutex;
int mono_exc_esp_offset = 0;
static int tls_mode = TLS_MODE_DETECT;
static int lmf_pthread_key = -1;
-static int monodomain_key = -1;
/*
* The code generated for sequence points reads from this location, which is
@@ -1255,7 +1254,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig)
}
gboolean
-mono_ppc_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig)
+mono_arch_tail_call_supported (MonoCompile *cfg, MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig)
{
CallInfo *c1, *c2;
gboolean res;
@@ -4575,6 +4574,7 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono
case MONO_PATCH_INFO_ABS:
case MONO_PATCH_INFO_CLASS_INIT:
case MONO_PATCH_INFO_RGCTX_FETCH:
+ case MONO_PATCH_INFO_JIT_ICALL_ADDR:
is_fd = TRUE;
break;
#endif
@@ -5396,8 +5396,6 @@ try_offset_access (void *value, guint32 idx)
static void
setup_tls_access (void)
{
- guint32 ptk;
-
#if defined(__linux__) && defined(_CS_GNU_LIBPTHREAD_VERSION)
size_t conf_size = 0;
char confbuf[128];
@@ -5447,6 +5445,7 @@ setup_tls_access (void)
ppc_blr (code);
if (*ins == cmplwi_1023) {
int found_lwz_284 = 0;
+ guint32 ptk;
for (ptk = 0; ptk < 20; ++ptk) {
++ins;
if (!*ins || *ins == blr_ins)
@@ -5504,17 +5503,6 @@ setup_tls_access (void)
tls_mode = TLS_MODE_FAILED;
if (tls_mode == TLS_MODE_FAILED)
return;
- if ((monodomain_key == -1) && (tls_mode == TLS_MODE_NPTL)) {
- monodomain_key = mono_domain_get_tls_offset();
- }
- /* if not TLS_MODE_NPTL or local dynamic (as indicated by
- mono_domain_get_tls_offset returning -1) then use keyed access. */
- if (monodomain_key == -1) {
- ptk = mono_domain_get_tls_key ();
- if (ptk < 1024)
- monodomain_key = ptk;
- }
-
if ((lmf_pthread_key == -1) && (tls_mode == TLS_MODE_NPTL)) {
lmf_pthread_key = mono_get_lmf_addr_tls_offset();
}
@@ -5523,7 +5511,7 @@ setup_tls_access (void)
/* if not TLS_MODE_NPTL or local dynamic (as indicated by
mono_get_lmf_addr_tls_offset returning -1) then use keyed access. */
if (lmf_pthread_key == -1) {
- ptk = mono_jit_tls_id;
+ guint32 ptk = mono_jit_tls_id;
if (ptk < 1024) {
/*g_print ("MonoLMF at: %d\n", ptk);*/
/*if (!try_offset_access (mono_get_lmf_addr (), ptk)) {
@@ -5739,19 +5727,6 @@ mono_arch_print_tree (MonoInst *tree, int arity)
return 0;
}
-MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- MonoInst* ins;
-
- setup_tls_access ();
- if (monodomain_key == -1)
- return NULL;
-
- MONO_INST_NEW (cfg, ins, OP_TLS_GET);
- ins->inst_offset = monodomain_key;
- return ins;
-}
-
mgreg_t
mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
{
@@ -5956,4 +5931,13 @@ mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code)
return NULL;
}
+void
+mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
+{
+ ext->lmf.previous_lmf = prev_lmf;
+ /* Mark that this is a MonoLMFExt */
+ ext->lmf.previous_lmf = (gpointer)(((gssize)ext->lmf.previous_lmf) | 2);
+ ext->lmf.ebp = (gssize)ext;
+}
+
#endif
diff --git a/mono/mini/mini-ppc.h b/mono/mini/mini-ppc.h
index e3d5b055b9..13b6adb537 100644
--- a/mono/mini/mini-ppc.h
+++ b/mono/mini/mini-ppc.h
@@ -195,6 +195,7 @@ typedef struct MonoCompileArch {
#define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1
#endif
#define MONO_ARCH_THIS_AS_FIRST_ARG 1
+#define MONO_ARCH_HAVE_OP_TAIL_CALL 1
#define PPC_NUM_REG_ARGS (PPC_LAST_ARG_REG-PPC_FIRST_ARG_REG+1)
#define PPC_NUM_REG_FPARGS (PPC_LAST_FPARG_REG-PPC_FIRST_FPARG_REG+1)
@@ -304,8 +305,6 @@ extern guint8* mono_ppc_create_pre_code_ftnptr (guint8 *code) MONO_INTERNAL;
gboolean
mono_ppc_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig) MONO_INTERNAL;
-#define MONO_ARCH_USE_OP_TAIL_CALL(caller_sig, callee_sig) mono_ppc_tail_call_supported (caller_sig, callee_sig)
-
void
mono_ppc_patch (guchar *code, const guchar *target) MONO_INTERNAL;
diff --git a/mono/mini/mini-s390x.c b/mono/mini/mini-s390x.c
index cc2a055e78..5374adc8b0 100644
--- a/mono/mini/mini-s390x.c
+++ b/mono/mini/mini-s390x.c
@@ -1227,7 +1227,7 @@ handle_enum:
mono_method_signature (method)->ret->type);
}
- ip = ((gint64) __builtin_return_address (0));
+ ip = ((gint64) __builtin_extract_return_addr (__builtin_return_address (0)));
printf (" ip: %p\n", (gpointer) ip);
}
@@ -5716,31 +5716,6 @@ mono_arch_regalloc_cost (MonoCompile *cfg, MonoMethodVar *vmv)
/*------------------------------------------------------------------*/
/* */
-/* Name - mono_arch_get_domain_intrinsic */
-/* */
-/* Function - */
-/* */
-/* Returns - */
-/* */
-/*------------------------------------------------------------------*/
-
-MonoInst *
-mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- MonoInst *ins;
-
- if (appdomain_tls_offset == -1)
- return NULL;
-
- MONO_INST_NEW (cfg, ins, OP_TLS_GET);
- ins->inst_offset = appdomain_tls_offset;
- return (ins);
-}
-
-/*========================= End of Function ========================*/
-
-/*------------------------------------------------------------------*/
-/* */
/* Name - mono_arch_flush_register_windows */
/* */
/* Function - */
@@ -6384,6 +6359,23 @@ mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code)
return NULL;
}
+/*------------------------------------------------------------------*/
+/* */
+/* Name - mono_arch_init_lmf_ext. */
+/* */
+/* Function - */
+/* */
+/*------------------------------------------------------------------*/
+
+void
+mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
+{
+ ext->lmf.previous_lmf = prev_lmf;
+ /* Mark that this is a MonoLMFExt */
+ ext->lmf.previous_lmf = (gpointer)(((gssize)ext->lmf.previous_lmf) | 2);
+ ext->lmf.ebp = (gssize)ext;
+}
+
/*========================= End of Function ========================*/
#endif
diff --git a/mono/mini/mini-sparc.c b/mono/mini/mini-sparc.c
index 9a0e4ec150..ec65fb5c6b 100644
--- a/mono/mini/mini-sparc.c
+++ b/mono/mini/mini-sparc.c
@@ -4424,11 +4424,6 @@ mono_arch_print_tree (MonoInst *tree, int arity)
return 0;
}
-MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- return NULL;
-}
-
mgreg_t
mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
{
diff --git a/mono/mini/mini-trampolines.c b/mono/mini/mini-trampolines.c
index cafbc0fce5..4c2dd86122 100644
--- a/mono/mini/mini-trampolines.c
+++ b/mono/mini/mini-trampolines.c
@@ -15,7 +15,6 @@
#include <mono/utils/mono-membar.h>
#include "mini.h"
-#include "debug-mini.h"
/*
* Address of the trampoline code. This is used by the debugger to check
@@ -149,7 +148,7 @@ static gpointer*
*/
__attribute__ ((noinline))
#endif
-mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *code, MonoMethod *method, MonoMethod **impl_method, gboolean *need_rgctx_tramp, gboolean *variance_used, gpointer *aot_addr)
+ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *code, MonoMethod *method, gboolean lookup_aot, MonoMethod **impl_method, gboolean *need_rgctx_tramp, gboolean *variance_used, gpointer *aot_addr)
{
MonoObject *this_argument = mono_arch_get_this_arg_from_call (regs, code);
MonoVTable *vt = this_argument->vtable;
@@ -191,7 +190,7 @@ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *cod
impl = mono_class_inflate_generic_method (impl, &context);
} else {
/* Avoid loading metadata or creating a generic vtable if possible */
- if (!vt->klass->valuetype)
+ if (lookup_aot && !vt->klass->valuetype)
*aot_addr = mono_aot_get_method_from_vt_slot (mono_domain_get (), vt, interface_offset + mono_method_get_vtable_slot (imt_method));
else
*aot_addr = NULL;
@@ -290,6 +289,7 @@ mini_add_method_trampoline (MonoMethod *orig_method, MonoMethod *m, gpointer com
{
gpointer addr = compiled_method;
gboolean callee_gsharedvt, callee_array_helper;
+ MonoMethod *jmethod = NULL;
MonoJitInfo *ji =
mini_jit_info_table_find (mono_domain_get (), mono_get_addr_from_ftnptr (compiled_method), NULL);
@@ -338,7 +338,9 @@ mini_add_method_trampoline (MonoMethod *orig_method, MonoMethod *m, gpointer com
}
}
- if (callee_gsharedvt && mini_is_gsharedvt_variable_signature (mono_method_signature (ji->method))) {
+ if (ji)
+ jmethod = jinfo_get_method (ji);
+ if (callee_gsharedvt && mini_is_gsharedvt_variable_signature (mono_method_signature (jmethod))) {
MonoGenericSharingContext *gsctx;
MonoMethodSignature *sig, *gsig;
@@ -348,7 +350,7 @@ mini_add_method_trampoline (MonoMethod *orig_method, MonoMethod *m, gpointer com
gsctx = mono_jit_info_get_generic_sharing_context (ji);
sig = mono_method_signature (m);
- gsig = mono_method_signature (ji->method);
+ gsig = mono_method_signature (jmethod);
addr = mini_get_gsharedvt_wrapper (TRUE, addr, sig, gsig, gsctx, -1, FALSE);
@@ -407,14 +409,8 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
m = mono_object_get_virtual_method (this_arg, m);
vtable_slot_to_patch = NULL;
} else {
- addr = NULL;
- vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, &impl_method, &need_rgctx_tramp, &variance_used, &addr);
- /* This is the vcall slot which gets called through the IMT thunk */
- vtable_slot_to_patch = vtable_slot;
- /* mono_convert_imt_slot_to_vtable_slot () also gives us the method that is supposed
- * to be called, so we compile it and go ahead as usual.
- */
- /*g_print ("imt found method %p (%s) at %p\n", impl_method, impl_method->name, code);*/
+ gboolean lookup_aot;
+
if (m->is_inflated && ((MonoMethodInflated*)m)->context.method_inst) {
/* Generic virtual method */
generic_virtual = m;
@@ -423,7 +419,18 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
variant_iface = m;
}
- if (addr && !generic_virtual && !variant_iface) {
+ addr = NULL;
+ /* We can only use the AOT compiled code if we don't require further processing */
+ lookup_aot = !generic_virtual & !variant_iface;
+ vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, lookup_aot, &impl_method, &need_rgctx_tramp, &variance_used, &addr);
+ /* This is the vcall slot which gets called through the IMT thunk */
+ vtable_slot_to_patch = vtable_slot;
+ /* mono_convert_imt_slot_to_vtable_slot () also gives us the method that is supposed
+ * to be called, so we compile it and go ahead as usual.
+ */
+ /*g_print ("imt found method %p (%s) at %p\n", impl_method, impl_method->name, code);*/
+
+ if (addr) {
/*
* We found AOT compiled code for the method, skip the rest.
*/
@@ -569,8 +576,6 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
addr = compiled_method = mono_compile_method (m);
g_assert (addr);
- mono_debugger_trampoline_compiled (code, m, addr);
-
if (generic_virtual || variant_iface) {
if (vt->klass->valuetype) /*FIXME is this required variant iface?*/
need_unbox_tramp = TRUE;
@@ -801,8 +806,6 @@ mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMetho
addr = mono_compile_method (m);
g_assert (addr);
- mono_debugger_trampoline_compiled (NULL, m, addr);
-
return addr;
}
#endif
@@ -891,10 +894,11 @@ mono_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, gui
mono_runtime_class_init (vtable);
- if (plt_entry) {
- mono_arch_nullify_plt_entry (plt_entry, regs);
- } else {
- mono_arch_nullify_class_init_trampoline (code, regs);
+ if (vtable->initialized) {
+ if (plt_entry)
+ mono_arch_nullify_plt_entry (plt_entry, regs);
+ else
+ mono_arch_nullify_class_init_trampoline (code, regs);
}
}
@@ -1021,7 +1025,7 @@ mono_delegate_trampoline (mgreg_t *regs, guint8 *code, gpointer *tramp_data, gui
} else {
ji = mono_jit_info_table_find (domain, mono_get_addr_from_ftnptr (delegate->method_ptr));
if (ji)
- method = ji->method;
+ method = jinfo_get_method (ji);
}
if (method) {
@@ -1060,7 +1064,6 @@ mono_delegate_trampoline (mgreg_t *regs, guint8 *code, gpointer *tramp_data, gui
delegate->method_ptr = addr;
if (enable_caching && delegate->method_code)
*delegate->method_code = delegate->method_ptr;
- mono_debugger_trampoline_compiled (NULL, method, delegate->method_ptr);
}
} else {
if (need_rgctx_tramp)
@@ -1086,7 +1089,6 @@ mono_delegate_trampoline (mgreg_t *regs, guint8 *code, gpointer *tramp_data, gui
code = mono_compile_method (m);
code = mini_add_method_trampoline (NULL, m, code, mono_method_needs_static_rgctx_invoke (m, FALSE), FALSE);
delegate->invoke_impl = mono_get_addr_from_ftnptr (code);
- mono_debugger_trampoline_compiled (NULL, m, delegate->invoke_impl);
return code;
}
@@ -1114,13 +1116,8 @@ mono_handler_block_guard_trampoline (mgreg_t *regs, guint8 *code, gpointer *tram
exc = mono_thread_resume_interruption ();
if (exc) {
- static void (*restore_context) (MonoContext *);
-
- if (!restore_context)
- restore_context = mono_get_restore_context ();
-
mono_handle_exception (&ctx, exc);
- restore_context (&ctx);
+ mono_restore_context (&ctx);
}
return resume_ip;
@@ -1212,12 +1209,7 @@ create_trampoline_code (MonoTrampolineType tramp_type)
guchar *code;
code = mono_arch_create_generic_trampoline (tramp_type, &info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- if (mono_jit_map_is_enabled ())
- mono_emit_jit_tramp (info->code, info->code_size, info->name);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
return code;
}
@@ -1341,13 +1333,7 @@ mono_create_generic_class_init_trampoline (void)
code = mono_get_addr_from_ftnptr (mono_aot_get_trampoline ("generic_class_init_trampoline"));
else {
code = mono_arch_create_generic_class_init_trampoline (&info, FALSE);
-
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- if (mono_jit_map_is_enabled ())
- mono_emit_jit_tramp (info->code, info->code_size, info->name);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
}
}
@@ -1388,7 +1374,7 @@ mono_create_jump_trampoline (MonoDomain *domain, MonoMethod *method, gboolean ad
ji = mono_domain_alloc0 (domain, MONO_SIZEOF_JIT_INFO);
ji->code_start = code;
ji->code_size = code_size;
- ji->method = method;
+ ji->d.method = method;
/*
* mono_delegate_ctor needs to find the method metadata from the
@@ -1509,9 +1495,6 @@ mono_create_rgctx_lazy_fetch_trampoline (guint32 offset)
gpointer tramp, ptr;
- if (mono_aot_only)
- return mono_aot_get_lazy_fetch_trampoline (offset);
-
mono_trampolines_lock ();
if (rgctx_lazy_fetch_trampoline_hash)
tramp = g_hash_table_lookup (rgctx_lazy_fetch_trampoline_hash, GUINT_TO_POINTER (offset));
@@ -1521,14 +1504,13 @@ mono_create_rgctx_lazy_fetch_trampoline (guint32 offset)
if (tramp)
return tramp;
- tramp = mono_arch_create_rgctx_lazy_fetch_trampoline (offset, &info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- if (mono_jit_map_is_enabled ())
- mono_emit_jit_tramp (info->code, info->code_size, info->name);
- mono_tramp_info_free (info);
+ if (mono_aot_only) {
+ ptr = mono_aot_get_lazy_fetch_trampoline (offset);
+ } else {
+ tramp = mono_arch_create_rgctx_lazy_fetch_trampoline (offset, &info, FALSE);
+ mono_tramp_info_register (info);
+ ptr = mono_create_ftnptr (mono_get_root_domain (), tramp);
}
- ptr = mono_create_ftnptr (mono_get_root_domain (), tramp);
mono_trampolines_lock ();
if (!rgctx_lazy_fetch_trampoline_hash) {
@@ -1568,12 +1550,7 @@ mono_create_monitor_enter_trampoline (void)
MonoTrampInfo *info;
code = mono_arch_create_monitor_enter_trampoline (&info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- if (mono_jit_map_is_enabled ())
- mono_emit_jit_tramp (info->code, info->code_size, info->name);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
}
mono_trampolines_unlock ();
@@ -1603,12 +1580,7 @@ mono_create_monitor_exit_trampoline (void)
MonoTrampInfo *info;
code = mono_arch_create_monitor_exit_trampoline (&info, FALSE);
- if (info) {
- mono_save_trampoline_xdebug_info (info);
- if (mono_jit_map_is_enabled ())
- mono_emit_jit_tramp (info->code, info->code_size, info->name);
- mono_tramp_info_free (info);
- }
+ mono_tramp_info_register (info);
}
mono_trampolines_unlock ();
@@ -1718,3 +1690,24 @@ mono_get_rgctx_fetch_trampoline_name (int slot)
return g_strdup_printf ("rgctx_fetch_trampoline_%s_%d", mrgctx ? "mrgctx" : "rgctx", index);
}
+gpointer
+mini_get_nullified_class_init_trampoline (void)
+{
+ static gpointer nullified_class_init_trampoline;
+
+ if (!nullified_class_init_trampoline) {
+ gpointer tramp;
+ MonoTrampInfo *info;
+
+ if (mono_aot_only) {
+ tramp = mono_aot_get_trampoline ("nullified_class_init_trampoline");
+ } else {
+ tramp = mono_arch_get_nullified_class_init_trampoline (&info);
+ mono_tramp_info_register (info);
+ }
+ mono_memory_barrier ();
+ nullified_class_init_trampoline = tramp;
+ }
+
+ return nullified_class_init_trampoline;
+}
diff --git a/mono/mini/mini-unwind.h b/mono/mini/mini-unwind.h
index 1d5be3190d..6b6ba7ad2f 100644
--- a/mono/mini/mini-unwind.h
+++ b/mono/mini/mini-unwind.h
@@ -158,4 +158,6 @@ mono_unwind_decode_llvm_mono_fde (guint8 *fde, int fde_len, guint8 *cie, guint8
GSList* mono_unwind_get_cie_program (void) MONO_INTERNAL;
+void mono_print_unwind_info (guint8 *unwind_info, int unwind_info_len) MONO_LLVM_INTERNAL;
+
#endif
diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c
index f8798ba460..8604961324 100755
--- a/mono/mini/mini-x86.c
+++ b/mono/mini/mini-x86.c
@@ -36,13 +36,11 @@
#include "mini-gc.h"
/* On windows, these hold the key returned by TlsAlloc () */
-static gint lmf_tls_offset = -1;
#ifdef TARGET_WIN32
static gint jit_tls_offset = -1;
#else
static gint lmf_addr_tls_offset = -1;
#endif
-static gint appdomain_tls_offset = -1;
#ifdef MONO_XEN_OPT
static gboolean optimize_for_xen = TRUE;
@@ -50,12 +48,6 @@ static gboolean optimize_for_xen = TRUE;
#define optimize_for_xen 0
#endif
-#ifdef TARGET_WIN32
-static gboolean is_win32 = TRUE;
-#else
-static gboolean is_win32 = FALSE;
-#endif
-
/* This mutex protects architecture specific caches */
#define mono_mini_arch_lock() EnterCriticalSection (&mini_arch_mutex)
#define mono_mini_arch_unlock() LeaveCriticalSection (&mini_arch_mutex)
@@ -67,9 +59,9 @@ static CRITICAL_SECTION mini_arch_mutex;
#ifdef TARGET_WIN32
/* Under windows, the default pinvoke calling convention is stdcall */
-#define CALLCONV_IS_STDCALL(sig) ((((sig)->call_convention) == MONO_CALL_STDCALL) || ((sig)->pinvoke && ((sig)->call_convention) == MONO_CALL_DEFAULT))
+#define CALLCONV_IS_STDCALL(sig) ((((sig)->call_convention) == MONO_CALL_STDCALL) || ((sig)->pinvoke && ((sig)->call_convention) == MONO_CALL_DEFAULT) || ((sig)->pinvoke && ((sig)->call_convention) == MONO_CALL_THISCALL))
#else
-#define CALLCONV_IS_STDCALL(sig) (((sig)->call_convention) == MONO_CALL_STDCALL)
+#define CALLCONV_IS_STDCALL(sig) (((sig)->call_convention) == MONO_CALL_STDCALL || ((sig)->pinvoke && ((sig)->call_convention) == MONO_CALL_THISCALL))
#endif
#define X86_IS_CALLEE_SAVED_REG(reg) (((reg) == X86_EBX) || ((reg) == X86_EDI) || ((reg) == X86_ESI))
@@ -77,6 +69,8 @@ static CRITICAL_SECTION mini_arch_mutex;
MonoBreakpointInfo
mono_breakpoint_info [MONO_BREAKPOINT_ARRAY_SIZE];
+static guint8*
+emit_load_aotconst (guint8 *start, guint8 *code, MonoCompile *cfg, MonoJumpInfo **ji, int dreg, int tramp_type, gconstpointer target);
#ifdef __native_client_codegen__
@@ -233,11 +227,22 @@ typedef struct {
ArgInfo args [1];
} CallInfo;
-#define PARAM_REGS 0
-
#define FLOAT_PARAM_REGS 0
-static X86_Reg_No param_regs [] = { 0 };
+static const guint32 thiscall_param_regs [] = { X86_ECX, X86_NREG };
+
+static const guint32 *callconv_param_regs(MonoMethodSignature *sig)
+{
+ if (!sig->pinvoke)
+ return NULL;
+
+ switch (sig->call_convention) {
+ case MONO_CALL_THISCALL:
+ return thiscall_param_regs;
+ default:
+ return NULL;
+ }
+}
#if defined(TARGET_WIN32) || defined(__APPLE__) || defined(__FreeBSD__)
#define SMALL_STRUCTS_IN_REGS
@@ -245,11 +250,11 @@ static X86_Reg_No return_regs [] = { X86_EAX, X86_EDX };
#endif
static void inline
-add_general (guint32 *gr, guint32 *stack_size, ArgInfo *ainfo)
+add_general (guint32 *gr, const guint32 *param_regs, guint32 *stack_size, ArgInfo *ainfo)
{
ainfo->offset = *stack_size;
- if (*gr >= PARAM_REGS) {
+ if (!param_regs || param_regs [*gr] == X86_NREG) {
ainfo->storage = ArgOnStack;
ainfo->nslots = 1;
(*stack_size) += sizeof (gpointer);
@@ -262,12 +267,12 @@ add_general (guint32 *gr, guint32 *stack_size, ArgInfo *ainfo)
}
static void inline
-add_general_pair (guint32 *gr, guint32 *stack_size, ArgInfo *ainfo)
+add_general_pair (guint32 *gr, const guint32 *param_regs , guint32 *stack_size, ArgInfo *ainfo)
{
ainfo->offset = *stack_size;
- g_assert (PARAM_REGS == 0);
-
+ g_assert(!param_regs || param_regs[*gr] == X86_NREG);
+
ainfo->storage = ArgOnStack;
(*stack_size) += sizeof (gpointer) * 2;
ainfo->nslots = 2;
@@ -298,7 +303,7 @@ add_float (guint32 *gr, guint32 *stack_size, ArgInfo *ainfo, gboolean is_double)
static void
add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgInfo *ainfo, MonoType *type,
gboolean is_return,
- guint32 *gr, guint32 *fr, guint32 *stack_size)
+ guint32 *gr, const guint32 *param_regs, guint32 *fr, guint32 *stack_size)
{
guint32 size;
MonoClass *klass;
@@ -320,16 +325,19 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn
ainfo->pair_storage [0] = ainfo->pair_storage [1] = ArgNone;
/* Special case structs with only a float member */
- if ((info->native_size == 8) && (info->num_fields == 1) && (info->fields [0].field->type->type == MONO_TYPE_R8)) {
- ainfo->storage = ArgValuetypeInReg;
- ainfo->pair_storage [0] = ArgOnDoubleFpStack;
- return;
+ if (info->num_fields == 1) {
+ int ftype = mini_replace_type (info->fields [0].field->type)->type;
+ if ((info->native_size == 8) && (ftype == MONO_TYPE_R8)) {
+ ainfo->storage = ArgValuetypeInReg;
+ ainfo->pair_storage [0] = ArgOnDoubleFpStack;
+ return;
+ }
+ if ((info->native_size == 4) && (ftype == MONO_TYPE_R4)) {
+ ainfo->storage = ArgValuetypeInReg;
+ ainfo->pair_storage [0] = ArgOnFloatFpStack;
+ return;
+ }
}
- if ((info->native_size == 4) && (info->num_fields == 1) && (info->fields [0].field->type->type == MONO_TYPE_R4)) {
- ainfo->storage = ArgValuetypeInReg;
- ainfo->pair_storage [0] = ArgOnFloatFpStack;
- return;
- }
if ((info->native_size == 1) || (info->native_size == 2) || (info->native_size == 4) || (info->native_size == 8)) {
ainfo->storage = ArgValuetypeInReg;
ainfo->pair_storage [0] = ArgInIReg;
@@ -343,6 +351,14 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn
}
#endif
+ if (param_regs && param_regs [*gr] != X86_NREG && !is_return) {
+ g_assert (size <= 4);
+ ainfo->storage = ArgValuetypeInReg;
+ ainfo->reg = param_regs [*gr];
+ (*gr)++;
+ return;
+ }
+
ainfo->offset = *stack_size;
ainfo->storage = ArgOnStack;
*stack_size += ALIGN_TO (size, sizeof (gpointer));
@@ -362,6 +378,7 @@ static CallInfo*
get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoMethodSignature *sig)
{
guint32 i, gr, fr, pstart;
+ const guint32 *param_regs;
MonoType *ret_type;
int n = sig->hasthis + sig->param_count;
guint32 stack_size = 0;
@@ -371,6 +388,8 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
fr = 0;
cinfo->nargs = n;
+ param_regs = callconv_param_regs(sig);
+
/* return value */
{
ret_type = mini_type_get_underlying_type (gsctx, sig->ret);
@@ -423,7 +442,7 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
case MONO_TYPE_TYPEDBYREF: {
guint32 tmp_gr = 0, tmp_fr = 0, tmp_stacksize = 0;
- add_valuetype (gsctx, sig, &cinfo->ret, sig->ret, TRUE, &tmp_gr, &tmp_fr, &tmp_stacksize);
+ add_valuetype (gsctx, sig, &cinfo->ret, ret_type, TRUE, &tmp_gr, NULL, &tmp_fr, &tmp_stacksize);
if (cinfo->ret.storage == ArgOnStack) {
cinfo->vtype_retaddr = TRUE;
/* The caller passes the address where the value is stored */
@@ -440,7 +459,7 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
cinfo->ret.storage = ArgNone;
break;
default:
- g_error ("Can't handle as return value 0x%x", sig->ret->type);
+ g_error ("Can't handle as return value 0x%x", ret_type->type);
}
}
@@ -454,29 +473,28 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
*/
if (cinfo->vtype_retaddr && !is_pinvoke && (sig->hasthis || (sig->param_count > 0 && MONO_TYPE_IS_REFERENCE (mini_type_get_underlying_type (gsctx, sig->params [0]))))) {
if (sig->hasthis) {
- add_general (&gr, &stack_size, cinfo->args + 0);
+ add_general (&gr, param_regs, &stack_size, cinfo->args + 0);
} else {
- add_general (&gr, &stack_size, &cinfo->args [sig->hasthis + 0]);
+ add_general (&gr, param_regs, &stack_size, &cinfo->args [sig->hasthis + 0]);
pstart = 1;
}
cinfo->vret_arg_offset = stack_size;
- add_general (&gr, &stack_size, &cinfo->ret);
+ add_general (&gr, NULL, &stack_size, &cinfo->ret);
cinfo->vret_arg_index = 1;
} else {
/* this */
if (sig->hasthis)
- add_general (&gr, &stack_size, cinfo->args + 0);
+ add_general (&gr, param_regs, &stack_size, cinfo->args + 0);
if (cinfo->vtype_retaddr)
- add_general (&gr, &stack_size, &cinfo->ret);
+ add_general (&gr, NULL, &stack_size, &cinfo->ret);
}
if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG) && (n == 0)) {
- gr = PARAM_REGS;
fr = FLOAT_PARAM_REGS;
/* Emit the signature cookie just before the implicit arguments */
- add_general (&gr, &stack_size, &cinfo->sig_cookie);
+ add_general (&gr, param_regs, &stack_size, &cinfo->sig_cookie);
}
for (i = pstart; i < sig->param_count; ++i) {
@@ -489,15 +507,14 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
* Prevent implicit arguments + the sig cookie from being passed
* in registers.
*/
- gr = PARAM_REGS;
fr = FLOAT_PARAM_REGS;
/* Emit the signature cookie just before the implicit arguments */
- add_general (&gr, &stack_size, &cinfo->sig_cookie);
+ add_general (&gr, param_regs, &stack_size, &cinfo->sig_cookie);
}
if (sig->params [i]->byref) {
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
continue;
}
ptype = mini_type_get_underlying_type (gsctx, sig->params [i]);
@@ -505,16 +522,16 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_I1:
case MONO_TYPE_U1:
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
break;
case MONO_TYPE_I2:
case MONO_TYPE_U2:
case MONO_TYPE_CHAR:
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
break;
case MONO_TYPE_I4:
case MONO_TYPE_U4:
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
break;
case MONO_TYPE_I:
case MONO_TYPE_U:
@@ -525,16 +542,16 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
case MONO_TYPE_STRING:
case MONO_TYPE_SZARRAY:
case MONO_TYPE_ARRAY:
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
break;
case MONO_TYPE_GENERICINST:
if (!mono_type_generic_inst_is_valuetype (ptype)) {
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
break;
}
if (mini_is_gsharedvt_type_gsctx (gsctx, ptype)) {
/* gsharedvt arguments are passed by ref */
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
g_assert (ainfo->storage == ArgOnStack);
ainfo->storage = ArgGSharedVt;
break;
@@ -542,11 +559,11 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
/* Fall through */
case MONO_TYPE_VALUETYPE:
case MONO_TYPE_TYPEDBYREF:
- add_valuetype (gsctx, sig, ainfo, ptype, FALSE, &gr, &fr, &stack_size);
+ add_valuetype (gsctx, sig, ainfo, ptype, FALSE, &gr, param_regs, &fr, &stack_size);
break;
case MONO_TYPE_U8:
case MONO_TYPE_I8:
- add_general_pair (&gr, &stack_size, ainfo);
+ add_general_pair (&gr, param_regs, &stack_size, ainfo);
break;
case MONO_TYPE_R4:
add_float (&fr, &stack_size, ainfo, FALSE);
@@ -558,7 +575,7 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
case MONO_TYPE_MVAR:
/* gsharedvt arguments are passed by ref */
g_assert (mini_is_gsharedvt_type_gsctx (gsctx, ptype));
- add_general (&gr, &stack_size, ainfo);
+ add_general (&gr, param_regs, &stack_size, ainfo);
g_assert (ainfo->storage == ArgOnStack);
ainfo->storage = ArgGSharedVt;
break;
@@ -569,11 +586,10 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
}
if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG) && (n > 0) && (sig->sentinelpos == sig->param_count)) {
- gr = PARAM_REGS;
fr = FLOAT_PARAM_REGS;
/* Emit the signature cookie just before the implicit arguments */
- add_general (&gr, &stack_size, &cinfo->sig_cookie);
+ add_general (&gr, param_regs, &stack_size, &cinfo->sig_cookie);
}
if (mono_do_x86_stack_align && (stack_size % MONO_ARCH_FRAME_ALIGNMENT) != 0) {
@@ -685,15 +701,25 @@ mono_arch_get_argument_info (MonoGenericSharingContext *gsctx, MonoMethodSignatu
}
gboolean
-mono_x86_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig)
+mono_arch_tail_call_supported (MonoCompile *cfg, MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig)
{
+ MonoType *callee_ret;
CallInfo *c1, *c2;
gboolean res;
+ if (cfg->compile_aot && !cfg->full_aot)
+ /* OP_TAILCALL doesn't work with AOT */
+ return FALSE;
+
c1 = get_call_info (NULL, NULL, caller_sig);
c2 = get_call_info (NULL, NULL, callee_sig);
+ /*
+ * Tail calls with more callee stack usage than the caller cannot be supported, since
+ * the extra stack space would be left on the stack after the tail call.
+ */
res = c1->stack_usage >= c2->stack_usage;
- if (callee_sig->ret && MONO_TYPE_ISSTRUCT (callee_sig->ret) && c2->ret.storage != ArgValuetypeInReg)
+ callee_ret = mini_replace_type (callee_sig->ret);
+ if (callee_ret && MONO_TYPE_ISSTRUCT (callee_ret) && c2->ret.storage != ArgValuetypeInReg)
/* An address on the callee's stack is passed as the first argument */
res = FALSE;
@@ -1037,10 +1063,15 @@ mono_arch_allocate_vars (MonoCompile *cfg)
cfg->frame_reg = X86_EBP;
offset = 0;
+ if (cfg->has_atomic_add_new_i4 || cfg->has_atomic_exchange_i4) {
+ /* The opcode implementations use callee-saved regs as scratch regs by pushing and pop-ing them, but that is not async safe */
+ cfg->used_int_regs |= (1 << X86_EBX) | (1 << X86_EDI) | (1 << X86_ESI);
+ }
+
/* Reserve space to save LMF and caller saved registers */
if (cfg->method->save_lmf) {
- offset += sizeof (MonoLMF);
+ /* The LMF var is allocated normally */
} else {
if (cfg->used_int_regs & (1 << X86_EBX)) {
offset += 4;
@@ -1168,19 +1199,31 @@ mono_arch_allocate_vars (MonoCompile *cfg)
void
mono_arch_create_vars (MonoCompile *cfg)
{
+ MonoType *sig_ret;
MonoMethodSignature *sig;
CallInfo *cinfo;
sig = mono_method_signature (cfg->method);
cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
+ sig_ret = mini_replace_type (sig->ret);
if (cinfo->ret.storage == ArgValuetypeInReg)
cfg->ret_var_is_local = TRUE;
- if ((cinfo->ret.storage != ArgValuetypeInReg) && (MONO_TYPE_ISSTRUCT (sig->ret) || mini_is_gsharedvt_variable_type (cfg, sig->ret))) {
+ if ((cinfo->ret.storage != ArgValuetypeInReg) && (MONO_TYPE_ISSTRUCT (sig_ret) || mini_is_gsharedvt_variable_type (cfg, sig_ret))) {
cfg->vret_addr = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_ARG);
}
+ if (cfg->method->save_lmf) {
+ cfg->create_lmf_var = TRUE;
+#ifndef HOST_WIN32
+ if (!optimize_for_xen) {
+ cfg->lmf_ir = TRUE;
+ cfg->lmf_ir_mono_lmf = TRUE;
+ }
+#endif
+ }
+
cfg->arch_eh_jit_info = 1;
}
@@ -1200,7 +1243,7 @@ collect_fp_stack_space (MonoMethodSignature *sig, int start_arg, int *fp_arg_set
MonoType *t;
for (; start_arg < sig->param_count; ++start_arg) {
- t = mini_type_get_underlying_type (NULL, sig->params [start_arg]);
+ t = mini_replace_type (sig->params [start_arg]);
if (!t->byref && t->type == MONO_TYPE_R8) {
fp_space += sizeof (double);
*fp_arg_setup = start_arg;
@@ -1245,11 +1288,12 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig)
CallInfo *cinfo;
ArgInfo *ainfo;
LLVMCallInfo *linfo;
- MonoType *t;
+ MonoType *t, *sig_ret;
n = sig->param_count + sig->hasthis;
cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
+ sig_ret = sig->ret;
linfo = mono_mempool_alloc0 (cfg->mempool, sizeof (LLVMCallInfo) + (sizeof (LLVMArgInfo) * n));
@@ -1275,13 +1319,13 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig)
*/
}
- if (mini_type_is_vtype (cfg, sig->ret) && cinfo->ret.storage == ArgInIReg) {
+ if (mini_type_is_vtype (cfg, sig_ret) && cinfo->ret.storage == ArgInIReg) {
/* Vtype returned using a hidden argument */
linfo->ret.storage = LLVMArgVtypeRetAddr;
linfo->vret_arg_index = cinfo->vret_arg_index;
}
- if (mini_type_is_vtype (cfg, sig->ret) && cinfo->ret.storage != ArgInIReg) {
+ if (mini_type_is_vtype (cfg, sig_ret) && cinfo->ret.storage != ArgInIReg) {
// FIXME:
cfg->exception_message = g_strdup ("vtype ret in call");
cfg->disable_llvm = TRUE;
@@ -1367,6 +1411,7 @@ emit_gc_param_slot_def (MonoCompile *cfg, int sp_offset, MonoType *t)
void
mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
{
+ MonoType *sig_ret;
MonoInst *arg, *in;
MonoMethodSignature *sig;
int i, j, n;
@@ -1375,6 +1420,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
sig = call->signature;
n = sig->param_count + sig->hasthis;
+ sig_ret = mini_replace_type (sig->ret);
cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
@@ -1394,7 +1440,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
}
}
- if (sig->ret && MONO_TYPE_ISSTRUCT (sig->ret)) {
+ if (sig_ret && MONO_TYPE_ISSTRUCT (sig_ret)) {
if (cinfo->ret.storage == ArgValuetypeInReg) {
/*
* Tell the JIT to use a more efficient calling convention: call using
@@ -1453,6 +1499,8 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
arg->opcode = OP_OUTARG_VT;
arg->sreg1 = in->dreg;
arg->klass = in->klass;
+ arg->inst_p1 = mono_mempool_alloc (cfg->mempool, sizeof (ArgInfo));
+ memcpy (arg->inst_p1, ainfo, sizeof (ArgInfo));
sp_offset += 4;
MONO_ADD_INS (cfg->cbb, arg);
} else if ((i >= sig->hasthis) && (MONO_TYPE_ISSTRUCT(t))) {
@@ -1474,10 +1522,15 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
arg->sreg1 = in->dreg;
arg->klass = in->klass;
arg->backend.size = size;
+ arg->inst_p0 = call;
+ arg->inst_p1 = mono_mempool_alloc (cfg->mempool, sizeof (ArgInfo));
+ memcpy (arg->inst_p1, ainfo, sizeof (ArgInfo));
MONO_ADD_INS (cfg->cbb, arg);
- sp_offset += size;
- emit_gc_param_slot_def (cfg, sp_offset, orig_type);
+ if (ainfo->storage != ArgValuetypeInReg) {
+ sp_offset += size;
+ emit_gc_param_slot_def (cfg, sp_offset, orig_type);
+ }
}
} else {
argsize = 4;
@@ -1505,6 +1558,11 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
}
}
break;
+ case ArgInIReg:
+ arg->opcode = OP_MOVE;
+ arg->dreg = ainfo->reg;
+ argsize = 0;
+ break;
default:
g_assert_not_reached ();
}
@@ -1542,7 +1600,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
}
}
- if (sig->ret && (MONO_TYPE_ISSTRUCT (sig->ret) || cinfo->vtype_retaddr)) {
+ if (sig_ret && (MONO_TYPE_ISSTRUCT (sig_ret) || cinfo->vtype_retaddr)) {
MonoInst *vtarg;
if (cinfo->ret.storage == ArgValuetypeInReg) {
@@ -1580,29 +1638,51 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
void
mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src)
{
+ MonoCallInst *call = (MonoCallInst*)ins->inst_p0;
+ ArgInfo *ainfo = ins->inst_p1;
MonoInst *arg;
int size = ins->backend.size;
- if (cfg->gsharedvt && mini_is_gsharedvt_klass (cfg, ins->klass)) {
- /* Pass by addr */
- MONO_INST_NEW (cfg, arg, OP_X86_PUSH);
- arg->sreg1 = src->dreg;
- MONO_ADD_INS (cfg->cbb, arg);
- } else if (size <= 4) {
- MONO_INST_NEW (cfg, arg, OP_X86_PUSH_MEMBASE);
- arg->sreg1 = src->dreg;
+ if (ainfo->storage == ArgValuetypeInReg) {
+ int dreg = mono_alloc_ireg (cfg);
+ switch (size) {
+ case 1:
+ MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU1_MEMBASE, dreg, src->dreg, 0);
+ break;
+ case 2:
+ MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, dreg, src->dreg, 0);
+ break;
+ case 4:
+ MONO_EMIT_NEW_LOAD_MEMBASE (cfg, dreg, src->dreg, 0);
+ break;
+ case 3: /* FIXME */
+ default:
+ g_assert_not_reached ();
+ }
+ mono_call_inst_add_outarg_reg (cfg, call, dreg, ainfo->reg, FALSE);
+ }
+ else {
+ if (cfg->gsharedvt && mini_is_gsharedvt_klass (cfg, ins->klass)) {
+ /* Pass by addr */
+ MONO_INST_NEW (cfg, arg, OP_X86_PUSH);
+ arg->sreg1 = src->dreg;
+ MONO_ADD_INS (cfg->cbb, arg);
+ } else if (size <= 4) {
+ MONO_INST_NEW (cfg, arg, OP_X86_PUSH_MEMBASE);
+ arg->sreg1 = src->dreg;
- MONO_ADD_INS (cfg->cbb, arg);
- } else if (size <= 20) {
- MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, ALIGN_TO (size, 4));
- mini_emit_memcpy (cfg, X86_ESP, 0, src->dreg, 0, size, 4);
- } else {
- MONO_INST_NEW (cfg, arg, OP_X86_PUSH_OBJ);
- arg->inst_basereg = src->dreg;
- arg->inst_offset = 0;
- arg->inst_imm = size;
+ MONO_ADD_INS (cfg->cbb, arg);
+ } else if (size <= 20) {
+ MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, ALIGN_TO (size, 4));
+ mini_emit_memcpy (cfg, X86_ESP, 0, src->dreg, 0, size, 4);
+ } else {
+ MONO_INST_NEW (cfg, arg, OP_X86_PUSH_OBJ);
+ arg->inst_basereg = src->dreg;
+ arg->inst_offset = 0;
+ arg->inst_imm = size;
- MONO_ADD_INS (cfg->cbb, arg);
+ MONO_ADD_INS (cfg->cbb, arg);
+ }
}
}
@@ -2317,50 +2397,176 @@ mono_x86_emit_tls_get (guint8* code, int dreg, int tls_offset)
return code;
}
+static guint8*
+emit_tls_get_reg (guint8* code, int dreg, int offset_reg)
+{
+ /* offset_reg contains a value translated by mono_arch_translate_tls_offset () */
+#if defined(__APPLE__) || defined(__linux__)
+ if (dreg != offset_reg)
+ x86_mov_reg_reg (code, dreg, offset_reg, sizeof (mgreg_t));
+ x86_prefix (code, X86_GS_PREFIX);
+ x86_mov_reg_membase (code, dreg, dreg, 0, sizeof (mgreg_t));
+#else
+ g_assert_not_reached ();
+#endif
+ return code;
+}
+
+guint8*
+mono_x86_emit_tls_get_reg (guint8* code, int dreg, int offset_reg)
+{
+ return emit_tls_get_reg (code, dreg, offset_reg);
+}
+
+static guint8*
+emit_tls_set_reg (guint8* code, int sreg, int offset_reg)
+{
+ /* offset_reg contains a value translated by mono_arch_translate_tls_offset () */
+#ifdef HOST_WIN32
+ g_assert_not_reached ();
+#elif defined(__APPLE__) || defined(__linux__)
+ x86_prefix (code, X86_GS_PREFIX);
+ x86_mov_membase_reg (code, offset_reg, 0, sreg, sizeof (mgreg_t));
+#else
+ g_assert_not_reached ();
+#endif
+ return code;
+}
+
+ /*
+ * mono_arch_translate_tls_offset:
+ *
+ * Translate the TLS offset OFFSET computed by MONO_THREAD_VAR_OFFSET () into a format usable by OP_TLS_GET_REG/OP_TLS_SET_REG.
+ */
+int
+mono_arch_translate_tls_offset (int offset)
+{
+#ifdef __APPLE__
+ return tls_gs_offset + (offset * 4);
+#else
+ return offset;
+#endif
+}
+
/*
- * emit_load_volatile_arguments:
+ * emit_setup_lmf:
*
- * Load volatile arguments from the stack to the original input registers.
- * Required before a tail call.
+ * Emit code to initialize an LMF structure at LMF_OFFSET.
*/
static guint8*
-emit_load_volatile_arguments (MonoCompile *cfg, guint8 *code)
+emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offset)
{
- MonoMethod *method = cfg->method;
- MonoMethodSignature *sig;
- MonoInst *inst;
- CallInfo *cinfo;
- guint32 i;
+ /* save all caller saved regs */
+ x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), X86_EBX, sizeof (mgreg_t));
+ mono_emit_unwind_op_offset (cfg, code, X86_EBX, - cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx));
+ x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), X86_EDI, sizeof (mgreg_t));
+ mono_emit_unwind_op_offset (cfg, code, X86_EDI, - cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi));
+ x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), X86_ESI, sizeof (mgreg_t));
+ mono_emit_unwind_op_offset (cfg, code, X86_ESI, - cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi));
+ x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebp), X86_EBP, sizeof (mgreg_t));
+
+ /* save the current IP */
+ if (cfg->compile_aot) {
+ /* This pushes the current ip */
+ x86_call_imm (code, 0);
+ x86_pop_reg (code, X86_EAX);
+ } else {
+ mono_add_patch_info (cfg, code + 1 - cfg->native_code, MONO_PATCH_INFO_IP, NULL);
+ x86_mov_reg_imm (code, X86_EAX, 0);
+ }
+ x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, eip), X86_EAX, sizeof (mgreg_t));
+
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, eip), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebp), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, esp), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, method), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), SLOT_NOREF);
+ mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), SLOT_NOREF);
- /* FIXME: Generate intermediate code instead */
+ return code;
+}
- sig = mono_method_signature (method);
+/*
+ * emit_push_lmf:
+ *
+ * Emit code to push an LMF structure on the LMF stack.
+ */
+static guint8*
+emit_push_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
+{
+ /* get the address of lmf for the current thread */
+ /*
+ * This is performance critical so we try to use some tricks to make
+ * it fast.
+ */
+ gboolean have_fastpath = FALSE;
- cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
-
- /* This is the opposite of the code in emit_prolog */
+#ifdef TARGET_WIN32
+ if (jit_tls_offset != -1) {
+ code = mono_x86_emit_tls_get (code, X86_EAX, jit_tls_offset);
+ x86_alu_reg_imm (code, X86_ADD, X86_EAX, G_STRUCT_OFFSET (MonoJitTlsData, lmf));
+ have_fastpath = TRUE;
+ }
+#else
+ if (!cfg->compile_aot && lmf_addr_tls_offset != -1) {
+ code = mono_x86_emit_tls_get (code, X86_EAX, lmf_addr_tls_offset);
+ have_fastpath = TRUE;
+ }
+#endif
+ if (!have_fastpath) {
+ if (cfg->compile_aot)
+ code = mono_arch_emit_load_got_addr (cfg->native_code, code, cfg, NULL);
+ code = emit_call (cfg, code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_get_lmf_addr");
+ }
- for (i = 0; i < sig->param_count + sig->hasthis; ++i) {
- ArgInfo *ainfo = cinfo->args + i;
- MonoType *arg_type;
- inst = cfg->args [i];
+ /* save lmf_addr */
+ x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), X86_EAX, sizeof (mgreg_t));
+ /* save previous_lmf */
+ x86_mov_reg_membase (code, X86_ECX, X86_EAX, 0, sizeof (mgreg_t));
+ x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), X86_ECX, sizeof (mgreg_t));
+ /* set new LMF */
+ x86_lea_membase (code, X86_ECX, cfg->frame_reg, lmf_offset);
+ x86_mov_membase_reg (code, X86_EAX, 0, X86_ECX, sizeof (mgreg_t));
- if (sig->hasthis && (i == 0))
- arg_type = &mono_defaults.object_class->byval_arg;
- else
- arg_type = sig->params [i - sig->hasthis];
+ return code;
+}
- /*
- * On x86, the arguments are either in their original stack locations, or in
- * global regs.
- */
- if (inst->opcode == OP_REGVAR) {
- g_assert (ainfo->storage == ArgOnStack);
-
- x86_mov_membase_reg (code, X86_EBP, inst->inst_offset, inst->dreg, 4);
- }
+/*
+ * emit_pop_lmf:
+ *
+ * Emit code to pop an LMF structure from the LMF stack.
+ * Preserves the return registers.
+ */
+static guint8*
+emit_pop_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
+{
+ MonoMethodSignature *sig = mono_method_signature (cfg->method);
+ int prev_lmf_reg;
+
+ /* Find a spare register */
+ switch (mini_type_get_underlying_type (cfg->generic_sharing_context, sig->ret)->type) {
+ case MONO_TYPE_I8:
+ case MONO_TYPE_U8:
+ prev_lmf_reg = X86_EDI;
+ cfg->used_int_regs |= (1 << X86_EDI);
+ break;
+ default:
+ prev_lmf_reg = X86_EDX;
+ break;
}
+ /* reg = previous_lmf */
+ x86_mov_reg_membase (code, prev_lmf_reg, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), 4);
+
+ /* ecx = lmf */
+ x86_mov_reg_membase (code, X86_ECX, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), 4);
+
+ /* *(lmf) = previous_lmf */
+ x86_mov_membase_reg (code, X86_ECX, 0, prev_lmf_reg, 4);
+
return code;
}
@@ -3059,48 +3265,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_MOVE:
x86_mov_reg_reg (code, ins->dreg, ins->sreg1, 4);
break;
- case OP_JMP: {
- /*
- * Note: this 'frame destruction' logic is useful for tail calls, too.
- * Keep in sync with the code in emit_epilog.
- */
- int pos = 0;
-
- /* FIXME: no tracing support... */
- if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
- code = mono_arch_instrument_epilog (cfg, mono_profiler_method_leave, code, FALSE);
- /* reset offset to make max_len work */
- offset = code - cfg->native_code;
-
- g_assert (!cfg->method->save_lmf);
-
- code = emit_load_volatile_arguments (cfg, code);
-
- if (cfg->used_int_regs & (1 << X86_EBX))
- pos -= 4;
- if (cfg->used_int_regs & (1 << X86_EDI))
- pos -= 4;
- if (cfg->used_int_regs & (1 << X86_ESI))
- pos -= 4;
- if (pos)
- x86_lea_membase (code, X86_ESP, X86_EBP, pos);
-
- if (cfg->used_int_regs & (1 << X86_ESI))
- x86_pop_reg (code, X86_ESI);
- if (cfg->used_int_regs & (1 << X86_EDI))
- x86_pop_reg (code, X86_EDI);
- if (cfg->used_int_regs & (1 << X86_EBX))
- x86_pop_reg (code, X86_EBX);
-
- /* restore ESP/EBP */
- x86_leave (code);
- offset = code - cfg->native_code;
- mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_METHOD_JUMP, ins->inst_p0);
- x86_jump32 (code, 0);
-
- cfg->disable_aot = TRUE;
- break;
- }
case OP_TAILCALL: {
MonoCallInst *call = (MonoCallInst*)ins;
int pos = 0, i;
@@ -3116,8 +3280,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
g_assert (!cfg->method->save_lmf);
- //code = emit_load_volatile_arguments (cfg, code);
-
/* restore callee saved registers */
for (i = 0; i < X86_NREG; ++i)
if (X86_IS_CALLEE_SAVED_REG (i) && cfg->used_int_regs & (1 << i))
@@ -3362,6 +3524,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_BR_REG:
x86_jump_reg (code, ins->sreg1);
break;
+ case OP_ICNEQ:
+ case OP_ICGE:
+ case OP_ICLE:
+ case OP_ICGE_UN:
+ case OP_ICLE_UN:
+
case OP_CEQ:
case OP_CLT:
case OP_CLT_UN:
@@ -3796,6 +3964,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
x86_alu_reg_imm (code, X86_AND, X86_EAX, X86_FP_CC_MASK);
break;
case OP_FCEQ:
+ case OP_FCNEQ:
if (cfg->opt & MONO_OPT_FCMOV) {
/* zeroing the register at the start results in
* shorter and faster code (we can also remove the widening op)
@@ -3806,8 +3975,19 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
x86_fstp (code, 0);
unordered_check = code;
x86_branch8 (code, X86_CC_P, 0, FALSE);
- x86_set_reg (code, X86_CC_EQ, ins->dreg, FALSE);
- x86_patch (unordered_check, code);
+ if (ins->opcode == OP_FCEQ) {
+ x86_set_reg (code, X86_CC_EQ, ins->dreg, FALSE);
+ x86_patch (unordered_check, code);
+ } else {
+ guchar *jump_to_end;
+ x86_set_reg (code, X86_CC_NE, ins->dreg, FALSE);
+ jump_to_end = code;
+ x86_jump8 (code, 0);
+ x86_patch (unordered_check, code);
+ x86_inc_reg (code, ins->dreg);
+ x86_patch (jump_to_end, code);
+ }
+
break;
}
if (ins->dreg != X86_EAX)
@@ -3816,7 +3996,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
EMIT_FPCOMPARE(code);
x86_alu_reg_imm (code, X86_AND, X86_EAX, X86_FP_CC_MASK);
x86_alu_reg_imm (code, X86_CMP, X86_EAX, 0x4000);
- x86_set_reg (code, X86_CC_EQ, ins->dreg, TRUE);
+ x86_set_reg (code, ins->opcode == OP_FCEQ ? X86_CC_EQ : X86_CC_NE, ins->dreg, TRUE);
x86_widen_reg (code, ins->dreg, ins->dreg, FALSE, FALSE);
if (ins->dreg != X86_EAX)
@@ -3868,6 +4048,44 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
if (ins->dreg != X86_EAX)
x86_pop_reg (code, X86_EAX);
break;
+ case OP_FCLE: {
+ guchar *unordered_check;
+ guchar *jump_to_end;
+ if (cfg->opt & MONO_OPT_FCMOV) {
+ /* zeroing the register at the start results in
+ * shorter and faster code (we can also remove the widening op)
+ */
+ x86_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg);
+ x86_fcomip (code, 1);
+ x86_fstp (code, 0);
+ unordered_check = code;
+ x86_branch8 (code, X86_CC_P, 0, FALSE);
+ x86_set_reg (code, X86_CC_NB, ins->dreg, FALSE);
+ x86_patch (unordered_check, code);
+ break;
+ }
+ if (ins->dreg != X86_EAX)
+ x86_push_reg (code, X86_EAX);
+
+ EMIT_FPCOMPARE(code);
+ x86_alu_reg_imm (code, X86_AND, X86_EAX, X86_FP_CC_MASK);
+ x86_alu_reg_imm (code, X86_CMP, X86_EAX, 0x4500);
+ unordered_check = code;
+ x86_branch8 (code, X86_CC_EQ, 0, FALSE);
+
+ x86_alu_reg_imm (code, X86_CMP, X86_EAX, X86_FP_C0);
+ x86_set_reg (code, X86_CC_NE, ins->dreg, TRUE);
+ x86_widen_reg (code, ins->dreg, ins->dreg, FALSE, FALSE);
+ jump_to_end = code;
+ x86_jump8 (code, 0);
+ x86_patch (unordered_check, code);
+ x86_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg);
+ x86_patch (jump_to_end, code);
+
+ if (ins->dreg != X86_EAX)
+ x86_pop_reg (code, X86_EAX);
+ break;
+ }
case OP_FCGT:
case OP_FCGT_UN:
if (cfg->opt & MONO_OPT_FCMOV) {
@@ -3911,6 +4129,44 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
if (ins->dreg != X86_EAX)
x86_pop_reg (code, X86_EAX);
break;
+ case OP_FCGE: {
+ guchar *unordered_check;
+ guchar *jump_to_end;
+ if (cfg->opt & MONO_OPT_FCMOV) {
+ /* zeroing the register at the start results in
+ * shorter and faster code (we can also remove the widening op)
+ */
+ x86_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg);
+ x86_fcomip (code, 1);
+ x86_fstp (code, 0);
+ unordered_check = code;
+ x86_branch8 (code, X86_CC_P, 0, FALSE);
+ x86_set_reg (code, X86_CC_NA, ins->dreg, FALSE);
+ x86_patch (unordered_check, code);
+ break;
+ }
+ if (ins->dreg != X86_EAX)
+ x86_push_reg (code, X86_EAX);
+
+ EMIT_FPCOMPARE(code);
+ x86_alu_reg_imm (code, X86_AND, X86_EAX, X86_FP_CC_MASK);
+ x86_alu_reg_imm (code, X86_CMP, X86_EAX, 0x4500);
+ unordered_check = code;
+ x86_branch8 (code, X86_CC_EQ, 0, FALSE);
+
+ x86_alu_reg_imm (code, X86_CMP, X86_EAX, X86_FP_C0);
+ x86_set_reg (code, X86_CC_GE, ins->dreg, TRUE);
+ x86_widen_reg (code, ins->dreg, ins->dreg, FALSE, FALSE);
+ jump_to_end = code;
+ x86_jump8 (code, 0);
+ x86_patch (unordered_check, code);
+ x86_alu_reg_reg (code, X86_XOR, ins->dreg, ins->dreg);
+ x86_patch (jump_to_end, code);
+
+ if (ins->dreg != X86_EAX)
+ x86_pop_reg (code, X86_EAX);
+ break;
+ }
case OP_FBEQ:
if (cfg->opt & MONO_OPT_FCMOV) {
guchar *jump = code;
@@ -4068,18 +4324,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
break;
}
case OP_TLS_GET_REG: {
-#ifdef __APPLE__
- // FIXME: tls_gs_offset can change too, do these when calculating the tls offset
- if (ins->dreg != ins->sreg1)
- x86_mov_reg_reg (code, ins->dreg, ins->sreg1, sizeof (gpointer));
- x86_shift_reg_imm (code, X86_SHL, ins->dreg, 2);
- if (tls_gs_offset)
- x86_alu_reg_imm (code, X86_ADD, ins->dreg, tls_gs_offset);
- x86_prefix (code, X86_GS_PREFIX);
- x86_mov_reg_membase (code, ins->dreg, ins->dreg, 0, sizeof (gpointer));
-#else
- g_assert_not_reached ();
-#endif
+ code = emit_tls_get_reg (code, ins->dreg, ins->sreg1);
+ break;
+ }
+ case OP_TLS_SET: {
+ code = mono_x86_emit_tls_set (code, ins->sreg1, ins->inst_offset);
+ break;
+ }
+ case OP_TLS_SET_REG: {
+ code = emit_tls_set_reg (code, ins->sreg1, ins->sreg2);
break;
}
case OP_MEMORY_BARRIER: {
@@ -4118,6 +4371,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_ATOMIC_ADD_NEW_I4: {
int dreg = ins->dreg;
+ g_assert (cfg->has_atomic_add_new_i4);
+
/* hack: limit in regalloc, dreg != sreg1 && dreg != sreg2 */
if (ins->sreg2 == dreg) {
if (dreg == X86_EBX) {
@@ -4163,6 +4418,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
int sreg2 = ins->sreg2;
int breg = ins->inst_basereg;
+ g_assert (cfg->has_atomic_exchange_i4);
+
/* cmpxchg uses eax as comperand, need to make sure we can use it
* hack to overcome limits in x86 reg allocator
* (req: dreg == eax and sreg2 != eax and breg != eax)
@@ -4210,7 +4467,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case OP_CARD_TABLE_WBARRIER: {
int ptr = ins->sreg1;
int value = ins->sreg2;
- guchar *br;
+ guchar *br = NULL;
int nursery_shift, card_table_shift;
gpointer card_table_mask;
size_t nursery_size;
@@ -4904,8 +5161,6 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono
unsigned char *ip = patch_info->ip.i + code;
const unsigned char *target;
- target = mono_resolve_patch_target (method, domain, code, patch_info, run_cctors);
-
if (compile_aot) {
switch (patch_info->type) {
case MONO_PATCH_INFO_BB:
@@ -4917,6 +5172,8 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono
}
}
+ target = mono_resolve_patch_target (method, domain, code, patch_info, run_cctors);
+
switch (patch_info->type) {
case MONO_PATCH_INFO_IP:
*((gconstpointer *)(ip)) = target;
@@ -5075,94 +5332,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
alloc_size = cfg->stack_offset;
pos = 0;
- if (method->save_lmf) {
- pos += sizeof (MonoLMF);
-
- /* save the current IP */
- if (cfg->compile_aot) {
- /* This pushes the current ip */
- x86_call_imm (code, 0);
- } else {
- mono_add_patch_info (cfg, code + 1 - cfg->native_code, MONO_PATCH_INFO_IP, NULL);
- x86_push_imm_template (code);
- }
- cfa_offset += sizeof (gpointer);
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset, SLOT_NOREF);
-
- /* save all caller saved regs */
- x86_push_reg (code, X86_EBP);
- cfa_offset += sizeof (gpointer);
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset, SLOT_NOREF);
- x86_push_reg (code, X86_ESI);
- cfa_offset += sizeof (gpointer);
- mono_emit_unwind_op_offset (cfg, code, X86_ESI, - cfa_offset);
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset, SLOT_NOREF);
- x86_push_reg (code, X86_EDI);
- cfa_offset += sizeof (gpointer);
- mono_emit_unwind_op_offset (cfg, code, X86_EDI, - cfa_offset);
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset, SLOT_NOREF);
- x86_push_reg (code, X86_EBX);
- cfa_offset += sizeof (gpointer);
- mono_emit_unwind_op_offset (cfg, code, X86_EBX, - cfa_offset);
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset, SLOT_NOREF);
-
- if ((lmf_tls_offset != -1) && !is_win32 && !optimize_for_xen) {
- /*
- * Optimized version which uses the mono_lmf TLS variable instead of indirection
- * through the mono_lmf_addr TLS variable.
- */
- /* %eax = previous_lmf */
- code = mono_x86_emit_tls_get (code, X86_EAX, lmf_tls_offset);
- /* skip esp + method_info + lmf */
- x86_alu_reg_imm (code, X86_SUB, X86_ESP, 12);
- cfa_offset += 12;
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset, SLOT_NOREF);
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + 4, SLOT_NOREF);
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + 8, SLOT_NOREF);
- /* push previous_lmf */
- x86_push_reg (code, X86_EAX);
- cfa_offset += 4;
- mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset, SLOT_NOREF);
- /* new lmf = ESP */
- code = mono_x86_emit_tls_set (code, X86_ESP, lmf_tls_offset);
- } else {
- /* get the address of lmf for the current thread */
- /*
- * This is performance critical so we try to use some tricks to make
- * it fast.
- */
- gboolean have_fastpath = FALSE;
-
-#ifdef TARGET_WIN32
- if (jit_tls_offset != -1) {
- code = mono_x86_emit_tls_get (code, X86_EAX, jit_tls_offset);
- x86_alu_reg_imm (code, X86_ADD, X86_EAX, G_STRUCT_OFFSET (MonoJitTlsData, lmf));
- have_fastpath = TRUE;
- }
-#else
- if (lmf_addr_tls_offset != -1) {
- code = mono_x86_emit_tls_get (code, X86_EAX, lmf_addr_tls_offset);
- have_fastpath = TRUE;
- }
-#endif
- if (!have_fastpath) {
- if (cfg->compile_aot)
- code = mono_arch_emit_load_got_addr (cfg->native_code, code, cfg, NULL);
- code = emit_call (cfg, code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_get_lmf_addr");
- }
-
- /* Skip esp + method info */
- x86_alu_reg_imm (code, X86_SUB, X86_ESP, 8);
-
- /* push lmf */
- x86_push_reg (code, X86_EAX);
- /* push *lfm (previous_lmf) */
- x86_push_membase (code, X86_EAX, 0);
- /* *(lmf) = ESP */
- x86_mov_membase_reg (code, X86_EAX, 0, X86_ESP, 4);
- }
- } else {
-
+ if (!method->save_lmf) {
if (cfg->used_int_regs & (1 << X86_EBX)) {
x86_push_reg (code, X86_EBX);
pos += 4;
@@ -5310,6 +5480,12 @@ mono_arch_emit_prolog (MonoCompile *cfg)
x86_mov_membase_reg (code, X86_EBP, cfg->rgctx_var->inst_offset, MONO_ARCH_RGCTX_REG, 4);
}
+ if (method->save_lmf) {
+ code = emit_setup_lmf (cfg, code, cfg->lmf_var->inst_offset, cfa_offset);
+ if (!cfg->lmf_ir)
+ code = emit_push_lmf (cfg, code, cfg->lmf_var->inst_offset);
+ }
+
if (mono_jit_trace_calls != NULL && mono_trace_eval (method))
code = mono_arch_instrument_prolog (cfg, mono_trace_enter_method, code, TRUE);
@@ -5340,7 +5516,7 @@ mono_arch_emit_epilog (MonoCompile *cfg)
{
MonoMethod *method = cfg->method;
MonoMethodSignature *sig = mono_method_signature (method);
- int quad, pos;
+ int i, quad, pos;
guint32 stack_to_pop;
guint8 *code;
int max_epilog_size = 16;
@@ -5361,17 +5537,32 @@ mono_arch_emit_epilog (MonoCompile *cfg)
if (mono_jit_trace_calls != NULL && mono_trace_eval (method))
code = mono_arch_instrument_epilog (cfg, mono_trace_leave_method, code, TRUE);
- /* the code restoring the registers must be kept in sync with OP_JMP */
+ /* the code restoring the registers must be kept in sync with OP_TAILCALL */
pos = 0;
if (method->save_lmf) {
- gint32 prev_lmf_reg;
- gint32 lmf_offset = -sizeof (MonoLMF);
+ gint32 lmf_offset = cfg->lmf_var->inst_offset;
+ guint8 *patch;
+ gboolean supported = FALSE;
+
+ if (cfg->compile_aot) {
+#if defined(__APPLE__) || defined(__linux__)
+ supported = TRUE;
+#endif
+ } else if (mono_get_jit_tls_offset () != -1) {
+ supported = TRUE;
+ }
/* check if we need to restore protection of the stack after a stack overflow */
- if (mono_get_jit_tls_offset () != -1) {
- guint8 *patch;
- code = mono_x86_emit_tls_get (code, X86_ECX, mono_get_jit_tls_offset ());
+ if (supported) {
+ if (cfg->compile_aot) {
+ code = emit_load_aotconst (NULL, code, cfg, NULL, X86_ECX, MONO_PATCH_INFO_TLS_OFFSET, GINT_TO_POINTER (TLS_KEY_JIT_TLS));
+
+ code = emit_tls_get_reg (code, X86_ECX, X86_ECX);
+ } else {
+ code = mono_x86_emit_tls_get (code, X86_ECX, mono_get_jit_tls_offset ());
+ }
+
/* we load the value in a separate instruction: this mechanism may be
* used later as a safer way to do thread interruption
*/
@@ -5385,61 +5576,33 @@ mono_arch_emit_epilog (MonoCompile *cfg)
} else {
/* FIXME: maybe save the jit tls in the prolog */
}
- if ((lmf_tls_offset != -1) && !is_win32 && !optimize_for_xen) {
- /*
- * Optimized version which uses the mono_lmf TLS variable instead of indirection
- * through the mono_lmf_addr TLS variable.
- */
- /* reg = previous_lmf */
- x86_mov_reg_membase (code, X86_ECX, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), 4);
- /* lmf = previous_lmf */
- code = mono_x86_emit_tls_set (code, X86_ECX, lmf_tls_offset);
- } else {
- /* Find a spare register */
- switch (mini_type_get_underlying_type (cfg->generic_sharing_context, sig->ret)->type) {
- case MONO_TYPE_I8:
- case MONO_TYPE_U8:
- prev_lmf_reg = X86_EDI;
- cfg->used_int_regs |= (1 << X86_EDI);
- break;
- default:
- prev_lmf_reg = X86_EDX;
- break;
- }
-
- /* reg = previous_lmf */
- x86_mov_reg_membase (code, prev_lmf_reg, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), 4);
-
- /* ecx = lmf */
- x86_mov_reg_membase (code, X86_ECX, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), 4);
-
- /* *(lmf) = previous_lmf */
- x86_mov_membase_reg (code, X86_ECX, 0, prev_lmf_reg, 4);
- }
+ if (!cfg->lmf_ir)
+ code = emit_pop_lmf (cfg, code, lmf_offset);
/* restore caller saved regs */
if (cfg->used_int_regs & (1 << X86_EBX)) {
- x86_mov_reg_membase (code, X86_EBX, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), 4);
+ x86_mov_reg_membase (code, X86_EBX, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), 4);
}
if (cfg->used_int_regs & (1 << X86_EDI)) {
- x86_mov_reg_membase (code, X86_EDI, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), 4);
+ x86_mov_reg_membase (code, X86_EDI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), 4);
}
if (cfg->used_int_regs & (1 << X86_ESI)) {
- x86_mov_reg_membase (code, X86_ESI, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), 4);
+ x86_mov_reg_membase (code, X86_ESI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), 4);
}
/* EBP is restored by LEAVE */
} else {
- if (cfg->used_int_regs & (1 << X86_EBX)) {
- pos -= 4;
- }
- if (cfg->used_int_regs & (1 << X86_EDI)) {
- pos -= 4;
+ for (i = 0; i < X86_NREG; ++i) {
+ if ((cfg->used_int_regs & X86_CALLER_REGS & (1 << i)) && (i != X86_EBP)) {
+ pos -= 4;
+ }
}
- if (cfg->used_int_regs & (1 << X86_ESI)) {
- pos -= 4;
+
+ if (pos) {
+ g_assert (need_stack_frame);
+ x86_lea_membase (code, X86_ESP, X86_EBP, pos);
}
if (pos) {
@@ -5642,20 +5805,15 @@ mono_arch_finish_init (void)
* We need to init this multiple times, since when we are first called, the key might not
* be initialized yet.
*/
- appdomain_tls_offset = mono_domain_get_tls_key ();
jit_tls_offset = mono_get_jit_tls_key ();
/* Only 64 tls entries can be accessed using inline code */
- if (appdomain_tls_offset >= 64)
- appdomain_tls_offset = -1;
if (jit_tls_offset >= 64)
jit_tls_offset = -1;
#else
#if MONO_XEN_OPT
optimize_for_xen = access ("/proc/xen", F_OK) == 0;
#endif
- appdomain_tls_offset = mono_domain_get_tls_offset ();
- lmf_tls_offset = mono_get_lmf_tls_offset ();
lmf_addr_tls_offset = mono_get_lmf_addr_tls_offset ();
#endif
}
@@ -5926,20 +6084,6 @@ mono_arch_print_tree (MonoInst *tree, int arity)
return 0;
}
-MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
- MonoInst* ins;
-
- return NULL;
-
- if (appdomain_tls_offset == -1)
- return NULL;
-
- MONO_INST_NEW (cfg, ins, OP_TLS_GET);
- ins->inst_offset = appdomain_tls_offset;
- return ins;
-}
-
guint32
mono_arch_get_patch_offset (guint8 *code)
{
@@ -6503,8 +6647,19 @@ mono_arch_emit_load_got_addr (guint8 *start, guint8 *code, MonoCompile *cfg, Mon
return code;
}
+static guint8*
+emit_load_aotconst (guint8 *start, guint8 *code, MonoCompile *cfg, MonoJumpInfo **ji, int dreg, int tramp_type, gconstpointer target)
+{
+ if (cfg)
+ mono_add_patch_info (cfg, code - cfg->native_code, tramp_type, target);
+ else
+ g_assert_not_reached ();
+ x86_mov_reg_membase (code, dreg, MONO_ARCH_GOT_REG, 0xf0f0f0f0, 4);
+ return code;
+}
+
/*
- * mono_ppc_emit_load_aotconst:
+ * mono_arch_emit_load_aotconst:
*
* Emit code to load the contents of the GOT slot identified by TRAMP_TYPE and
* TARGET from the mscorlib GOT in full-aot code.
@@ -6688,6 +6843,15 @@ mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code)
return NULL;
}
+void
+mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
+{
+ ext->lmf.previous_lmf = (gsize)prev_lmf;
+ /* Mark that this is a MonoLMFExt */
+ ext->lmf.previous_lmf = (gsize)(gpointer)(((gssize)ext->lmf.previous_lmf) | 2);
+ ext->lmf.ebp = (gssize)ext;
+}
+
#endif
#if defined(MONOTOUCH) || defined(MONO_EXTENSIONS)
diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h
index 20d2eeb329..14d6e14871 100644
--- a/mono/mini/mini-x86.h
+++ b/mono/mini/mini-x86.h
@@ -262,15 +262,9 @@ typedef struct {
#define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG 1
#define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK 1
#define MONO_ARCH_GSHAREDVT_SUPPORTED 1
-
-#ifdef TARGET_OSX
+#define MONO_ARCH_HAVE_OP_TAIL_CALL 1
+#define MONO_ARCH_HAVE_TRANSLATE_TLS_OFFSET 1
#define MONO_ARCH_HAVE_TLS_GET_REG 1
-#endif
-
-gboolean
-mono_x86_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig) MONO_INTERNAL;
-
-#define MONO_ARCH_USE_OP_TAIL_CALL(caller_sig, callee_sig) mono_x86_tail_call_supported (caller_sig, callee_sig)
/* Used for optimization, not complete */
#define MONO_ARCH_IS_OP_MEMBASE(opcode) ((opcode) == OP_X86_PUSH_MEMBASE)
@@ -328,6 +322,9 @@ typedef struct {
guint8*
mono_x86_emit_tls_get (guint8* code, int dreg, int tls_offset) MONO_INTERNAL;
+guint8*
+mono_x86_emit_tls_get_reg (guint8* code, int dreg, int offset_reg) MONO_INTERNAL;
+
guint32
mono_x86_get_this_arg_offset (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig) MONO_INTERNAL;
diff --git a/mono/mini/mini.c b/mono/mini/mini.c
index ef88e603a6..3ea1289f61 100644
--- a/mono/mini/mini.c
+++ b/mono/mini/mini.c
@@ -49,6 +49,7 @@
#include <mono/metadata/mempool-internals.h>
#include <mono/metadata/attach.h>
#include <mono/metadata/runtime.h>
+#include <mono/metadata/mono-debug-debugger.h>
#include <mono/utils/mono-math.h>
#include <mono/utils/mono-compiler.h>
#include <mono/utils/mono-counters.h>
@@ -58,6 +59,7 @@
#include <mono/utils/mono-tls.h>
#include <mono/utils/mono-hwcap.h>
#include <mono/utils/dtrace.h>
+#include <mono/utils/mono-signal-handler.h>
#include "mini.h"
#include "mini-llvm.h"
@@ -70,17 +72,9 @@
#include "jit-icalls.h"
-#include "debug-mini.h"
#include "mini-gc.h"
#include "debugger-agent.h"
-/* this macro is used for a runtime check done in mini_init () */
-#ifdef MONO_ARCH_EMULATE_MUL_DIV
-#define EMUL_MUL_DIV 1
-#else
-#define EMUL_MUL_DIV 0
-#endif
-
static gpointer mono_jit_compile_method_with_opt (MonoMethod *method, guint32 opt, MonoException **ex);
@@ -93,20 +87,12 @@ MonoNativeTlsKey mono_jit_tls_id;
MONO_FAST_TLS_DECLARE(mono_jit_tls);
#endif
-#ifndef MONO_ARCH_MONITOR_ENTER_ADJUSTMENT
-#define MONO_ARCH_MONITOR_ENTER_ADJUSTMENT 1
-#endif
-
MonoTraceSpec *mono_jit_trace_calls = NULL;
gboolean mono_compile_aot = FALSE;
/* If this is set, no code is generated dynamically, everything is taken from AOT files */
gboolean mono_aot_only = FALSE;
/* Whenever to use IMT */
-#ifdef MONO_ARCH_HAVE_IMT
-gboolean mono_use_imt = TRUE;
-#else
-gboolean mono_use_imt = FALSE;
-#endif
+gboolean mono_use_imt = ARCH_HAVE_IMT;
MonoMethodDesc *mono_inject_async_exc_method = NULL;
int mono_inject_async_exc_pos;
MonoMethodDesc *mono_break_at_bb_method = NULL;
@@ -153,6 +139,8 @@ gboolean disable_vtypes_in_regs = FALSE;
gboolean mono_dont_free_global_codeman;
+static GSList *tramp_infos;
+
gpointer
mono_realloc_native_code (MonoCompile *cfg)
{
@@ -326,9 +314,9 @@ get_method_from_ip (void *ip)
else
return NULL;
}
- method = mono_method_full_name (ji->method, TRUE);
+ method = mono_method_full_name (jinfo_get_method (ji), TRUE);
/* FIXME: unused ? */
- location = mono_debug_lookup_source_location (ji->method, (guint32)((guint8*)ip - (guint8*)ji->code_start), domain);
+ location = mono_debug_lookup_source_location (jinfo_get_method (ji), (guint32)((guint8*)ip - (guint8*)ji->code_start), domain);
res = g_strdup_printf (" %s + 0x%x (%p %p) [%p - %s]", method, (int)((char*)ip - (char*)ji->code_start), ji->code_start, (char*)ji->code_start + ji->code_size, domain, domain->friendly_name);
@@ -382,6 +370,7 @@ mono_print_method_from_ip (void *ip)
FindTrampUserData user_data;
MonoGenericSharingContext*gsctx;
const char *shared_type;
+ GSList *l;
ji = mini_jit_info_table_find (domain, ip, &target_domain);
if (!ji) {
@@ -394,14 +383,23 @@ mono_print_method_from_ip (void *ip)
char *mname = mono_method_full_name (user_data.method, TRUE);
printf ("IP %p is a JIT trampoline for %s\n", ip, mname);
g_free (mname);
+ return;
}
- else
- g_print ("No method at %p\n", ip);
+ for (l = tramp_infos; l; l = l->next) {
+ MonoTrampInfo *tinfo = l->data;
+
+ if ((guint8*)ip >= tinfo->code && (guint8*)ip <= tinfo->code + tinfo->code_size) {
+ printf ("IP %p is at offset 0x%x of trampoline '%s'.\n", ip, (int)((guint8*)ip - tinfo->code), tinfo->name);
+ return;
+ }
+ }
+
+ g_print ("No method at %p\n", ip);
fflush (stdout);
return;
}
- method = mono_method_full_name (ji->method, TRUE);
- source = mono_debug_lookup_source_location (ji->method, (guint32)((guint8*)ip - (guint8*)ji->code_start), target_domain);
+ method = mono_method_full_name (jinfo_get_method (ji), TRUE);
+ source = mono_debug_lookup_source_location (jinfo_get_method (ji), (guint32)((guint8*)ip - (guint8*)ji->code_start), target_domain);
gsctx = mono_jit_info_get_generic_sharing_context (ji);
shared_type = "";
@@ -430,6 +428,8 @@ mono_print_method_from_ip (void *ip)
*/
gboolean mono_method_same_domain (MonoJitInfo *caller, MonoJitInfo *callee)
{
+ MonoMethod *cmethod;
+
if (!caller || !callee)
return FALSE;
@@ -440,8 +440,9 @@ gboolean mono_method_same_domain (MonoJitInfo *caller, MonoJitInfo *callee)
if (caller->domain_neutral && !callee->domain_neutral)
return FALSE;
- if ((caller->method->klass == mono_defaults.appdomain_class) &&
- (strstr (caller->method->name, "InvokeInDomain"))) {
+ cmethod = jinfo_get_method (caller);
+ if ((cmethod->klass == mono_defaults.appdomain_class) &&
+ (strstr (cmethod->name, "InvokeInDomain"))) {
/* The InvokeInDomain methods change the current appdomain */
return FALSE;
}
@@ -578,6 +579,22 @@ mono_emit_unwind_op (MonoCompile *cfg, int when, int tag, int reg, int val)
op->when = when;
cfg->unwind_ops = g_slist_append_mempool (cfg->mempool, cfg->unwind_ops, op);
+ if (cfg->verbose_level > 1) {
+ switch (tag) {
+ case DW_CFA_def_cfa:
+ printf ("CFA: [%x] def_cfa: %s+0x%x\n", when, mono_arch_regname (reg), val);
+ break;
+ case DW_CFA_def_cfa_register:
+ printf ("CFA: [%x] def_cfa_reg: %s\n", when, mono_arch_regname (reg));
+ break;
+ case DW_CFA_def_cfa_offset:
+ printf ("CFA: [%x] def_cfa_offset: 0x%x\n", when, val);
+ break;
+ case DW_CFA_offset:
+ printf ("CFA: [%x] offset: %s at cfa-0x%x\n", when, mono_arch_regname (reg), -val);
+ break;
+ }
+ }
}
MonoJumpInfoToken *
@@ -633,6 +650,38 @@ mono_tramp_info_free (MonoTrampInfo *info)
g_free (info);
}
+/*
+ * mono_tramp_info_register:
+ *
+ * Remember INFO for use by xdebug, mono_print_method_from_ip (), jit maps, etc.
+ * INFO can be NULL.
+ * Frees INFO.
+ */
+void
+mono_tramp_info_register (MonoTrampInfo *info)
+{
+ MonoTrampInfo *copy;
+
+ if (!info)
+ return;
+
+ copy = g_new0 (MonoTrampInfo, 1);
+ copy->code = info->code;
+ copy->code_size = info->code_size;
+ copy->name = g_strdup (info->name);
+
+ mono_jit_lock ();
+ tramp_infos = g_slist_prepend (tramp_infos, copy);
+ mono_jit_unlock ();
+
+ mono_save_trampoline_xdebug_info (info);
+
+ if (mono_jit_map_is_enabled ())
+ mono_emit_jit_tramp (info->code, info->code_size, info->name);
+
+ mono_tramp_info_free (info);
+}
+
G_GNUC_UNUSED static void
break_count (void)
{
@@ -848,6 +897,8 @@ mono_type_to_store_membase (MonoCompile *cfg, MonoType *type)
if (type->byref)
return OP_STORE_MEMBASE_REG;
+ type = mini_replace_type (type);
+
handle_enum:
switch (type->type) {
case MONO_TYPE_I1:
@@ -910,7 +961,7 @@ mono_type_to_load_membase (MonoCompile *cfg, MonoType *type)
if (type->byref)
return OP_LOAD_MEMBASE;
- type = mono_type_get_underlying_type (type);
+ type = mini_replace_type (type);
switch (type->type) {
case MONO_TYPE_I1:
@@ -988,6 +1039,8 @@ mini_type_to_ldind (MonoCompile* cfg, MonoType *type)
guint
mini_type_to_stind (MonoCompile* cfg, MonoType *type)
{
+ type = mini_replace_type (type);
+
if (cfg->generic_sharing_context && !type->byref) {
if (type->type == MONO_TYPE_VAR || type->type == MONO_TYPE_MVAR) {
if (mini_type_var_is_vt (cfg, type))
@@ -1167,6 +1220,8 @@ mono_compile_create_var_for_vreg (MonoCompile *cfg, MonoType *type, int opcode,
int num = cfg->num_varinfo;
gboolean regpair;
+ type = mini_replace_type (type);
+
if ((num + 1) >= cfg->varinfo_count) {
int orig_count = cfg->varinfo_count;
cfg->varinfo_count = cfg->varinfo_count ? (cfg->varinfo_count * 2) : 64;
@@ -1193,7 +1248,7 @@ mono_compile_create_var_for_vreg (MonoCompile *cfg, MonoType *type, int opcode,
if (type->byref) {
mono_mark_vreg_as_mp (cfg, vreg);
} else {
- MonoType *t = mini_type_get_underlying_type (NULL, type);
+ MonoType *t = mini_replace_type (type);
if ((MONO_TYPE_ISSTRUCT (t) && inst->klass->has_references) || mini_type_is_reference (cfg, t)) {
inst->flags |= MONO_INST_GC_TRACK;
mono_mark_vreg_as_ref (cfg, vreg);
@@ -1275,6 +1330,7 @@ MonoInst*
mono_compile_create_var (MonoCompile *cfg, MonoType *type, int opcode)
{
int dreg;
+ type = mini_replace_type (type);
if (mono_type_is_long (type))
dreg = mono_alloc_dreg (cfg, STACK_I8);
@@ -1471,10 +1527,9 @@ mono_get_array_new_va_signature (int arity)
res = mono_metadata_signature_alloc (mono_defaults.corlib, arity + 1);
res->pinvoke = 1;
-#ifdef MONO_ARCH_VARARG_ICALLS
- /* Only set this only some archs since not all backends can handle varargs+pinvoke */
- res->call_convention = MONO_CALL_VARARG;
-#endif
+ if (ARCH_VARARG_ICALLS)
+ /* Only set this only some archs since not all backends can handle varargs+pinvoke */
+ res->call_convention = MONO_CALL_VARARG;
#ifdef TARGET_WIN32
res->call_convention = MONO_CALL_C;
@@ -2790,7 +2845,6 @@ mono_thread_start_cb (intptr_t tid, gpointer stack_start, gpointer func)
MonoInternalThread *thread;
void *jit_tls = setup_jit_tls_data (stack_start, mono_thread_abort);
thread = mono_thread_internal_current ();
- mono_debugger_thread_created (tid, thread->root_domain_thread, jit_tls, func);
if (thread)
thread->jit_data = jit_tls;
@@ -2814,7 +2868,6 @@ mono_thread_attach_cb (intptr_t tid, gpointer stack_start)
MonoInternalThread *thread;
void *jit_tls = setup_jit_tls_data (stack_start, mono_thread_abort_dummy);
thread = mono_thread_internal_current ();
- mono_debugger_thread_created (tid, thread->root_domain_thread, (MonoJitTlsData *) jit_tls, NULL);
if (thread)
thread->jit_data = jit_tls;
if (mono_profiler_get_events () & MONO_PROFILE_STATISTICAL)
@@ -2829,8 +2882,6 @@ mini_thread_cleanup (MonoInternalThread *thread)
MonoJitTlsData *jit_tls = thread->jit_data;
if (jit_tls) {
- mono_debugger_thread_cleanup (jit_tls);
-
/* We can't clean up tls information if we are on another thread, it will clean up the wrong stuff
* It would be nice to issue a warning when this happens outside of the shutdown sequence. but it's
* not a trivial thing.
@@ -2853,7 +2904,7 @@ mini_thread_cleanup (MonoInternalThread *thread)
}
int
-mini_get_tls_offset (MonoJitTlsKey key)
+mini_get_tls_offset (MonoTlsKey key)
{
int offset;
@@ -2870,14 +2921,20 @@ mini_get_tls_offset (MonoJitTlsKey key)
case TLS_KEY_LMF:
offset = mono_get_lmf_tls_offset ();
break;
+ case TLS_KEY_LMF_ADDR:
+ offset = mono_get_lmf_addr_tls_offset ();
+ break;
default:
- g_assert_not_reached ();
- offset = -1;
+ offset = mono_tls_key_get_offset (key);
+ g_assert (offset != -1);
break;
}
+
return offset;
}
+#ifndef DISABLE_JIT
+
static MonoInst*
mono_create_tls_get_offset (MonoCompile *cfg, int offset)
{
@@ -2895,21 +2952,37 @@ mono_create_tls_get_offset (MonoCompile *cfg, int offset)
return ins;
}
-static MonoInst*
-mono_create_tls_get (MonoCompile *cfg, MonoJitTlsKey key)
+gboolean
+mini_tls_get_supported (MonoCompile *cfg, MonoTlsKey key)
+{
+ if (!MONO_ARCH_HAVE_TLS_GET)
+ return FALSE;
+
+ if (cfg->compile_aot)
+ return ARCH_HAVE_TLS_GET_REG;
+ else
+ return mini_get_tls_offset (key) != -1;
+}
+
+MonoInst*
+mono_create_tls_get (MonoCompile *cfg, MonoTlsKey key)
{
/*
* TLS offsets might be different at AOT time, so load them from a GOT slot and
* use a different opcode.
*/
- if (cfg->compile_aot && MONO_ARCH_HAVE_TLS_GET && ARCH_HAVE_TLS_GET_REG) {
- MonoInst *ins, *c;
-
- EMIT_NEW_TLS_OFFSETCONST (cfg, c, key);
- MONO_INST_NEW (cfg, ins, OP_TLS_GET_REG);
- ins->dreg = mono_alloc_preg (cfg);
- ins->sreg1 = c->dreg;
- return ins;
+ if (cfg->compile_aot) {
+ if (MONO_ARCH_HAVE_TLS_GET && ARCH_HAVE_TLS_GET_REG) {
+ MonoInst *ins, *c;
+
+ EMIT_NEW_TLS_OFFSETCONST (cfg, c, key);
+ MONO_INST_NEW (cfg, ins, OP_TLS_GET_REG);
+ ins->dreg = mono_alloc_preg (cfg);
+ ins->sreg1 = c->dreg;
+ return ins;
+ } else {
+ return NULL;
+ }
}
return mono_create_tls_get_offset (cfg, mini_get_tls_offset (key));
@@ -2939,13 +3012,35 @@ mono_get_lmf_intrinsic (MonoCompile* cfg)
return mono_create_tls_get (cfg, TLS_KEY_LMF);
}
+MonoInst*
+mono_get_lmf_addr_intrinsic (MonoCompile* cfg)
+{
+ return mono_create_tls_get (cfg, TLS_KEY_LMF_ADDR);
+}
+
+#endif /* !DISABLE_JIT */
+
void
mono_add_patch_info (MonoCompile *cfg, int ip, MonoJumpInfoType type, gconstpointer target)
{
- MonoJumpInfo *ji = mono_mempool_alloc (cfg->mempool, sizeof (MonoJumpInfo));
+ MonoJumpInfo *ji = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoJumpInfo));
+
+ ji->ip.i = ip;
+ ji->type = type;
+ ji->data.target = target;
+ ji->next = cfg->patch_info;
+
+ cfg->patch_info = ji;
+}
+
+void
+mono_add_patch_info_rel (MonoCompile *cfg, int ip, MonoJumpInfoType type, gconstpointer target, int relocation)
+{
+ MonoJumpInfo *ji = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoJumpInfo));
ji->ip.i = ip;
ji->type = type;
+ ji->relocation = relocation;
ji->data.target = target;
ji->next = cfg->patch_info;
@@ -3077,6 +3172,7 @@ mono_patch_info_hash (gconstpointer data)
case MONO_PATCH_INFO_DELEGATE_TRAMPOLINE:
case MONO_PATCH_INFO_SIGNATURE:
case MONO_PATCH_INFO_TLS_OFFSET:
+ case MONO_PATCH_INFO_METHOD_CODE_SLOT:
return (ji->type << 8) | (gssize)ji->data.target;
case MONO_PATCH_INFO_GSHAREDVT_CALL:
return (ji->type << 8) | (gssize)ji->data.gsharedvt->method;
@@ -3241,6 +3337,21 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code,
}
#endif
break;
+ case MONO_PATCH_INFO_METHOD_CODE_SLOT: {
+ gpointer code_slot;
+
+ mono_domain_lock (domain);
+ if (!domain_jit_info (domain)->method_code_hash)
+ domain_jit_info (domain)->method_code_hash = g_hash_table_new (NULL, NULL);
+ code_slot = g_hash_table_lookup (domain_jit_info (domain)->method_code_hash, patch_info->data.method);
+ if (!code_slot) {
+ code_slot = mono_domain_alloc0 (domain, sizeof (gpointer));
+ g_hash_table_insert (domain_jit_info (domain)->method_code_hash, patch_info->data.method, code_slot);
+ }
+ mono_domain_unlock (domain);
+ target = code_slot;
+ break;
+ }
case MONO_PATCH_INFO_SWITCH: {
gpointer *jump_table;
int i;
@@ -3513,9 +3624,16 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code,
target = (gpointer) (size_t) mono_jit_tls_id;
break;
}
- case MONO_PATCH_INFO_TLS_OFFSET:
- target = GINT_TO_POINTER (mini_get_tls_offset (GPOINTER_TO_INT (patch_info->data.target)));
+ case MONO_PATCH_INFO_TLS_OFFSET: {
+ int offset;
+
+ offset = mini_get_tls_offset (GPOINTER_TO_INT (patch_info->data.target));
+#ifdef MONO_ARCH_HAVE_TRANSLATE_TLS_OFFSET
+ offset = mono_arch_translate_tls_offset (offset);
+#endif
+ target = GINT_TO_POINTER (offset);
break;
+ }
case MONO_PATCH_INFO_OBJC_SELECTOR_REF: {
target = NULL;
break;
@@ -3618,6 +3736,13 @@ mono_compile_create_vars (MonoCompile *cfg)
g_print ("locals done\n");
mono_arch_create_vars (cfg);
+
+ if (cfg->method->save_lmf && cfg->create_lmf_var) {
+ MonoInst *lmf_var = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
+ lmf_var->flags |= MONO_INST_VOLATILE;
+ lmf_var->flags |= MONO_INST_LMF;
+ cfg->lmf_var = lmf_var;
+ }
}
void
@@ -3774,6 +3899,8 @@ mono_save_seq_point_info (MonoCompile *cfg)
sp->il_offset = ins->inst_imm;
sp->native_offset = ins->inst_offset;
+ if (ins->flags & MONO_INST_NONEMPTY_STACK)
+ sp->flags |= MONO_SEQ_POINT_FLAG_NONEMPTY_STACK;
/* Used below */
ins->backend.size = i;
@@ -4129,7 +4256,7 @@ create_jit_info_for_trampoline (MonoMethod *wrapper, MonoTrampInfo *info)
}
jinfo = mono_domain_alloc0 (domain, MONO_SIZEOF_JIT_INFO);
- jinfo->method = wrapper;
+ jinfo->d.method = wrapper;
jinfo->code_start = info->code;
jinfo->code_size = info->code_size;
jinfo->used_regs = mono_cache_unwind_info (uw_info, info_len);
@@ -4209,7 +4336,7 @@ create_jit_info (MonoCompile *cfg, MonoMethod *method_to_compile)
generic_info_size + holes_size + arch_eh_info_size + cas_size);
}
- jinfo->method = cfg->method_to_register;
+ jinfo->d.method = cfg->method_to_register;
jinfo->code_start = cfg->native_code;
jinfo->code_size = cfg->code_len;
jinfo->used_regs = cfg->used_int_regs;
@@ -4450,7 +4577,6 @@ create_jit_info (MonoCompile *cfg, MonoMethod *method_to_compile)
* Its possible to generate dwarf unwind info for xdebug etc, but not actually
* using it during runtime, hence the define.
*/
-#ifdef MONO_ARCH_HAVE_XP_UNWIND
if (cfg->encoded_unwind_ops) {
jinfo->used_regs = mono_cache_unwind_info (cfg->encoded_unwind_ops, cfg->encoded_unwind_ops_len);
g_free (cfg->encoded_unwind_ops);
@@ -4461,7 +4587,6 @@ create_jit_info (MonoCompile *cfg, MonoMethod *method_to_compile)
jinfo->used_regs = mono_cache_unwind_info (unwind_info, info_len);
g_free (unwind_info);
}
-#endif
return jinfo;
}
@@ -4471,20 +4596,43 @@ static MonoType*
get_gsharedvt_type (MonoType *t)
{
MonoGenericParam *par = t->data.generic_param;
+ MonoGenericParam *copy;
MonoType *res;
+ MonoImage *image = NULL;
/*
* Create an anonymous gparam with a different serial so normal gshared and gsharedvt methods have
* a different instantiation.
*/
g_assert (mono_generic_param_info (par));
- par = g_memdup (par, sizeof (MonoGenericParamFull));
- par->owner = NULL;
+ if (par->owner) {
+ image = par->owner->image;
+
+ mono_image_lock (image);
+ if (!image->gsharedvt_types)
+ image->gsharedvt_types = g_hash_table_new (NULL, NULL);
+ res = g_hash_table_lookup (image->gsharedvt_types, par);
+ mono_image_unlock (image);
+ if (res)
+ return res;
+ copy = mono_image_alloc0 (image, sizeof (MonoGenericParamFull));
+ memcpy (copy, par, sizeof (MonoGenericParamFull));
+ } else {
+ copy = g_memdup (par, sizeof (MonoGenericParamFull));
+ }
+ copy->owner = NULL;
// FIXME:
- par->image = mono_defaults.corlib;
- par->serial = 1;
+ copy->image = mono_defaults.corlib;
+ copy->serial = 1;
res = mono_metadata_type_dup (NULL, t);
- res->data.generic_param = par;
+ res->data.generic_param = copy;
+
+ if (par->owner) {
+ mono_image_lock (image);
+ /* Duplicates are ok */
+ g_hash_table_insert (image->gsharedvt_types, par, res);
+ mono_image_unlock (image);
+ }
return res;
}
@@ -4675,15 +4823,14 @@ mini_init_gsctx (MonoGenericContext *context, MonoGenericSharingContext *gsctx)
* @method: the method to compile
* @opts: the optimization flags to use
* @domain: the domain where the method will be compiled in
- * @run_cctors: whether we should run type ctors if possible
- * @compile_aot: whether this is an AOT compilation
+ * @flags: compilation flags
* @parts: debug flag
*
* Returns: a MonoCompile* pointer. Caller must check the exception_type
* field in the returned struct to see if compilation succeded.
*/
MonoCompile*
-mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gboolean run_cctors, gboolean compile_aot, int parts)
+mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFlags flags, int parts)
{
MonoMethodHeader *header;
MonoMethodSignature *sig;
@@ -4695,6 +4842,9 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
gboolean try_generic_shared, try_llvm = FALSE;
MonoMethod *method_to_compile, *method_to_register;
gboolean method_is_gshared = FALSE;
+ gboolean run_cctors = (flags & JIT_FLAG_RUN_CCTORS) ? 1 : 0;
+ gboolean compile_aot = (flags & JIT_FLAG_AOT) ? 1 : 0;
+ gboolean full_aot = (flags & JIT_FLAG_FULL_AOT) ? 1 : 0;
InterlockedIncrement (&mono_jit_stats.methods_compiled);
if (mono_profiler_get_events () & MONO_PROFILE_JIT_COMPILATION)
@@ -4761,6 +4911,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
cfg->domain = domain;
cfg->verbose_level = mini_verbose;
cfg->compile_aot = compile_aot;
+ cfg->full_aot = full_aot;
cfg->skip_visibility = method->skip_visibility;
cfg->orig_method = method;
cfg->gen_seq_points = debug_options.gen_seq_points;
@@ -4867,7 +5018,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
#endif
/* The debugger has no liveness information, so avoid sharing registers/stack slots */
- if (mono_debug_using_mono_debugger () || debug_options.mdb_optimizations) {
+ if (debug_options.mdb_optimizations) {
cfg->disable_reuse_registers = TRUE;
cfg->disable_reuse_stack_slots = TRUE;
/*
@@ -5120,6 +5271,8 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
mono_handle_global_vregs (cfg);
if (cfg->opt & MONO_OPT_DEADCE)
mono_local_deadce (cfg);
+ if (cfg->opt & MONO_OPT_ALIAS_ANALYSIS)
+ mono_local_alias_analysis (cfg);
/* Disable this for LLVM to make the IR easier to handle */
if (!COMPILE_LLVM (cfg))
mono_if_conversion (cfg);
@@ -5274,6 +5427,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
#endif
if (cfg->comp_done & MONO_COMP_SSA && COMPILE_LLVM (cfg)) {
+ mono_ssa_loop_invariant_code_motion (cfg);
/* This removes MONO_INST_FAULT flags too so perform it unconditionally */
if (cfg->opt & MONO_OPT_ABCREM)
mono_perform_abc_removal (cfg);
@@ -5290,7 +5444,9 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
if (COMPILE_SOFT_FLOAT (cfg))
mono_decompose_soft_float (cfg);
#endif
- if (!COMPILE_LLVM (cfg))
+ if (COMPILE_LLVM (cfg))
+ mono_decompose_vtype_opts_llvm (cfg);
+ else
mono_decompose_vtype_opts (cfg);
if (cfg->flags & MONO_CFG_HAS_ARRAY_ACCESS)
mono_decompose_array_access_opts (cfg);
@@ -5536,7 +5692,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
#else
MonoCompile*
-mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gboolean run_cctors, gboolean compile_aot, int parts)
+mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFlags flags, int parts)
{
g_assert_not_reached ();
return NULL;
@@ -5624,7 +5780,7 @@ void
mono_emit_jit_map (MonoJitInfo *jinfo)
{
if (perf_map_file) {
- char *name = mono_method_full_name (jinfo->method, TRUE);
+ char *name = mono_method_full_name (jinfo_get_method (jinfo), TRUE);
mono_emit_jit_tramp (jinfo->code_start, jinfo->code_size, name);
g_free (name);
}
@@ -5691,9 +5847,6 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
if (jinfo)
mono_profiler_method_end_jit (method, jinfo, MONO_PROFILE_OK);
return code;
-
- //if (mono_debug_format != MONO_DEBUG_FORMAT_NONE)
- //mono_debug_add_wrapper (method, nm);
} else if ((method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME)) {
const char *name = method->name;
char *full_name, *msg;
@@ -5784,7 +5937,7 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
jit_timer = g_timer_new ();
- cfg = mini_method_compile (method, opt, target_domain, TRUE, FALSE, 0);
+ cfg = mini_method_compile (method, opt, target_domain, JIT_FLAG_RUN_CCTORS, 0);
prof_method = cfg->method;
g_timer_stop (jit_timer);
@@ -5893,7 +6046,7 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
}
if (code == NULL) {
- mono_internal_hash_table_insert (&target_domain->jit_code_hash, cfg->jit_info->method, cfg->jit_info);
+ mono_internal_hash_table_insert (&target_domain->jit_code_hash, cfg->jit_info->d.method, cfg->jit_info);
mono_domain_jit_code_hash_unlock (target_domain);
code = cfg->native_code;
@@ -6078,7 +6231,6 @@ mono_jit_compile_method_with_opt (MonoMethod *method, guint32 opt, MonoException
if (!callinfo->wrapper) {
callinfo->wrapper = p;
mono_register_jit_icall_wrapper (callinfo, p);
- mono_debug_add_icall_wrapper (method, callinfo);
}
mono_jit_unlock ();
mono_loader_unlock ();
@@ -6093,7 +6245,7 @@ mono_jit_compile_method (MonoMethod *method)
MonoException *ex = NULL;
gpointer code;
- code = mono_jit_compile_method_with_opt (method, default_opt, &ex);
+ code = mono_jit_compile_method_with_opt (method, mono_get_optimizations_for_method (method, default_opt), &ex);
if (!code) {
g_assert (ex);
mono_raise_exception (ex);
@@ -6216,6 +6368,33 @@ mono_jit_find_compiled_method_with_jit_info (MonoDomain *domain, MonoMethod *met
return NULL;
}
+gboolean mono_do_single_method_regression = FALSE;
+guint32 mono_single_method_regression_opt = 0;
+MonoMethod *mono_current_single_method = NULL;
+GSList *mono_single_method_list = NULL;
+GHashTable *mono_single_method_hash = NULL;
+
+guint32
+mono_get_optimizations_for_method (MonoMethod *method, guint32 default_opt)
+{
+ g_assert (method);
+
+ if (!mono_do_single_method_regression)
+ return default_opt;
+ if (!mono_current_single_method) {
+ if (!mono_single_method_hash)
+ mono_single_method_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
+ if (!g_hash_table_lookup (mono_single_method_hash, method)) {
+ g_hash_table_insert (mono_single_method_hash, method, method);
+ mono_single_method_list = g_slist_prepend (mono_single_method_list, method);
+ }
+ return default_opt;
+ }
+ if (method == mono_current_single_method)
+ return mono_single_method_regression_opt;
+ return default_opt;
+}
+
gpointer
mono_jit_find_compiled_method (MonoDomain *domain, MonoMethod *method)
{
@@ -6304,7 +6483,7 @@ mono_jit_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObjec
if (callee) {
MonoException *jit_ex = NULL;
- info->compiled_method = mono_jit_compile_method_with_opt (callee, default_opt, &jit_ex);
+ info->compiled_method = mono_jit_compile_method_with_opt (callee, mono_get_optimizations_for_method (callee, default_opt), &jit_ex);
if (!info->compiled_method) {
g_free (info);
g_assert (jit_ex);
@@ -6328,6 +6507,7 @@ mono_jit_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObjec
*/
#ifdef MONO_ARCH_DYN_CALL_SUPPORTED
if (mono_aot_only || debug_options.dyn_runtime_invoke) {
+ MonoType *ret_type;
MonoMethodSignature *sig = mono_method_signature (method);
gboolean supported = TRUE;
int i;
@@ -6348,8 +6528,9 @@ mono_jit_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObjec
if (supported)
info->dyn_call_info = mono_arch_dyn_call_prepare (sig);
+ ret_type = sig->ret;
if (info->dyn_call_info) {
- switch (sig->ret->type) {
+ switch (ret_type->type) {
case MONO_TYPE_VOID:
break;
case MONO_TYPE_I1:
@@ -6366,7 +6547,7 @@ mono_jit_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObjec
case MONO_TYPE_CHAR:
case MONO_TYPE_R4:
case MONO_TYPE_R8:
- info->ret_box_class = mono_class_from_mono_type (sig->ret);
+ info->ret_box_class = mono_class_from_mono_type (ret_type);
break;
case MONO_TYPE_PTR:
info->ret_box_class = mono_defaults.int_class;
@@ -6378,11 +6559,11 @@ mono_jit_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObjec
case MONO_TYPE_OBJECT:
break;
case MONO_TYPE_GENERICINST:
- if (!MONO_TYPE_IS_REFERENCE (sig->ret))
- info->ret_box_class = mono_class_from_mono_type (sig->ret);
+ if (!MONO_TYPE_IS_REFERENCE (ret_type))
+ info->ret_box_class = mono_class_from_mono_type (ret_type);
break;
case MONO_TYPE_VALUETYPE:
- info->ret_box_class = mono_class_from_mono_type (sig->ret);
+ info->ret_box_class = mono_class_from_mono_type (ret_type);
break;
default:
g_assert_not_reached ();
@@ -6473,8 +6654,7 @@ mono_jit_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObjec
return runtime_invoke (obj, params, exc, info->compiled_method);
}
-void
-SIG_HANDLER_SIGNATURE (mono_sigfpe_signal_handler)
+SIG_HANDLER_FUNC (, mono_sigfpe_signal_handler)
{
MonoException *exc = NULL;
MonoJitInfo *ji;
@@ -6508,8 +6688,7 @@ SIG_HANDLER_SIGNATURE (mono_sigfpe_signal_handler)
mono_arch_handle_exception (ctx, exc);
}
-void
-SIG_HANDLER_SIGNATURE (mono_sigill_signal_handler)
+SIG_HANDLER_FUNC (, mono_sigill_signal_handler)
{
MonoException *exc;
GET_CONTEXT;
@@ -6523,8 +6702,7 @@ SIG_HANDLER_SIGNATURE (mono_sigill_signal_handler)
#define HAVE_SIG_INFO
#endif
-void
-SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler)
+SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler)
{
MonoJitInfo *ji;
MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id);
@@ -6603,8 +6781,7 @@ SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler)
#endif
}
-void
-SIG_HANDLER_SIGNATURE (mono_sigint_signal_handler)
+SIG_HANDLER_FUNC (, mono_sigint_signal_handler)
{
MonoException *exc;
GET_CONTEXT;
@@ -6766,7 +6943,6 @@ mini_create_ftnptr (MonoDomain *domain, gpointer addr)
desc [0] = addr;
desc [1] = NULL;
# elif defined(__ppc64__) || defined(__powerpc64__)
- gpointer *desc;
desc = mono_domain_alloc0 (domain, 3 * sizeof (gpointer));
@@ -6809,6 +6985,10 @@ register_jit_stats (void)
mono_counters_register ("Method cache lookups", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.methods_lookups);
mono_counters_register ("Compiled CIL code size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.cil_code_size);
mono_counters_register ("Native code size", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.native_code_size);
+ mono_counters_register ("Aliases found", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.alias_found);
+ mono_counters_register ("Aliases eliminated", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.alias_removed);
+ mono_counters_register ("Aliased loads eliminated", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.loads_eliminated);
+ mono_counters_register ("Aliased stores eliminated", MONO_COUNTER_JIT | MONO_COUNTER_INT, &mono_jit_stats.stores_eliminated);
}
static void runtime_invoke_info_free (gpointer value);
@@ -6840,6 +7020,13 @@ delete_jump_list (gpointer key, gpointer value, gpointer user_data)
}
static void
+delete_got_slot_list (gpointer key, gpointer value, gpointer user_data)
+{
+ GSList *list = value;
+ g_slist_free (list);
+}
+
+static void
dynamic_method_info_free (gpointer key, gpointer value, gpointer user_data)
{
MonoJitDynamicMethodInfo *di = value;
@@ -6880,7 +7067,7 @@ mini_free_jit_domain_info (MonoDomain *domain)
g_hash_table_foreach (info->jump_target_hash, delete_jump_list, NULL);
g_hash_table_destroy (info->jump_target_hash);
if (info->jump_target_got_slot_hash) {
- g_hash_table_foreach (info->jump_target_got_slot_hash, delete_jump_list, NULL);
+ g_hash_table_foreach (info->jump_target_got_slot_hash, delete_got_slot_list, NULL);
g_hash_table_destroy (info->jump_target_got_slot_hash);
}
if (info->dynamic_code_hash) {
@@ -6924,6 +7111,8 @@ mini_init (const char *filename, const char *runtime_version)
}
#endif
+ InitializeCriticalSection (&jit_mutex);
+
/* Happens when using the embedding interface */
if (!default_opt_set)
default_opt = mono_parse_default_optimizations (NULL);
@@ -6933,13 +7122,6 @@ mini_init (const char *filename, const char *runtime_version)
mono_set_generic_sharing_vt_supported (TRUE);
#endif
- InitializeCriticalSection (&jit_mutex);
-
-#ifdef MONO_DEBUGGER_SUPPORTED
- if (mini_debug_running_inside_mdb ())
- mini_debugger_init ();
-#endif
-
#ifdef MONO_HAVE_FAST_TLS
MONO_FAST_TLS_INIT (mono_jit_tls);
MONO_FAST_TLS_INIT (mono_lmf_addr);
@@ -7094,11 +7276,11 @@ mini_init (const char *filename, const char *runtime_version)
/*Init arch tls information only after the metadata side is inited to make sure we see dynamic appdomain tls keys*/
mono_arch_finish_init ();
+ mono_icall_init ();
+
/* This must come after mono_init () in the aot-only case */
mono_exceptions_init ();
- mono_icall_init ();
-
/* This should come after mono_init () too */
mini_gc_init ();
@@ -7166,6 +7348,8 @@ mini_init (const char *filename, const char *runtime_version)
register_opcode_emulation (OP_LDIV_UN, "__emul_ldiv_un", "long long long", mono_lldiv_un, "mono_lldiv_un", FALSE);
register_opcode_emulation (OP_LREM, "__emul_lrem", "long long long", mono_llrem, "mono_llrem", FALSE);
register_opcode_emulation (OP_LREM_UN, "__emul_lrem_un", "long long long", mono_llrem_un, "mono_llrem_un", FALSE);
+#endif
+#if !defined(MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS) || defined(MONO_ARCH_EMULATE_LONG_MUL_OVF_OPTS)
register_opcode_emulation (OP_LMUL_OVF_UN, "__emul_lmul_ovf_un", "long long long", mono_llmult_ovf_un, "mono_llmult_ovf_un", FALSE);
register_opcode_emulation (OP_LMUL_OVF, "__emul_lmul_ovf", "long long long", mono_llmult_ovf, "mono_llmult_ovf", FALSE);
#endif
@@ -7193,7 +7377,7 @@ mini_init (const char *filename, const char *runtime_version)
#endif
#if defined(MONO_ARCH_EMULATE_MUL_DIV) || defined(MONO_ARCH_SOFT_FLOAT_FALLBACK)
- if (EMUL_MUL_DIV || mono_arch_is_soft_float ()) {
+ if (ARCH_EMULATE_MUL_DIV || mono_arch_is_soft_float ()) {
register_opcode_emulation (OP_FDIV, "__emul_fdiv", "double double double", mono_fdiv, "mono_fdiv", FALSE);
}
#endif
@@ -7275,6 +7459,8 @@ mini_init (const char *filename, const char *runtime_version)
#if SIZEOF_REGISTER == 4
register_opcode_emulation (OP_FCONV_TO_U, "__emul_fconv_to_u", "uint32 double", mono_fconv_u4, "mono_fconv_u4", TRUE);
+#else
+ register_opcode_emulation (OP_FCONV_TO_U, "__emul_fconv_to_u", "ulong double", mono_fconv_u8, "mono_fconv_u8", TRUE);
#endif
/* other jit icalls */
@@ -7311,7 +7497,7 @@ mini_init (const char *filename, const char *runtime_version)
register_icall (mono_array_new_4, "mono_array_new_4", "object ptr int int int int", FALSE);
register_icall (mono_get_native_calli_wrapper, "mono_get_native_calli_wrapper", "ptr ptr ptr ptr", FALSE);
register_icall (mono_resume_unwind, "mono_resume_unwind", "void", TRUE);
- register_icall (mono_gsharedvt_constrained_call, "mono_gsharedvt_constrained_call", "object ptr ptr ptr ptr ptr", TRUE);
+ register_icall (mono_gsharedvt_constrained_call, "mono_gsharedvt_constrained_call", "object ptr ptr ptr ptr ptr", FALSE);
register_icall (mono_gsharedvt_value_copy, "mono_gsharedvt_value_copy", "void ptr ptr ptr", TRUE);
register_icall (mono_gc_wbarrier_value_copy_bitmap, "mono_gc_wbarrier_value_copy_bitmap", "void ptr ptr int int", FALSE);
@@ -7457,8 +7643,6 @@ mini_cleanup (MonoDomain *domain)
mono_domain_free (domain, TRUE);
#endif
- mono_debugger_cleanup ();
-
#ifdef ENABLE_LLVM
if (mono_use_llvm)
mono_llvm_cleanup ();
@@ -7775,3 +7959,14 @@ mono_jumptable_get_entry (guint8 *code_ptr)
return mono_arch_jumptable_entry_from_code (code_ptr);
}
#endif
+
+/*
+ * mini_replace_type:
+ *
+ * Replace the type used in the metadata stream with what the JIT will actually use during compilation.
+*/
+MonoType*
+mini_replace_type (MonoType *type)
+{
+ return mono_type_get_underlying_type (type);
+}
diff --git a/mono/mini/mini.h b/mono/mini/mini.h
index a99aa427ab..5393537096 100644
--- a/mono/mini/mini.h
+++ b/mono/mini/mini.h
@@ -102,17 +102,6 @@
#define LLVM_CHECK_VERSION(major,minor) 0
#endif
-/*
- * Whenever we are using mono's LLVM branch.
- * This can be used in if statements, code which references new definitions from the branch
- * still needs an #ifdef LLVM_MONO_BRANCH.
- */
-#ifdef LLVM_MONO_BRANCH
-#define IS_LLVM_MONO_BRANCH 1
-#else
-#define IS_LLVM_MONO_BRANCH 0
-#endif
-
#define NOT_IMPLEMENTED do { g_assert_not_reached (); } while (0)
/* for 32 bit systems */
@@ -133,7 +122,7 @@
#endif
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 93
+#define MONO_AOT_FILE_VERSION 97
//TODO: This is x86/amd64 specific.
#define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6))
@@ -284,6 +273,10 @@ typedef struct MonoAotFileInfo
/* These are used for sanity checking object layout problems when cross-compiling */
guint32 double_align, long_align, generic_tramp_num;
+ /* The page size used by trampoline pages */
+ guint32 tramp_page_size;
+ /* The offset where the trampolines begin on a trampoline page */
+ guint32 tramp_page_code_offsets [MONO_AOT_TRAMP_NUM];
} MonoAotFileInfo;
/* Per-domain information maintained by the JIT */
@@ -340,8 +333,10 @@ typedef struct {
*/
typedef MonoStackFrameInfo StackFrameInfo;
+#define MONO_SEQ_POINT_FLAG_NONEMPTY_STACK 1
+
typedef struct {
- int il_offset, native_offset;
+ int il_offset, native_offset, flags;
/* Indexes of successor sequence points */
int *next;
/* Number of entries in next */
@@ -467,7 +462,7 @@ enum {
/* FIXME: Add more instructions */
/* INEG sets the condition codes, and the OP_LNEG decomposition depends on this on x86 */
-#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR))
+#define MONO_INS_HAS_NO_SIDE_EFFECT(ins) (MONO_IS_MOVE (ins) || (ins->opcode == OP_ICONST) || (ins->opcode == OP_I8CONST) || MONO_IS_ZERO (ins) || (ins->opcode == OP_ADD_IMM) || (ins->opcode == OP_R8CONST) || (ins->opcode == OP_LADD_IMM) || (ins->opcode == OP_ISUB_IMM) || (ins->opcode == OP_IADD_IMM) || (ins->opcode == OP_LNEG) || (ins->opcode == OP_ISUB) || (ins->opcode == OP_CMOV_IGE) || (ins->opcode == OP_ISHL_IMM) || (ins->opcode == OP_ISHR_IMM) || (ins->opcode == OP_ISHR_UN_IMM) || (ins->opcode == OP_IAND_IMM) || (ins->opcode == OP_ICONV_TO_U1) || (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_SEXT_I4) || (ins->opcode == OP_LCONV_TO_U1) || (ins->opcode == OP_ICONV_TO_U2) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_LCONV_TO_I2) || (ins->opcode == OP_LDADDR) || (ins->opcode == OP_PHI) || (ins->opcode == OP_NOP) || (ins->opcode == OP_ZEXT_I4) || (ins->opcode == OP_NOT_NULL))
#define MONO_METHOD_IS_FINAL(m) (((m)->flags & METHOD_ATTRIBUTE_FINAL) || ((m)->klass && ((m)->klass->flags & TYPE_ATTRIBUTE_SEALED)))
@@ -524,6 +519,11 @@ extern gboolean mono_do_x86_stack_align;
extern const char *mono_build_date;
extern gboolean mono_do_signal_chaining;
extern gboolean mono_use_llvm;
+extern gboolean mono_do_single_method_regression;
+extern guint32 mono_single_method_regression_opt;
+extern MonoMethod *mono_current_single_method;
+extern GSList *mono_single_method_list;
+extern GHashTable *mono_single_method_hash;
#define INS_INFO(opcode) (&ins_info [((opcode) - OP_START - 1) * 4])
@@ -842,10 +842,15 @@ struct MonoCallInst {
GSList *out_ireg_args;
GSList *out_freg_args;
GSList *outarg_vts;
+ gpointer call_info;
#ifdef ENABLE_LLVM
LLVMCallInfo *cinfo;
int rgctx_arg_reg, imt_arg_reg;
#endif
+#ifdef TARGET_ARM
+ /* See the comment in mini-arm.c!mono_arch_emit_call for RegTypeFP. */
+ GSList *float_args;
+#endif
};
struct MonoCallArgParm {
@@ -868,6 +873,7 @@ enum {
MONO_INST_TAILCALL = 4,
MONO_INST_VOLATILE = 4,
MONO_INST_NOTYPECHECK = 4,
+ MONO_INST_NONEMPTY_STACK = 4, /* in SEQ_POINT */
MONO_INST_UNALIGNED = 8,
MONO_INST_CFOLD_TAKEN = 8, /* On branches */
MONO_INST_CFOLD_NOT_TAKEN = 16, /* On branches */
@@ -883,7 +889,7 @@ enum {
*/
MONO_INST_LMF = 32,
/* On loads, the source address points to a constant value */
- MONO_INST_CONSTANT_LOAD = 64,
+ MONO_INST_INVARIANT_LOAD = 64,
/* On variables, the variable needs GC tracking */
MONO_INST_GC_TRACK = 128,
/*
@@ -1048,16 +1054,6 @@ typedef struct {
gboolean orig_ex_ctx_set;
} MonoJitTlsData;
-/* TLS entries used by JITted code */
-typedef enum {
- /* mono_thread_internal_current () */
- TLS_KEY_THREAD = 0,
- TLS_KEY_JIT_TLS = 1,
- /* mono_domain_get () */
- TLS_KEY_DOMAIN = 2,
- TLS_KEY_LMF = 3
-} MonoJitTlsKey;
-
/*
* This structure is an extension of MonoLMF and contains extra information.
*/
@@ -1188,6 +1184,8 @@ typedef struct MonoJumpInfoGSharedVtCall MonoJumpInfoGSharedVtCall;
typedef struct MonoJumpInfo MonoJumpInfo;
struct MonoJumpInfo {
MonoJumpInfo *next;
+ /* Relocation type for patching */
+ int relocation;
union {
int i;
guint8 *p;
@@ -1262,6 +1260,13 @@ typedef enum {
(t) == MONO_TRAMPOLINE_MONITOR_ENTER || \
(t) == MONO_TRAMPOLINE_MONITOR_EXIT)
+/* These trampolines receive an argument directly in a register */
+#define MONO_TRAMPOLINE_TYPE_HAS_ARG(t) \
+ ((t) == MONO_TRAMPOLINE_GENERIC_CLASS_INIT || \
+ (t) == MONO_TRAMPOLINE_MONITOR_ENTER || \
+ (t) == MONO_TRAMPOLINE_MONITOR_EXIT || \
+ (t) == MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD)
+
/* optimization flags */
#define OPTFLAG(id,shift,name,descr) MONO_OPT_ ## id = 1 << shift,
enum {
@@ -1269,6 +1274,16 @@ enum {
MONO_OPT_LAST
};
+/* Flags for mini_method_compile () */
+typedef enum {
+ /* Whenever to run cctors during JITting */
+ JIT_FLAG_RUN_CCTORS = (1 << 0),
+ /* Whenever this is an AOT compilation */
+ JIT_FLAG_AOT = (1 << 1),
+ /* Whenever this is a full AOT compilation */
+ JIT_FLAG_FULL_AOT = (1 << 2)
+} JitFlags;
+
/* Bit-fields in the MonoBasicBlock.region */
#define MONO_REGION_TRY 0
#define MONO_REGION_FINALLY 16
@@ -1384,6 +1399,9 @@ typedef struct {
/* For native-to-managed wrappers, the saved old domain */
MonoInst *orig_domain_var;
+ MonoInst *lmf_var;
+ MonoInst *lmf_addr_var;
+
unsigned char *cil_start;
#ifdef __native_client_codegen__
/* this alloc is not aligned, native_code */
@@ -1412,6 +1430,7 @@ typedef struct {
guint run_cctors : 1;
guint need_lmf_area : 1;
guint compile_aot : 1;
+ guint full_aot : 1;
guint compile_llvm : 1;
guint got_var_allocated : 1;
guint ret_var_is_local : 1;
@@ -1429,6 +1448,17 @@ typedef struct {
guint disable_vreg_to_lvreg : 1;
guint disable_deadce_vars : 1;
guint disable_out_of_line_bblocks : 1;
+ guint create_lmf_var : 1;
+ /*
+ * When this is set, the code to push/pop the LMF from the LMF stack is generated as IR
+ * instead of being generated in emit_prolog ()/emit_epilog ().
+ */
+ guint lmf_ir : 1;
+ /*
+ * Whenever to use the mono_lmf TLS variable instead of indirection through the
+ * mono_lmf_addr TLS variable.
+ */
+ guint lmf_ir_mono_lmf : 1;
guint gen_write_barriers : 1;
guint init_ref_vars : 1;
guint extend_live_ranges : 1;
@@ -1443,6 +1473,9 @@ typedef struct {
guint compute_gc_maps : 1;
guint soft_breakpoints : 1;
guint arch_eh_jit_info : 1;
+ guint has_indirection : 1;
+ guint has_atomic_add_new_i4 : 1;
+ guint has_atomic_exchange_i4 : 1;
gpointer debug_info;
guint32 lmf_offset;
guint16 *intvars;
@@ -1612,6 +1645,10 @@ typedef struct {
gint32 cas_linkdemand;
gint32 cas_demand_generation;
gint32 generic_virtual_invocations;
+ gint32 alias_found;
+ gint32 alias_removed;
+ gint32 loads_eliminated;
+ gint32 stores_eliminated;
int methods_with_llvm;
int methods_without_llvm;
char *max_ratio_method;
@@ -1882,6 +1919,7 @@ MonoDebugOptions *mini_get_debug_options (void) MONO_INTERNAL;
/* helper methods */
void mono_disable_optimizations (guint32 opts) MONO_INTERNAL;
void mono_set_optimizations (guint32 opts) MONO_INTERNAL;
+guint32 mono_get_optimizations_for_method (MonoMethod *method, guint32 default_opt) MONO_INTERNAL;
void mono_set_verbose_level (guint32 level) MONO_INTERNAL;
MonoJumpInfoToken* mono_jump_info_token_new (MonoMemPool *mp, MonoImage *image, guint32 token) MONO_INTERNAL;
MonoJumpInfoToken* mono_jump_info_token_new2 (MonoMemPool *mp, MonoImage *image, guint32 token, MonoGenericContext *context) MONO_INTERNAL;
@@ -1945,6 +1983,7 @@ guint mini_type_to_stind (MonoCompile* cfg, MonoType *type) M
guint32 mono_reverse_branch_op (guint32 opcode) MONO_INTERNAL;
void mono_disassemble_code (MonoCompile *cfg, guint8 *code, int size, char *id) MONO_INTERNAL;
void mono_add_patch_info (MonoCompile *cfg, int ip, MonoJumpInfoType type, gconstpointer target) MONO_LLVM_INTERNAL;
+void mono_add_patch_info_rel (MonoCompile *cfg, int ip, MonoJumpInfoType type, gconstpointer target, int relocation) MONO_LLVM_INTERNAL;
void mono_remove_patch_info (MonoCompile *cfg, int ip) MONO_INTERNAL;
MonoJumpInfo* mono_patch_info_dup_mp (MonoMemPool *mp, MonoJumpInfo *patch_info) MONO_INTERNAL;
guint mono_patch_info_hash (gconstpointer data) MONO_INTERNAL;
@@ -1963,11 +2002,14 @@ MonoNativeTlsKey mono_get_jit_tls_key (void) MONO_INTERNAL;
gint32 mono_get_jit_tls_offset (void) MONO_INTERNAL;
gint32 mono_get_lmf_tls_offset (void) MONO_INTERNAL;
gint32 mono_get_lmf_addr_tls_offset (void) MONO_INTERNAL;
-int mini_get_tls_offset (MonoJitTlsKey key) MONO_INTERNAL;
+int mini_get_tls_offset (MonoTlsKey key) MONO_INTERNAL;
+gboolean mini_tls_get_supported (MonoCompile *cfg, MonoTlsKey key) MONO_INTERNAL;
+MonoInst* mono_create_tls_get (MonoCompile *cfg, MonoTlsKey key) MONO_INTERNAL;
MonoInst* mono_get_jit_tls_intrinsic (MonoCompile *cfg) MONO_INTERNAL;
MonoInst* mono_get_domain_intrinsic (MonoCompile* cfg) MONO_INTERNAL;
MonoInst* mono_get_thread_intrinsic (MonoCompile* cfg) MONO_INTERNAL;
MonoInst* mono_get_lmf_intrinsic (MonoCompile* cfg) MONO_INTERNAL;
+MonoInst* mono_get_lmf_addr_intrinsic (MonoCompile* cfg) MONO_INTERNAL;
GList *mono_varlist_insert_sorted (MonoCompile *cfg, GList *list, MonoMethodVar *mv, int sort_type) MONO_INTERNAL;
GList *mono_varlist_sort (MonoCompile *cfg, GList *list, int sort_type) MONO_INTERNAL;
void mono_analyze_liveness (MonoCompile *cfg) MONO_INTERNAL;
@@ -1976,7 +2018,7 @@ void mono_linear_scan (MonoCompile *cfg, GList *vars, GLis
void mono_global_regalloc (MonoCompile *cfg) MONO_INTERNAL;
void mono_create_jump_table (MonoCompile *cfg, MonoInst *label, MonoBasicBlock **bbs, int num_blocks) MONO_INTERNAL;
int mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) MONO_INTERNAL;
-MonoCompile *mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gboolean run_cctors, gboolean compile_aot, int parts) MONO_INTERNAL;
+MonoCompile *mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFlags flags, int parts) MONO_INTERNAL;
void mono_destroy_compile (MonoCompile *cfg) MONO_INTERNAL;
MonoJitICallInfo *mono_find_jit_opcode_emulation (int opcode) MONO_INTERNAL;
void mono_print_ins_index (int i, MonoInst *ins) MONO_INTERNAL;
@@ -2041,6 +2083,12 @@ void mono_nacl_gc(void);
#define NACL_SIZE(a, b) (a)
#endif
+static inline MonoMethod*
+jinfo_get_method (MonoJitInfo *ji)
+{
+ return mono_jit_info_get_method (ji);
+}
+
/* AOT */
void mono_aot_init (void) MONO_INTERNAL;
void mono_aot_cleanup (void) MONO_INTERNAL;
@@ -2149,6 +2197,7 @@ gconstpointer mono_get_trampoline_func (MonoTrampolineType tramp_type);
gpointer mini_get_vtable_trampoline (int slot_index) MONO_INTERNAL;
char* mono_get_generic_trampoline_name (MonoTrampolineType tramp_type) MONO_INTERNAL;
char* mono_get_rgctx_fetch_trampoline_name (int slot) MONO_INTERNAL;
+gpointer mini_get_nullified_class_init_trampoline (void) MONO_INTERNAL;
gpointer mini_add_method_trampoline (MonoMethod *orig_method, MonoMethod *m, gpointer compiled_method, gboolean add_static_rgctx_tramp, gboolean add_unbox_tramp) MONO_INTERNAL;
gboolean mini_jit_info_is_gsharedvt (MonoJitInfo *ji) MONO_INTERNAL;
@@ -2180,6 +2229,8 @@ void mono_emit_unwind_op (MonoCompile *cfg, int when,
int val) MONO_INTERNAL;
MonoTrampInfo* mono_tramp_info_create (const char *name, guint8 *code, guint32 code_size, MonoJumpInfo *ji, GSList *unwind_ops) MONO_INTERNAL;
void mono_tramp_info_free (MonoTrampInfo *info) MONO_INTERNAL;
+void mono_tramp_info_register (MonoTrampInfo *info) MONO_INTERNAL;
+int mini_exception_id_by_name (const char *name) MONO_INTERNAL;
int mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_bblock, MonoBasicBlock *end_bblock,
MonoInst *return_var, GList *dont_inline, MonoInst **inline_args,
@@ -2188,6 +2239,7 @@ int mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoB
MonoInst *mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins) MONO_INTERNAL;
void mono_decompose_long_opts (MonoCompile *cfg) MONO_INTERNAL;
void mono_decompose_vtype_opts (MonoCompile *cfg) MONO_INTERNAL;
+void mono_decompose_vtype_opts_llvm (MonoCompile *cfg) MONO_INTERNAL;
void mono_decompose_array_access_opts (MonoCompile *cfg) MONO_INTERNAL;
void mono_decompose_soft_float (MonoCompile *cfg) MONO_INTERNAL;
void mono_handle_global_vregs (MonoCompile *cfg) MONO_INTERNAL;
@@ -2259,6 +2311,8 @@ gboolean mono_arch_gsharedvt_sig_supported (MonoMethodSignature *sig) MONO_
gpointer mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) MONO_INTERNAL;
gpointer mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_sig, MonoMethodSignature *gsharedvt_sig, MonoGenericSharingContext *gsctx, gboolean gsharedvt_in, gint32 vcall_offset, gboolean calli) MONO_INTERNAL;
gboolean mono_arch_opcode_needs_emulation (MonoCompile *cfg, int opcode) MONO_INTERNAL;
+gboolean mono_arch_tail_call_supported (MonoCompile *cfg, MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig) MONO_INTERNAL;
+int mono_arch_translate_tls_offset (int offset) MONO_INTERNAL;
#ifdef MONO_ARCH_SOFT_FLOAT_FALLBACK
gboolean mono_arch_is_soft_float (void) MONO_INTERNAL;
@@ -2282,6 +2336,7 @@ void mono_arch_skip_breakpoint (MonoContext *ctx, MonoJitInfo *
void mono_arch_skip_single_step (MonoContext *ctx) MONO_INTERNAL;
gpointer mono_arch_get_seq_point_info (MonoDomain *domain, guint8 *code) MONO_INTERNAL;
void mono_arch_setup_resume_sighandler_ctx (MonoContext *ctx, gpointer func) MONO_INTERNAL;
+void mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf) MONO_INTERNAL;
#endif
#ifdef USE_JUMP_TABLES
@@ -2323,7 +2378,6 @@ mgreg_t mono_arch_context_get_int_reg (MonoContext *ctx, int reg) MONO_INTE
void mono_arch_context_set_int_reg (MonoContext *ctx, int reg, mgreg_t val) MONO_INTERNAL;
void mono_arch_flush_register_windows (void) MONO_INTERNAL;
gboolean mono_arch_is_inst_imm (gint64 imm) MONO_INTERNAL;
-MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg) MONO_INTERNAL;
gboolean mono_arch_is_int_overflow (void *sigctx, void *info) MONO_INTERNAL;
void mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) MONO_INTERNAL;
guint32 mono_arch_get_patch_offset (guint8 *code) MONO_INTERNAL;
@@ -2394,6 +2448,7 @@ MonoJitInfo * mono_find_jit_info (MonoDomain *domain, MonoJitTlsD
typedef gboolean (*MonoExceptionFrameWalk) (MonoMethod *method, gpointer ip, size_t native_offset, gboolean managed, gpointer user_data);
gboolean mono_exception_walk_trace (MonoException *ex, MonoExceptionFrameWalk func, gpointer user_data);
+void mono_restore_context (MonoContext *ctx) MONO_INTERNAL;
gboolean
mono_find_jit_info_ext (MonoDomain *domain, MonoJitTlsData *jit_tls,
@@ -2435,6 +2490,7 @@ void mono_ssa_cprop (MonoCompile *cfg) MONO_INTERNAL
void mono_ssa_deadce (MonoCompile *cfg) MONO_INTERNAL;
void mono_ssa_strength_reduction (MonoCompile *cfg) MONO_INTERNAL;
void mono_free_loop_info (MonoCompile *cfg) MONO_INTERNAL;
+void mono_ssa_loop_invariant_code_motion (MonoCompile *cfg) MONO_INTERNAL;
void mono_ssa_compute2 (MonoCompile *cfg);
void mono_ssa_remove2 (MonoCompile *cfg);
@@ -2453,7 +2509,6 @@ void mono_debug_serialize_debug_info (MonoCompile *cfg, guint8 **out_
void mono_debug_add_aot_method (MonoDomain *domain,
MonoMethod *method, guint8 *code_start,
guint8 *debug_info, guint32 debug_info_len) MONO_INTERNAL;
-void mono_debug_add_icall_wrapper (MonoMethod *method, MonoJitICallInfo* info) MONO_INTERNAL;
MONO_API void mono_debug_print_vars (gpointer ip, gboolean only_arguments);
MONO_API void mono_debugger_run_finally (MonoContext *start_ctx);
@@ -2461,16 +2516,6 @@ extern gssize mono_breakpoint_info_index [MONO_BREAKPOINT_ARRAY_SIZE];
MONO_API gboolean mono_breakpoint_clean_code (guint8 *method_start, guint8 *code, int offset, guint8 *buf, int size);
-#ifdef MONO_DEBUGGER_SUPPORTED
-
-/* Mono Debugger support */
-void mini_debugger_init (void);
-int mini_debugger_main (MonoDomain *domain, MonoAssembly *assembly, int argc, char **argv);
-gboolean mini_debug_running_inside_mdb (void);
-void mini_debugger_set_attach_ok (void);
-
-#endif
-
/* Tracing */
MonoTraceSpec *mono_trace_parse_options (const char *options) MONO_INTERNAL;
void mono_trace_set_assembly (MonoAssembly *assembly) MONO_INTERNAL;
@@ -2488,6 +2533,8 @@ extern void
mono_local_cprop (MonoCompile *cfg);
extern void
mono_local_deadce (MonoCompile *cfg);
+void
+mono_local_alias_analysis (MonoCompile *cfg) MONO_INTERNAL;
/* CAS - stack walk */
MonoSecurityFrame* ves_icall_System_Security_SecurityFrame_GetSecurityFrame (gint32 skip) MONO_INTERNAL;
@@ -2583,6 +2630,7 @@ void mono_generic_sharing_cleanup (void) MONO_INTERNAL;
MonoClass* mini_class_get_container_class (MonoClass *class) MONO_INTERNAL;
MonoGenericContext* mini_class_get_context (MonoClass *class) MONO_INTERNAL;
+MonoType* mini_replace_type (MonoType *type) MONO_INTERNAL;
MonoType* mini_get_basic_type_from_generic (MonoGenericSharingContext *gsctx, MonoType *type) MONO_INTERNAL;
MonoType* mini_type_get_underlying_type (MonoGenericSharingContext *gsctx, MonoType *type) MONO_INTERNAL;
MonoMethod* mini_get_shared_method (MonoMethod *method) MONO_INTERNAL;
@@ -2604,7 +2652,8 @@ gboolean mini_is_gsharedvt_klass (MonoCompile *cfg, MonoClass *klass); /* should
gboolean mini_is_gsharedvt_type (MonoCompile *cfg, MonoType *t) MONO_INTERNAL;
gboolean mini_is_gsharedvt_signature (MonoCompile *cfg, MonoMethodSignature *sig) MONO_INTERNAL;
gboolean mini_is_gsharedvt_type_gsctx (MonoGenericSharingContext *gsctx, MonoType *t) MONO_INTERNAL;
-gboolean mini_is_gsharedvt_variable_type (MonoCompile *cfg, MonoType *t) MONO_INTERNAL;
+gboolean mini_is_gsharedvt_variable_type (MonoCompile *cfg, MonoType *t) MONO_LLVM_INTERNAL;
+gboolean mini_is_gsharedvt_variable_klass (MonoCompile *cfg, MonoClass *klass) MONO_LLVM_INTERNAL;
gboolean mini_is_gsharedvt_sharable_method (MonoMethod *method) MONO_INTERNAL;
gboolean mini_is_gsharedvt_variable_signature (MonoMethodSignature *sig) MONO_INTERNAL;
gboolean mini_is_gsharedvt_sharable_inst (MonoGenericInst *inst) MONO_INTERNAL;
@@ -2724,15 +2773,19 @@ void mono_gdb_render_native_backtraces (pid_t crashed_pid) MONO_INTERNAL;
#ifdef MONO_ARCH_USE_SIGACTION
#define SIG_HANDLER_SIGNATURE(ftn) ftn (int _dummy, siginfo_t *info, void *context)
+#define SIG_HANDLER_FUNC(access, ftn) MONO_SIGNAL_HANDLER_FUNC (access, ftn, (int _dummy, siginfo_t *info, void *context))
#define SIG_HANDLER_PARAMS _dummy, info, context
#elif defined(HOST_WIN32)
#define SIG_HANDLER_SIGNATURE(ftn) ftn (int _dummy, EXCEPTION_POINTERS *info, void *context)
+#define SIG_HANDLER_FUNC(access, ftn) MONO_SIGNAL_HANDLER_FUNC (access, ftn, (int _dummy, EXCEPTION_POINTERS *info, void *context))
#define SIG_HANDLER_PARAMS _dummy, info, context
#elif defined(__HAIKU__)
#define SIG_HANDLER_SIGNATURE(ftn) ftn (int _dummy, void *userData, vregs regs)
+#define SIG_HANDLER_FUNC(access, ftn) MONO_SIGNAL_HANDLER_FUNC (access, ftn, (int _dummy, void *userData, vregs regs))
#define SIG_HANDLER_PARAMS _dummy, userData, regs
#else
#define SIG_HANDLER_SIGNATURE(ftn) ftn (int _dummy)
+#define SIG_HANDLER_FUNC(access, ftn) MONO_SIGNAL_HANDLER_FUNC (access, ftn, (int _dummy))
#define SIG_HANDLER_PARAMS _dummy
#endif
@@ -2748,10 +2801,10 @@ gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_INTERNAL;
#define ARCH_HAVE_DELEGATE_TRAMPOLINES 0
#endif
-#ifdef MONO_ARCH_USE_OP_TAIL_CALL
-#define ARCH_USE_OP_TAIL_CALL 1
+#ifdef MONO_ARCH_HAVE_OP_TAIL_CALL
+#define ARCH_HAVE_OP_TAIL_CALL 1
#else
-#define ARCH_USE_OP_TAIL_CALL 0
+#define ARCH_HAVE_OP_TAIL_CALL 0
#endif
#ifndef MONO_ARCH_HAVE_TLS_GET
@@ -2764,4 +2817,30 @@ gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_INTERNAL;
#define ARCH_HAVE_TLS_GET_REG 0
#endif
+#ifdef MONO_ARCH_EMULATE_MUL_DIV
+#define ARCH_EMULATE_MUL_DIV 1
+#else
+#define ARCH_EMULATE_MUL_DIV 0
+#endif
+
+#ifndef MONO_ARCH_MONITOR_ENTER_ADJUSTMENT
+#define MONO_ARCH_MONITOR_ENTER_ADJUSTMENT 1
+#endif
+
+#ifndef MONO_ARCH_DYN_CALL_PARAM_AREA
+#define MONO_ARCH_DYN_CALL_PARAM_AREA 0
+#endif
+
+#ifdef MONO_ARCH_HAVE_IMT
+#define ARCH_HAVE_IMT 1
+#else
+#define ARCH_HAVE_IMT 0
+#endif
+
+#ifdef MONO_ARCH_VARARG_ICALLS
+#define ARCH_VARARG_ICALLS 1
+#else
+#define ARCH_VARARG_ICALLS 0
+#endif
+
#endif /* __MONO_MINI_H__ */
diff --git a/mono/mini/optflags-def.h b/mono/mini/optflags-def.h
index 0e754329ae..bee894bdc5 100644
--- a/mono/mini/optflags-def.h
+++ b/mono/mini/optflags-def.h
@@ -26,3 +26,4 @@ OPTFLAG(GSHARED ,25, "gshared", "Generic Sharing")
OPTFLAG(GSHAREDVT,24, "gsharedvt", "Generic sharing for valuetypes")
OPTFLAG(SIMD ,26, "simd", "Simd intrinsics")
OPTFLAG(UNSAFE ,27, "unsafe", "Remove bound checks and perform other dangerous changes")
+OPTFLAG(ALIAS_ANALYSIS ,28, "alias-analysis", "Alias analysis of locals")
diff --git a/mono/mini/patch-info.h b/mono/mini/patch-info.h
index a966be512b..12c5525423 100644
--- a/mono/mini/patch-info.h
+++ b/mono/mini/patch-info.h
@@ -50,7 +50,5 @@ PATCH_INFO(GSHAREDVT_METHOD, "gsharedvt_method")
PATCH_INFO(JIT_TLS_ID, "jit_tls_id")
PATCH_INFO(TLS_OFFSET, "tls_offset")
PATCH_INFO(OBJC_SELECTOR_REF, "objc_selector_ref")
+PATCH_INFO(METHOD_CODE_SLOT, "method_code_slot")
PATCH_INFO(NONE, "none")
-
-
-
diff --git a/mono/mini/regalloc2.c b/mono/mini/regalloc2.c
index 098ff5d4b2..b2fb35067a 100644
--- a/mono/mini/regalloc2.c
+++ b/mono/mini/regalloc2.c
@@ -252,17 +252,20 @@ handle_reg_constraints (MonoCompile *cfg)
cfg->cbb = bb;
MONO_BB_FOR_EACH_INS (bb, ins) {
const char *spec = ins_get_spec (ins->opcode);
- int dest_sreg1, dest_sreg2, dest_dreg;
+ int dest_sreg1, dest_sreg2, dest_sreg3, dest_dreg;
dest_sreg1 = MONO_ARCH_INST_FIXED_REG (spec [MONO_INST_SRC1]);
dest_sreg2 = MONO_ARCH_INST_FIXED_REG (spec [MONO_INST_SRC2]);
+ dest_sreg3 = MONO_ARCH_INST_FIXED_REG (spec [MONO_INST_SRC3]);
dest_dreg = MONO_ARCH_INST_FIXED_REG (spec [MONO_INST_DEST]);
if (MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_DEST]) ||
- MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_SRC1]) ||
- MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_SRC2]))
+ MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_SRC1]) ||
+ MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_SRC2]) ||
+ MONO_ARCH_INST_IS_REGPAIR (spec [MONO_INST_SRC3])) {
/* FIXME: */
g_assert_not_reached ();
+ }
if (spec [MONO_INST_CLOB] == 'c') {
MonoCallInst *call = (MonoCallInst*)ins;
@@ -303,7 +306,7 @@ handle_reg_constraints (MonoCompile *cfg)
if (spec [MONO_INST_CLOB] == '1') {
/* Copying sreg1 to dreg could clobber sreg2 so make a copy of sreg2 */
- if (spec [MONO_INST_SRC2] && (ins->dreg == ins->sreg2)) {
+ if (spec [MONO_INST_SRC2] != ' ' && (ins->dreg == ins->sreg2)) {
int new_sreg2 = mono_alloc_preg (cfg);
MonoInst *move;
g_assert (spec [MONO_INST_DEST] != 'f');
@@ -312,6 +315,7 @@ handle_reg_constraints (MonoCompile *cfg)
prev = move;
ins->sreg2 = new_sreg2;
}
+ g_assert (!(spec [MONO_INST_SRC3] != ' ' && (ins->dreg == ins->sreg3)));
if (spec [MONO_INST_DEST] == 'f')
emit_fp_move (cfg, ins->dreg, ins->sreg1, prev);
else
@@ -329,6 +333,11 @@ handle_reg_constraints (MonoCompile *cfg)
ins->sreg2 = dest_sreg2;
}
+ if (dest_sreg3 != -1) {
+ emit_move (cfg, dest_sreg3, ins->sreg3, prev);
+ ins->sreg3 = dest_sreg3;
+ }
+
if (dest_dreg != -1) {
emit_move (cfg, ins->dreg, dest_dreg, ins);
g_assert (spec [MONO_INST_CLOB] != '1');
@@ -497,6 +506,13 @@ update_gen_kill_set (MonoCompile *cfg, MonoRegallocContext *ctx, MonoBasicBlock
mono_bitset_set_fast (bb->gen_set, sreg);
}
+ /* SREG3 */
+ sreg = ins->sreg3;
+ if (spec [MONO_INST_SRC3] != ' ') {
+ if (!mono_bitset_test_fast (bb->kill_set, sreg))
+ mono_bitset_set_fast (bb->gen_set, sreg);
+ }
+
/* DREG */
if (spec [MONO_INST_DEST] != ' ') {
if (MONO_IS_STORE_MEMBASE (ins)) {
@@ -707,6 +723,17 @@ compute_live_in_out_sets (MonoCompile *cfg, MonoRegallocContext *ctx)
#endif
}
+static MonoLiveInterval*
+get_var_interval (MonoCompile *cfg, MonoRegallocContext *ctx, int idx)
+{
+ MonoLiveInterval *interval = ctx->varinfo [idx].interval;
+ if (interval)
+ return interval;
+ interval = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoLiveInterval));
+ ctx->varinfo [idx].interval = interval;
+ return interval;
+}
+
static inline void
update_liveness (MonoCompile *cfg, MonoRegallocContext *ctx, MonoInst *ins, int inst_num, gint32 *last_use)
{
@@ -730,9 +757,9 @@ update_liveness (MonoCompile *cfg, MonoRegallocContext *ctx, MonoInst *ins, int
* Avoid a hole in the liveness range, since the allocation code
* could think the register is free there.
*/
- mono_linterval_add_range (ctx->cfg, ctx->varinfo [ins->dreg].interval, inst_num, last_use [ins->dreg]);
+ mono_linterval_add_range (ctx->cfg, get_var_interval (cfg, ctx, ins->dreg), inst_num, last_use [ins->dreg]);
} else {
- mono_linterval_add_range (ctx->cfg, ctx->varinfo [ins->dreg].interval, inst_num + INS_POS_DEF, last_use [ins->dreg]);
+ mono_linterval_add_range (ctx->cfg, get_var_interval (cfg, ctx, ins->dreg), inst_num + INS_POS_DEF, last_use [ins->dreg]);
}
last_use [ins->dreg] = 0;
}
@@ -743,7 +770,7 @@ update_liveness (MonoCompile *cfg, MonoRegallocContext *ctx, MonoInst *ins, int
spec = INS_INFO (ins->opcode);
} else {
LIVENESS_DEBUG (printf ("\tdead def of R%d, add range to R%d: [%x, %x]\n", ins->dreg, ins->dreg, inst_num + INS_POS_DEF, inst_num + INS_POS_DEF));
- mono_linterval_add_range (ctx->cfg, ctx->varinfo [ins->dreg].interval, inst_num + INS_POS_DEF, inst_num + INS_POS_DEF);
+ mono_linterval_add_range (ctx->cfg, get_var_interval (cfg, ctx, ins->dreg), inst_num + INS_POS_DEF, inst_num + INS_POS_DEF);
}
}
}
@@ -789,6 +816,20 @@ update_liveness (MonoCompile *cfg, MonoRegallocContext *ctx, MonoInst *ins, int
last_use [sreg] = inst_num + INS_POS_USE;
}
ctx->varinfo [sreg].use_pos = g_slist_prepend_mempool (ctx->cfg->mempool, ctx->varinfo [sreg].use_pos, GINT_TO_POINTER (inst_num));
+
+ /* SREG3 */
+ sreg = ins->sreg3;
+ if (spec [MONO_INST_SRC3] != ' ') {
+ if (last_use [sreg] == 0) {
+ LIVENESS_DEBUG (printf ("\tlast use of R%d set to %x\n", sreg, inst_num + INS_POS_USE));
+ last_use [sreg] = inst_num + INS_POS_USE;
+ }
+ ctx->varinfo [sreg].use_pos = g_slist_prepend_mempool (ctx->cfg->mempool, ctx->varinfo [sreg].use_pos, GINT_TO_POINTER (inst_num));
+
+ /*
+ if (ins->sreg3 <= MONO_MAX_IREGS)
+ mono_linterval_add_range (ctx->cfg, get_var_interval (cfg, ctx, ins->sreg3), inst_num + INS_POS_DEF, inst_num + INS_POS_DEF);
+ */
}
if (ins_get_spec (ins->opcode)[MONO_INST_CLOB] == 'c') {
@@ -830,15 +871,15 @@ update_liveness (MonoCompile *cfg, MonoRegallocContext *ctx, MonoInst *ins, int
if (clob == 'c') {
/* A call clobbers some int/fp registers */
for (l = mono_arch_get_iregs_clobbered_by_call ((MonoCallInst*)ins); l; l = l->next)
- mono_linterval_add_range (ctx->cfg, ctx->varinfo [GPOINTER_TO_INT (l->data)].interval, inst_num + INS_POS_CLOB, inst_num + INS_POS_CLOB);
+ mono_linterval_add_range (ctx->cfg, get_var_interval (cfg, ctx, GPOINTER_TO_INT (l->data)), inst_num + INS_POS_CLOB, inst_num + INS_POS_CLOB);
for (l = mono_arch_get_fregs_clobbered_by_call ((MonoCallInst*)ins); l; l = l->next)
- mono_linterval_add_range (ctx->cfg, ctx->varinfo [GPOINTER_TO_INT (l->data)].interval, inst_num + INS_POS_CLOB, inst_num + INS_POS_CLOB);
+ mono_linterval_add_range (ctx->cfg, get_var_interval (cfg, ctx, GPOINTER_TO_INT (l->data)), inst_num + INS_POS_CLOB, inst_num + INS_POS_CLOB);
}
else {
int clob_reg = MONO_ARCH_INST_FIXED_REG (clob);
if (clob_reg != -1)
- mono_linterval_add_range (ctx->cfg, ctx->varinfo [clob_reg].interval, inst_num + INS_POS_CLOB, inst_num + INS_POS_CLOB);
+ mono_linterval_add_range (ctx->cfg, get_var_interval (cfg, ctx, clob_reg), inst_num + INS_POS_CLOB, inst_num + INS_POS_CLOB);
}
}
}
@@ -861,10 +902,6 @@ compute_intervals (MonoCompile *cfg, MonoRegallocContext *ctx)
reverse_len = 1024;
reverse = mono_mempool_alloc (cfg->mempool, sizeof (MonoInst*) * reverse_len);
- for (idx = 0; idx < max_vars; ++idx) {
- ctx->varinfo [idx].interval = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoLiveInterval));
- }
-
/*
* Process bblocks in reverse order, so the addition of new live ranges
* to the intervals is faster.
@@ -931,7 +968,7 @@ compute_intervals (MonoCompile *cfg, MonoRegallocContext *ctx)
if (last_use [idx] != 0) {
/* Live at exit, not written -> live on enter */
LIVENESS_DEBUG (printf ("Var R%d live at enter, add range to R%d: [%x, %x)\n", idx, idx, block_from, last_use [idx]));
- mono_linterval_add_range (cfg, ctx->varinfo [idx].interval, block_from, last_use [idx]);
+ mono_linterval_add_range (cfg, get_var_interval (cfg, ctx, idx), block_from, last_use [idx]);
}
}
}
@@ -946,14 +983,14 @@ compute_intervals (MonoCompile *cfg, MonoRegallocContext *ctx)
for (i = 0; i < cfg->num_varinfo; i ++) {
MonoMethodVar *vi = MONO_VARINFO (cfg, i);
if ((cfg->varinfo [vi->idx]->opcode == OP_ARG) && (cfg->varinfo [vi->idx] != cfg->ret))
- mono_linterval_add_range (cfg, ctx->varinfo [cfg->varinfo [i]->dreg].interval, 0, 1);
+ mono_linterval_add_range (cfg, get_var_interval (cfg, ctx, cfg->varinfo [i]->dreg), 0, 1);
}
#endif
#if 0
for (idx = 0; idx < max_vars; ++idx) {
printf ("LIVENESS R%d: ", idx);
- mono_linterval_print (ctx->varinfo [idx].interval);
+ mono_linterval_print (get_var_interval (cfg, ctx, idx));
printf ("\n");
}
}
@@ -1204,7 +1241,7 @@ linear_scan (MonoCompile *cfg, MonoRegallocContext *ctx)
/* Create list of allocatable variables */
vars = NULL;
for (i = MONO_FIRST_VREG; i < cfg->next_vreg; ++i) {
- if (ctx->varinfo [i].interval->range)
+ if (get_var_interval (cfg, ctx, i)->range)
vars = g_list_prepend (vars, &ctx->varinfo [i]);
}
@@ -1222,7 +1259,7 @@ linear_scan (MonoCompile *cfg, MonoRegallocContext *ctx)
/* The hard registers are assigned to themselves */
for (i = 0; i < MONO_MAX_IREGS + MONO_MAX_FREGS; ++i) {
ctx->varinfo [i].hreg = i;
- if (ctx->varinfo [i].interval->range)
+ if (get_var_interval (cfg, ctx, i)->range)
inactive = g_list_append (inactive, &ctx->varinfo [i]);
}
@@ -2207,6 +2244,12 @@ rewrite_code (MonoCompile *cfg, MonoRegallocContext *ctx)
ins->sreg2 = l->hreg;
}
+ if (spec [MONO_INST_SRC3] != ' ') {
+ MonoRegallocInterval *l = child_at (&ctx->varinfo [ins->sreg3], pos + INS_POS_USE);
+ g_assert (l->hreg != -1);
+ ins->sreg3 = l->hreg;
+ }
+
if (cfg->verbose_level > 1)
mono_print_ins_index (1, ins);
diff --git a/mono/mini/ssa.c b/mono/mini/ssa.c
index d58d814e11..023d277800 100644
--- a/mono/mini/ssa.c
+++ b/mono/mini/ssa.c
@@ -1350,4 +1350,117 @@ mono_ssa_strength_reduction (MonoCompile *cfg)
}
#endif
+void
+mono_ssa_loop_invariant_code_motion (MonoCompile *cfg)
+{
+ MonoBasicBlock *bb, *h, *idom;
+ MonoInst *ins, *n, *tins;
+ int i;
+
+ g_assert (cfg->comp_done & MONO_COMP_SSA);
+ if (!(cfg->comp_done & MONO_COMP_LOOPS) || !(cfg->comp_done & MONO_COMP_SSA_DEF_USE))
+ return;
+
+ for (bb = cfg->bb_entry->next_bb; bb; bb = bb->next_bb) {
+ GList *lp = bb->loop_blocks;
+
+ if (!lp)
+ continue;
+ h = (MonoBasicBlock *)lp->data;
+ if (bb != h)
+ continue;
+ MONO_BB_FOR_EACH_INS_SAFE (bb, n, ins) {
+ gboolean is_class_init = FALSE;
+
+ /*
+ * Try to move instructions out of loop headers into the preceeding bblock.
+ */
+ if (ins->opcode == OP_VOIDCALL) {
+ MonoCallInst *call = (MonoCallInst*)ins;
+
+ if (call->fptr_is_patch) {
+ MonoJumpInfo *ji = (MonoJumpInfo*)call->fptr;
+
+ if (ji->type == MONO_PATCH_INFO_CLASS_INIT)
+ is_class_init = TRUE;
+ }
+ }
+ if (ins->opcode == OP_LDLEN || ins->opcode == OP_STRLEN || ins->opcode == OP_CHECK_THIS || ins->opcode == OP_AOTCONST || is_class_init) {
+ gboolean skip;
+ int sreg;
+
+ idom = h->idom;
+ /*
+ * h->nesting is needed to work around:
+ * http://llvm.org/bugs/show_bug.cgi?id=17868
+ */
+ if (!(idom && idom->last_ins && idom->last_ins->opcode == OP_BR && idom->last_ins->inst_target_bb == h && h->nesting == 1)) {
+ continue;
+ }
+
+ /*
+ * Make sure there are no instructions with side effects before ins.
+ */
+ skip = FALSE;
+ MONO_BB_FOR_EACH_INS (bb, tins) {
+ if (tins == ins)
+ break;
+ if (!MONO_INS_HAS_NO_SIDE_EFFECT (tins)) {
+ skip = TRUE;
+ break;
+ }
+ }
+ if (skip) {
+ /*
+ printf ("%s\n", mono_method_full_name (cfg->method, TRUE));
+ mono_print_ins (tins);
+ */
+ continue;
+ }
+
+ /* Make sure we don't move the instruction before the def of its sreg */
+ if (ins->opcode == OP_LDLEN || ins->opcode == OP_STRLEN || ins->opcode == OP_CHECK_THIS)
+ sreg = ins->sreg1;
+ else
+ sreg = -1;
+ if (sreg != -1) {
+ MonoInst *tins;
+
+ skip = FALSE;
+ for (tins = ins->prev; tins; tins = tins->prev) {
+ const char *spec = INS_INFO (tins->opcode);
+
+ if (tins->opcode == OP_MOVE && tins->dreg == sreg) {
+ sreg = tins->sreg1;
+ } if (spec [MONO_INST_DEST] != ' ' && tins->dreg == sreg) {
+ skip = TRUE;
+ break;
+ }
+ }
+ if (skip)
+ continue;
+ ins->sreg1 = sreg;
+ }
+
+ if (cfg->verbose_level > 1) {
+ printf ("licm in BB%d on ", bb->block_num);
+ mono_print_ins (ins);
+ }
+ //{ static int count = 0; count ++; printf ("%d\n", count); }
+ MONO_REMOVE_INS (bb, ins);
+ mono_bblock_insert_before_ins (idom, idom->last_ins, ins);
+ if (ins->opcode == OP_LDLEN || ins->opcode == OP_STRLEN)
+ idom->has_array_access = TRUE;
+ }
+ }
+ }
+
+ cfg->comp_done &= ~MONO_COMP_SSA_DEF_USE;
+ for (i = 0; i < cfg->num_varinfo; i++) {
+ MonoMethodVar *info = MONO_VARINFO (cfg, i);
+ info->def = NULL;
+ info->uses = NULL;
+ }
+}
+
#endif /* DISABLE_JIT */
diff --git a/mono/mini/tasklets.c b/mono/mini/tasklets.c
index a287c73042..6766c26a69 100644
--- a/mono/mini/tasklets.c
+++ b/mono/mini/tasklets.c
@@ -69,12 +69,12 @@ continuation_mark_frame (MonoContinuation *cont)
ctx = new_ctx;
if (endloop)
break;
- if (strcmp (ji->method->name, "Mark") == 0)
+ if (strcmp (jinfo_get_method (ji)->name, "Mark") == 0)
endloop = TRUE;
} while (1);
cont->top_sp = MONO_CONTEXT_GET_SP (&ctx);
- /*g_print ("method: %s, sp: %p\n", ji->method->name, cont->top_sp);*/
+ /*g_print ("method: %s, sp: %p\n", jinfo_get_method (ji)->name, cont->top_sp);*/
return NULL;
}
@@ -95,7 +95,7 @@ continuation_store (MonoContinuation *cont, int state, MonoException **e)
}
cont->lmf = lmf;
- cont->return_ip = __builtin_return_address (0);
+ cont->return_ip = __builtin_extract_return_addr (__builtin_return_address (0));
cont->return_sp = __builtin_frame_address (0);
num_bytes = (char*)cont->top_sp - (char*)cont->return_sp;
diff --git a/mono/mini/trace.c b/mono/mini/trace.c
index f67b704c36..551b2a2fda 100644
--- a/mono/mini/trace.c
+++ b/mono/mini/trace.c
@@ -31,6 +31,8 @@
# define fprintf(__ignore, ...) g_log ("mono-gc", G_LOG_LEVEL_MESSAGE, __VA_ARGS__)
#endif
+#define RETURN_ADDRESS(N) (__builtin_extract_return_addr (__builtin_return_address (N)))
+
static MonoTraceSpec trace_spec;
gboolean
@@ -401,7 +403,7 @@ mono_trace_enter_method (MonoMethod *method, char *ebp)
g_free (fname);
if (!ebp) {
- printf (") ip: %p\n", __builtin_return_address (1));
+ printf (") ip: %p\n", RETURN_ADDRESS (1));
return;
}
@@ -411,7 +413,7 @@ mono_trace_enter_method (MonoMethod *method, char *ebp)
if (method->is_inflated) {
/* FIXME: Might be better to pass the ji itself */
- MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), __builtin_return_address (0), NULL);
+ MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), RETURN_ADDRESS (0), NULL);
if (ji) {
gsctx = mono_jit_info_get_generic_sharing_context (ji);
if (gsctx && (gsctx->var_is_vt || gsctx->mvar_is_vt)) {
@@ -569,7 +571,7 @@ mono_trace_leave_method (MonoMethod *method, ...)
if (method->is_inflated) {
/* FIXME: Might be better to pass the ji itself */
- MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), __builtin_return_address (0), NULL);
+ MonoJitInfo *ji = mini_jit_info_table_find (mono_domain_get (), RETURN_ADDRESS (0), NULL);
if (ji) {
gsctx = mono_jit_info_get_generic_sharing_context (ji);
if (gsctx && (gsctx->var_is_vt || gsctx->mvar_is_vt)) {
@@ -682,7 +684,7 @@ handle_enum:
printf ("(unknown return type %x)", mono_method_signature (method)->ret->type);
}
- //printf (" ip: %p\n", __builtin_return_address (1));
+ //printf (" ip: %p\n", RETURN_ADDRESS (1));
printf ("\n");
fflush (stdout);
}
diff --git a/mono/mini/tramp-amd64.c b/mono/mini/tramp-amd64.c
index f81bd33e48..10d5ef2f32 100644
--- a/mono/mini/tramp-amd64.c
+++ b/mono/mini/tramp-amd64.c
@@ -34,8 +34,6 @@
#define IS_REX(inst) (((inst) >= 0x40) && ((inst) <= 0x4f))
-static guint8* nullified_class_init_trampoline;
-
/*
* mono_arch_get_unbox_trampoline:
* @m: method pointer
@@ -165,11 +163,11 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr)
/* Print some diagnostics */
MonoJitInfo *ji = mono_jit_info_table_find (mono_domain_get (), (char*)orig_code);
if (ji)
- fprintf (stderr, "At %s, offset 0x%zx\n", mono_method_full_name (ji->method, TRUE), (guint8*)orig_code - (guint8*)ji->code_start);
+ fprintf (stderr, "At %s, offset 0x%zx\n", mono_method_full_name (jinfo_get_method (ji), TRUE), (guint8*)orig_code - (guint8*)ji->code_start);
fprintf (stderr, "Addr: %p\n", addr);
ji = mono_jit_info_table_find (mono_domain_get (), (char*)addr);
if (ji)
- fprintf (stderr, "Callee: %s\n", mono_method_full_name (ji->method, TRUE));
+ fprintf (stderr, "Callee: %s\n", mono_method_full_name (jinfo_get_method (ji), TRUE));
g_assert_not_reached ();
#else
/*
@@ -336,6 +334,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
guint8 buf [16];
MonoJitInfo *ji = NULL;
gboolean can_write;
+ gpointer tramp = mini_get_nullified_class_init_trampoline ();
if (mono_use_llvm) {
/* code - 7 might be before the start of the method */
@@ -360,7 +359,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
vtable_slot = get_vcall_slot_addr (code, regs);
g_assert (vtable_slot);
- *vtable_slot = nullified_class_init_trampoline;
+ *vtable_slot = tramp;
} else if (buf [2] == 0xe8) {
/* call <TARGET> */
//guint8 *buf = code - 2;
@@ -378,11 +377,11 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
buf [4] = 0x90;
*/
- mono_arch_patch_callsite (code - 5, code, nullified_class_init_trampoline);
+ mono_arch_patch_callsite (code - 5, code, tramp);
} else if ((buf [5] == 0xff) && x86_modrm_mod (buf [6]) == 3 && x86_modrm_reg (buf [6]) == 2) {
/* call *<reg> */
/* Generated by the LLVM JIT or on platforms without MAP_32BIT set */
- mono_arch_patch_callsite (code - 13, code, nullified_class_init_trampoline);
+ mono_arch_patch_callsite (code - 13, code, tramp);
} else if (buf [4] == 0x90 || buf [5] == 0xeb || buf [6] == 0x66) {
/* Already changed by another thread */
;
@@ -396,10 +395,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
void
mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
{
- if (mono_aot_only && !nullified_class_init_trampoline)
- nullified_class_init_trampoline = mono_aot_get_trampoline ("nullified_class_init_trampoline");
-
- mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline);
+ mono_arch_patch_plt_entry (code, NULL, regs, mini_get_nullified_class_init_trampoline ());
}
static void
@@ -432,7 +428,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
code = buf = mono_global_codeman_reserve (kMaxCodeSize);
- framesize = kMaxCodeSize + sizeof (MonoLMF);
+ framesize = kMaxCodeSize + sizeof (MonoLMFTramp);
framesize = (framesize + (MONO_ARCH_FRAME_ALIGNMENT - 1)) & ~ (MONO_ARCH_FRAME_ALIGNMENT - 1);
orig_rsp_to_rbp_offset = 0;
@@ -587,7 +583,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
/* Save LMF begin */
- offset += sizeof (MonoLMF);
+ offset += sizeof (MonoLMFTramp);
lmf_offset = - offset;
/* Save ip */
@@ -603,23 +599,9 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
amd64_mov_reg_reg (code, AMD64_R11, AMD64_RSP, sizeof(mgreg_t));
amd64_alu_reg_imm (code, X86_ADD, AMD64_R11, framesize + 16);
amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsp), AMD64_R11, sizeof(mgreg_t));
- /* Save method */
- if (tramp_type == MONO_TRAMPOLINE_JIT || tramp_type == MONO_TRAMPOLINE_JUMP) {
- amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, arg_offset, sizeof(gpointer));
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, method), AMD64_R11, sizeof(gpointer));
- } else {
- amd64_mov_membase_imm (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, method), 0, sizeof(gpointer));
- }
- /* Save callee saved regs */
-#ifdef TARGET_WIN32
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rdi), AMD64_RDI, sizeof(mgreg_t));
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsi), AMD64_RSI, sizeof(mgreg_t));
-#endif
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rbx), AMD64_RBX, sizeof(mgreg_t));
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r12), AMD64_R12, sizeof(mgreg_t));
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r13), AMD64_R13, sizeof(mgreg_t));
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r14), AMD64_R14, sizeof(mgreg_t));
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, r15), AMD64_R15, sizeof(mgreg_t));
+ /* Save pointer to registers */
+ amd64_lea_membase (code, AMD64_R11, AMD64_RBP, saved_regs_offset);
+ amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMFTramp, regs), AMD64_R11, sizeof(mgreg_t));
if (aot) {
code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_get_lmf_addr");
@@ -629,11 +611,12 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
amd64_call_reg (code, AMD64_R11);
/* Save lmf_addr */
- amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), AMD64_RAX, sizeof(gpointer));
+ amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMFTramp, lmf_addr), AMD64_RAX, sizeof(gpointer));
/* Save previous_lmf */
- /* Set the lowest bit to 1 to signal that this LMF has the ip field set */
+ /* Set the lowest bit to signal that this LMF has the ip field set */
+ /* Set the third lowest bit to signal that this is a MonoLMFTramp structure */
amd64_mov_reg_membase (code, AMD64_R11, AMD64_RAX, 0, sizeof(gpointer));
- amd64_alu_reg_imm_size (code, X86_ADD, AMD64_R11, 1, sizeof(gpointer));
+ amd64_alu_reg_imm_size (code, X86_ADD, AMD64_R11, 0x5, sizeof(gpointer));
amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_R11, sizeof(gpointer));
/* Set new lmf */
amd64_lea_membase (code, AMD64_R11, AMD64_RBP, lmf_offset);
@@ -681,10 +664,9 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
amd64_mov_reg_membase (code, AMD64_RAX, AMD64_RBP, res_offset, sizeof(mgreg_t));
/* Restore LMF */
-
amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
- amd64_alu_reg_imm_size (code, X86_SUB, AMD64_RCX, 1, sizeof(gpointer));
- amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), sizeof(gpointer));
+ amd64_alu_reg_imm_size (code, X86_SUB, AMD64_RCX, 0x5, sizeof(gpointer));
+ amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMFTramp, lmf_addr), sizeof(gpointer));
amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_RCX, sizeof(gpointer));
/*
@@ -720,11 +702,6 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
mono_arch_flush_icache (buf, code - buf);
- if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT) {
- /* Initialize the nullified class init trampoline used in the AOT case */
- nullified_class_init_trampoline = mono_arch_get_nullified_class_init_trampoline (NULL);
- }
-
if (info) {
tramp_name = mono_get_generic_trampoline_name (tramp_type);
*info = mono_tramp_info_create (tramp_name, buf, code - buf, ji, unwind_ops);
@@ -750,9 +727,6 @@ mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info)
if (info)
*info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL);
- if (mono_jit_map_is_enabled ())
- mono_emit_jit_tramp (buf, code - buf, "nullified_class_init_trampoline");
-
return buf;
}
diff --git a/mono/mini/tramp-arm.c b/mono/mini/tramp-arm.c
index 39070e6760..6e973e0e74 100644
--- a/mono/mini/tramp-arm.c
+++ b/mono/mini/tramp-arm.c
@@ -16,15 +16,13 @@
#include <mono/metadata/marshal.h>
#include <mono/metadata/tabledefs.h>
#include <mono/arch/arm/arm-codegen.h>
+#include <mono/arch/arm/arm-vfp-codegen.h>
#include "mini.h"
#include "mini-arm.h"
#define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
-static guint8* nullified_class_init_trampoline;
-
-
#ifdef USE_JUMP_TABLES
static guint16
@@ -131,16 +129,13 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *a
void
mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
{
- mono_arch_patch_callsite (NULL, code, nullified_class_init_trampoline);
+ mono_arch_patch_callsite (NULL, code, mini_get_nullified_class_init_trampoline ());
}
void
mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
{
- if (mono_aot_only && !nullified_class_init_trampoline)
- nullified_class_init_trampoline = mono_aot_get_trampoline ("nullified_class_init_trampoline");
-
- mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline);
+ mono_arch_patch_plt_entry (code, NULL, regs, mini_get_nullified_class_init_trampoline ());
}
#ifndef DISABLE_JIT
@@ -179,7 +174,7 @@ emit_bx (guint8* code, int reg)
return code;
}
-/* Stack size for trampoline function
+/* Stack size for trampoline function
*/
#define STACK ALIGN_TO (sizeof (MonoLMF), 8)
@@ -201,7 +196,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
gpointer *constants;
#endif
- int cfa_offset, lmf_offset, regsave_size, lr_offset;
+ int cfa_offset, regsave_size, lr_offset;
GSList *unwind_ops = NULL;
MonoJumpInfo *ji = NULL;
int buf_len;
@@ -213,7 +208,12 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
/* Now we'll create in 'buf' the ARM trampoline code. This
is the trampoline code common to all methods */
- buf_len = 212;
+ buf_len = 272;
+
+ /* Add space for saving/restoring VFP regs. */
+ if (mono_arm_is_hard_float ())
+ buf_len += 8 * 2;
+
code = buf = mono_global_codeman_reserve (buf_len);
/*
@@ -222,8 +222,6 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
* saved as sp + LR_OFFSET by the push in the specific trampoline
*/
- /* The offset of lmf inside the stack frame */
- lmf_offset = STACK - sizeof (MonoLMF);
/* The size of the area already allocated by the push in the specific trampoline */
regsave_size = 14 * sizeof (mgreg_t);
/* The offset where lr was saved inside the regsave area */
@@ -288,11 +286,13 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
* The pointer to the struct is put in r1.
* the iregs array is already allocated on the stack by push.
*/
- ARM_SUB_REG_IMM8 (code, ARMREG_SP, ARMREG_SP, STACK - regsave_size);
+ code = mono_arm_emit_load_imm (code, ARMREG_R2, STACK - regsave_size);
+ ARM_SUB_REG_REG (code, ARMREG_SP, ARMREG_SP, ARMREG_R2);
cfa_offset += STACK - regsave_size;
mono_add_unwind_op_def_cfa_offset (unwind_ops, code, buf, cfa_offset);
/* V1 == lmf */
- ARM_ADD_REG_IMM8 (code, ARMREG_V1, ARMREG_SP, STACK - sizeof (MonoLMF));
+ code = mono_arm_emit_load_imm (code, ARMREG_R2, STACK - sizeof (MonoLMF));
+ ARM_ADD_REG_REG (code, ARMREG_V1, ARMREG_SP, ARMREG_R2);
/*
* The stack now looks like:
@@ -316,7 +316,8 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, method));
}
/* save caller SP */
- ARM_ADD_REG_IMM8 (code, ARMREG_R2, ARMREG_SP, cfa_offset);
+ code = mono_arm_emit_load_imm (code, ARMREG_R2, cfa_offset);
+ ARM_ADD_REG_REG (code, ARMREG_R2, ARMREG_SP, ARMREG_R2);
ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, sp));
/* save caller FP */
ARM_LDR_IMM (code, ARMREG_R2, ARMREG_V1, (G_STRUCT_OFFSET (MonoLMF, iregs) + ARMREG_FP*4));
@@ -329,11 +330,22 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
}
ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, ip));
+ /* Save VFP registers. */
+ if (mono_arm_is_hard_float ()) {
+ /*
+ * Strictly speaking, we don't have to save d0-d7 in the LMF, but
+ * it's easier than attempting to store them on the stack since
+ * this trampoline code is pretty messy.
+ */
+ ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, fregs));
+ ARM_FSTMD (code, ARM_VFP_D0, 8, ARMREG_R0);
+ }
+
/*
* Now we're ready to call xxx_trampoline ().
*/
/* Arg 1: the saved registers */
- ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, iregs));
+ ARM_ADD_REG_IMM (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, iregs), 0);
/* Arg 2: code (next address to the instruction that called us) */
if (tramp_type == MONO_TRAMPOLINE_JUMP) {
@@ -413,6 +425,12 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
/* *(lmf_addr) = previous_lmf */
ARM_STR_IMM (code, ARMREG_IP, ARMREG_LR, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+ /* Restore VFP registers. */
+ if (mono_arm_is_hard_float ()) {
+ ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, fregs));
+ ARM_FLDMD (code, ARM_VFP_D0, 8, ARMREG_R0);
+ }
+
/* Non-standard function epilogue. Instead of doing a proper
* return, we just jump to the compiled code.
*/
@@ -452,10 +470,6 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
/* Sanity check */
g_assert ((code - buf) <= buf_len);
- if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT)
- /* Initialize the nullified class init trampoline used in the AOT case */
- nullified_class_init_trampoline = mono_arch_get_nullified_class_init_trampoline (NULL);
-
if (info) {
tramp_name = mono_get_generic_trampoline_name (tramp_type);
*info = mono_tramp_info_create (tramp_name, buf, code - buf, ji, unwind_ops);
@@ -928,6 +942,13 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a
g_assert_not_reached ();
return NULL;
}
+
+gpointer
+mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info)
+{
+ g_assert_not_reached ();
+ return NULL;
+}
#endif /* DISABLE_JIT */
diff --git a/mono/mini/tramp-mips.c b/mono/mini/tramp-mips.c
index ca6752fa7d..b0e7be95e0 100644
--- a/mono/mini/tramp-mips.c
+++ b/mono/mini/tramp-mips.c
@@ -24,8 +24,6 @@
#include "mini.h"
#include "mini-mips.h"
-static guint8* nullified_class_init_trampoline;
-
/*
* get_unbox_trampoline:
* @m: method pointer
@@ -116,10 +114,7 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *a
void
mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
{
- if (mono_aot_only && !nullified_class_init_trampoline)
- nullified_class_init_trampoline = mono_aot_get_trampoline ("nullified_class_init_trampoline");
-
- mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline);
+ mono_arch_patch_plt_entry (code, NULL, regs, mini_get_nullified_class_init_trampoline ());
}
void
@@ -314,10 +309,6 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
/* Sanity check */
g_assert ((code - buf) <= max_code_len);
- if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT)
- /* Initialize the nullified class init trampoline used in the AOT case */
- nullified_class_init_trampoline = mono_arch_get_nullified_class_init_trampoline (NULL);
-
if (info) {
tramp_name = mono_get_generic_trampoline_name (tramp_type);
*info = mono_tramp_info_create (tramp_name, buf, code - buf, ji, unwind_ops);
diff --git a/mono/mini/tramp-ppc.c b/mono/mini/tramp-ppc.c
index 7391809975..7cec84281e 100644
--- a/mono/mini/tramp-ppc.c
+++ b/mono/mini/tramp-ppc.c
@@ -22,8 +22,7 @@
#include "mini.h"
#include "mini-ppc.h"
-static guint8* nullified_class_init_trampoline;
-
+#if 0
/* Same as mono_create_ftnptr, but doesn't require a domain */
static gpointer
mono_ppc_create_ftnptr (guint8 *code)
@@ -40,6 +39,7 @@ mono_ppc_create_ftnptr (guint8 *code)
return code;
#endif
}
+#endif
/*
* Return the instruction to jump from code to target, 0 if not
@@ -200,16 +200,13 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *a
void
mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
{
- mono_arch_patch_callsite (NULL, code, nullified_class_init_trampoline);
+ mono_arch_patch_callsite (NULL, code, mini_get_nullified_class_init_trampoline ());
}
void
mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
{
- if (mono_aot_only && !nullified_class_init_trampoline)
- nullified_class_init_trampoline = mono_aot_get_trampoline ("nullified_class_init_trampoline");
-
- mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline);
+ mono_arch_patch_plt_entry (code, NULL, regs, mini_get_nullified_class_init_trampoline ());
}
/* Stack size for trampoline function
@@ -440,11 +437,6 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
/* Sanity check */
g_assert ((code - buf) <= size);
- if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT) {
- /* Initialize the nullified class init trampoline */
- nullified_class_init_trampoline = mono_ppc_create_ftnptr (mono_arch_get_nullified_class_init_trampoline (NULL));
- }
-
if (info) {
tramp_name = mono_get_generic_trampoline_name (tramp_type);
*info = mono_tramp_info_create (tramp_name, buf, code - buf, ji, unwind_ops);
diff --git a/mono/mini/tramp-s390x.c b/mono/mini/tramp-s390x.c
index fe25878f14..0888809884 100644
--- a/mono/mini/tramp-s390x.c
+++ b/mono/mini/tramp-s390x.c
@@ -193,6 +193,32 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
/*------------------------------------------------------------------*/
/* */
+/* Name - mono_arch_get_nullified_class_init */
+/* */
+/* Function - Nullify a PLT entry call. */
+/* */
+/*------------------------------------------------------------------*/
+
+gpointer
+mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info)
+{
+ guint8 *buf, *code;
+
+ code = buf = mono_global_codeman_reserve (16);
+
+ s390_br (code, s390_r14);
+
+ if (info)
+ *info = mono_tramp_info_create ("nullified_class_init_trampoline",
+ buf, code - buf, NULL, NULL);
+
+ return (buf);
+}
+
+/*========================= End of Function ========================*/
+
+/*------------------------------------------------------------------*/
+/* */
/* Name - mono_arch_nullify_plt_entry */
/* */
/* Function - Nullify a PLT entry call. */
diff --git a/mono/mini/tramp-sparc.c b/mono/mini/tramp-sparc.c
index a1f5afd457..8941877966 100644
--- a/mono/mini/tramp-sparc.c
+++ b/mono/mini/tramp-sparc.c
@@ -273,3 +273,20 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info
g_assert_not_reached ();
return NULL;
}
+
+gpointer
+mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info)
+{
+ guint8 *buf, *code;
+
+ code = buf = mono_global_codeman_reserve (16);
+
+ sparc_ret (code);
+
+ mono_arch_flush_icache (buf, code - buf);
+
+ if (info)
+ *info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL);
+
+ return buf;
+}
diff --git a/mono/mini/tramp-x86.c b/mono/mini/tramp-x86.c
index 193d3ec9eb..4e42d0d88f 100644
--- a/mono/mini/tramp-x86.c
+++ b/mono/mini/tramp-x86.c
@@ -25,8 +25,6 @@
#include "mini.h"
#include "mini-x86.h"
-static guint8* nullified_class_init_trampoline;
-
/*
* mono_arch_get_unbox_trampoline:
* @m: method pointer
@@ -239,6 +237,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
{
guint8 buf [16];
gboolean can_write = mono_breakpoint_clean_code (NULL, code, 6, buf, sizeof (buf));
+ gpointer tramp = mini_get_nullified_class_init_trampoline ();
if (!can_write)
return;
@@ -273,7 +272,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
//VALGRIND_DISCARD_TRANSLATIONS (code, 8);
}
#elif defined(__native_client_codegen__)
- mono_arch_patch_callsite (code, code + 5, nullified_class_init_trampoline);
+ mono_arch_patch_callsite (code, code + 5, tramp);
#endif
} else if (code [0] == 0x90 || code [0] == 0xeb) {
/* Already changed by another thread */
@@ -285,7 +284,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
vtable_slot = get_vcall_slot_addr (code + 5, regs);
g_assert (vtable_slot);
- *vtable_slot = nullified_class_init_trampoline;
+ *vtable_slot = tramp;
} else {
printf ("Invalid trampoline sequence: %x %x %x %x %x %x %x\n", code [0], code [1], code [2], code [3],
code [4], code [5], code [6]);
@@ -296,10 +295,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
void
mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
{
- if (mono_aot_only && !nullified_class_init_trampoline)
- nullified_class_init_trampoline = mono_aot_get_trampoline ("nullified_class_init_trampoline");
-
- mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline);
+ mono_arch_patch_plt_entry (code, NULL, regs, mini_get_nullified_class_init_trampoline ());
}
guchar*
@@ -543,11 +539,6 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
g_free (tramp_name);
}
- if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT) {
- /* Initialize the nullified class init trampoline used in the AOT case */
- nullified_class_init_trampoline = mono_arch_get_nullified_class_init_trampoline (NULL);
- }
-
return buf;
}
@@ -567,9 +558,6 @@ mono_arch_get_nullified_class_init_trampoline (MonoTrampInfo **info)
if (info)
*info = mono_tramp_info_create ("nullified_class_init_trampoline", buf, code - buf, NULL, NULL);
- if (mono_jit_map_is_enabled ())
- mono_emit_jit_tramp (buf, code - buf, "nullified_class_init_trampoline");
-
return buf;
}
@@ -873,7 +861,15 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot)
x86_branch8 (code, X86_CC_Z, -1, 1);
/* load MonoInternalThread* into EDX */
- code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ());
+ if (aot) {
+ /* load_aotconst () puts the result into EAX */
+ x86_mov_reg_reg (code, X86_EDX, X86_EAX, sizeof (mgreg_t));
+ code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_TLS_OFFSET, GINT_TO_POINTER (TLS_KEY_THREAD));
+ code = mono_x86_emit_tls_get_reg (code, X86_EAX, X86_EAX);
+ x86_xchg_reg_reg (code, X86_EAX, X86_EDX, sizeof (mgreg_t));
+ } else {
+ code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ());
+ }
/* load TID into EDX */
x86_mov_reg_membase (code, X86_EDX, X86_EDX, G_STRUCT_OFFSET (MonoInternalThread, tid), 4);
@@ -1006,7 +1002,15 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot)
/* next case: synchronization is not null */
/* load MonoInternalThread* into EDX */
- code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ());
+ if (aot) {
+ /* load_aotconst () puts the result into EAX */
+ x86_mov_reg_reg (code, X86_EDX, X86_EAX, sizeof (mgreg_t));
+ code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_TLS_OFFSET, GINT_TO_POINTER (TLS_KEY_THREAD));
+ code = mono_x86_emit_tls_get_reg (code, X86_EAX, X86_EAX);
+ x86_xchg_reg_reg (code, X86_EAX, X86_EDX, sizeof (mgreg_t));
+ } else {
+ code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ());
+ }
/* load TID into EDX */
x86_mov_reg_membase (code, X86_EDX, X86_EDX, G_STRUCT_OFFSET (MonoInternalThread, tid), 4);
/* is synchronization->owner == TID */
diff --git a/mono/mini/unwind.c b/mono/mini/unwind.c
index 2377e0dd00..018ad903e4 100644
--- a/mono/mini/unwind.c
+++ b/mono/mini/unwind.c
@@ -31,6 +31,8 @@ typedef struct {
guint8 info [MONO_ZERO_LEN_ARRAY];
} MonoUnwindInfo;
+#define ALIGN_TO(val,align) ((((size_t)val) + ((align) - 1)) & ~((align) - 1))
+
static CRITICAL_SECTION unwind_mutex;
static MonoUnwindInfo **cached_info;
@@ -49,8 +51,9 @@ static int map_hw_reg_to_dwarf_reg [] = { 0, 2, 1, 3, 7, 6, 4, 5, 8, 9, 10, 11,
#define DWARF_PC_REG (mono_hw_reg_to_dwarf_reg (AMD64_RIP))
#elif defined(TARGET_ARM)
// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf
-static int map_hw_reg_to_dwarf_reg [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
-#define NUM_REGS 16
+/* Assign d8..d15 to hregs 16..24 */
+static int map_hw_reg_to_dwarf_reg [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 264, 265, 266, 267, 268, 269, 270, 271 };
+#define NUM_REGS 272
#define DWARF_DATA_ALIGN (-4)
#define DWARF_PC_REG (mono_hw_reg_to_dwarf_reg (ARMREG_LR))
#elif defined (TARGET_X86)
@@ -248,6 +251,68 @@ decode_sleb128 (guint8 *buf, guint8 **endbuf)
return res;
}
+void
+mono_print_unwind_info (guint8 *unwind_info, int unwind_info_len)
+{
+ guint8 *p;
+ int pos, reg, offset, cfa_reg, cfa_offset;
+
+ p = unwind_info;
+ pos = 0;
+ while (p < unwind_info + unwind_info_len) {
+ int op = *p & 0xc0;
+
+ switch (op) {
+ case DW_CFA_advance_loc:
+ pos += *p & 0x3f;
+ p ++;
+ break;
+ case DW_CFA_offset:
+ reg = *p & 0x3f;
+ p ++;
+ offset = decode_uleb128 (p, &p) * DWARF_DATA_ALIGN;
+ if (reg == DWARF_PC_REG)
+ printf ("CFA: [%x] offset: %s at cfa-0x%x\n", pos, "pc", -offset);
+ else
+ printf ("CFA: [%x] offset: %s at cfa-0x%x\n", pos, mono_arch_regname (mono_dwarf_reg_to_hw_reg (reg)), -offset);
+ break;
+ case 0: {
+ int ext_op = *p;
+ p ++;
+ switch (ext_op) {
+ case DW_CFA_def_cfa:
+ cfa_reg = decode_uleb128 (p, &p);
+ cfa_offset = decode_uleb128 (p, &p);
+ printf ("CFA: [%x] def_cfa: %s+0x%x\n", pos, mono_arch_regname (mono_dwarf_reg_to_hw_reg (cfa_reg)), cfa_offset);
+ break;
+ case DW_CFA_def_cfa_offset:
+ cfa_offset = decode_uleb128 (p, &p);
+ printf ("CFA: [%x] def_cfa_offset: 0x%x\n", pos, cfa_offset);
+ break;
+ case DW_CFA_def_cfa_register:
+ cfa_reg = decode_uleb128 (p, &p);
+ printf ("CFA: [%x] def_cfa_reg: %s\n", pos, mono_arch_regname (mono_dwarf_reg_to_hw_reg (cfa_reg)));
+ break;
+ case DW_CFA_offset_extended_sf:
+ reg = decode_uleb128 (p, &p);
+ offset = decode_sleb128 (p, &p) * DWARF_DATA_ALIGN;
+ printf ("CFA: [%x] offset_extended_sf: %s at cfa-0x%x\n", pos, mono_arch_regname (mono_dwarf_reg_to_hw_reg (reg)), -offset);
+ break;
+ case DW_CFA_advance_loc4:
+ pos += read32 (p);
+ p += 4;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ break;
+ }
+ default:
+ g_assert_not_reached ();
+ }
+ }
+}
+
/*
* mono_unwind_ops_encode:
*
@@ -330,14 +395,14 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len)
#endif
static G_GNUC_UNUSED void
-print_dwarf_state (int cfa_reg, int cfa_offset, int ip, int nregs, Loc *locations)
+print_dwarf_state (int cfa_reg, int cfa_offset, int ip, int nregs, Loc *locations, guint8 *reg_saved)
{
int i;
printf ("\t%x: cfa=r%d+%d ", ip, cfa_reg, cfa_offset);
for (i = 0; i < nregs; ++i)
- if (locations [i].loc_type == LOC_OFFSET)
+ if (reg_saved [i] && locations [i].loc_type == LOC_OFFSET)
printf ("r%d@%d(cfa) ", i, locations [i].offset);
printf ("\n");
}
@@ -358,12 +423,12 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len,
guint8 **out_cfa)
{
Loc locations [NUM_REGS];
- int i, pos, reg, cfa_reg, cfa_offset;
+ guint8 reg_saved [NUM_REGS];
+ int i, pos, reg, cfa_reg, cfa_offset, offset;
guint8 *p;
guint8 *cfa_val;
- for (i = 0; i < NUM_REGS; ++i)
- locations [i].loc_type = LOC_SAME;
+ memset (reg_saved, 0, sizeof (reg_saved));
p = unwind_info;
pos = 0;
@@ -381,6 +446,7 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len,
case DW_CFA_offset:
reg = *p & 0x3f;
p ++;
+ reg_saved [reg] = TRUE;
locations [reg].loc_type = LOC_OFFSET;
locations [reg].offset = decode_uleb128 (p, &p) * DWARF_DATA_ALIGN;
break;
@@ -400,8 +466,19 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len,
break;
case DW_CFA_offset_extended_sf:
reg = decode_uleb128 (p, &p);
+ offset = decode_sleb128 (p, &p);
+ g_assert (reg < NUM_REGS);
+ reg_saved [reg] = TRUE;
locations [reg].loc_type = LOC_OFFSET;
- locations [reg].offset = decode_sleb128 (p, &p) * DWARF_DATA_ALIGN;
+ locations [reg].offset = offset * DWARF_DATA_ALIGN;
+ break;
+ case DW_CFA_offset_extended:
+ reg = decode_uleb128 (p, &p);
+ offset = decode_uleb128 (p, &p);
+ g_assert (reg < NUM_REGS);
+ reg_saved [reg] = TRUE;
+ locations [reg].loc_type = LOC_OFFSET;
+ locations [reg].offset = offset * DWARF_DATA_ALIGN;
break;
case DW_CFA_advance_loc4:
pos += read32 (p);
@@ -422,7 +499,7 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len,
cfa_val = (guint8*)regs [mono_dwarf_reg_to_hw_reg (cfa_reg)] + cfa_offset;
for (i = 0; i < NUM_REGS; ++i) {
- if (locations [i].loc_type == LOC_OFFSET) {
+ if (reg_saved [i] && locations [i].loc_type == LOC_OFFSET) {
int hreg = mono_dwarf_reg_to_hw_reg (i);
g_assert (hreg < nregs);
regs [hreg] = *(mgreg_t*)(cfa_val + locations [i].offset);
@@ -647,33 +724,27 @@ read_encoded_val (guint32 encoding, guint8 *p, guint8 **endp)
/*
* decode_lsda:
*
- * Decode the Language Specific Data Area generated by LLVM.
+ * Decode the Mono specific Language Specific Data Area generated by LLVM.
*/
static void
decode_lsda (guint8 *lsda, guint8 *code, MonoJitExceptionInfo **ex_info, guint32 *ex_info_len, gpointer **type_info, int *this_reg, int *this_offset)
{
- gint32 ttype_offset, call_site_length;
- gint32 ttype_encoding, call_site_encoding;
- guint8 *ttype, *action_table, *call_site, *p;
- int i, ncall_sites;
+ guint8 *p;
+ int i, ncall_sites, this_encoding;
+ guint32 mono_magic, version;
- /*
- * LLVM generates a c++ style LSDA, which can be decoded by looking at
- * eh_personality.cc in gcc.
- */
p = lsda;
- if (*p == DW_EH_PE_udata4) {
- /* This is the modified LSDA generated by the LLVM mono branch */
- guint32 mono_magic, version;
+ /* This is the modified LSDA generated by the LLVM mono branch */
+ mono_magic = decode_uleb128 (p, &p);
+ g_assert (mono_magic == 0x4d4fef4f);
+ version = decode_uleb128 (p, &p);
+ g_assert (version == 1);
+ this_encoding = *p;
+ p ++;
+ if (this_encoding == DW_EH_PE_udata4) {
gint32 op, reg, offset;
- p ++;
- mono_magic = decode_uleb128 (p, &p);
- g_assert (mono_magic == 0x4d4fef4f);
- version = decode_uleb128 (p, &p);
- g_assert (version == 1);
-
/* 'this' location */
op = *p;
g_assert (op == DW_OP_bregx);
@@ -684,61 +755,24 @@ decode_lsda (guint8 *lsda, guint8 *code, MonoJitExceptionInfo **ex_info, guint32
*this_reg = mono_dwarf_reg_to_hw_reg (reg);
*this_offset = offset;
} else {
- /* Read @LPStart */
- g_assert (*p == DW_EH_PE_omit);
- p ++;
+ g_assert (this_encoding == DW_EH_PE_omit);
*this_reg = -1;
*this_offset = -1;
}
-
- /* Read @TType */
- ttype_encoding = *p;
- p ++;
- ttype_offset = decode_uleb128 (p, &p);
- ttype = p + ttype_offset;
-
- /* Read call-site table */
- call_site_encoding = *p;
- g_assert (call_site_encoding == DW_EH_PE_udata4);
- p ++;
- call_site_length = decode_uleb128 (p, &p);
- call_site = p;
- p += call_site_length;
- action_table = p;
-
- /* Calculate the size of our table */
- ncall_sites = 0;
- p = call_site;
- while (p < action_table) {
- int block_start_offset, block_size, landing_pad, action_offset;
-
- block_start_offset = read32 (p);
- p += sizeof (gint32);
- block_size = read32 (p);
- p += sizeof (gint32);
- landing_pad = read32 (p);
- p += sizeof (gint32);
- action_offset = decode_uleb128 (p, &p);
-
- /* landing_pad == 0 means the region has no landing pad */
- if (landing_pad)
- ncall_sites ++;
- }
+ ncall_sites = decode_uleb128 (p, &p);
+ p = (guint8*)ALIGN_TO ((mgreg_t)p, 4);
if (ex_info) {
*ex_info = g_malloc0 (ncall_sites * sizeof (MonoJitExceptionInfo));
*ex_info_len = ncall_sites;
}
-
if (type_info)
*type_info = g_malloc0 (ncall_sites * sizeof (gpointer));
- p = call_site;
- i = 0;
- while (p < action_table) {
- int block_start_offset, block_size, landing_pad, action_offset, type_offset;
- guint8 *action, *tinfo;
+ for (i = 0; i < ncall_sites; ++i) {
+ int block_start_offset, block_size, landing_pad;
+ guint8 *tinfo;
block_start_offset = read32 (p);
p += sizeof (gint32);
@@ -746,49 +780,19 @@ decode_lsda (guint8 *lsda, guint8 *code, MonoJitExceptionInfo **ex_info, guint32
p += sizeof (gint32);
landing_pad = read32 (p);
p += sizeof (gint32);
- action_offset = decode_uleb128 (p, &p);
-
- if (!action_offset)
- continue;
-
- action = action_table + action_offset - 1;
-
- type_offset = decode_sleb128 (action, &action);
-
- if (landing_pad) {
- //printf ("BLOCK: %p-%p %p, %d\n", code + block_start_offset, code + block_start_offset + block_size, code + landing_pad, action_offset);
-
- g_assert (ttype_offset);
-
- if (ttype_encoding == DW_EH_PE_absptr) {
- guint8 *ttype_entry = (ttype - (type_offset * sizeof (gpointer)));
- tinfo = *(gpointer*)ttype_entry;
- } else if (ttype_encoding == (DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4)) {
- guint8 *ttype_entry = (ttype - (type_offset * 4));
- gint32 offset = *(gint32*)ttype_entry;
- guint8 *stub = ttype_entry + offset;
- tinfo = *(gpointer*)stub;
- } else if (ttype_encoding == (DW_EH_PE_pcrel | DW_EH_PE_sdata4)) {
- guint8 *ttype_entry = (ttype - (type_offset * 4));
- gint32 offset = *(gint32*)ttype_entry;
- tinfo = ttype_entry + offset;
- } else if (ttype_encoding == DW_EH_PE_udata4) {
- /* Embedded directly */
- guint8 *ttype_entry = (ttype - (type_offset * 4));
- tinfo = ttype_entry;
- } else {
- g_assert_not_reached ();
- }
+ tinfo = p;
+ p += sizeof (gint32);
- if (ex_info) {
- if (*type_info)
- (*type_info) [i] = tinfo;
- (*ex_info)[i].try_start = code + block_start_offset;
- (*ex_info)[i].try_end = code + block_start_offset + block_size;
- (*ex_info)[i].handler_start = code + landing_pad;
+ g_assert (landing_pad);
+ g_assert (((size_t)tinfo % 4) == 0);
+ //printf ("X: %p %d\n", landing_pad, *(int*)tinfo);
- }
- i ++;
+ if (ex_info) {
+ if (*type_info)
+ (*type_info) [i] = tinfo;
+ (*ex_info)[i].try_start = code + block_start_offset;
+ (*ex_info)[i].try_end = code + block_start_offset + block_size;
+ (*ex_info)[i].handler_start = code + landing_pad;
}
}
}
diff --git a/mono/mini/version.h b/mono/mini/version.h
index 76cc182975..52e11bfdec 100644
--- a/mono/mini/version.h
+++ b/mono/mini/version.h
@@ -1 +1 @@
-#define FULL_VERSION "(no/8d3b4b7"
+#define FULL_VERSION "(no/b1e8599"
diff --git a/mono/mini/xdebug.c b/mono/mini/xdebug.c
index b9e6388f1a..9e415ca339 100644
--- a/mono/mini/xdebug.c
+++ b/mono/mini/xdebug.c
@@ -173,7 +173,7 @@ mono_xdebug_init (const char *options)
img_writer_emit_section_change (w, ".text", 0);
img_writer_emit_string (w, "");
- mono_dwarf_writer_emit_base_info (xdebug_writer, mono_unwind_get_cie_program ());
+ mono_dwarf_writer_emit_base_info (xdebug_writer, "JITted code", mono_unwind_get_cie_program ());
}
static void
@@ -192,7 +192,7 @@ xdebug_begin_emit (MonoImageWriter **out_w, MonoDwarfWriter **out_dw)
dw = mono_dwarf_writer_create (w, il_file, il_file_line_index, FALSE, TRUE);
- mono_dwarf_writer_emit_base_info (dw, mono_unwind_get_cie_program ());
+ mono_dwarf_writer_emit_base_info (dw, "JITted code", mono_unwind_get_cie_program ());
*out_w = w;
*out_dw = dw;
@@ -294,8 +294,8 @@ mono_save_xdebug_info (MonoCompile *cfg)
xdebug_method_count ++;
- dmji = mono_debug_find_method (cfg->jit_info->method, mono_domain_get ());;
- mono_dwarf_writer_emit_method (xdebug_writer, cfg, cfg->jit_info->method, NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji);
+ dmji = mono_debug_find_method (jinfo_get_method (cfg->jit_info), mono_domain_get ());;
+ mono_dwarf_writer_emit_method (xdebug_writer, cfg, jinfo_get_method (cfg->jit_info), NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji);
mono_debug_free_method_jit_info (dmji);
#if 0
@@ -323,8 +323,8 @@ mono_save_xdebug_info (MonoCompile *cfg)
return;
mono_loader_lock ();
- dmji = mono_debug_find_method (cfg->jit_info->method, mono_domain_get ());;
- mono_dwarf_writer_emit_method (xdebug_writer, cfg, cfg->jit_info->method, NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji);
+ dmji = mono_debug_find_method (jinfo_get_method (cfg->jit_info), mono_domain_get ());
+ mono_dwarf_writer_emit_method (xdebug_writer, cfg, jinfo_get_method (cfg->jit_info), NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji);
mono_debug_free_method_jit_info (dmji);
fflush (xdebug_fp);
mono_loader_unlock ();
diff --git a/mono/monograph/Makefile.am b/mono/monograph/Makefile.am
index 64fe072e9a..585b564182 100644
--- a/mono/monograph/Makefile.am
+++ b/mono/monograph/Makefile.am
@@ -24,10 +24,17 @@ else
runtime_lib=../interpreter/libmint.la
endif
+if DISABLE_EXECUTABLES
+bin_PROGRAMS =
+else
if DISABLE_LIBRARIES
+bin_PROGRAMS =
else
+if SUPPORT_BOEHM
bin_PROGRAMS = monograph
endif
+endif
+endif
AM_CPPFLAGS = \
-I$(top_srcdir) \
diff --git a/mono/monograph/Makefile.in b/mono/monograph/Makefile.in
index f65d033287..4422e8bc41 100644
--- a/mono/monograph/Makefile.in
+++ b/mono/monograph/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -51,10 +52,9 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-@DISABLE_LIBRARIES_FALSE@bin_PROGRAMS = monograph$(EXEEXT)
+@DISABLE_EXECUTABLES_FALSE@@DISABLE_LIBRARIES_FALSE@@SUPPORT_BOEHM_TRUE@bin_PROGRAMS = monograph$(EXEEXT)
subdir = mono/monograph
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -103,7 +103,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -113,10 +113,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = monograph.c
DIST_SOURCES = monograph.c
am__can_run_installinfo = \
@@ -523,20 +523,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -680,18 +666,18 @@ uninstall-am: uninstall-binPROGRAMS
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libtool cscopelist ctags distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am html html-am info info-am \
- install install-am install-binPROGRAMS 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 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-binPROGRAMS
+ clean-generic clean-libtool ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS 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 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-binPROGRAMS
@HOST_WIN32_TRUE@export HOST_CC
diff --git a/mono/profiler/Makefile.in b/mono/profiler/Makefile.in
index 5253c2a471..2f4723ca72 100644
--- a/mono/profiler/Makefile.in
+++ b/mono/profiler/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -55,8 +56,7 @@ target_triplet = @target@
@DISABLE_LIBRARIES_FALSE@@DISABLE_PROFILER_FALSE@@JIT_SUPPORTED_TRUE@bin_PROGRAMS = mprof-report$(EXEEXT)
@PLATFORM_ANDROID_TRUE@am__append_1 = $(GLIB_LIBS)
subdir = mono/profiler
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -161,7 +161,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -171,10 +171,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmono_profiler_aot_la_SOURCES) \
$(libmono_profiler_cov_la_SOURCES) \
$(libmono_profiler_iomap_la_SOURCES) \
@@ -495,14 +495,12 @@ uninstall-libLTLIBRARIES:
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(lib_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
libmono-profiler-aot.la: $(libmono_profiler_aot_la_OBJECTS) $(libmono_profiler_aot_la_DEPENDENCIES) $(EXTRA_libmono_profiler_aot_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(am_libmono_profiler_aot_la_rpath) $(libmono_profiler_aot_la_OBJECTS) $(libmono_profiler_aot_la_LIBADD) $(LIBS)
libmono-profiler-cov.la: $(libmono_profiler_cov_la_OBJECTS) $(libmono_profiler_cov_la_DEPENDENCIES) $(EXTRA_libmono_profiler_cov_la_DEPENDENCIES)
@@ -652,20 +650,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -814,7 +798,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES
.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
- clean-libtool cscopelist ctags distclean distclean-compile \
+ clean-libtool ctags distclean distclean-compile \
distclean-generic distclean-libtool distclean-tags distdir dvi \
dvi-am html html-am info info-am install install-am \
install-binPROGRAMS install-data install-data-am install-dvi \
diff --git a/mono/profiler/ptestrunner.pl b/mono/profiler/ptestrunner.pl
index 36ae39ec53..96f2e0137c 100755
--- a/mono/profiler/ptestrunner.pl
+++ b/mono/profiler/ptestrunner.pl
@@ -16,6 +16,7 @@ my $minibuilddir = $builddir . "/mono/mini";
# for the profiler module
append_path ("LD_LIBRARY_PATH", $profbuilddir . "/.libs");
append_path ("DYLD_LIBRARY_PATH", $profbuilddir . "/.libs");
+append_path ("DYLD_LIBRARY_PATH", $minibuilddir . "/.libs");
# for mprof-report
append_path ("PATH", $profbuilddir);
@@ -37,7 +38,8 @@ $report = run_test ("test-busy.exe", "report,sample");
check_report_basics ($report);
check_report_threads ($report, "BusyHelper");
# at least 40% of the samples should hit each of the two busy methods
-check_report_samples ($report, "T:test ()" => 40, "T:test3 ()" => 40);
+# This seems to fail on osx, where the main thread gets the majority of SIGPROF signals
+#check_report_samples ($report, "T:test ()" => 40, "T:test3 ()" => 40);
report_errors ();
# test lock events
$report = run_test ("test-monitor.exe");
@@ -56,20 +58,20 @@ report_errors ();
$report = run_test_sgen ("test-heapshot.exe", "report,heapshot");
if ($report ne "missing binary") {
check_report_basics ($report);
- check_report_heapshot ($report, 0, {"T" => 5000});
- check_report_heapshot ($report, 1, {"T" => 5023});
+ check_report_heapshot ($report, 1, {"T" => 5000});
+ check_report_heapshot ($report, 2, {"T" => 5023});
report_errors ();
}
# test heapshot traces
$report = run_test_sgen ("test-heapshot.exe", "heapshot,output=-traces.mlpd", "--traces traces.mlpd");
if ($report ne "missing binary") {
check_report_basics ($report);
- check_report_heapshot ($report, 0, {"T" => 5000});
- check_report_heapshot ($report, 1, {"T" => 5023});
- check_heapshot_traces ($report, 0,
+ check_report_heapshot ($report, 1, {"T" => 5000});
+ check_report_heapshot ($report, 2, {"T" => 5023});
+ check_heapshot_traces ($report, 1,
T => [4999, "T"]
);
- check_heapshot_traces ($report, 1,
+ check_heapshot_traces ($report, 2,
T => [5022, "T"]
);
report_errors ();
@@ -344,9 +346,9 @@ sub check_report_heapshot
$section = get_heap_shot ($section, $hshot);
foreach my $type (keys %allocs) {
if ($section =~ /\d+\s+(\d+)\s+\d+\s+\Q$type\E(\s+\(bytes.*\))?$/m) {
- push @errors, "Wrong heapshot for type $type." unless $1 >= $allocs{$type};
+ push @errors, "Wrong heapshot for type $type at $hshot ($1, $allocs{$type})." unless $1 >= $allocs{$type};
} else {
- push @errors, "No heapshot for type $type.";
+ push @errors, "No heapshot for type $type at heapshot $hshot.";
}
}
}
diff --git a/mono/profiler/test-busy.cs b/mono/profiler/test-busy.cs
index 76e1a5b2b5..275f417a2d 100644
--- a/mono/profiler/test-busy.cs
+++ b/mono/profiler/test-busy.cs
@@ -1,3 +1,4 @@
+using System;
using System.Threading;
class T {
diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am
index 3e7a734046..1507db9c28 100644
--- a/mono/tests/Makefile.am
+++ b/mono/tests/Makefile.am
@@ -21,7 +21,10 @@ MKBUNDLE = \
PKG_CONFIG_PATH=$(top_builddir):$(PKG_CONFIG_PATH) \
$(RUNTIME) $(mcs_topdir)/class/lib/net_4_5/mkbundle.exe
-MCS = $(RUNTIME) $(mcs_topdir)/class/lib/build/mcs.exe -unsafe -nowarn:0162 -nowarn:0168 -nowarn:0219 -debug
+MCS = $(RUNTIME) $(mcs_topdir)/class/lib/build/mcs.exe -unsafe -debug \
+ -nowarn:0162 -nowarn:0168 -nowarn:0219 -nowarn:0414 -nowarn:0618 \
+ -nowarn:0169 -nowarn:1690 -nowarn:0649 -nowarn:0612 -nowarn:3021 \
+ -nowarn:0197
ILASM = $(RUNTIME) $(mcs_topdir)/class/lib/net_4_5/ilasm.exe
BENCHSRC=fib.cs random.cs nested-loops.cs ackermann.cs tight-loop.cs sieve.cs
@@ -389,7 +392,8 @@ BASE_TEST_CS_SRC= \
allow-synchronous-major.cs \
unload-appdomain-on-shutdown.cs \
block_guard_restore_aligment_on_exit.cs \
- finally_block_ending_in_dead_bb.cs
+ finally_block_ending_in_dead_bb.cs \
+ thread_static_gc_layout.cs
TEST_CS_SRC_DIST= \
$(BASE_TEST_CS_SRC) \
@@ -802,7 +806,9 @@ runtest: $(TESTSI_CS) $(TESTSI_IL) $(TESTBS) libtest.la $(PREREQSI_IL) $(PREREQS
@failed=0; \
passed=0; \
failed_tests="";\
- for i in $(TESTSI_CS) $(TESTBS) $(TESTSI_IL); do \
+ rm -f testlist testlist.sorted; \
+ for i in $(TESTSI_CS) $(TESTBS) $(TESTSI_IL); do echo $${i} >> testlist; sort testlist > testlist.sorted; done; \
+ for i in `cat testlist.sorted`; do \
rm -f $${i}.so; \
if [ x$(AOT) = x1 ]; then if echo $(AOT_DISABLED_TESTS) | grep -v -q $${i}; then $(with_mono_path) $(JITTEST_PROG_RUN) --aot --debug $${i} > $${i}.aotlog 2>&1 || exit 1; fi; fi; \
if $(srcdir)/test-driver '$(with_mono_path) $(JITTEST_PROG_RUN)' $$i '$(DISABLED_TESTS)' 'no-dump' $(RUNTIME_ARGS); \
@@ -815,6 +821,7 @@ runtest: $(TESTSI_CS) $(TESTSI_IL) $(TESTBS) libtest.la $(PREREQSI_IL) $(PREREQS
fi \
done; \
echo "$${passed} test(s) passed. $${failed} test(s) did not pass."; \
+ rm -f testlist testlist.sorted; \
if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
@@ -883,7 +890,7 @@ debug-casts:
@$(MCS) -r:TestDriver.dll $(srcdir)/debug-casts.cs
@$(RUNTIME) --debug=casts debug-casts.exe
-EXTRA_DIST += sgen-bridge.cs sgen-descriptors.cs sgen-gshared-vtype.cs sgen-bridge-major-fragmentation.cs sgen-domain-unload.cs sgen-weakref-stress.cs sgen-cementing-stress.cs sgen-case-23400.cs finalizer-wait.cs critical-finalizers.cs sgen-domain-unload-2.cs sgen-suspend.cs
+EXTRA_DIST += sgen-bridge.cs sgen-descriptors.cs sgen-gshared-vtype.cs sgen-bridge-major-fragmentation.cs sgen-domain-unload.cs sgen-weakref-stress.cs sgen-cementing-stress.cs sgen-case-23400.cs finalizer-wait.cs critical-finalizers.cs sgen-domain-unload-2.cs sgen-suspend.cs sgen-new-threads-dont-join-stw.cs sgen-bridge-xref.cs
#those are actually configurations, eg plain_sgen-descriptors.exe
@@ -897,7 +904,8 @@ SGEN_TESTS = \
sgen-domain-unload.exe \
sgen-weakref-stress.exe \
sgen-cementing-stress.exe \
- sgen-case-23400.exe
+ sgen-case-23400.exe \
+ sgen-new-threads-dont-join-stw.exe
SGEN_CONFIGURATIONS = \
"|plain" \
@@ -937,7 +945,7 @@ sgen-regular-tests: $(SGEN_TESTS)
if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
-sgen-bridge-tests: sgen-bridge.exe sgen-bridge-major-fragmentation.exe
+sgen-bridge-tests1: sgen-bridge.exe sgen-bridge-major-fragmentation.exe
@failed=0; \
passed=0; \
failed_tests="";\
@@ -961,8 +969,73 @@ sgen-bridge-tests: sgen-bridge.exe sgen-bridge-major-fragmentation.exe
if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
+sgen-bridge-tests2: sgen-bridge-xref.exe
+ @failed=0; \
+ passed=0; \
+ failed_tests="";\
+ for test in $+; do \
+ echo "...$$test"; \
+ for conf in $(SGEN_BRIDGE_CONFIGURATIONS); do \
+ name=`echo $$conf | cut -d\| -f 2`; \
+ params=`echo $$conf | cut -d\| -f 1`; \
+ test_name="$${test}|$${name}"; \
+ if MONO_GC_PARAMS="bridge=2Bridge$${params}" MONO_ENV_OPTIONS="--gc=sgen" $(srcdir)/test-driver '$(with_mono_path) $(JITTEST_PROG_RUN)' $$test_name "$(DISABLED_TESTS_SGEN)" 'dump-output' $(RUNTIME_ARGS); \
+ then \
+ passed=`expr $${passed} + 1`; \
+ else \
+ if [ $$? = 2 ]; then break; fi; \
+ failed=`expr $${failed} + 1`; \
+ failed_tests="$${failed_tests} $$test_name"; \
+ fi \
+ done \
+ done; \
+ echo "$${passed} test(s) passed. $${failed} test(s) did not pass."; \
+ if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
+ for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
+
+
+sgen-bridge-tests: sgen-bridge-tests1 sgen-bridge-tests2
+
sgen-tests: sgen-regular-tests sgen-bridge-tests
+AOT_CONFIGURATIONS= \
+ "|regular" \
+ "--gc=boehm|boehm"
+
+#LLVM crashes, got to fix it first.
+# "--llvm|llvm" \
+# "--llvm --gc=boehm|llvm+boehm"
+
+
+test-aot:
+ @failed=0; \
+ passed=0; \
+ failed_tests="";\
+ profile=net_4_5; \
+ tmpfile=`mktemp -t mono_aot_output` || exit 1; \
+ rm -f test-aot-$${name}.stdout test-aot-$${name}.stderr; \
+ for assembly in $(mcs_topdir)/class/lib/$$profile/*.dll ; do \
+ asm_name=`basename $$assembly`; \
+ echo "... $$asm_name"; \
+ for conf in $(AOT_CONFIGURATIONS); do \
+ name=`echo $$conf | cut -d\| -f 2`; \
+ params=`echo $$conf | cut -d\| -f 1`; \
+ test_name="$${asm_name}|$${name}"; \
+ echo " $$test_name"; \
+ if MONO_PATH=$(mcs_topdir)/class/lib/$$profile $(JITTEST_PROG_RUN) $$params --aot=outfile=$$tmpfile $$assembly >> test-aot-$${name}.stdout 2>> test-aot-$${name}.stderr; \
+ then \
+ passed=`expr $${passed} + 1`; \
+ else \
+ failed=`expr $${failed} + 1`; \
+ failed_tests="$${failed_tests} $$test_name"; \
+ fi \
+ done; \
+ done; \
+ rm $$tmpfile; \
+ echo "$${passed} test(s) passed. $${failed} test(s) did not pass."; \
+ if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
+ for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
+
# Generated tests for runtime invoke
EXTRA_DIST += gen-runtime-invoke.cs
diff --git a/mono/tests/Makefile.in b/mono/tests/Makefile.in
index 31a965ae3a..1acf2e0dd3 100644
--- a/mono/tests/Makefile.in
+++ b/mono/tests/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -69,8 +70,7 @@ target_triplet = @target@
@NACL_CODEGEN_FALSE@am__append_3 = bug-438454.cs bug-438454.exe.stdout.expected threadpool-in-processexit.cs threadpool-in-processexit.exe.stdout.expected
subdir = mono/tests
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(srcdir)/tests-config.in $(top_srcdir)/depcomp \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ $(srcdir)/tests-config.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -105,7 +105,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -115,10 +115,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libtest_la_SOURCES)
DIST_SOURCES = $(libtest_la_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -378,7 +378,11 @@ MKBUNDLE = \
PKG_CONFIG_PATH=$(top_builddir):$(PKG_CONFIG_PATH) \
$(RUNTIME) $(mcs_topdir)/class/lib/net_4_5/mkbundle.exe
-MCS = $(RUNTIME) $(mcs_topdir)/class/lib/build/mcs.exe -unsafe -nowarn:0162 -nowarn:0168 -nowarn:0219 -debug
+MCS = $(RUNTIME) $(mcs_topdir)/class/lib/build/mcs.exe -unsafe -debug \
+ -nowarn:0162 -nowarn:0168 -nowarn:0219 -nowarn:0414 -nowarn:0618 \
+ -nowarn:0169 -nowarn:1690 -nowarn:0649 -nowarn:0612 -nowarn:3021 \
+ -nowarn:0197
+
ILASM = $(RUNTIME) $(mcs_topdir)/class/lib/net_4_5/ilasm.exe
BENCHSRC = fib.cs random.cs nested-loops.cs ackermann.cs tight-loop.cs sieve.cs
STRESS_TESTS_SRC = \
@@ -745,7 +749,8 @@ BASE_TEST_CS_SRC = \
allow-synchronous-major.cs \
unload-appdomain-on-shutdown.cs \
block_guard_restore_aligment_on_exit.cs \
- finally_block_ending_in_dead_bb.cs
+ finally_block_ending_in_dead_bb.cs \
+ thread_static_gc_layout.cs
TEST_CS_SRC_DIST = \
$(BASE_TEST_CS_SRC) \
@@ -957,9 +962,10 @@ EXTRA_DIST = test-driver $(TEST_CS_SRC_DIST) $(TEST_IL_SRC) \
sgen-bridge-major-fragmentation.cs sgen-domain-unload.cs \
sgen-weakref-stress.cs sgen-cementing-stress.cs \
sgen-case-23400.cs finalizer-wait.cs critical-finalizers.cs \
- sgen-domain-unload-2.cs sgen-suspend.cs gen-runtime-invoke.cs \
- make-imt-test.cs test-inline-call-stack-library.cs \
- test-inline-call-stack.cs \
+ sgen-domain-unload-2.cs sgen-suspend.cs \
+ sgen-new-threads-dont-join-stw.cs sgen-bridge-xref.cs \
+ gen-runtime-invoke.cs make-imt-test.cs \
+ test-inline-call-stack-library.cs test-inline-call-stack.cs \
unhandled-exception-base-configuration.config \
unhandled-exception-legacy-configuration.config \
appdomain-unload.exe.config unhandled-exception-test-case.2.cs \
@@ -986,7 +992,8 @@ SGEN_TESTS = \
sgen-domain-unload.exe \
sgen-weakref-stress.exe \
sgen-cementing-stress.exe \
- sgen-case-23400.exe
+ sgen-case-23400.exe \
+ sgen-new-threads-dont-join-stw.exe
SGEN_CONFIGURATIONS = \
"|plain" \
@@ -1003,6 +1010,10 @@ SGEN_BRIDGE_CONFIGURATIONS = \
",major=marksweep-conc|ms-conc" \
",minor=split|ms-split"
+AOT_CONFIGURATIONS = \
+ "|regular" \
+ "--gc=boehm|boehm"
+
GSHARED_TESTS = \
generics-sharing.2.exe shared-generic-methods.2.exe \
shared-generic-synchronized.2.exe generic-initobj.2.exe \
@@ -1087,14 +1098,12 @@ tests-config: $(top_builddir)/config.status $(srcdir)/tests-config.in
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libtest.la: $(libtest_la_OBJECTS) $(libtest_la_DEPENDENCIES) $(EXTRA_libtest_la_DEPENDENCIES)
$(AM_V_CCLD)$(libtest_la_LINK) $(libtest_la_OBJECTS) $(libtest_la_LIBADD) $(LIBS)
@@ -1144,11 +1153,11 @@ clean-libtool:
-rm -rf .libs _libs
# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-# (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
@@ -1212,10 +1221,6 @@ ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
-cscopelist-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
- done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -1279,20 +1284,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -1460,24 +1451,22 @@ ps-am:
uninstall-am:
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
- cscopelist-recursive ctags-recursive install-am install-strip \
- tags-recursive
+ ctags-recursive install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am check check-am check-local clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist \
- cscopelist-recursive ctags ctags-recursive distclean \
- distclean-compile distclean-generic distclean-libtool \
- distclean-tags distdir 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 installcheck installcheck-am installdirs \
- installdirs-am maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am
+ clean-libtool clean-noinstLTLIBRARIES ctags ctags-recursive \
+ distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir 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 installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am
check-local: test
@@ -1604,7 +1593,9 @@ runtest: $(TESTSI_CS) $(TESTSI_IL) $(TESTBS) libtest.la $(PREREQSI_IL) $(PREREQS
@failed=0; \
passed=0; \
failed_tests="";\
- for i in $(TESTSI_CS) $(TESTBS) $(TESTSI_IL); do \
+ rm -f testlist testlist.sorted; \
+ for i in $(TESTSI_CS) $(TESTBS) $(TESTSI_IL); do echo $${i} >> testlist; sort testlist > testlist.sorted; done; \
+ for i in `cat testlist.sorted`; do \
rm -f $${i}.so; \
if [ x$(AOT) = x1 ]; then if echo $(AOT_DISABLED_TESTS) | grep -v -q $${i}; then $(with_mono_path) $(JITTEST_PROG_RUN) --aot --debug $${i} > $${i}.aotlog 2>&1 || exit 1; fi; fi; \
if $(srcdir)/test-driver '$(with_mono_path) $(JITTEST_PROG_RUN)' $$i '$(DISABLED_TESTS)' 'no-dump' $(RUNTIME_ARGS); \
@@ -1617,6 +1608,7 @@ runtest: $(TESTSI_CS) $(TESTSI_IL) $(TESTBS) libtest.la $(PREREQSI_IL) $(PREREQS
fi \
done; \
echo "$${passed} test(s) passed. $${failed} test(s) did not pass."; \
+ rm -f testlist testlist.sorted; \
if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
@@ -1705,7 +1697,7 @@ sgen-regular-tests: $(SGEN_TESTS)
if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
-sgen-bridge-tests: sgen-bridge.exe sgen-bridge-major-fragmentation.exe
+sgen-bridge-tests1: sgen-bridge.exe sgen-bridge-major-fragmentation.exe
@failed=0; \
passed=0; \
failed_tests="";\
@@ -1729,7 +1721,66 @@ sgen-bridge-tests: sgen-bridge.exe sgen-bridge-major-fragmentation.exe
if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
+sgen-bridge-tests2: sgen-bridge-xref.exe
+ @failed=0; \
+ passed=0; \
+ failed_tests="";\
+ for test in $+; do \
+ echo "...$$test"; \
+ for conf in $(SGEN_BRIDGE_CONFIGURATIONS); do \
+ name=`echo $$conf | cut -d\| -f 2`; \
+ params=`echo $$conf | cut -d\| -f 1`; \
+ test_name="$${test}|$${name}"; \
+ if MONO_GC_PARAMS="bridge=2Bridge$${params}" MONO_ENV_OPTIONS="--gc=sgen" $(srcdir)/test-driver '$(with_mono_path) $(JITTEST_PROG_RUN)' $$test_name "$(DISABLED_TESTS_SGEN)" 'dump-output' $(RUNTIME_ARGS); \
+ then \
+ passed=`expr $${passed} + 1`; \
+ else \
+ if [ $$? = 2 ]; then break; fi; \
+ failed=`expr $${failed} + 1`; \
+ failed_tests="$${failed_tests} $$test_name"; \
+ fi \
+ done \
+ done; \
+ echo "$${passed} test(s) passed. $${failed} test(s) did not pass."; \
+ if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
+ for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
+
+sgen-bridge-tests: sgen-bridge-tests1 sgen-bridge-tests2
+
sgen-tests: sgen-regular-tests sgen-bridge-tests
+
+#LLVM crashes, got to fix it first.
+# "--llvm|llvm" \
+# "--llvm --gc=boehm|llvm+boehm"
+
+test-aot:
+ @failed=0; \
+ passed=0; \
+ failed_tests="";\
+ profile=net_4_5; \
+ tmpfile=`mktemp -t mono_aot_output` || exit 1; \
+ rm -f test-aot-$${name}.stdout test-aot-$${name}.stderr; \
+ for assembly in $(mcs_topdir)/class/lib/$$profile/*.dll ; do \
+ asm_name=`basename $$assembly`; \
+ echo "... $$asm_name"; \
+ for conf in $(AOT_CONFIGURATIONS); do \
+ name=`echo $$conf | cut -d\| -f 2`; \
+ params=`echo $$conf | cut -d\| -f 1`; \
+ test_name="$${asm_name}|$${name}"; \
+ echo " $$test_name"; \
+ if MONO_PATH=$(mcs_topdir)/class/lib/$$profile $(JITTEST_PROG_RUN) $$params --aot=outfile=$$tmpfile $$assembly >> test-aot-$${name}.stdout 2>> test-aot-$${name}.stderr; \
+ then \
+ passed=`expr $${passed} + 1`; \
+ else \
+ failed=`expr $${failed} + 1`; \
+ failed_tests="$${failed_tests} $$test_name"; \
+ fi \
+ done; \
+ done; \
+ rm $$tmpfile; \
+ echo "$${passed} test(s) passed. $${failed} test(s) did not pass."; \
+ if [ $${failed} != 0 ]; then echo -e "\nFailed tests:\n"; \
+ for i in $${failed_tests}; do echo $${i}; done; exit 1; fi
runtime-invoke.gen.exe: TestDriver.dll gen-runtime-invoke.exe
$(RUNTIME) gen-runtime-invoke.exe > runtime-invoke.gen.cs
$(MCS) -out:runtime-invoke.gen.exe -r:TestDriver.dll runtime-invoke.gen.cs
diff --git a/mono/tests/assemblyresolve/Makefile.in b/mono/tests/assemblyresolve/Makefile.in
index b0686eb164..4bb15ec55a 100644
--- a/mono/tests/assemblyresolve/Makefile.in
+++ b/mono/tests/assemblyresolve/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -51,8 +52,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/assemblyresolve
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +70,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -330,8 +330,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/tests/cas/Makefile.in b/mono/tests/cas/Makefile.in
index 44eb62d52c..064a3244c6 100644
--- a/mono/tests/cas/Makefile.in
+++ b/mono/tests/cas/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -51,8 +52,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/cas
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +70,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -367,11 +367,11 @@ clean-libtool:
-rm -rf .libs _libs
# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-# (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
@@ -435,10 +435,6 @@ ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
-cscopelist-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
- done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -502,20 +498,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -675,23 +657,22 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
- cscopelist-recursive ctags-recursive install-am install-strip \
- tags-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+ install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am check check-am clean clean-generic clean-libtool \
- cscopelist cscopelist-recursive ctags ctags-recursive \
- distclean distclean-generic distclean-libtool distclean-tags \
- distdir 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 installcheck installcheck-am installdirs \
- installdirs-am maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
- ps ps-am tags tags-recursive uninstall uninstall-am
+ ctags ctags-recursive distclean distclean-generic \
+ distclean-libtool distclean-tags distdir 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 installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am
# Uncomment this for these tests to be for for 'make check'
diff --git a/mono/tests/cas/assembly/Makefile.in b/mono/tests/cas/assembly/Makefile.in
index a5a517eb93..8e2f4b92b3 100644
--- a/mono/tests/cas/assembly/Makefile.in
+++ b/mono/tests/cas/assembly/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,7 +53,7 @@ host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/cas/assembly
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +71,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -336,8 +337,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/tests/cas/demand/Makefile.in b/mono/tests/cas/demand/Makefile.in
index 9a23a2ce7e..9205d81753 100644
--- a/mono/tests/cas/demand/Makefile.in
+++ b/mono/tests/cas/demand/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,7 +53,7 @@ host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/cas/demand
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +71,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -340,8 +341,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/tests/cas/inheritance/Makefile.in b/mono/tests/cas/inheritance/Makefile.in
index bcc8153555..c89e390b40 100644
--- a/mono/tests/cas/inheritance/Makefile.in
+++ b/mono/tests/cas/inheritance/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,7 +53,7 @@ host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/cas/inheritance
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +71,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -343,8 +344,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/tests/cas/linkdemand/Makefile.in b/mono/tests/cas/linkdemand/Makefile.in
index 8e0a713ccb..d4da3fc138 100644
--- a/mono/tests/cas/linkdemand/Makefile.in
+++ b/mono/tests/cas/linkdemand/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,7 +53,7 @@ host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/cas/linkdemand
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +71,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -348,8 +349,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/tests/cas/threads/Makefile.in b/mono/tests/cas/threads/Makefile.in
index c5a4bef8ab..e155820b21 100644
--- a/mono/tests/cas/threads/Makefile.in
+++ b/mono/tests/cas/threads/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -52,7 +53,7 @@ host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/cas/threads
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +71,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -343,8 +344,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/tests/finalizer-exception.cs b/mono/tests/finalizer-exception.cs
index f11a1dcdef..29489ad494 100644
--- a/mono/tests/finalizer-exception.cs
+++ b/mono/tests/finalizer-exception.cs
@@ -2,10 +2,13 @@ using System;
using System.Threading;
public class FinalizerException {
+
~FinalizerException () {
throw new Exception ();
}
+ static IntPtr aptr;
+
/*
* We allocate the exception object deep down the stack so
* that it doesn't get pinned.
@@ -13,6 +16,7 @@ public class FinalizerException {
public static unsafe void MakeException (int depth) {
// Avoid tail calls
int* values = stackalloc int [20];
+ aptr = new IntPtr (values);
if (depth <= 0) {
new FinalizerException ();
return;
diff --git a/mono/tests/gc-descriptors/Makefile.in b/mono/tests/gc-descriptors/Makefile.in
index 2d9720a6de..af0e00e870 100644
--- a/mono/tests/gc-descriptors/Makefile.in
+++ b/mono/tests/gc-descriptors/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -51,8 +52,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = mono/tests/gc-descriptors
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -70,7 +70,7 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -330,8 +330,6 @@ TAGS:
ctags: CTAGS
CTAGS:
-cscope cscopelist:
-
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/mono/tests/libtest.c b/mono/tests/libtest.c
index c19603c6e5..f683ee2b66 100644
--- a/mono/tests/libtest.c
+++ b/mono/tests/libtest.c
@@ -5300,3 +5300,81 @@ mono_test_marshal_return_lpwstr (void)
return res;
}
+
+
+#ifndef TARGET_X86
+
+LIBTEST_API int STDCALL
+mono_test_has_thiscall (void)
+{
+ return 1;
+}
+
+LIBTEST_API int
+_mono_test_native_thiscall1 (int arg)
+{
+ return arg;
+}
+
+LIBTEST_API int
+_mono_test_native_thiscall2 (int arg, int arg2)
+{
+ return arg + (arg2^1);
+}
+
+LIBTEST_API int
+_mono_test_native_thiscall3 (int arg, int arg2, int arg3)
+{
+ return arg + (arg2^1) + (arg3^2);
+}
+
+#elif defined(__GNUC__)
+
+LIBTEST_API int STDCALL
+mono_test_has_thiscall (void)
+{
+ return 1;
+}
+
+#define def_asm_fn(name) \
+ "\t.align 4\n" \
+ "\t.globl _" #name "\n" \
+ "_" #name ":\n" \
+ "\t.globl __" #name "\n" \
+ "__" #name ":\n"
+
+asm(".text\n"
+
+def_asm_fn(mono_test_native_thiscall1)
+"\tmovl %ecx,%eax\n"
+"\tret\n"
+
+def_asm_fn(mono_test_native_thiscall2)
+"\tmovl %ecx,%eax\n"
+"\tmovl 4(%esp),%ecx\n"
+"\txorl $1,%ecx\n"
+"\taddl %ecx,%eax\n"
+"\tret $4\n"
+
+def_asm_fn(mono_test_native_thiscall3)
+"\tmovl %ecx,%eax\n"
+"\tmovl 4(%esp),%ecx\n"
+"\txorl $1,%ecx\n"
+"\taddl %ecx,%eax\n"
+"\tmovl 8(%esp),%ecx\n"
+"\txorl $2,%ecx\n"
+"\taddl %ecx,%eax\n"
+"\tret $8\n"
+
+);
+
+#else
+
+LIBTEST_API int STDCALL
+mono_test_has_thiscall (void)
+{
+ return 0;
+}
+
+#endif
+
diff --git a/mono/tests/marshal.cs b/mono/tests/marshal.cs
index 166a4d1de2..aadf7adf74 100644
--- a/mono/tests/marshal.cs
+++ b/mono/tests/marshal.cs
@@ -29,12 +29,7 @@ public class Tests {
public static extern IntPtr mono_test_marshal_return_delegate_2 ();
static int test_0_get_function_pointer_for_delegate () {
- // This is a 2.0 feature
- MethodInfo mi = typeof (Marshal).GetMethod ("GetFunctionPointerForDelegate");
- if (mi == null)
- return 0;
-
- IntPtr fnPtr = (IntPtr)mi.Invoke (null, new object [] { new SimpleDelegate (delegate_test)});
+ IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate (new SimpleDelegate (delegate_test));
if (mono_test_marshal_delegate (fnPtr) != 3)
return 1;
@@ -43,28 +38,18 @@ public class Tests {
}
static int test_0_get_delegate_for_function_pointer () {
- // This is a 2.0 feature
- MethodInfo mi = typeof (Marshal).GetMethod ("GetDelegateForFunctionPointer");
- if (mi == null)
- return 0;
-
IntPtr ptr = mono_test_marshal_return_delegate (new SimpleDelegate (delegate_test));
-
- SimpleDelegate d = (SimpleDelegate)mi.Invoke (null, new object [] { ptr, typeof (SimpleDelegate) });
+
+ SimpleDelegate d = (SimpleDelegate)Marshal.GetDelegateForFunctionPointer (ptr, typeof (SimpleDelegate));
return d (5) == 6 ? 0 : 1;
}
/* Obtain a delegate from a native function pointer */
static int test_0_get_delegate_for_ftnptr_native () {
- // This is a 2.0 feature
- MethodInfo mi = typeof (Marshal).GetMethod ("GetDelegateForFunctionPointer");
- if (mi == null)
- return 0;
-
IntPtr ptr = mono_test_marshal_return_delegate_2 ();
- SimpleDelegate d = (SimpleDelegate)mi.Invoke (null, new object [] { ptr, typeof (SimpleDelegate) });
+ SimpleDelegate d = (SimpleDelegate)Marshal.GetDelegateForFunctionPointer (ptr, typeof (SimpleDelegate));
return d (5) == 6 ? 0 : 1;
}
diff --git a/mono/tests/marshal7.cs b/mono/tests/marshal7.cs
index aeb7b55c87..02cfbbd40a 100644
--- a/mono/tests/marshal7.cs
+++ b/mono/tests/marshal7.cs
@@ -1,4 +1,5 @@
using System;
+using System.Reflection;
using System.Runtime.InteropServices;
public class Test
@@ -51,7 +52,8 @@ public class Test
object itf;
}
- // Size should be 12 in both 32 and 64 bits
+ // Size should be 16 in both 32 and 64 bits win/linux
+ // Size should be 12 on 32bits OSX size alignment of long is 4
[StructLayout (LayoutKind.Explicit)]
struct TestStruct8 {
[FieldOffset (0)]
@@ -69,7 +71,8 @@ public class Test
public ulong b;
}
- // Size should be 11 in both 32 and 64 bits
+ // Size should be 16 in both 32 and 64 bits
+ // Size should be 12 on 32bits OSX size alignment of long is 4
[StructLayout (LayoutKind.Explicit)]
struct TestStruct10 {
[FieldOffset (0)]
@@ -95,6 +98,34 @@ public class Test
public int b;
}
+ // Size should always be 12, since pack = 0, size = 0 and min alignment = 4
+ //When pack is not set, we default to 8, so min (8, min alignment) -> 4
+ [StructLayout (LayoutKind.Explicit)]
+ struct TestStruct13 {
+ [FieldOffset(0)]
+ int one;
+ [FieldOffset(4)]
+ int two;
+ [FieldOffset(8)]
+ int three;
+ }
+
+ // Size should always be 12, since pack = 8, size = 0 and min alignment = 4
+ //It's aligned to min (pack, min alignment) -> 4
+ [StructLayout (LayoutKind.Explicit)]
+ struct TestStruct14 {
+ [FieldOffset(0)]
+ int one;
+ [FieldOffset(4)]
+ int two;
+ [FieldOffset(8)]
+ int three;
+ }
+ static bool IsOSX ()
+ {
+ return (int)typeof (Environment).GetMethod ("get_Platform", BindingFlags.Static | BindingFlags.NonPublic).Invoke (null, null) == 6;
+ }
+
public unsafe static int Main ()
{
///
@@ -181,16 +212,27 @@ public class Test
// a VARIANT is
if (Marshal.SizeOf (typeof (TestStruct7)) != 16)
return 13;
- if (Marshal.SizeOf (typeof (TestStruct8)) != 16)
- return 14;
+ if (IsOSX () && IntPtr.Size == 4) {
+ if (Marshal.SizeOf (typeof (TestStruct8)) != 12)
+ return 14;
+ if (Marshal.SizeOf (typeof (TestStruct10)) != 12)
+ return 16;
+ } else {
+ if (Marshal.SizeOf (typeof (TestStruct8)) != 16)
+ return 14;
+ if (Marshal.SizeOf (typeof (TestStruct10)) != 16)
+ return 16;
+ }
if (Marshal.SizeOf (typeof (TestStruct9)) != 12)
return 15;
- if (Marshal.SizeOf (typeof (TestStruct10)) != 16)
- return 16;
if (Marshal.SizeOf (typeof (TestStruct11)) != 11)
return 17;
if (Marshal.SizeOf (typeof (TestStruct12)) != 6)
return 18;
+ if (Marshal.SizeOf (typeof (TestStruct13)) != 12)
+ return 19;
+ if (Marshal.SizeOf (typeof (TestStruct14)) != 12)
+ return 20;
return 0;
}
}
diff --git a/mono/tests/pinvoke2.cs b/mono/tests/pinvoke2.cs
index 3f1f6dc43f..22c83573c4 100644
--- a/mono/tests/pinvoke2.cs
+++ b/mono/tests/pinvoke2.cs
@@ -84,6 +84,15 @@ public class Tests {
public int x;
public double y;
}
+
+ [StructLayout (LayoutKind.Sequential)]
+ public struct TinyStruct {
+ public TinyStruct (int i)
+ {
+ this.i = i;
+ }
+ public int i;
+ }
[StructLayout (LayoutKind.Sequential)]
public class SimpleClass {
@@ -1725,5 +1734,51 @@ public class Tests {
return 1;
}
+ [DllImport ("libtest", EntryPoint="mono_test_has_thiscall")]
+ public static extern int mono_test_has_thiscall ();
+
+ [DllImport ("libtest", EntryPoint = "_mono_test_native_thiscall1", CallingConvention=CallingConvention.ThisCall)]
+ public static extern int mono_test_native_thiscall (int a);
+
+ [DllImport ("libtest", EntryPoint = "_mono_test_native_thiscall2", CallingConvention=CallingConvention.ThisCall)]
+ public static extern int mono_test_native_thiscall (int a, int b);
+
+ [DllImport ("libtest", EntryPoint = "_mono_test_native_thiscall3", CallingConvention=CallingConvention.ThisCall)]
+ public static extern int mono_test_native_thiscall (int a, int b, int c);
+
+ [DllImport ("libtest", EntryPoint = "_mono_test_native_thiscall1", CallingConvention=CallingConvention.ThisCall)]
+ public static extern int mono_test_native_thiscall (TinyStruct a);
+
+ [DllImport ("libtest", EntryPoint = "_mono_test_native_thiscall2", CallingConvention=CallingConvention.ThisCall)]
+ public static extern int mono_test_native_thiscall (TinyStruct a, int b);
+
+ [DllImport ("libtest", EntryPoint = "_mono_test_native_thiscall3", CallingConvention=CallingConvention.ThisCall)]
+ public static extern int mono_test_native_thiscall (TinyStruct a, int b, int c);
+
+ public static int test_0_native_thiscall ()
+ {
+ if (mono_test_has_thiscall () == 0)
+ return 0;
+
+ if (mono_test_native_thiscall (1968329802) != 1968329802)
+ return 1;
+
+ if (mono_test_native_thiscall (268894549, 1212675791) != 1481570339)
+ return 2;
+
+ if (mono_test_native_thiscall (1288082683, -421187449, -1733670329) != -866775098)
+ return 3;
+
+ if (mono_test_native_thiscall (new TinyStruct(1968329802)) != 1968329802)
+ return 4;
+
+ if (mono_test_native_thiscall (new TinyStruct(268894549), 1212675791) != 1481570339)
+ return 5;
+
+ if (mono_test_native_thiscall (new TinyStruct(1288082683), -421187449, -1733670329) != -866775098)
+ return 6;
+
+ return 0;
+ }
}
diff --git a/mono/tests/sgen-bridge-xref.cs b/mono/tests/sgen-bridge-xref.cs
new file mode 100644
index 0000000000..82892803ce
--- /dev/null
+++ b/mono/tests/sgen-bridge-xref.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Threading;
+
+public class Bridge {
+ public int __test;
+ public string id;
+ public List<object> link = new List<object> ();
+
+ ~Bridge () {
+ }
+}
+
+class Driver {
+ static WeakReference<Bridge> root, child;
+
+ static void SetupLinks () {
+ var a = new Bridge () { id = "bridge" };
+ var b = new Bridge () { id = "child" };
+ a.link.Add (b);
+ a.__test = 1;
+ b.__test = 0;
+ root = new WeakReference<Bridge> (a, true);
+ child = new WeakReference<Bridge> (b, true);
+ }
+
+ static int Main ()
+ {
+ var t = new Thread (SetupLinks);
+ t.Start ();
+ t.Join ();
+
+ GC.Collect ();
+ Bridge a, b;
+ a = b = null;
+ Console.WriteLine ("try get A {0}", root.TryGetTarget (out a));
+ Console.WriteLine ("try get B {0}", child.TryGetTarget (out b));
+ Console.WriteLine ("a is null {0}", a == null);
+ Console.WriteLine ("b is null {0}", b == null);
+ if (a == null || b == null)
+ return 1;
+
+ Console.WriteLine ("a test {0}", a.__test);
+ Console.WriteLine ("b test {0}", b.__test);
+
+ if (a.__test != 1 || b.__test != 3)
+ return 2;
+
+ return 0;
+ }
+} \ No newline at end of file
diff --git a/mono/tests/sgen-descriptors.cs b/mono/tests/sgen-descriptors.cs
index ae000849ce..246e5aac59 100644
--- a/mono/tests/sgen-descriptors.cs
+++ b/mono/tests/sgen-descriptors.cs
@@ -1,4 +1,5 @@
using System;
+using System.Runtime.InteropServices;
public struct SmallMixed
{
@@ -47,6 +48,13 @@ public class HugePtrFree {
public LargeStruct2 c;
}
+[StructLayout (LayoutKind.Sequential)]
+public class Non32bitBitmap {
+ public object o;
+ public long i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35;
+ public object o2;
+}
+
/*
This is a stress test for descriptors.
*/
@@ -54,10 +62,10 @@ class Driver {
static char[] FOO = new char[] { 'f', 'o', 'b' };
static void Fill (int cycles) {
- object[] root = new object [12];
+ object[] root = new object [13];
object[] current = root;
for (int i = 0; i < cycles; ++i) {
- current [0] = new object [12];
+ current [0] = new object [13];
current [1] = new int [6];
current [2] = new int [2,3];
current [3] = new string (FOO);
@@ -72,6 +80,9 @@ class Driver {
current [10] = new HugePtrFree ();
if ((i % 10000) == 0)
current [11] = new LargeStruct2 [1];
+
+ /* Test for 64 bit bitmap descriptors (#14834) */
+ current [12] = new Non32bitBitmap () { o = new object (), i32 = 1, i33 = 1, i34 = 1, i35 = 1, o2 = new object () };
current = (object[])current [0];
}
diff --git a/mono/tests/sgen-new-threads-dont-join-stw.cs b/mono/tests/sgen-new-threads-dont-join-stw.cs
new file mode 100644
index 0000000000..b6d0a9b693
--- /dev/null
+++ b/mono/tests/sgen-new-threads-dont-join-stw.cs
@@ -0,0 +1,95 @@
+using System;
+using System.Timers;
+using System.Threading;
+using System.Collections;
+using System.Collections.Generic;
+
+class T {
+
+ static int count = 0;
+ static object count_lock = new object();
+
+ const long N = 500000;
+ const int num_threads = 8;
+
+ static void UseMemory () {
+
+ for (int i = 0; i < N; ++i) {
+
+ var l1 = new ArrayList ();
+ l1.Add(""+i);
+ var l2 = new ArrayList ();
+ l2.Add(""+(i+1));
+ var l3 = new ArrayList ();
+ l3.Add(""+(i+2));
+ var l4 = new ArrayList ();
+ l4.Add(""+(i+3));
+ }
+
+
+ lock (count_lock)
+ {
+ count++;
+ Monitor.PulseAll(count_lock);
+ }
+ }
+
+ static void Timer_Elapsed(object sender, EventArgs e)
+ {
+ HashSet<string> h = new HashSet<string>();
+ for (int j = 0; j < 10000; j++)
+ {
+ h.Add(""+j+""+j);
+ }
+ }
+
+ static void Main (string[] args) {
+
+ for (int j = 0; j < 2; j++)
+ {
+ count = 0;
+
+ List<Thread> threads = new List<Thread>();
+ List<System.Timers.Timer> timers = new List<System.Timers.Timer>();
+
+ for (int i = 0; i < num_threads; i++)
+ {
+ Thread t3 = new Thread (delegate () {
+ UseMemory();
+ });
+
+ t3.Start ();
+
+ System.Timers.Timer timer = new System.Timers.Timer();
+ timer.Elapsed += Timer_Elapsed;
+ timer.AutoReset = false;
+ timer.Interval = 1000;
+ timer.Start();
+ timers.Add(timer);
+ }
+
+ for (int i = 0; i < 4000; i++)
+ {
+ System.Timers.Timer timer = new System.Timers.Timer();
+ timer.Elapsed += Timer_Elapsed;
+ timer.AutoReset = false;
+ timer.Interval = 500;
+ timer.Start();
+ timers.Add(timer);
+ }
+
+ lock (count_lock)
+ {
+ while (count < num_threads)
+ {
+ Monitor.Wait(count_lock);
+ }
+ }
+
+ foreach (var t in threads)
+ {
+ t.Join();
+ }
+ }
+ }
+}
diff --git a/mono/tests/thread_static_gc_layout.cs b/mono/tests/thread_static_gc_layout.cs
new file mode 100644
index 0000000000..d0ea8b4e34
--- /dev/null
+++ b/mono/tests/thread_static_gc_layout.cs
@@ -0,0 +1,26 @@
+using System;
+
+public struct Sandwich
+{
+ public IntPtr a;
+ public object b;
+ public IntPtr c;
+ public IntPtr d;
+}
+
+class Driver {
+ [ThreadStatic]
+ static Sandwich blt;
+ // const long initial_val = 0x0100000001L;
+ const int initial_val = 1;
+
+ static int Main ()
+ {
+ blt.a = (IntPtr)initial_val;
+ blt.b = new object ();
+ blt.c = (IntPtr)initial_val;
+ blt.d = (IntPtr)initial_val;
+ GC.Collect ();
+ return (blt.a == blt.c && blt.c == blt.d && blt.a == (IntPtr)initial_val) ? 0 : -1;
+ }
+} \ No newline at end of file
diff --git a/mono/utils/Makefile.am b/mono/utils/Makefile.am
index 8eefcda5ca..21e47bb648 100644
--- a/mono/utils/Makefile.am
+++ b/mono/utils/Makefile.am
@@ -100,6 +100,7 @@ monoutils_sources = \
mono-threads-windows.c \
mono-threads.h \
mono-tls.h \
+ mono-tls.c \
linux_magic.h \
mono-memory-model.h \
atomic.h \
@@ -107,7 +108,8 @@ monoutils_sources = \
mono-hwcap.h \
mono-hwcap.c \
bsearch.h \
- bsearch.c
+ bsearch.c \
+ mono-signal-handler.h
arch_sources =
diff --git a/mono/utils/Makefile.in b/mono/utils/Makefile.in
index d5c142c2a4..aaa3cac165 100644
--- a/mono/utils/Makefile.in
+++ b/mono/utils/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# 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.
@@ -68,8 +69,7 @@ target_triplet = @target@
@S390X_TRUE@am__append_14 = mono-hwcap-s390x.c mono-hwcap-s390x.h
subdir = mono/utils
DIST_COMMON = $(libmonoutilsinclude_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
- $(top_srcdir)/mkinstalldirs ChangeLog
+ $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -112,14 +112,15 @@ am__libmonoutils_la_SOURCES_DIST = mono-md5.c mono-sha1.c \
lock-free-array-queue.h mono-linked-list-set.c \
mono-linked-list-set.h mono-threads.c mono-threads-posix.c \
mono-threads-mach.c mono-threads-windows.c mono-threads.h \
- mono-tls.h linux_magic.h mono-memory-model.h atomic.h atomic.c \
- mono-hwcap.h mono-hwcap.c bsearch.h bsearch.c \
- mach-support-x86.c mach-support-amd64.c mach-support-arm.c \
- mach-support-unknown.c mono-hwcap-x86.c mono-hwcap-x86.h \
- mono-hwcap-arm.c mono-hwcap-arm.h mono-hwcap-mips.c \
- mono-hwcap-mips.h mono-hwcap-ppc.c mono-hwcap-ppc.h \
- mono-hwcap-sparc.c mono-hwcap-sparc.h mono-hwcap-ia64.c \
- mono-hwcap-ia64.h mono-hwcap-s390x.c mono-hwcap-s390x.h
+ mono-tls.h mono-tls.c linux_magic.h mono-memory-model.h \
+ atomic.h atomic.c mono-hwcap.h mono-hwcap.c bsearch.h \
+ bsearch.c mono-signal-handler.h mach-support-x86.c \
+ mach-support-amd64.c mach-support-arm.c mach-support-unknown.c \
+ mono-hwcap-x86.c mono-hwcap-x86.h mono-hwcap-arm.c \
+ mono-hwcap-arm.h mono-hwcap-mips.c mono-hwcap-mips.h \
+ mono-hwcap-ppc.c mono-hwcap-ppc.h mono-hwcap-sparc.c \
+ mono-hwcap-sparc.h mono-hwcap-ia64.c mono-hwcap-ia64.h \
+ mono-hwcap-s390x.c mono-hwcap-s390x.h
am__objects_1 = mono-md5.lo mono-sha1.lo mono-logger.lo \
mono-codeman.lo dlmalloc.lo mono-counters.lo mono-dl.lo \
mono-internal-hash.lo mono-io-portability.lo monobitset.lo \
@@ -131,8 +132,8 @@ am__objects_1 = mono-md5.lo mono-sha1.lo mono-logger.lo \
mach-support.lo mono-context.lo hazard-pointer.lo \
lock-free-queue.lo lock-free-alloc.lo lock-free-array-queue.lo \
mono-linked-list-set.lo mono-threads.lo mono-threads-posix.lo \
- mono-threads-mach.lo mono-threads-windows.lo atomic.lo \
- mono-hwcap.lo bsearch.lo
+ mono-threads-mach.lo mono-threads-windows.lo mono-tls.lo \
+ atomic.lo mono-hwcap.lo bsearch.lo
@CROSS_COMPILE_FALSE@@X86_TRUE@am__objects_2 = mach-support-x86.lo
@AMD64_TRUE@@CROSS_COMPILE_FALSE@am__objects_3 = \
@AMD64_TRUE@@CROSS_COMPILE_FALSE@ mach-support-amd64.lo
@@ -166,7 +167,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
+am__v_CC_0 = @echo " CC " $@;
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
@@ -176,10 +177,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libmonoutils_la_SOURCES)
DIST_SOURCES = $(am__libmonoutils_la_SOURCES_DIST)
am__can_run_installinfo = \
@@ -510,6 +511,7 @@ monoutils_sources = \
mono-threads-windows.c \
mono-threads.h \
mono-tls.h \
+ mono-tls.c \
linux_magic.h \
mono-memory-model.h \
atomic.h \
@@ -517,7 +519,8 @@ monoutils_sources = \
mono-hwcap.h \
mono-hwcap.c \
bsearch.h \
- bsearch.c
+ bsearch.c \
+ mono-signal-handler.h
arch_sources = $(am__append_1) $(am__append_2) $(am__append_3) \
$(am__append_4) $(am__append_5) $(am__append_6) \
@@ -571,14 +574,12 @@ $(am__aclocal_m4_deps):
clean-noinstLTLIBRARIES:
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
- @list='$(noinst_LTLIBRARIES)'; \
- locs=`for p in $$list; do echo $$p; done | \
- sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
- sort -u`; \
- test -z "$$locs" || { \
- echo rm -f $${locs}; \
- rm -f $${locs}; \
- }
+ @list='$(noinst_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
libmonoutils.la: $(libmonoutils_la_OBJECTS) $(libmonoutils_la_DEPENDENCIES) $(EXTRA_libmonoutils_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libmonoutils_la_OBJECTS) $(libmonoutils_la_LIBADD) $(LIBS)
@@ -636,6 +637,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mono-threads-windows.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mono-threads.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mono-time.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mono-tls.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mono-uri.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mono-value-hash.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/monobitset.Plo@am__quote@
@@ -742,20 +744,6 @@ GTAGS:
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP)'; \
- case "$(srcdir)" in \
- [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
- *) sdir=$(subdir)/$(srcdir) ;; \
- esac; \
- for i in $$list; do \
- if test -f "$$i"; then \
- echo "$(subdir)/$$i"; \
- else \
- echo "$$sdir/$$i"; \
- fi; \
- done >> $(top_builddir)/cscope.files
-
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -903,18 +891,18 @@ uninstall-am: uninstall-libmonoutilsincludeHEADERS
.MAKE: all check install install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
- distclean distclean-compile distclean-generic \
- distclean-libtool distclean-tags distdir 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-libmonoutilsincludeHEADERS install-man \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip 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 \
+ clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir 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-libmonoutilsincludeHEADERS install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ 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-libmonoutilsincludeHEADERS
diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c
index da3290a518..7cd884e61d 100755
--- a/mono/utils/atomic.c
+++ b/mono/utils/atomic.c
@@ -13,12 +13,14 @@
#include <mono/utils/atomic.h>
-#if defined (WAPI_NO_ATOMIC_ASM) || !defined (HAS_64BITS_ATOMIC)
+#if defined (WAPI_NO_ATOMIC_ASM) || defined (BROKEN_64BIT_ATOMICS_INTRINSIC)
#include <pthread.h>
static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER;
+#define NEED_64BIT_CMPXCHG_FALLBACK
+
#endif
#ifdef WAPI_NO_ATOMIC_ASM
@@ -82,6 +84,52 @@ gpointer InterlockedCompareExchangePointer(volatile gpointer *dest,
return(old);
}
+gint32 InterlockedAdd(volatile gint32 *dest, gint32 add)
+{
+ gint32 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ *dest += add;
+ ret= *dest;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
+gint64 InterlockedAdd64(volatile gint64 *dest, gint64 add)
+{
+ gint64 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ *dest += add;
+ ret= *dest;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
gint32 InterlockedIncrement(volatile gint32 *dest)
{
gint32 ret;
@@ -105,6 +153,29 @@ gint32 InterlockedIncrement(volatile gint32 *dest)
return(ret);
}
+gint64 InterlockedIncrement64(volatile gint64 *dest)
+{
+ gint64 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ (*dest)++;
+ ret= *dest;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
gint32 InterlockedDecrement(volatile gint32 *dest)
{
gint32 ret;
@@ -128,6 +199,29 @@ gint32 InterlockedDecrement(volatile gint32 *dest)
return(ret);
}
+gint64 InterlockedDecrement64(volatile gint64 *dest)
+{
+ gint64 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ (*dest)--;
+ ret= *dest;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
{
gint32 ret;
@@ -151,6 +245,29 @@ gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
return(ret);
}
+gint64 InterlockedExchange64(volatile gint64 *dest, gint64 exch)
+{
+ gint64 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ ret=*dest;
+ *dest=exch;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch)
{
gpointer ret;
@@ -197,40 +314,241 @@ gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
return(ret);
}
-#endif
+gint64 InterlockedExchangeAdd64(volatile gint64 *dest, gint64 add)
+{
+ gint64 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ ret= *dest;
+ *dest+=add;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
-#ifndef HAS_64BITS_ATOMICS
+ pthread_cleanup_pop (0);
-#if defined (TARGET_MACH) && defined (TARGET_ARM) && (defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7S__))
+ return(ret);
+}
-gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp) __attribute__ ((naked));
+gint8 InterlockedRead8(volatile gint8 *src)
+{
+ gint8 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
-gint64
-InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp)
+ ret= *src;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
+gint16 InterlockedRead16(volatile gint16 *src)
+{
+ gint16 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ ret= *src;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
+gint32 InterlockedRead(volatile gint32 *src)
+{
+ gint32 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ ret= *src;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
+gint64 InterlockedRead64(volatile gint64 *src)
+{
+ gint64 ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ ret= *src;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
+gpointer InterlockedReadPointer(volatile gpointer *src)
+{
+ gpointer ret;
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ ret= *src;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+
+ return(ret);
+}
+
+void InterlockedWrite(volatile gint8 *dst, gint8 val)
+{
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ *dst=val;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+}
+
+void InterlockedWrite16(volatile gint16 *dst, gint16 val)
+{
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ *dst=val;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+}
+
+void InterlockedWrite(volatile gint32 *dst, gint32 val)
+{
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ *dst=val;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+}
+
+void InterlockedWrite64(volatile gint64 *dst, gint64 val)
{
- __asm__ (
- "push {r4, r5, r6, r7}\n"
- "ldr r4, [sp, #16]\n"
- "dmb\n"
-"1:\n"
- "ldrexd r6, r7, [r0]\n"
- "cmp r7, r4\n"
- "bne 2f\n"
- "cmp r6, r3\n"
- "bne 2f\n"
- "strexd r5, r1, r2, [r0]\n"
- "cmp r5, #0\n"
- "bne 1b\n"
-"2:\n"
- "dmb\n"
- "mov r0, r6\n"
- "mov r1, r7\n"
- "pop {r4, r5, r6, r7}\n"
- "bx lr\n"
- );
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ *dst=val;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
}
-#elif defined (TARGET_MACH) && (defined (TARGET_X86) || defined (TARGET_AMD64))
+void InterlockedWritePointer(volatile gpointer *dst, gpointer val)
+{
+ int thr_ret;
+
+ mono_once(&spin_once, spin_init);
+
+ pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+ (void *)&spin);
+ thr_ret = pthread_mutex_lock(&spin);
+ g_assert (thr_ret == 0);
+
+ *dst=val;
+
+ thr_ret = pthread_mutex_unlock(&spin);
+ g_assert (thr_ret == 0);
+
+ pthread_cleanup_pop (0);
+}
+
+#endif
+
+#if defined (NEED_64BIT_CMPXCHG_FALLBACK)
+
+#if defined (TARGET_OSX)
+
+/* The compiler breaks if this code is in the header... */
gint64
InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp)
@@ -238,6 +556,12 @@ InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp)
return __sync_val_compare_and_swap (dest, comp, exch);
}
+#elif defined (HAVE_64BIT_CMPXCHG_FALLBACK)
+
+#ifdef ENABLE_EXTENSION_MODULE
+#include "../../../mono-extensions/mono/utils/atomic.c"
+#endif
+
#else
gint64
@@ -256,4 +580,5 @@ InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp)
}
#endif
+
#endif
diff --git a/mono/utils/atomic.h b/mono/utils/atomic.h
index 8e57f5d116..79455ad9c4 100755
--- a/mono/utils/atomic.h
+++ b/mono/utils/atomic.h
@@ -11,16 +11,6 @@
#ifndef _WAPI_ATOMIC_H_
#define _WAPI_ATOMIC_H_
-#if defined(__NetBSD__)
-#include <sys/param.h>
-
-#if __NetBSD_Version__ > 499004000
-#include <sys/atomic.h>
-#define HAVE_ATOMIC_OPS
-#endif
-
-#endif
-
#include "config.h"
#include <glib.h>
@@ -31,17 +21,123 @@
/* On Windows, we always use the functions provided by the Windows API. */
#if defined(__WIN32__) || defined(_WIN32)
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
#include <windows.h>
-#define HAS_64BITS_ATOMICS 1
+#include <mono/utils/mono-membar.h>
/* mingw is missing InterlockedCompareExchange64 () from winbase.h */
-#ifdef __MINGW32__
+#if HAVE_DECL_INTERLOCKEDCOMPAREEXCHANGE64==0
static inline gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp)
{
return __sync_val_compare_and_swap (dest, comp, exch);
}
#endif
+/* mingw is missing InterlockedExchange64 () from winbase.h */
+#if HAVE_DECL_INTERLOCKEDEXCHANGE64==0
+static inline gint64 InterlockedExchange64(volatile gint64 *val, gint64 new_val)
+{
+ gint64 old_val;
+ do {
+ old_val = *val;
+ } while (InterlockedCompareExchange64 (val, new_val, old_val) != old_val);
+ return old_val;
+}
+#endif
+
+/* mingw is missing InterlockedIncrement64 () from winbase.h */
+#if HAVE_DECL_INTERLOCKEDINCREMENT64==0
+static inline gint64 InterlockedIncrement64(volatile gint64 *val)
+{
+ return __sync_add_and_fetch (val, 1);
+}
+#endif
+
+/* mingw is missing InterlockedDecrement64 () from winbase.h */
+#if HAVE_DECL_INTERLOCKEDDECREMENT64==0
+static inline gint64 InterlockedDecrement64(volatile gint64 *val)
+{
+ return __sync_sub_and_fetch (val, 1);
+}
+#endif
+
+/* mingw is missing InterlockedAdd () from winbase.h */
+#if HAVE_DECL_INTERLOCKEDADD==0
+static inline gint32 InterlockedAdd(volatile gint32 *dest, gint32 add)
+{
+ return __sync_add_and_fetch (dest, add);
+}
+#endif
+
+/* mingw is missing InterlockedAdd64 () from winbase.h */
+#if HAVE_DECL_INTERLOCKEDADD64==0
+static inline gint64 InterlockedAdd64(volatile gint64 *dest, gint64 add)
+{
+ return __sync_add_and_fetch (dest, add);
+}
+#endif
+
+/* And now for some dirty hacks... The Windows API doesn't
+ * provide any useful primitives for this (other than getting
+ * into architecture-specific madness), so use CAS. */
+
+static inline gint32 InterlockedRead(volatile gint32 *src)
+{
+ return InterlockedCompareExchange (src, 0, 0);
+}
+
+static inline gint64 InterlockedRead64(volatile gint64 *src)
+{
+ return InterlockedCompareExchange64 (src, 0, 0);
+}
+
+static inline gpointer InterlockedReadPointer(volatile gpointer *src)
+{
+ return InterlockedCompareExchangePointer (src, NULL, NULL);
+}
+
+static inline void InterlockedWrite(volatile gint32 *dst, gint32 val)
+{
+ InterlockedExchange (dst, val);
+}
+
+static inline void InterlockedWrite64(volatile gint64 *dst, gint64 val)
+{
+ InterlockedExchange64 (dst, val);
+}
+
+static inline void InterlockedWritePointer(volatile gpointer *dst, gpointer val)
+{
+ InterlockedExchangePointer (dst, val);
+}
+
+/* We can't even use CAS for these, so write them out
+ * explicitly according to x86(_64) semantics... */
+
+static inline gint8 InterlockedRead8(volatile gint8 *src)
+{
+ return *src;
+}
+
+static inline gint16 InterlockedRead16(volatile gint16 *src)
+{
+ return *src;
+}
+
+static inline void InterlockedWrite8(volatile gint8 *dst, gint8 val)
+{
+ *dst = val;
+ mono_memory_barrier ();
+}
+
+static inline void InterlockedWrite16(volatile gint16 *dst, gint16 val)
+{
+ *dst = val;
+ mono_memory_barrier ();
+}
+
/* Prefer GCC atomic ops if the target supports it (see configure.in). */
#elif defined(USE_GCC_ATOMIC_OPS)
@@ -56,6 +152,11 @@ static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest
return __sync_val_compare_and_swap (dest, comp, exch);
}
+static inline gint32 InterlockedAdd(volatile gint32 *dest, gint32 add)
+{
+ return __sync_add_and_fetch (dest, add);
+}
+
static inline gint32 InterlockedIncrement(volatile gint32 *val)
{
return __sync_add_and_fetch (val, 1);
@@ -63,7 +164,7 @@ static inline gint32 InterlockedIncrement(volatile gint32 *val)
static inline gint32 InterlockedDecrement(volatile gint32 *val)
{
- return __sync_add_and_fetch (val, -1);
+ return __sync_sub_and_fetch (val, 1);
}
static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
@@ -90,339 +191,167 @@ static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
return __sync_fetch_and_add (val, add);
}
-#if defined (TARGET_OSX)
-#define BROKEN_64BIT_ATOMICS_INTRINSIC 1
-#endif
-
-
-#if !defined (BROKEN_64BIT_ATOMICS_INTRINSIC)
-#define HAS_64BITS_ATOMICS 1
-
-static inline gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp)
+static inline gint8 InterlockedRead8(volatile gint8 *src)
{
- return __sync_val_compare_and_swap (dest, comp, exch);
+ /* Kind of a hack, but GCC doesn't give us anything better, and it's
+ * certainly not as bad as using a CAS loop. */
+ return __sync_fetch_and_add (src, 0);
}
-#endif
-
-
-#elif defined(__NetBSD__) && defined(HAVE_ATOMIC_OPS)
-
-static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
- gint32 exch, gint32 comp)
+static inline gint16 InterlockedRead16(volatile gint16 *src)
{
- return atomic_cas_32((uint32_t*)dest, comp, exch);
+ return __sync_fetch_and_add (src, 0);
}
-static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
+static inline gint32 InterlockedRead(volatile gint32 *src)
{
- return atomic_cas_ptr(dest, comp, exch);
+ return __sync_fetch_and_add (src, 0);
}
-static inline gint32 InterlockedIncrement(volatile gint32 *val)
+static inline void InterlockedWrite8(volatile gint8 *dst, gint8 val)
{
- return atomic_inc_32_nv((uint32_t*)val);
+ /* Nothing useful from GCC at all, so fall back to CAS. */
+ gint8 old_val;
+ do {
+ old_val = *dst;
+ } while (__sync_val_compare_and_swap (dst, old_val, val) != old_val);
}
-static inline gint32 InterlockedDecrement(volatile gint32 *val)
+static inline void InterlockedWrite16(volatile gint16 *dst, gint16 val)
{
- return atomic_dec_32_nv((uint32_t*)val);
+ gint16 old_val;
+ do {
+ old_val = *dst;
+ } while (__sync_val_compare_and_swap (dst, old_val, val) != old_val);
}
-static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
+static inline void InterlockedWrite(volatile gint32 *dst, gint32 val)
{
- return atomic_swap_32((uint32_t*)val, new_val);
+ /* Nothing useful from GCC at all, so fall back to CAS. */
+ gint32 old_val;
+ do {
+ old_val = *dst;
+ } while (__sync_val_compare_and_swap (dst, old_val, val) != old_val);
}
-static inline gpointer InterlockedExchangePointer(volatile gpointer *val,
- gpointer new_val)
+#if defined (TARGET_OSX) || defined (__arm__) || (defined (__mips__) && !defined (__mips64)) || (defined (__powerpc__) && !defined (__powerpc64__)) || (defined (__sparc__) && !defined (__arch64__))
+#define BROKEN_64BIT_ATOMICS_INTRINSIC 1
+#endif
+
+#if !defined (BROKEN_64BIT_ATOMICS_INTRINSIC)
+
+static inline gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp)
{
- return atomic_swap_ptr(val, new_val);
+ return __sync_val_compare_and_swap (dest, comp, exch);
}
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+static inline gint64 InterlockedAdd64(volatile gint64 *dest, gint64 add)
{
- return atomic_add_32_nv((uint32_t*)val, add) - add;
+ return __sync_add_and_fetch (dest, add);
}
-#elif (defined(sparc) || defined (__sparc__)) && defined(__GNUC__)
-
-G_GNUC_UNUSED
-static inline gint32 InterlockedCompareExchange(volatile gint32 *_dest, gint32 _exch, gint32 _comp)
+static inline gint64 InterlockedIncrement64(volatile gint64 *val)
{
- register volatile gint32 *dest asm("g1") = _dest;
- register gint32 comp asm("o4") = _comp;
- register gint32 exch asm("o5") = _exch;
-
- __asm__ __volatile__(
- /* cas [%%g1], %%o4, %%o5 */
- ".word 0xdbe0500c"
- : "=r" (exch)
- : "0" (exch), "r" (dest), "r" (comp)
- : "memory");
-
- return exch;
+ return __sync_add_and_fetch (val, 1);
}
-G_GNUC_UNUSED
-static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *_dest, gpointer _exch, gpointer _comp)
+static inline gint64 InterlockedDecrement64(volatile gint64 *val)
{
- register volatile gpointer *dest asm("g1") = _dest;
- register gpointer comp asm("o4") = _comp;
- register gpointer exch asm("o5") = _exch;
-
- __asm__ __volatile__(
-#ifdef SPARCV9
- /* casx [%%g1], %%o4, %%o5 */
- ".word 0xdbf0500c"
-#else
- /* cas [%%g1], %%o4, %%o5 */
- ".word 0xdbe0500c"
-#endif
- : "=r" (exch)
- : "0" (exch), "r" (dest), "r" (comp)
- : "memory");
-
- return exch;
+ return __sync_sub_and_fetch (val, 1);
}
-G_GNUC_UNUSED
-static inline gint32 InterlockedIncrement(volatile gint32 *_dest)
+static inline gint64 InterlockedExchangeAdd64(volatile gint64 *val, gint64 add)
{
- register volatile gint32 *dest asm("g1") = _dest;
- register gint32 tmp asm("o4");
- register gint32 ret asm("o5");
-
- __asm__ __volatile__(
- "1: ld [%%g1], %%o4\n\t"
- " add %%o4, 1, %%o5\n\t"
- /* cas [%%g1], %%o4, %%o5 */
- " .word 0xdbe0500c\n\t"
- " cmp %%o4, %%o5\n\t"
- " bne 1b\n\t"
- " add %%o5, 1, %%o5"
- : "=&r" (tmp), "=&r" (ret)
- : "r" (dest)
- : "memory", "cc");
-
- return ret;
+ return __sync_fetch_and_add (val, add);
}
-G_GNUC_UNUSED
-static inline gint32 InterlockedDecrement(volatile gint32 *_dest)
+static inline gint64 InterlockedRead64(volatile gint64 *src)
{
- register volatile gint32 *dest asm("g1") = _dest;
- register gint32 tmp asm("o4");
- register gint32 ret asm("o5");
-
- __asm__ __volatile__(
- "1: ld [%%g1], %%o4\n\t"
- " sub %%o4, 1, %%o5\n\t"
- /* cas [%%g1], %%o4, %%o5 */
- " .word 0xdbe0500c\n\t"
- " cmp %%o4, %%o5\n\t"
- " bne 1b\n\t"
- " sub %%o5, 1, %%o5"
- : "=&r" (tmp), "=&r" (ret)
- : "r" (dest)
- : "memory", "cc");
-
- return ret;
+ /* Kind of a hack, but GCC doesn't give us anything better. */
+ return __sync_fetch_and_add (src, 0);
}
-G_GNUC_UNUSED
-static inline gint32 InterlockedExchange(volatile gint32 *_dest, gint32 exch)
-{
- register volatile gint32 *dest asm("g1") = _dest;
- register gint32 tmp asm("o4");
- register gint32 ret asm("o5");
+#else
- __asm__ __volatile__(
- "1: ld [%%g1], %%o4\n\t"
- " mov %3, %%o5\n\t"
- /* cas [%%g1], %%o4, %%o5 */
- " .word 0xdbe0500c\n\t"
- " cmp %%o4, %%o5\n\t"
- " bne 1b\n\t"
- " nop"
- : "=&r" (tmp), "=&r" (ret)
- : "r" (dest), "r" (exch)
- : "memory", "cc");
+/* Implement 64-bit cmpxchg by hand or emulate it. */
+extern gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp);
- return ret;
-}
+/* Implement all other 64-bit atomics in terms of a specialized CAS
+ * in this case, since chances are that the other 64-bit atomic
+ * intrinsics are broken too.
+ */
-G_GNUC_UNUSED
-static inline gpointer InterlockedExchangePointer(volatile gpointer *_dest, gpointer exch)
+static inline gint64 InterlockedExchangeAdd64(volatile gint64 *dest, gint64 add)
{
- register volatile gpointer *dest asm("g1") = _dest;
- register gpointer tmp asm("o4");
- register gpointer ret asm("o5");
-
- __asm__ __volatile__(
-#ifdef SPARCV9
- "1: ldx [%%g1], %%o4\n\t"
-#else
- "1: ld [%%g1], %%o4\n\t"
-#endif
- " mov %3, %%o5\n\t"
-#ifdef SPARCV9
- /* casx [%%g1], %%o4, %%o5 */
- " .word 0xdbf0500c\n\t"
-#else
- /* cas [%%g1], %%o4, %%o5 */
- " .word 0xdbe0500c\n\t"
-#endif
- " cmp %%o4, %%o5\n\t"
- " bne 1b\n\t"
- " nop"
- : "=&r" (tmp), "=&r" (ret)
- : "r" (dest), "r" (exch)
- : "memory", "cc");
-
- return ret;
+ gint64 old_val;
+ do {
+ old_val = *dest;
+ } while (InterlockedCompareExchange64 (dest, old_val + add, old_val) != old_val);
+ return old_val;
}
-G_GNUC_UNUSED
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *_dest, gint32 add)
+static inline gint64 InterlockedIncrement64(volatile gint64 *val)
{
- register volatile gint32 *dest asm("g1") = _dest;
- register gint32 tmp asm("o4");
- register gint32 ret asm("o5");
-
- __asm__ __volatile__(
- "1: ld [%%g1], %%o4\n\t"
- " add %%o4, %3, %%o5\n\t"
- /* cas [%%g1], %%o4, %%o5 */
- " .word 0xdbe0500c\n\t"
- " cmp %%o4, %%o5\n\t"
- " bne 1b\n\t"
- " add %%o5, %3, %%o5"
- : "=&r" (tmp), "=&r" (ret)
- : "r" (dest), "r" (add)
- : "memory", "cc");
-
- return ret;
+ gint64 get, set;
+ do {
+ get = *val;
+ set = get + 1;
+ } while (InterlockedCompareExchange64 (val, set, get) != get);
+ return set;
}
-#elif __s390x__
-
-static inline gint32
-InterlockedCompareExchange(volatile gint32 *dest,
- gint32 exch, gint32 comp)
+static inline gint64 InterlockedDecrement64(volatile gint64 *val)
{
- gint32 old;
-
- __asm__ __volatile__ ("\tLA\t1,%0\n"
- "\tLR\t%1,%3\n"
- "\tCS\t%1,%2,0(1)\n"
- : "+m" (*dest), "=&r" (old)
- : "r" (exch), "r" (comp)
- : "1", "cc");
- return(old);
+ gint64 get, set;
+ do {
+ get = *val;
+ set = get - 1;
+ } while (InterlockedCompareExchange64 (val, set, get) != get);
+ return set;
}
-static inline gpointer
-InterlockedCompareExchangePointer(volatile gpointer *dest,
- gpointer exch,
- gpointer comp)
+static inline gint64 InterlockedAdd64(volatile gint64 *dest, gint64 add)
{
- gpointer old;
-
- __asm__ __volatile__ ("\tLA\t1,%0\n"
- "\tLGR\t%1,%3\n"
- "\tCSG\t%1,%2,0(1)\n"
- : "+m" (*dest), "=&r" (old)
- : "r" (exch), "r" (comp)
- : "1", "cc");
-
- return(old);
+ gint64 get, set;
+ do {
+ get = *dest;
+ set = get + add;
+ } while (InterlockedCompareExchange64 (dest, set, get) != get);
+ return set;
}
-static inline gint32
-InterlockedIncrement(volatile gint32 *val)
+static inline gint64 InterlockedRead64(volatile gint64 *src)
{
- gint32 tmp;
-
- __asm__ __volatile__ ("\tLA\t2,%1\n"
- "0:\tLGF\t%0,%1\n"
- "\tLGFR\t1,%0\n"
- "\tAGHI\t1,1\n"
- "\tCS\t%0,1,0(2)\n"
- "\tJNZ\t0b\n"
- "\tLGFR\t%0,1"
- : "=r" (tmp), "+m" (*val)
- : : "1", "2", "cc");
-
- return(tmp);
+ return InterlockedCompareExchange64 (src, 0, 0);
}
-static inline gint32
-InterlockedDecrement(volatile gint32 *val)
-{
- gint32 tmp;
-
- __asm__ __volatile__ ("\tLA\t2,%1\n"
- "0:\tLGF\t%0,%1\n"
- "\tLGFR\t1,%0\n"
- "\tAGHI\t1,-1\n"
- "\tCS\t%0,1,0(2)\n"
- "\tJNZ\t0b\n"
- "\tLGFR\t%0,1"
- : "=r" (tmp), "+m" (*val)
- : : "1", "2", "cc");
+#endif
- return(tmp);
+static inline gpointer InterlockedReadPointer(volatile gpointer *src)
+{
+ return InterlockedCompareExchangePointer (src, NULL, NULL);
}
-static inline gint32
-InterlockedExchange(volatile gint32 *val, gint32 new_val)
+static inline void InterlockedWritePointer(volatile gpointer *dst, gpointer val)
{
- gint32 ret;
-
- __asm__ __volatile__ ("\tLA\t1,%0\n"
- "0:\tL\t%1,%0\n"
- "\tCS\t%1,%2,0(1)\n"
- "\tJNZ\t0b"
- : "+m" (*val), "=&r" (ret)
- : "r" (new_val)
- : "1", "cc");
-
- return(ret);
+ InterlockedExchangePointer (dst, val);
}
-static inline gpointer
-InterlockedExchangePointer(volatile gpointer *val, gpointer new_val)
+/* We always implement this in terms of a 64-bit cmpxchg since
+ * GCC doesn't have an intrisic to model it anyway. */
+static inline gint64 InterlockedExchange64(volatile gint64 *val, gint64 new_val)
{
- gpointer ret;
-
- __asm__ __volatile__ ("\tLA\t1,%0\n"
- "0:\tLG\t%1,%0\n"
- "\tCSG\t%1,%2,0(1)\n"
- "\tJNZ\t0b"
- : "+m" (*val), "=&r" (ret)
- : "r" (new_val)
- : "1", "cc");
-
- return(ret);
+ gint64 old_val;
+ do {
+ old_val = *val;
+ } while (InterlockedCompareExchange64 (val, new_val, old_val) != old_val);
+ return old_val;
}
-static inline gint32
-InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+static inline void InterlockedWrite64(volatile gint64 *dst, gint64 val)
{
- gint32 ret;
-
- __asm__ __volatile__ ("\tLA\t2,%1\n"
- "0:\tLGF\t%0,%1\n"
- "\tLGFR\t1,%0\n"
- "\tAGR\t1,%2\n"
- "\tCS\t%0,1,0(2)\n"
- "\tJNZ\t0b"
- : "=&r" (ret), "+m" (*val)
- : "r" (add)
- : "1", "2", "cc");
-
- return(ret);
+ /* Nothing useful from GCC at all, so fall back to CAS. */
+ InterlockedExchange64 (dst, val);
}
#elif defined(__ia64__)
@@ -546,17 +475,30 @@ static inline gint32 InterlockedExchangeAdd(gint32 volatile *val, gint32 add)
#define WAPI_NO_ATOMIC_ASM
extern gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp);
+extern gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp);
extern gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp);
+extern gint32 InterlockedAdd(volatile gint32 *dest, gint32 add);
+extern gint64 InterlockedAdd64(volatile gint64 *dest, gint64 add);
extern gint32 InterlockedIncrement(volatile gint32 *dest);
+extern gint64 InterlockedIncrement64(volatile gint64 *dest);
extern gint32 InterlockedDecrement(volatile gint32 *dest);
+extern gint64 InterlockedDecrement64(volatile gint64 *dest);
extern gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch);
+extern gint64 InterlockedExchange64(volatile gint64 *dest, gint64 exch);
extern gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch);
extern gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add);
+extern gint64 InterlockedExchangeAdd64(volatile gint64 *dest, gint64 add);
+extern gint8 InterlockedRead8(volatile gint8 *src);
+extern gint16 InterlockedRead16(volatile gint16 *src);
+extern gint32 InterlockedRead(volatile gint32 *src);
+extern gint64 InterlockedRead64(volatile gint64 *src);
+extern gpointer InterlockedReadPointer(volatile gpointer *src);
+extern void InterlockedWrite8(volatile gint8 *dst, gint8 val);
+extern void InterlockedWrite16(volatile gint16 *dst, gint16 val);
+extern void InterlockedWrite(volatile gint32 *dst, gint32 val);
+extern void InterlockedWrite64(volatile gint64 *dst, gint64 val);
+extern void InterlockedWritePointer(volatile gpointer *dst, gpointer val);
#endif
-#ifndef HAS_64BITS_ATOMICS
-extern gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp);
-#endif
-
#endif /* _WAPI_ATOMIC_H_ */
diff --git a/mono/utils/dlmalloc.c b/mono/utils/dlmalloc.c
index 59287aac77..f83272f88e 100644
--- a/mono/utils/dlmalloc.c
+++ b/mono/utils/dlmalloc.c
@@ -24,7 +24,7 @@
/* Use mmap for allocating memory */
#define HAVE_MORECORE 0
#define NO_MALLINFO 1
-#include <dlmalloc.h>
+#include <mono/utils/dlmalloc.h>
/*
* Quickstart
diff --git a/mono/utils/mach-support-arm.c b/mono/utils/mach-support-arm.c
index eb5fd60351..5f242752ef 100644
--- a/mono/utils/mach-support-arm.c
+++ b/mono/utils/mach-support-arm.c
@@ -19,6 +19,11 @@
#include "utils/mono-compiler.h"
#include "mach-support.h"
+/* _mcontext.h now defines __darwin_mcontext32, not __darwin_mcontext, starting with Xcode 5.1 */
+#ifdef _STRUCT_MCONTEXT32
+ #define __darwin_mcontext __darwin_mcontext32
+#endif
+
/* Known offsets used for TLS storage*/
diff --git a/mono/utils/mono-compiler.h b/mono/utils/mono-compiler.h
index 56f5ea90ad..6772dacfd5 100644
--- a/mono/utils/mono-compiler.h
+++ b/mono/utils/mono-compiler.h
@@ -187,6 +187,7 @@
/* Deal with Microsoft C compiler differences */
#ifdef _MSC_VER
+#include <math.h>
#include <float.h>
#define isnan(x) _isnan(x)
#define trunc(x) (((x) < 0) ? ceil((x)) : floor((x)))
diff --git a/mono/utils/mono-hwcap-arm.c b/mono/utils/mono-hwcap-arm.c
index d5d5f00ecb..01816d8c93 100644
--- a/mono/utils/mono-hwcap-arm.c
+++ b/mono/utils/mono-hwcap-arm.c
@@ -35,6 +35,8 @@ gboolean mono_hwcap_arm_is_v6 = FALSE;
gboolean mono_hwcap_arm_is_v7 = FALSE;
gboolean mono_hwcap_arm_is_v7s = FALSE;
gboolean mono_hwcap_arm_has_vfp = FALSE;
+gboolean mono_hwcap_arm_has_vfp3 = FALSE;
+gboolean mono_hwcap_arm_has_vfp3_d16 = FALSE;
gboolean mono_hwcap_arm_has_thumb = FALSE;
gboolean mono_hwcap_arm_has_thumb2 = FALSE;
@@ -57,9 +59,17 @@ mono_hwcap_arch_init (void)
mono_hwcap_arm_has_thumb = TRUE;
/* HWCAP_ARM_VFP */
- if (hwcap & 0x00000064)
+ if (hwcap & 0x00000040)
mono_hwcap_arm_has_vfp = TRUE;
+ /* HWCAP_ARM_VFPv3 */
+ if (hwcap & 0x00002000)
+ mono_hwcap_arm_has_vfp3 = TRUE;
+
+ /* HWCAP_ARM_VFPv3D16 */
+ if (hwcap & 0x00004000)
+ mono_hwcap_arm_has_vfp3_d16 = TRUE;
+
/* TODO: Find a way to detect Thumb 2. */
}
@@ -136,6 +146,12 @@ mono_hwcap_arch_init (void)
if (strstr (line, "vfp"))
mono_hwcap_arm_has_vfp = TRUE;
+ if (strstr (line, "vfpv3"))
+ mono_hwcap_arm_has_vfp3 = TRUE;
+
+ if (strstr (line, "vfpv3-d16"))
+ mono_hwcap_arm_has_vfp3_d16 = TRUE;
+
continue;
}
}
@@ -154,6 +170,8 @@ mono_hwcap_print(FILE *f)
g_fprintf (f, "mono_hwcap_arm_is_v7 = %i\n", mono_hwcap_arm_is_v7);
g_fprintf (f, "mono_hwcap_arm_is_v7s = %i\n", mono_hwcap_arm_is_v7s);
g_fprintf (f, "mono_hwcap_arm_has_vfp = %i\n", mono_hwcap_arm_has_vfp);
+ g_fprintf (f, "mono_hwcap_arm_has_vfp3 = %i\n", mono_hwcap_arm_has_vfp3);
+ g_fprintf (f, "mono_hwcap_arm_has_vfp3_d16 = %i\n", mono_hwcap_arm_has_vfp3_d16);
g_fprintf (f, "mono_hwcap_arm_has_thumb = %i\n", mono_hwcap_arm_has_thumb);
g_fprintf (f, "mono_hwcap_arm_has_thumb2 = %i\n", mono_hwcap_arm_has_thumb2);
}
diff --git a/mono/utils/mono-hwcap-arm.h b/mono/utils/mono-hwcap-arm.h
index 6bc9c3b907..76a20a1f53 100644
--- a/mono/utils/mono-hwcap-arm.h
+++ b/mono/utils/mono-hwcap-arm.h
@@ -8,6 +8,8 @@ extern gboolean mono_hwcap_arm_is_v6;
extern gboolean mono_hwcap_arm_is_v7;
extern gboolean mono_hwcap_arm_is_v7s;
extern gboolean mono_hwcap_arm_has_vfp;
+extern gboolean mono_hwcap_arm_has_vfp3;
+extern gboolean mono_hwcap_arm_has_vfp3_d16;
extern gboolean mono_hwcap_arm_has_thumb;
extern gboolean mono_hwcap_arm_has_thumb2;
diff --git a/mono/utils/mono-hwcap-sparc.c b/mono/utils/mono-hwcap-sparc.c
index 87bf9ca899..f039ec28e4 100644
--- a/mono/utils/mono-hwcap-sparc.c
+++ b/mono/utils/mono-hwcap-sparc.c
@@ -49,9 +49,9 @@ mono_hwcap_arch_init (void)
* in turn means a v9 or better.
*/
if (getpagesize () == 8192)
- strcpy (buf, "sparcv9")
+ strcpy (buf, "sparcv9");
else
- strcpy (buf, "sparcv8")
+ strcpy (buf, "sparcv8");
#endif
mono_hwcap_sparc_is_v9 = strstr (buf, "sparcv9");
diff --git a/mono/utils/mono-membar.h b/mono/utils/mono-membar.h
index fa4057a0ee..8b1c966356 100644
--- a/mono/utils/mono-membar.h
+++ b/mono/utils/mono-membar.h
@@ -45,34 +45,6 @@ static inline void mono_memory_write_barrier (void)
_WriteBarrier ();
MemoryBarrier ();
}
-#elif defined(__WIN32__) || defined(_WIN32)
-#include <windows.h>
-
-/* Since we only support GCC 3.x in Cygwin for
- some arcane reason, we have to use inline
- assembly to get fences (__sync_synchronize
- is not available). */
-
-static inline void mono_memory_barrier (void)
-{
- __asm__ __volatile__ (
- "lock\n\t"
- "addl\t$0,0(%%esp)\n\t"
- :
- :
- : "memory"
- );
-}
-
-static inline void mono_memory_read_barrier (void)
-{
- mono_memory_barrier ();
-}
-
-static inline void mono_memory_write_barrier (void)
-{
- mono_memory_barrier ();
-}
#elif defined(USE_GCC_ATOMIC_OPS)
static inline void mono_memory_barrier (void)
{
@@ -88,36 +60,6 @@ static inline void mono_memory_write_barrier (void)
{
mono_memory_barrier ();
}
-#elif defined(sparc) || defined(__sparc__)
-static inline void mono_memory_barrier (void)
-{
- __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
-}
-
-static inline void mono_memory_read_barrier (void)
-{
- __asm__ __volatile__ ("membar #LoadLoad" : : : "memory");
-}
-
-static inline void mono_memory_write_barrier (void)
-{
- __asm__ __volatile__ ("membar #StoreStore" : : : "memory");
-}
-#elif defined(__s390__)
-static inline void mono_memory_barrier (void)
-{
- __asm__ __volatile__ ("bcr 15,0" : : : "memory");
-}
-
-static inline void mono_memory_read_barrier (void)
-{
- mono_memory_barrier ();
-}
-
-static inline void mono_memory_write_barrier (void)
-{
- mono_memory_barrier ();
-}
#elif defined(__ia64__)
static inline void mono_memory_barrier (void)
{
diff --git a/mono/utils/mono-proclib.c b/mono/utils/mono-proclib.c
index 01b8c1bb50..5bd290f75e 100644
--- a/mono/utils/mono-proclib.c
+++ b/mono/utils/mono-proclib.c
@@ -561,7 +561,7 @@ get_cpu_times (int cpu_id, gint64 *user, gint64 *systemt, gint64 *irq, gint64 *s
char buf [256];
char *s;
int hz = get_user_hz ();
- guint64 user_ticks, nice_ticks, system_ticks, idle_ticks, iowait_ticks, irq_ticks, sirq_ticks;
+ guint64 user_ticks = 0, nice_ticks = 0, system_ticks = 0, idle_ticks = 0, iowait_ticks, irq_ticks = 0, sirq_ticks = 0;
FILE *f = fopen ("/proc/stat", "r");
if (!f)
return;
diff --git a/mono/utils/mono-semaphore.c b/mono/utils/mono-semaphore.c
index 0af2dd3a29..68ff7dbe33 100644
--- a/mono/utils/mono-semaphore.c
+++ b/mono/utils/mono-semaphore.c
@@ -33,7 +33,10 @@
# define WAIT_BLOCK(a,b) sem_timedwait (a, b)
# endif
+#ifndef NSEC_PER_SEC
#define NSEC_PER_SEC 1000000000
+#endif
+
int
mono_sem_timedwait (MonoSemType *sem, guint32 timeout_ms, gboolean alertable)
{
diff --git a/mono/utils/mono-signal-handler.h b/mono/utils/mono-signal-handler.h
new file mode 100644
index 0000000000..3a01146d5e
--- /dev/null
+++ b/mono/utils/mono-signal-handler.h
@@ -0,0 +1,29 @@
+/*
+ * mono-signal-handler.h: Handle signal handler differences across platforms
+ *
+ * Copyright (C) 2013 Xamarin Inc
+ */
+
+#ifndef __MONO_SIGNAL_HANDLER_H__
+#define __MONO_SIGNAL_HANDLER_H__
+
+#include "config.h"
+
+#ifdef ENABLE_EXTENSION_MODULE
+#include "../../../mono-extensions/mono/utils/mono-signal-handler.h"
+#endif
+/*
+Not all platforms support signal handlers in the same way. Some have the same concept but
+for some weird reason pass different kind of arguments.
+
+All signal handler helpers should go here so they can be properly shared across the JIT,
+utils and sgen.
+
+TODO: Cleanup & move mini's macros to here so they can leveraged by other parts.
+
+*/
+#ifndef MONO_SIGNAL_HANDLER_FUNC
+#define MONO_SIGNAL_HANDLER_FUNC(access, name, arglist) access void name arglist
+#endif
+
+#endif
diff --git a/mono/utils/mono-stack-unwinding.h b/mono/utils/mono-stack-unwinding.h
index 21331fa1bd..d821f3c5e3 100644
--- a/mono/utils/mono-stack-unwinding.h
+++ b/mono/utils/mono-stack-unwinding.h
@@ -46,16 +46,22 @@ typedef struct {
MonoJitInfo *ji;
/*
* Same as ji->method.
+ * Not valid if ASYNC_CONTEXT is true.
*/
MonoMethod *method;
/*
* If ji->method is a gshared method, this is the actual method instance.
* This is only filled if lookup for actual method was requested (MONO_UNWIND_LOOKUP_ACTUAL_METHOD)
+ * Not valid if ASYNC_CONTEXT is true.
*/
MonoMethod *actual_method;
/* The domain containing the code executed by this frame */
MonoDomain *domain;
gboolean managed;
+ /*
+ * Whenever this frame was loaded in async context.
+ */
+ gboolean async_context;
int native_offset;
/*
* IL offset of this frame.
@@ -64,7 +70,7 @@ typedef struct {
*/
int il_offset;
- /*The next fields are only usefull for the jit*/
+ /* The next fields are only useful for the jit */
gpointer lmf;
guint32 unwind_info_len;
guint8 *unwind_info;
diff --git a/mono/utils/mono-threads.c b/mono/utils/mono-threads.c
index 3a54cd0e54..cf2c519925 100644
--- a/mono/utils/mono-threads.c
+++ b/mono/utils/mono-threads.c
@@ -48,6 +48,9 @@ static MonoLinkedListSet thread_list;
static gboolean disable_new_interrupt = FALSE;
static gboolean mono_threads_inited = FALSE;
+static void mono_threads_unregister_current_thread (MonoThreadInfo *info);
+
+
static inline void
mono_hazard_pointer_clear_all (MonoThreadHazardPointers *hp, int retain)
{
@@ -149,10 +152,12 @@ register_thread (MonoThreadInfo *info, gpointer baseptr)
}
mono_threads_platform_register (info);
-
+ info->thread_state = STATE_RUNNING;
+ mono_thread_info_suspend_lock ();
/*If this fail it means a given thread has been registered twice, which doesn't make sense. */
result = mono_thread_info_insert (info);
g_assert (result);
+ mono_thread_info_suspend_unlock ();
return info;
}
@@ -171,14 +176,30 @@ unregister_thread (void *arg)
*/
mono_native_tls_set_value (small_id_key, GUINT_TO_POINTER (info->small_id + 1));
+ info->thread_state = STATE_SHUTTING_DOWN;
+
/*
- The unregister callback is reposible for calling mono_threads_unregister_current_thread
- since it usually needs to be done in sync with the GC does a stop-the-world.
+ First perform the callback that requires no locks.
+ This callback has the potential of taking other locks, so we do it before.
+ After it completes, the thread remains functional.
+ */
+ if (threads_callbacks.thread_detach)
+ threads_callbacks.thread_detach (info);
+
+ mono_thread_info_suspend_lock ();
+
+ /*
+ Now perform the callback that must be done under locks.
+ This will render the thread useless and non-suspendable, so it must
+ be done while holding the suspend lock to give no other thread chance
+ to suspend it.
*/
if (threads_callbacks.thread_unregister)
threads_callbacks.thread_unregister (info);
- else
- mono_threads_unregister_current_thread (info);
+ mono_threads_unregister_current_thread (info);
+
+ info->thread_state = STATE_DEAD;
+ mono_thread_info_suspend_unlock ();
/*now it's safe to free the thread info.*/
mono_thread_hazardous_free_or_queue (info, free_thread_info, TRUE, FALSE);
@@ -190,26 +211,19 @@ unregister_thread (void *arg)
* This must be called from the thread unregister callback and nowhere else.
* The current thread must be passed as TLS might have already been cleaned up.
*/
-void
+static void
mono_threads_unregister_current_thread (MonoThreadInfo *info)
{
gboolean result;
g_assert (mono_thread_info_get_tid (info) == mono_native_thread_id_get ());
result = mono_thread_info_remove (info);
g_assert (result);
-
}
MonoThreadInfo*
mono_thread_info_current (void)
{
- return mono_native_tls_get_value (thread_info_key);
-}
-
-static MonoThreadInfo*
-mono_thread_info_current_slow (void)
-{
- MonoThreadInfo *info = mono_thread_info_current ();
+ MonoThreadInfo *info = (MonoThreadInfo*)mono_native_tls_get_value (thread_info_key);
if (info)
return info;
@@ -457,7 +471,7 @@ mono_thread_info_resume (MonoNativeThreadId tid)
MONO_SEM_POST (&info->suspend_semaphore);
mono_hazard_pointer_clear (hp, 1);
- mono_atomic_store_release (&mono_thread_info_current_slow ()->inside_critical_region, FALSE);
+ mono_atomic_store_release (&mono_thread_info_current ()->inside_critical_region, FALSE);
return result;
}
@@ -465,7 +479,7 @@ mono_thread_info_resume (MonoNativeThreadId tid)
void
mono_thread_info_finish_suspend (void)
{
- mono_atomic_store_release (&mono_thread_info_current_slow ()->inside_critical_region, FALSE);
+ mono_atomic_store_release (&mono_thread_info_current ()->inside_critical_region, FALSE);
}
/*
@@ -481,6 +495,10 @@ is_thread_in_critical_region (MonoThreadInfo *info)
if (info->inside_critical_region)
return TRUE;
+ /* The target thread might be shutting down and the domain might be null, which means no managed code left to run. */
+ if (!info->suspend_state.unwind_data [MONO_UNWIND_DATA_DOMAIN])
+ return FALSE;
+
ji = mono_jit_info_table_find (
info->suspend_state.unwind_data [MONO_UNWIND_DATA_DOMAIN],
MONO_CONTEXT_GET_IP (&info->suspend_state.ctx));
@@ -488,7 +506,7 @@ is_thread_in_critical_region (MonoThreadInfo *info)
if (!ji)
return FALSE;
- method = ji->method;
+ method = mono_jit_info_get_method (ji);
return threads_callbacks.mono_method_is_critical (method);
}
@@ -540,7 +558,7 @@ mono_thread_info_safe_suspend_sync (MonoNativeThreadId id, gboolean interrupt_ke
sleep_duration += 10;
}
- mono_atomic_store_release (&mono_thread_info_current_slow ()->inside_critical_region, TRUE);
+ mono_atomic_store_release (&mono_thread_info_current ()->inside_critical_region, TRUE);
mono_thread_info_suspend_unlock ();
return info;
@@ -645,3 +663,58 @@ mono_thread_info_new_interrupt_enabled (void)
#endif
return FALSE;
}
+
+/*
+ * mono_thread_info_set_is_async_context:
+ *
+ * Set whenever the current thread is in an async context. Some runtime functions might behave
+ * differently while in an async context in order to be async safe.
+ */
+void
+mono_thread_info_set_is_async_context (gboolean async_context)
+{
+ MonoThreadInfo *info = mono_thread_info_current ();
+
+ if (info)
+ info->is_async_context = async_context;
+}
+
+gboolean
+mono_thread_info_is_async_context (void)
+{
+ MonoThreadInfo *info = mono_thread_info_current ();
+
+ if (info)
+ return info->is_async_context;
+ else
+ return FALSE;
+}
+
+/*
+ * mono_threads_create_thread:
+ *
+ * Create a new thread executing START with argument ARG. Store its id into OUT_TID.
+ * Returns: a windows or io-layer handle for the thread.
+ */
+HANDLE
+mono_threads_create_thread (LPTHREAD_START_ROUTINE start, gpointer arg, guint32 stack_size, guint32 creation_flags, MonoNativeThreadId *out_tid)
+{
+ HANDLE res;
+
+#ifdef HOST_WIN32
+ DWORD real_tid;
+
+ res = mono_threads_CreateThread (NULL, stack_size, start, arg, creation_flags, &real_tid);
+ if (out_tid)
+ *out_tid = real_tid;
+#else
+ gsize real_tid;
+
+ res = CreateThread (NULL, stack_size, start, arg, creation_flags, &real_tid);
+ if (out_tid)
+ *out_tid = real_tid;
+#endif
+
+ return res;
+}
+
diff --git a/mono/utils/mono-threads.h b/mono/utils/mono-threads.h
index 0004e55c96..e54ec617f9 100644
--- a/mono/utils/mono-threads.h
+++ b/mono/utils/mono-threads.h
@@ -26,6 +26,8 @@ typedef HANDLE MonoNativeThreadHandle; /* unused */
typedef DWORD mono_native_thread_return_t;
+#define MONO_NATIVE_THREAD_ID_TO_UINT(tid) (tid)
+
#else
#include <pthread.h>
@@ -47,6 +49,8 @@ typedef pthread_t MonoNativeThreadId;
typedef void* mono_native_thread_return_t;
+#define MONO_NATIVE_THREAD_ID_TO_UINT(tid) (gsize)(tid)
+
#endif /* #ifdef HOST_WIN32 */
/*
@@ -76,10 +80,10 @@ and reduce the number of casts drastically.
#endif
enum {
- STATE_STARTING = 0x01,
- STATE_RUNNING = 0x02,
- STATE_SHUTTING_DOWN = 0x03,
- STATE_DEAD = 0x04,
+ STATE_STARTING = 0x00,
+ STATE_RUNNING = 0x01,
+ STATE_SHUTTING_DOWN = 0x02,
+ STATE_DEAD = 0x03,
RUN_STATE_MASK = 0x0F,
STATE_SUSPENDED = 0x10,
@@ -87,8 +91,8 @@ enum {
SUSPEND_STATE_MASK = 0xF0,
};
-#define mono_thread_info_run_state(info) ((info)->thread_state & RUN_STATE_MASK)
-#define mono_thread_info_suspend_state(info) ((info)->thread_state & SUSPEND_STATE_MASK)
+#define mono_thread_info_run_state(info) (((MonoThreadInfo*)info)->thread_state & RUN_STATE_MASK)
+#define mono_thread_info_suspend_state(info) (((MonoThreadInfo*)info)->thread_state & SUSPEND_STATE_MASK)
typedef struct {
MonoLinkedListSetNode node;
@@ -126,15 +130,30 @@ typedef struct {
and is ended when you call either mono_thread_info_resume or mono_thread_info_finish_suspend.
*/
gboolean inside_critical_region;
+
+ /*
+ * If TRUE, the thread is in async context. Code can use this information to avoid async-unsafe
+ * operations like locking without having to pass an 'async' parameter around.
+ */
+ gboolean is_async_context;
} MonoThreadInfo;
typedef struct {
void* (*thread_register)(THREAD_INFO_TYPE *info, void *baseaddr);
/*
- This callback is called after @info is removed from the thread list.
+ This callback is called with @info still on the thread list.
+ This call is made while holding the suspend lock, so don't do callbacks.
SMR remains functional as its small_id has not been reclaimed.
*/
void (*thread_unregister)(THREAD_INFO_TYPE *info);
+ /*
+ This callback is called right before thread_unregister. This is called
+ without any locks held so it's the place for complicated cleanup.
+
+ The thread must remain operational between this call and thread_unregister.
+ It must be possible to successfully suspend it after thread_unregister completes.
+ */
+ void (*thread_detach)(THREAD_INFO_TYPE *info);
void (*thread_attach)(THREAD_INFO_TYPE *info);
gboolean (*mono_method_is_critical) (void *method);
#ifndef HOST_WIN32
@@ -151,13 +170,13 @@ typedef struct {
/*
Requires the world to be stoped
*/
-#define FOREACH_THREAD(thread) MONO_LLS_FOREACH (mono_thread_info_list_head (), thread, SgenThreadInfo*)
+#define FOREACH_THREAD(thread) MONO_LLS_FOREACH (mono_thread_info_list_head (), thread, THREAD_INFO_TYPE*)
#define END_FOREACH_THREAD MONO_LLS_END_FOREACH
/*
Snapshot iteration.
*/
-#define FOREACH_THREAD_SAFE(thread) MONO_LLS_FOREACH_SAFE (mono_thread_info_list_head (), thread, SgenThreadInfo*)
+#define FOREACH_THREAD_SAFE(thread) MONO_LLS_FOREACH_SAFE (mono_thread_info_list_head (), thread, THREAD_INFO_TYPE*)
#define END_FOREACH_THREAD_SAFE MONO_LLS_END_FOREACH_SAFE
#define mono_thread_info_get_tid(info) ((MonoNativeThreadId)((MonoThreadInfo*)info)->node.key)
@@ -197,10 +216,10 @@ mono_thread_info_get_small_id (void) MONO_INTERNAL;
MonoLinkedListSet*
mono_thread_info_list_head (void) MONO_INTERNAL;
-MonoThreadInfo*
+THREAD_INFO_TYPE*
mono_thread_info_lookup (MonoNativeThreadId id) MONO_INTERNAL;
-MonoThreadInfo*
+THREAD_INFO_TYPE*
mono_thread_info_safe_suspend_sync (MonoNativeThreadId tid, gboolean interrupt_kernel) MONO_INTERNAL;
gboolean
@@ -216,7 +235,7 @@ gboolean
mono_thread_info_new_interrupt_enabled (void) MONO_INTERNAL;
void
-mono_thread_info_setup_async_call (MonoThreadInfo *info, void (*target_func)(void*), void *user_data) MONO_INTERNAL;
+mono_thread_info_setup_async_call (THREAD_INFO_TYPE *info, void (*target_func)(void*), void *user_data) MONO_INTERNAL;
void
mono_thread_info_suspend_lock (void) MONO_INTERNAL;
@@ -225,14 +244,20 @@ void
mono_thread_info_suspend_unlock (void) MONO_INTERNAL;
void
-mono_threads_unregister_current_thread (THREAD_INFO_TYPE *info) MONO_INTERNAL;
-
-void
mono_thread_info_disable_new_interrupt (gboolean disable) MONO_INTERNAL;
void
mono_thread_info_abort_socket_syscall_for_close (MonoNativeThreadId tid) MONO_INTERNAL;
+void
+mono_thread_info_set_is_async_context (gboolean async_context) MONO_INTERNAL;
+
+gboolean
+mono_thread_info_is_async_context (void) MONO_INTERNAL;
+
+HANDLE
+mono_threads_create_thread (LPTHREAD_START_ROUTINE start, gpointer arg, guint32 stack_size, guint32 creation_flags, MonoNativeThreadId *out_tid);
+
#if !defined(HOST_WIN32)
int
@@ -254,12 +279,12 @@ HANDLE
/* Plartform specific functions DON'T use them */
void mono_threads_init_platform (void) MONO_INTERNAL; //ok
-gboolean mono_threads_core_suspend (MonoThreadInfo *info) MONO_INTERNAL;
-gboolean mono_threads_core_resume (MonoThreadInfo *info) MONO_INTERNAL;
-void mono_threads_platform_register (MonoThreadInfo *info) MONO_INTERNAL; //ok
-void mono_threads_platform_free (MonoThreadInfo *info) MONO_INTERNAL;
-void mono_threads_core_interrupt (MonoThreadInfo *info) MONO_INTERNAL;
-void mono_threads_core_abort_syscall (MonoThreadInfo *info) MONO_INTERNAL;
+gboolean mono_threads_core_suspend (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+gboolean mono_threads_core_resume (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+void mono_threads_platform_register (THREAD_INFO_TYPE *info) MONO_INTERNAL; //ok
+void mono_threads_platform_free (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+void mono_threads_core_interrupt (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+void mono_threads_core_abort_syscall (THREAD_INFO_TYPE *info) MONO_INTERNAL;
gboolean mono_threads_core_needs_abort_syscall (void) MONO_INTERNAL;
MonoNativeThreadId mono_native_thread_id_get (void) MONO_INTERNAL;
diff --git a/mono/utils/mono-tls.c b/mono/utils/mono-tls.c
new file mode 100644
index 0000000000..007dc4e6d2
--- /dev/null
+++ b/mono/utils/mono-tls.c
@@ -0,0 +1,37 @@
+/*
+ * mono-tls.c: Low-level TLS support
+ *
+ * Copyright 2013 Xamarin, Inc (http://www.xamarin.com)
+ */
+
+#include <config.h>
+
+#include "mono-tls.h"
+
+static int tls_offsets [TLS_KEY_NUM];
+static gboolean tls_offset_set [TLS_KEY_NUM];
+
+/*
+ * mono_tls_key_get_offset:
+ *
+ * Return the TLS offset used by the TLS var identified by KEY, previously initialized by a call to
+ * mono_tls_key_set_offset (). Return -1 if the offset is not known.
+ */
+int
+mono_tls_key_get_offset (MonoTlsKey key)
+{
+ g_assert (tls_offset_set [key]);
+ return tls_offsets [key];
+}
+
+/*
+ * mono_tls_key_set_offset:
+ *
+ * Set the TLS offset used by the TLS var identified by KEY.
+ */
+void
+mono_tls_key_set_offset (MonoTlsKey key, int offset)
+{
+ tls_offsets [key] = offset;
+ tls_offset_set [key] = TRUE;
+}
diff --git a/mono/utils/mono-tls.h b/mono/utils/mono-tls.h
index c38708469f..485aea76f3 100644
--- a/mono/utils/mono-tls.h
+++ b/mono/utils/mono-tls.h
@@ -11,6 +11,23 @@
#ifndef __MONO_TLS_H__
#define __MONO_TLS_H__
+#include <glib.h>
+
+/* TLS entries used by the runtime */
+typedef enum {
+ /* mono_thread_internal_current () */
+ TLS_KEY_THREAD = 0,
+ TLS_KEY_JIT_TLS = 1,
+ /* mono_domain_get () */
+ TLS_KEY_DOMAIN = 2,
+ TLS_KEY_LMF = 3,
+ TLS_KEY_SGEN_THREAD_INFO = 4,
+ TLS_KEY_SGEN_TLAB_NEXT_ADDR = 5,
+ TLS_KEY_SGEN_TLAB_TEMP_END = 6,
+ TLS_KEY_BOEHM_GC_THREAD = 7,
+ TLS_KEY_LMF_ADDR = 8,
+ TLS_KEY_NUM = 9
+} MonoTlsKey;
#ifdef HOST_WIN32
@@ -49,5 +66,7 @@ mono_native_tls_set_value (MonoNativeTlsKey key, gpointer value)
#endif /* HOST_WIN32 */
+int mono_tls_key_get_offset (MonoTlsKey key);
+void mono_tls_key_set_offset (MonoTlsKey key, int offset);
#endif /* __MONO_TLS_H__ */
diff --git a/mono/utils/monobitset.c b/mono/utils/monobitset.c
index 5ff68938f6..e113260d4a 100644
--- a/mono/utils/monobitset.c
+++ b/mono/utils/monobitset.c
@@ -210,25 +210,17 @@ mono_bitset_count (const MonoBitSet *set) {
count = 0;
for (i = 0; i < set->size / BITS_PER_CHUNK; ++i) {
d = set->data [i];
- /* there is probably some asm code that can do this much faster */
- if (d) {
-#if SIZEOF_VOID_P == 8
- /* http://www.jjj.de/bitwizardry/bitwizardrypage.html */
- d -= (d>>1) & 0x5555555555555555;
- d = ((d>>2) & 0x3333333333333333) + (d & 0x3333333333333333);
- d = ((d>>4) + d) & 0x0f0f0f0f0f0f0f0f;
- d *= 0x0101010101010101;
- count += d >> 56;
+#ifdef __GNUC__
+ if (sizeof (gsize) == sizeof (unsigned long))
+ count += __builtin_popcountl (d);
+ else
+ count += __builtin_popcount (d);
#else
- /* http://aggregate.org/MAGIC/ */
- d -= ((d >> 1) & 0x55555555);
- d = (((d >> 2) & 0x33333333) + (d & 0x33333333));
- d = (((d >> 4) + d) & 0x0f0f0f0f);
- d += (d >> 8);
- d += (d >> 16);
- count += (d & 0x0000003f);
-#endif
+ while (d) {
+ count ++;
+ d &= (d - 1);
}
+#endif
}
return count;
}